@@ -514,26 +514,52 @@ 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_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);
519525}
520526
521527static inline Sleef_quad
522528quad_maximum (const Sleef_quad *in1, const Sleef_quad *in2)
523529{
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);
526538}
527539
528540static inline Sleef_quad
529541quad_fmin (const Sleef_quad *in1, const Sleef_quad *in2)
530542{
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+ }
531550 return Sleef_fminq1 (*in1, *in2);
532551}
533552
534553static inline Sleef_quad
535554quad_fmax (const Sleef_quad *in1, const Sleef_quad *in2)
536555{
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+ }
537563 return Sleef_fmaxq1 (*in1, *in2);
538564}
539565
0 commit comments