Skip to content

Commit a299b54

Browse files
authored
fix: use f*_algebraic intrinsics, instead of f*_fast intrinsics (#481)
Signed-off-by: usamoi <usamoi@outlook.com>
1 parent 6df574d commit a299b54

File tree

2 files changed

+73
-45
lines changed

2 files changed

+73
-45
lines changed

crates/base/src/scalar/f32.rs

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -455,14 +455,14 @@ impl Add<F32> for F32 {
455455

456456
#[inline(always)]
457457
fn add(self, rhs: F32) -> F32 {
458-
unsafe { std::intrinsics::fadd_fast(self.0, rhs.0).into() }
458+
intrinsics::fadd_algebraic(self.0, rhs.0).into()
459459
}
460460
}
461461

462462
impl AddAssign<F32> for F32 {
463463
#[inline(always)]
464464
fn add_assign(&mut self, rhs: F32) {
465-
unsafe { self.0 = std::intrinsics::fadd_fast(self.0, rhs.0) }
465+
self.0 = intrinsics::fadd_algebraic(self.0, rhs.0)
466466
}
467467
}
468468

@@ -477,14 +477,14 @@ impl Sub<F32> for F32 {
477477

478478
#[inline(always)]
479479
fn sub(self, rhs: F32) -> F32 {
480-
unsafe { std::intrinsics::fsub_fast(self.0, rhs.0).into() }
480+
intrinsics::fsub_algebraic(self.0, rhs.0).into()
481481
}
482482
}
483483

484484
impl SubAssign<F32> for F32 {
485485
#[inline(always)]
486486
fn sub_assign(&mut self, rhs: F32) {
487-
unsafe { self.0 = std::intrinsics::fsub_fast(self.0, rhs.0) }
487+
self.0 = intrinsics::fsub_algebraic(self.0, rhs.0)
488488
}
489489
}
490490

@@ -493,14 +493,14 @@ impl Mul<F32> for F32 {
493493

494494
#[inline(always)]
495495
fn mul(self, rhs: F32) -> F32 {
496-
unsafe { std::intrinsics::fmul_fast(self.0, rhs.0).into() }
496+
intrinsics::fmul_algebraic(self.0, rhs.0).into()
497497
}
498498
}
499499

500500
impl MulAssign<F32> for F32 {
501501
#[inline(always)]
502502
fn mul_assign(&mut self, rhs: F32) {
503-
unsafe { self.0 = std::intrinsics::fmul_fast(self.0, rhs.0) }
503+
self.0 = intrinsics::fmul_algebraic(self.0, rhs.0)
504504
}
505505
}
506506

@@ -509,14 +509,14 @@ impl Div<F32> for F32 {
509509

510510
#[inline(always)]
511511
fn div(self, rhs: F32) -> F32 {
512-
unsafe { std::intrinsics::fdiv_fast(self.0, rhs.0).into() }
512+
intrinsics::fdiv_algebraic(self.0, rhs.0).into()
513513
}
514514
}
515515

516516
impl DivAssign<F32> for F32 {
517517
#[inline(always)]
518518
fn div_assign(&mut self, rhs: F32) {
519-
unsafe { self.0 = std::intrinsics::fdiv_fast(self.0, rhs.0) }
519+
self.0 = intrinsics::fdiv_algebraic(self.0, rhs.0)
520520
}
521521
}
522522

@@ -525,14 +525,14 @@ impl Rem<F32> for F32 {
525525

526526
#[inline(always)]
527527
fn rem(self, rhs: F32) -> F32 {
528-
unsafe { std::intrinsics::frem_fast(self.0, rhs.0).into() }
528+
intrinsics::frem_algebraic(self.0, rhs.0).into()
529529
}
530530
}
531531

532532
impl RemAssign<F32> for F32 {
533533
#[inline(always)]
534534
fn rem_assign(&mut self, rhs: F32) {
535-
unsafe { self.0 = std::intrinsics::frem_fast(self.0, rhs.0) }
535+
self.0 = intrinsics::frem_algebraic(self.0, rhs.0)
536536
}
537537
}
538538

@@ -569,13 +569,13 @@ impl Add<f32> for F32 {
569569

570570
#[inline(always)]
571571
fn add(self, rhs: f32) -> F32 {
572-
unsafe { std::intrinsics::fadd_fast(self.0, rhs).into() }
572+
intrinsics::fadd_algebraic(self.0, rhs).into()
573573
}
574574
}
575575

576576
impl AddAssign<f32> for F32 {
577577
fn add_assign(&mut self, rhs: f32) {
578-
unsafe { self.0 = std::intrinsics::fadd_fast(self.0, rhs) }
578+
self.0 = intrinsics::fadd_algebraic(self.0, rhs)
579579
}
580580
}
581581

@@ -584,14 +584,14 @@ impl Sub<f32> for F32 {
584584

585585
#[inline(always)]
586586
fn sub(self, rhs: f32) -> F32 {
587-
unsafe { std::intrinsics::fsub_fast(self.0, rhs).into() }
587+
intrinsics::fsub_algebraic(self.0, rhs).into()
588588
}
589589
}
590590

591591
impl SubAssign<f32> for F32 {
592592
#[inline(always)]
593593
fn sub_assign(&mut self, rhs: f32) {
594-
unsafe { self.0 = std::intrinsics::fsub_fast(self.0, rhs) }
594+
self.0 = intrinsics::fsub_algebraic(self.0, rhs)
595595
}
596596
}
597597

@@ -600,14 +600,14 @@ impl Mul<f32> for F32 {
600600

601601
#[inline(always)]
602602
fn mul(self, rhs: f32) -> F32 {
603-
unsafe { std::intrinsics::fmul_fast(self.0, rhs).into() }
603+
intrinsics::fmul_algebraic(self.0, rhs).into()
604604
}
605605
}
606606

607607
impl MulAssign<f32> for F32 {
608608
#[inline(always)]
609609
fn mul_assign(&mut self, rhs: f32) {
610-
unsafe { self.0 = std::intrinsics::fmul_fast(self.0, rhs) }
610+
self.0 = intrinsics::fmul_algebraic(self.0, rhs)
611611
}
612612
}
613613

@@ -616,14 +616,14 @@ impl Div<f32> for F32 {
616616

617617
#[inline(always)]
618618
fn div(self, rhs: f32) -> F32 {
619-
unsafe { std::intrinsics::fdiv_fast(self.0, rhs).into() }
619+
intrinsics::fdiv_algebraic(self.0, rhs).into()
620620
}
621621
}
622622

623623
impl DivAssign<f32> for F32 {
624624
#[inline(always)]
625625
fn div_assign(&mut self, rhs: f32) {
626-
unsafe { self.0 = std::intrinsics::fdiv_fast(self.0, rhs) }
626+
self.0 = intrinsics::fdiv_algebraic(self.0, rhs)
627627
}
628628
}
629629

@@ -632,14 +632,37 @@ impl Rem<f32> for F32 {
632632

633633
#[inline(always)]
634634
fn rem(self, rhs: f32) -> F32 {
635-
unsafe { std::intrinsics::frem_fast(self.0, rhs).into() }
635+
intrinsics::frem_algebraic(self.0, rhs).into()
636636
}
637637
}
638638

639639
impl RemAssign<f32> for F32 {
640640
#[inline(always)]
641641
fn rem_assign(&mut self, rhs: f32) {
642-
unsafe { self.0 = std::intrinsics::frem_fast(self.0, rhs) }
642+
self.0 = intrinsics::frem_algebraic(self.0, rhs)
643+
}
644+
}
645+
646+
mod intrinsics {
647+
#[inline(always)]
648+
pub fn fadd_algebraic(lhs: f32, rhs: f32) -> f32 {
649+
std::intrinsics::fadd_algebraic(lhs, rhs)
650+
}
651+
#[inline(always)]
652+
pub fn fsub_algebraic(lhs: f32, rhs: f32) -> f32 {
653+
std::intrinsics::fsub_algebraic(lhs, rhs)
654+
}
655+
#[inline(always)]
656+
pub fn fmul_algebraic(lhs: f32, rhs: f32) -> f32 {
657+
std::intrinsics::fmul_algebraic(lhs, rhs)
658+
}
659+
#[inline(always)]
660+
pub fn fdiv_algebraic(lhs: f32, rhs: f32) -> f32 {
661+
std::intrinsics::fdiv_algebraic(lhs, rhs)
662+
}
663+
#[inline(always)]
664+
pub fn frem_algebraic(lhs: f32, rhs: f32) -> f32 {
665+
std::intrinsics::frem_algebraic(lhs, rhs)
643666
}
644667
}
645668

crates/base/src/scalar/half_f16.rs

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -441,14 +441,14 @@ impl Add<F16> for F16 {
441441

442442
#[inline(always)]
443443
fn add(self, rhs: F16) -> F16 {
444-
unsafe { intrinsics::fadd_fast(self.0, rhs.0).into() }
444+
intrinsics::fadd_algebraic(self.0, rhs.0).into()
445445
}
446446
}
447447

448448
impl AddAssign<F16> for F16 {
449449
#[inline(always)]
450450
fn add_assign(&mut self, rhs: F16) {
451-
unsafe { self.0 = intrinsics::fadd_fast(self.0, rhs.0) }
451+
self.0 = intrinsics::fadd_algebraic(self.0, rhs.0)
452452
}
453453
}
454454

@@ -457,14 +457,14 @@ impl Sub<F16> for F16 {
457457

458458
#[inline(always)]
459459
fn sub(self, rhs: F16) -> F16 {
460-
unsafe { intrinsics::fsub_fast(self.0, rhs.0).into() }
460+
intrinsics::fsub_algebraic(self.0, rhs.0).into()
461461
}
462462
}
463463

464464
impl SubAssign<F16> for F16 {
465465
#[inline(always)]
466466
fn sub_assign(&mut self, rhs: F16) {
467-
unsafe { self.0 = intrinsics::fsub_fast(self.0, rhs.0) }
467+
self.0 = intrinsics::fsub_algebraic(self.0, rhs.0)
468468
}
469469
}
470470

@@ -473,14 +473,14 @@ impl Mul<F16> for F16 {
473473

474474
#[inline(always)]
475475
fn mul(self, rhs: F16) -> F16 {
476-
unsafe { intrinsics::fmul_fast(self.0, rhs.0).into() }
476+
intrinsics::fmul_algebraic(self.0, rhs.0).into()
477477
}
478478
}
479479

480480
impl MulAssign<F16> for F16 {
481481
#[inline(always)]
482482
fn mul_assign(&mut self, rhs: F16) {
483-
unsafe { self.0 = intrinsics::fmul_fast(self.0, rhs.0) }
483+
self.0 = intrinsics::fmul_algebraic(self.0, rhs.0)
484484
}
485485
}
486486

@@ -489,14 +489,14 @@ impl Div<F16> for F16 {
489489

490490
#[inline(always)]
491491
fn div(self, rhs: F16) -> F16 {
492-
unsafe { intrinsics::fdiv_fast(self.0, rhs.0).into() }
492+
intrinsics::fdiv_algebraic(self.0, rhs.0).into()
493493
}
494494
}
495495

496496
impl DivAssign<F16> for F16 {
497497
#[inline(always)]
498498
fn div_assign(&mut self, rhs: F16) {
499-
unsafe { self.0 = intrinsics::fdiv_fast(self.0, rhs.0) }
499+
self.0 = intrinsics::fdiv_algebraic(self.0, rhs.0)
500500
}
501501
}
502502

@@ -505,14 +505,14 @@ impl Rem<F16> for F16 {
505505

506506
#[inline(always)]
507507
fn rem(self, rhs: F16) -> F16 {
508-
unsafe { intrinsics::frem_fast(self.0, rhs.0).into() }
508+
intrinsics::frem_algebraic(self.0, rhs.0).into()
509509
}
510510
}
511511

512512
impl RemAssign<F16> for F16 {
513513
#[inline(always)]
514514
fn rem_assign(&mut self, rhs: F16) {
515-
unsafe { self.0 = intrinsics::frem_fast(self.0, rhs.0) }
515+
self.0 = intrinsics::frem_algebraic(self.0, rhs.0)
516516
}
517517
}
518518

@@ -549,13 +549,13 @@ impl Add<f16> for F16 {
549549

550550
#[inline(always)]
551551
fn add(self, rhs: f16) -> F16 {
552-
unsafe { intrinsics::fadd_fast(self.0, rhs).into() }
552+
intrinsics::fadd_algebraic(self.0, rhs).into()
553553
}
554554
}
555555

556556
impl AddAssign<f16> for F16 {
557557
fn add_assign(&mut self, rhs: f16) {
558-
unsafe { self.0 = intrinsics::fadd_fast(self.0, rhs) }
558+
self.0 = intrinsics::fadd_algebraic(self.0, rhs)
559559
}
560560
}
561561

@@ -564,14 +564,14 @@ impl Sub<f16> for F16 {
564564

565565
#[inline(always)]
566566
fn sub(self, rhs: f16) -> F16 {
567-
unsafe { intrinsics::fsub_fast(self.0, rhs).into() }
567+
intrinsics::fsub_algebraic(self.0, rhs).into()
568568
}
569569
}
570570

571571
impl SubAssign<f16> for F16 {
572572
#[inline(always)]
573573
fn sub_assign(&mut self, rhs: f16) {
574-
unsafe { self.0 = intrinsics::fsub_fast(self.0, rhs) }
574+
self.0 = intrinsics::fsub_algebraic(self.0, rhs)
575575
}
576576
}
577577

@@ -580,14 +580,14 @@ impl Mul<f16> for F16 {
580580

581581
#[inline(always)]
582582
fn mul(self, rhs: f16) -> F16 {
583-
unsafe { intrinsics::fmul_fast(self.0, rhs).into() }
583+
intrinsics::fmul_algebraic(self.0, rhs).into()
584584
}
585585
}
586586

587587
impl MulAssign<f16> for F16 {
588588
#[inline(always)]
589589
fn mul_assign(&mut self, rhs: f16) {
590-
unsafe { self.0 = intrinsics::fmul_fast(self.0, rhs) }
590+
self.0 = intrinsics::fmul_algebraic(self.0, rhs)
591591
}
592592
}
593593

@@ -596,14 +596,14 @@ impl Div<f16> for F16 {
596596

597597
#[inline(always)]
598598
fn div(self, rhs: f16) -> F16 {
599-
unsafe { intrinsics::fdiv_fast(self.0, rhs).into() }
599+
intrinsics::fdiv_algebraic(self.0, rhs).into()
600600
}
601601
}
602602

603603
impl DivAssign<f16> for F16 {
604604
#[inline(always)]
605605
fn div_assign(&mut self, rhs: f16) {
606-
unsafe { self.0 = intrinsics::fdiv_fast(self.0, rhs) }
606+
self.0 = intrinsics::fdiv_algebraic(self.0, rhs)
607607
}
608608
}
609609

@@ -612,33 +612,38 @@ impl Rem<f16> for F16 {
612612

613613
#[inline(always)]
614614
fn rem(self, rhs: f16) -> F16 {
615-
unsafe { intrinsics::frem_fast(self.0, rhs).into() }
615+
intrinsics::frem_algebraic(self.0, rhs).into()
616616
}
617617
}
618618

619619
impl RemAssign<f16> for F16 {
620620
#[inline(always)]
621621
fn rem_assign(&mut self, rhs: f16) {
622-
unsafe { self.0 = intrinsics::frem_fast(self.0, rhs) }
622+
self.0 = intrinsics::frem_algebraic(self.0, rhs)
623623
}
624624
}
625625

626626
mod intrinsics {
627627
use half::f16;
628628

629-
pub unsafe fn fadd_fast(lhs: f16, rhs: f16) -> f16 {
629+
#[inline(always)]
630+
pub fn fadd_algebraic(lhs: f16, rhs: f16) -> f16 {
630631
lhs + rhs
631632
}
632-
pub unsafe fn fsub_fast(lhs: f16, rhs: f16) -> f16 {
633+
#[inline(always)]
634+
pub fn fsub_algebraic(lhs: f16, rhs: f16) -> f16 {
633635
lhs - rhs
634636
}
635-
pub unsafe fn fmul_fast(lhs: f16, rhs: f16) -> f16 {
637+
#[inline(always)]
638+
pub fn fmul_algebraic(lhs: f16, rhs: f16) -> f16 {
636639
lhs * rhs
637640
}
638-
pub unsafe fn fdiv_fast(lhs: f16, rhs: f16) -> f16 {
641+
#[inline(always)]
642+
pub fn fdiv_algebraic(lhs: f16, rhs: f16) -> f16 {
639643
lhs / rhs
640644
}
641-
pub unsafe fn frem_fast(lhs: f16, rhs: f16) -> f16 {
645+
#[inline(always)]
646+
pub fn frem_algebraic(lhs: f16, rhs: f16) -> f16 {
642647
lhs % rhs
643648
}
644649
}

0 commit comments

Comments
 (0)