@@ -125,6 +125,10 @@ mod tests {
125
125
Mulsf3 ,
126
126
Muldf3 ,
127
127
128
+ // float/div.rs
129
+ Divsf3 ,
130
+ Divdf3 ,
131
+
128
132
// int/mul.rs
129
133
Muldi3 ,
130
134
Mulodi4 ,
@@ -3399,6 +3403,187 @@ fn muldf3() {
3399
3403
}
3400
3404
}
3401
3405
3406
+ #[ derive( Eq , Hash , PartialEq ) ]
3407
+ pub struct Divsf3 {
3408
+ a : u32 , // f32
3409
+ b : u32 , // f32
3410
+ c : u32 , // f32
3411
+ }
3412
+
3413
+ impl TestCase for Divsf3 {
3414
+ fn name ( ) -> & ' static str {
3415
+ "divsf3"
3416
+ }
3417
+
3418
+ fn generate < R > ( rng : & mut R ) -> Option < Self >
3419
+ where
3420
+ R : Rng ,
3421
+ Self : Sized ,
3422
+ {
3423
+ let a = gen_large_f32 ( rng) ;
3424
+ let b = gen_large_f32 ( rng) ;
3425
+ if b == 0.0 {
3426
+ return None ;
3427
+ }
3428
+ let c = a / b;
3429
+ // TODO accept NaNs. We don't do that right now because we can't check
3430
+ // for NaN-ness on the thumb targets (due to missing intrinsics)
3431
+ if a. is_nan ( ) || b. is_nan ( ) || c. is_nan ( ) || c. abs ( ) <= unsafe { mem:: transmute ( 16777215u32 ) } {
3432
+ return None ;
3433
+ }
3434
+
3435
+ Some (
3436
+ Divsf3 {
3437
+ a : to_u32 ( a) ,
3438
+ b : to_u32 ( b) ,
3439
+ c : to_u32 ( c) ,
3440
+ } ,
3441
+ )
3442
+ }
3443
+
3444
+ fn to_string ( & self , buffer : & mut String ) {
3445
+ writeln ! (
3446
+ buffer,
3447
+ "(({a}, {b}), {c})," ,
3448
+ a = self . a,
3449
+ b = self . b,
3450
+ c = self . c
3451
+ )
3452
+ . unwrap ( ) ;
3453
+ }
3454
+
3455
+ fn prologue ( ) -> & ' static str {
3456
+ r#"
3457
+ #[cfg(all(target_arch = "arm",
3458
+ not(any(target_env = "gnu", target_env = "musl")),
3459
+ target_os = "linux",
3460
+ test))]
3461
+ use core::mem;
3462
+ #[cfg(not(all(target_arch = "arm",
3463
+ not(any(target_env = "gnu", target_env = "musl")),
3464
+ target_os = "linux",
3465
+ test)))]
3466
+ use std::mem;
3467
+ use compiler_builtins::float::div::__divsf3;
3468
+
3469
+ fn mk_f32(x: u32) -> f32 {
3470
+ unsafe { mem::transmute(x) }
3471
+ }
3472
+
3473
+ fn to_u32(x: f32) -> u32 {
3474
+ unsafe { mem::transmute(x) }
3475
+ }
3476
+
3477
+ static TEST_CASES: &[((u32, u32), u32)] = &[
3478
+ "#
3479
+ }
3480
+
3481
+ fn epilogue ( ) -> & ' static str {
3482
+ "
3483
+ ];
3484
+
3485
+ #[test]
3486
+ fn divsf3() {
3487
+ for &((a, b), c) in TEST_CASES {
3488
+ let c_ = __divsf3(mk_f32(a), mk_f32(b));
3489
+ assert_eq!(((a, b), c), ((a, b), to_u32(c_)));
3490
+ }
3491
+ }
3492
+ "
3493
+ }
3494
+ }
3495
+
3496
+ #[ derive( Eq , Hash , PartialEq ) ]
3497
+ pub struct Divdf3 {
3498
+ a : u64 , // f64
3499
+ b : u64 , // f64
3500
+ c : u64 , // f64
3501
+ }
3502
+
3503
+ impl TestCase for Divdf3 {
3504
+ fn name ( ) -> & ' static str {
3505
+ "divdf3"
3506
+ }
3507
+
3508
+ fn generate < R > ( rng : & mut R ) -> Option < Self >
3509
+ where
3510
+ R : Rng ,
3511
+ Self : Sized ,
3512
+ {
3513
+ let a = gen_large_f64 ( rng) ;
3514
+ let b = gen_large_f64 ( rng) ;
3515
+ if b == 0.0 {
3516
+ return None ;
3517
+ }
3518
+ let c = a / b;
3519
+ // TODO accept NaNs. We don't do that right now because we can't check
3520
+ // for NaN-ness on the thumb targets (due to missing intrinsics)
3521
+ if a. is_nan ( ) || b. is_nan ( ) || c. is_nan ( )
3522
+ || c. abs ( ) <= unsafe { mem:: transmute ( 4503599627370495u64 ) } {
3523
+ return None ;
3524
+ }
3525
+
3526
+ Some (
3527
+ Divdf3 {
3528
+ a : to_u64 ( a) ,
3529
+ b : to_u64 ( b) ,
3530
+ c : to_u64 ( c) ,
3531
+ } ,
3532
+ )
3533
+ }
3534
+
3535
+ fn to_string ( & self , buffer : & mut String ) {
3536
+ writeln ! (
3537
+ buffer,
3538
+ "(({a}, {b}), {c})," ,
3539
+ a = self . a,
3540
+ b = self . b,
3541
+ c = self . c
3542
+ )
3543
+ . unwrap ( ) ;
3544
+ }
3545
+
3546
+ fn prologue ( ) -> & ' static str {
3547
+ r#"
3548
+ #[cfg(all(target_arch = "arm",
3549
+ not(any(target_env = "gnu", target_env = "musl")),
3550
+ target_os = "linux",
3551
+ test))]
3552
+ use core::mem;
3553
+ #[cfg(not(all(target_arch = "arm",
3554
+ not(any(target_env = "gnu", target_env = "musl")),
3555
+ target_os = "linux",
3556
+ test)))]
3557
+ use std::mem;
3558
+ use compiler_builtins::float::div::__divdf3;
3559
+
3560
+ fn mk_f64(x: u64) -> f64 {
3561
+ unsafe { mem::transmute(x) }
3562
+ }
3563
+
3564
+ fn to_u64(x: f64) -> u64 {
3565
+ unsafe { mem::transmute(x) }
3566
+ }
3567
+
3568
+ static TEST_CASES: &[((u64, u64), u64)] = &[
3569
+ "#
3570
+ }
3571
+
3572
+ fn epilogue ( ) -> & ' static str {
3573
+ "
3574
+ ];
3575
+
3576
+ #[test]
3577
+ fn divdf3() {
3578
+ for &((a, b), c) in TEST_CASES {
3579
+ let c_ = __divdf3(mk_f64(a), mk_f64(b));
3580
+ assert_eq!(((a, b), c), ((a, b), to_u64(c_)));
3581
+ }
3582
+ }
3583
+ "
3584
+ }
3585
+ }
3586
+
3402
3587
3403
3588
#[ derive( Eq , Hash , PartialEq ) ]
3404
3589
pub struct Udivdi3 {
0 commit comments