@@ -514,33 +514,53 @@ quad_mod(const Sleef_quad *a, const Sleef_quad *b)
514514static inline Sleef_quad
515515quad_minimum (const Sleef_quad *in1, const Sleef_quad *in2)
516516{
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);
520525}
521526
522527static inline Sleef_quad
523528quad_maximum (const Sleef_quad *in1, const Sleef_quad *in2)
524529{
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);
528538}
529539
530540static inline Sleef_quad
531541quad_fmin (const Sleef_quad *in1, const Sleef_quad *in2)
532542{
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);
536551}
537552
538553static inline Sleef_quad
539554quad_fmax (const Sleef_quad *in1, const Sleef_quad *in2)
540555{
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);
544564}
545565
546566static inline Sleef_quad
0 commit comments