@@ -16310,7 +16310,7 @@ ix86_expand_rint (rtx operand0, rtx operand1)
return copysign (xa, operand1);
*/
machine_mode mode = GET_MODE (operand0);
- rtx res, xa, TWO52, two52, mask;
+ rtx res, xa, TWO52, mask;
rtx_code_label *label;
res = gen_reg_rtx (mode);
@@ -16323,16 +16323,18 @@ ix86_expand_rint (rtx operand0, rtx operand1)
TWO52 = ix86_gen_TWO52 (mode);
label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
- two52 = TWO52;
if (flag_rounding_math)
{
- two52 = gen_reg_rtx (mode);
- ix86_sse_copysign_to_positive (two52, TWO52, res, mask);
+ ix86_sse_copysign_to_positive (TWO52, TWO52, res, mask);
xa = res;
}
- xa = expand_simple_binop (mode, PLUS, xa, two52, NULL_RTX, 0, OPTAB_DIRECT);
- xa = expand_simple_binop (mode, MINUS, xa, two52, xa, 0, OPTAB_DIRECT);
+ xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
+ xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
+
+ /* Remove the sign with FE_DOWNWARD, where x - x = -0.0. */
+ if (HONOR_SIGNED_ZEROS (mode) && flag_rounding_math)
+ xa = ix86_expand_sse_fabs (xa, NULL);
ix86_sse_copysign_to_positive (res, xa, res, mask);
@@ -16577,7 +16579,7 @@ ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
tmp = expand_simple_binop (mode, MINUS,
xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
/* Remove the sign with FE_DOWNWARD, where x - x = -0.0. */
- if (flag_rounding_math)
+ if (HONOR_SIGNED_ZEROS (mode) && flag_rounding_math)
tmp = ix86_expand_sse_fabs (tmp, NULL);
/* res = copysign (xa2, operand1) */
new file mode 100644
@@ -0,0 +1,28 @@
+/* PR target/96793 */
+/* { dg-do run { target sse2_runtime } } */
+/* { dg-require-effective-target fenv } */
+/* { dg-options "-O2 -frounding-math -msse2 -mno-sse4 -mfpmath=sse" } */
+
+#include <fenv.h>
+
+double
+__attribute__((noinline))
+test (double value)
+{
+ return __builtin_rint (value);
+}
+
+int
+main ()
+{
+ double result;
+
+ fesetround (FE_DOWNWARD);
+
+ result = test (0.25);
+
+ if (__builtin_signbit (result) != 0)
+ __builtin_abort ();
+
+ return 0;
+}