@@ -514,26 +514,52 @@ quad_mod(const Sleef_quad *a, const Sleef_quad *b)
514
514
static inline Sleef_quad
515
515
quad_minimum (const Sleef_quad *in1, const Sleef_quad *in2)
516
516
{
517
- return Sleef_iunordq1 (*in1, *in2) ? (Sleef_iunordq1 (*in1, *in1) ? *in1 : *in2)
518
- : Sleef_fminq1 (*in1, *in2);
517
+ if (Sleef_iunordq1 (*in1, *in2)) {
518
+ return Sleef_iunordq1 (*in1, *in1) ? *in1 : *in2;
519
+ }
520
+ // minimum(-0.0, +0.0) = -0.0
521
+ if (Sleef_icmpeqq1 (*in1, QUAD_ZERO) && Sleef_icmpeqq1 (*in2, QUAD_ZERO)) {
522
+ return Sleef_icmpleq1 (Sleef_copysignq1 (QUAD_ONE, *in1), Sleef_copysignq1 (QUAD_ONE, *in2)) ? *in1 : *in2;
523
+ }
524
+ return Sleef_fminq1 (*in1, *in2);
519
525
}
520
526
521
527
static inline Sleef_quad
522
528
quad_maximum (const Sleef_quad *in1, const Sleef_quad *in2)
523
529
{
524
- return Sleef_iunordq1 (*in1, *in2) ? (Sleef_iunordq1 (*in1, *in1) ? *in1 : *in2)
525
- : Sleef_fmaxq1 (*in1, *in2);
530
+ if (Sleef_iunordq1 (*in1, *in2)) {
531
+ return Sleef_iunordq1 (*in1, *in1) ? *in1 : *in2;
532
+ }
533
+ // maximum(-0.0, +0.0) = +0.0
534
+ if (Sleef_icmpeqq1 (*in1, QUAD_ZERO) && Sleef_icmpeqq1 (*in2, QUAD_ZERO)) {
535
+ return Sleef_icmpgeq1 (Sleef_copysignq1 (QUAD_ONE, *in1), Sleef_copysignq1 (QUAD_ONE, *in2)) ? *in1 : *in2;
536
+ }
537
+ return Sleef_fmaxq1 (*in1, *in2);
526
538
}
527
539
528
540
static inline Sleef_quad
529
541
quad_fmin (const Sleef_quad *in1, const Sleef_quad *in2)
530
542
{
543
+ if (Sleef_iunordq1 (*in1, *in2)) {
544
+ return Sleef_iunordq1 (*in2, *in2) ? *in1 : *in2;
545
+ }
546
+ // fmin(-0.0, +0.0) = -0.0
547
+ if (Sleef_icmpeqq1 (*in1, QUAD_ZERO) && Sleef_icmpeqq1 (*in2, QUAD_ZERO)) {
548
+ return Sleef_icmpleq1 (Sleef_copysignq1 (QUAD_ONE, *in1), Sleef_copysignq1 (QUAD_ONE, *in2)) ? *in1 : *in2;
549
+ }
531
550
return Sleef_fminq1 (*in1, *in2);
532
551
}
533
552
534
553
static inline Sleef_quad
535
554
quad_fmax (const Sleef_quad *in1, const Sleef_quad *in2)
536
555
{
556
+ if (Sleef_iunordq1 (*in1, *in2)) {
557
+ return Sleef_iunordq1 (*in2, *in2) ? *in1 : *in2;
558
+ }
559
+ // maximum(-0.0, +0.0) = +0.0
560
+ if (Sleef_icmpeqq1 (*in1, QUAD_ZERO) && Sleef_icmpeqq1 (*in2, QUAD_ZERO)) {
561
+ return Sleef_icmpgeq1 (Sleef_copysignq1 (QUAD_ONE, *in1), Sleef_copysignq1 (QUAD_ONE, *in2)) ? *in1 : *in2;
562
+ }
537
563
return Sleef_fmaxq1 (*in1, *in2);
538
564
}
539
565
0 commit comments