@@ -514,33 +514,53 @@ 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_icmpltq1 (*in1, *in2) ? *in1
519
- : *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);
520
525
}
521
526
522
527
static inline Sleef_quad
523
528
quad_maximum (const Sleef_quad *in1, const Sleef_quad *in2)
524
529
{
525
- return Sleef_iunordq1 (*in1, *in2) ? (Sleef_iunordq1 (*in1, *in1) ? *in1 : *in2)
526
- : Sleef_icmpgtq1 (*in1, *in2) ? *in1
527
- : *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);
528
538
}
529
539
530
540
static inline Sleef_quad
531
541
quad_fmin (const Sleef_quad *in1, const Sleef_quad *in2)
532
542
{
533
- return Sleef_iunordq1 (*in1, *in2) ? (Sleef_iunordq1 (*in2, *in2) ? *in1 : *in2)
534
- : Sleef_icmpleq1 (*in1, *in2) ? *in1
535
- : *in2;
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
+ }
550
+ return Sleef_fminq1 (*in1, *in2);
536
551
}
537
552
538
553
static inline Sleef_quad
539
554
quad_fmax (const Sleef_quad *in1, const Sleef_quad *in2)
540
555
{
541
- return Sleef_iunordq1 (*in1, *in2) ? (Sleef_iunordq1 (*in2, *in2) ? *in1 : *in2)
542
- : Sleef_icmpgeq1 (*in1, *in2) ? *in1
543
- : *in2;
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
+ }
563
+ return Sleef_fmaxq1 (*in1, *in2);
544
564
}
545
565
546
566
static inline Sleef_quad
0 commit comments