aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2018-09-25 16:26:11 +0200
committerUros Bizjak <uros@gcc.gnu.org>2018-09-25 16:26:11 +0200
commitbe2df8bc38a14659f6a5604c22252f17ef2a2a6c (patch)
tree8876632c2b2cae7e57d3840e7d7917086e50a9e4 /gcc
parentb16084d244418d5421505f09851b5adf5abc35ec (diff)
downloadgcc-be2df8bc38a14659f6a5604c22252f17ef2a2a6c.zip
gcc-be2df8bc38a14659f6a5604c22252f17ef2a2a6c.tar.gz
gcc-be2df8bc38a14659f6a5604c22252f17ef2a2a6c.tar.bz2
i386.md (frndintxf2_mask_pm): Remove.
* config/i386/i386.md (frndintxf2_mask_pm): Remove. (frndintxf2_mask_pm_i387): Ditto. (nearbyintxf2): Rewrite expander pattern to match rintxf2. Enable for !flag_trapping_math. (nearbyint<mode>2): Enable x87 modes for !flag_trapping_math. Enable SSE modes for TARGET_SSE4_1 and expand them with round insn. Change operand 1 predicate to nonimmediate_operand. (attr "i387_cw"): Remove mask_pm. * config/i386/i386.h (enum ix86_stack_slot): Remove SLOT_CW_MASK_PM. (enum ix86_entity): Remove I387_MASK_PM. * config/i386/i386.c (ix86_i387_mode_needed): Do not handle I387_MASK_PM. (ix86_mode_needed): Ditto. (ix86_mode_after): Ditto. (ix86_mode_entry): Ditto. (ix86_mode_exit): Ditto. (emit_i387_cw_initialization): Do not handle I387_CW_MASK_PM. From-SVN: r264571
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/config/i386/i386.c16
-rw-r--r--gcc/config/i386/i386.h2
-rw-r--r--gcc/config/i386/i386.md79
-rw-r--r--gcc/reg-stack.c1
5 files changed, 43 insertions, 75 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a92e935..b9e6ec2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2018-09-25 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.md (frndintxf2_mask_pm): Remove.
+ (frndintxf2_mask_pm_i387): Ditto.
+ (nearbyintxf2): Rewrite expander pattern to match rintxf2.
+ Enable for !flag_trapping_math.
+ (nearbyint<mode>2): Enable x87 modes for !flag_trapping_math.
+ Enable SSE modes for TARGET_SSE4_1 and expand them with round insn.
+ Change operand 1 predicate to nonimmediate_operand.
+ (attr "i387_cw"): Remove mask_pm.
+ * config/i386/i386.h (enum ix86_stack_slot): Remove SLOT_CW_MASK_PM.
+ (enum ix86_entity): Remove I387_MASK_PM.
+ * config/i386/i386.c (ix86_i387_mode_needed): Do not
+ handle I387_MASK_PM.
+ (ix86_mode_needed): Ditto.
+ (ix86_mode_after): Ditto.
+ (ix86_mode_entry): Ditto.
+ (ix86_mode_exit): Ditto.
+ (emit_i387_cw_initialization): Do not handle I387_CW_MASK_PM.
+
2018-09-25 Jakub Jelinek <jakub@redhat.com>
* vr-values.c (vr_values::vr_values): Initialize to_remove_edges and
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 3d76c89..6c7da3d 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -18880,11 +18880,6 @@ ix86_i387_mode_needed (int entity, rtx_insn *insn)
return mode;
break;
- case I387_MASK_PM:
- if (mode == I387_CW_MASK_PM)
- return mode;
- break;
-
default:
gcc_unreachable ();
}
@@ -18907,7 +18902,6 @@ ix86_mode_needed (int entity, rtx_insn *insn)
case I387_TRUNC:
case I387_FLOOR:
case I387_CEIL:
- case I387_MASK_PM:
return ix86_i387_mode_needed (entity, insn);
default:
gcc_unreachable ();
@@ -18968,7 +18962,6 @@ ix86_mode_after (int entity, int mode, rtx_insn *insn)
case I387_TRUNC:
case I387_FLOOR:
case I387_CEIL:
- case I387_MASK_PM:
return mode;
default:
gcc_unreachable ();
@@ -19021,7 +19014,6 @@ ix86_mode_entry (int entity)
case I387_TRUNC:
case I387_FLOOR:
case I387_CEIL:
- case I387_MASK_PM:
return I387_CW_ANY;
default:
gcc_unreachable ();
@@ -19056,7 +19048,6 @@ ix86_mode_exit (int entity)
case I387_TRUNC:
case I387_FLOOR:
case I387_CEIL:
- case I387_MASK_PM:
return I387_CW_ANY;
default:
gcc_unreachable ();
@@ -19108,12 +19099,6 @@ emit_i387_cw_initialization (int mode)
slot = SLOT_CW_CEIL;
break;
- case I387_CW_MASK_PM:
- /* mask precision exception for nearbyint() */
- emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
- slot = SLOT_CW_MASK_PM;
- break;
-
default:
gcc_unreachable ();
}
@@ -19169,7 +19154,6 @@ ix86_emit_mode_set (int entity, int mode, int prev_mode ATTRIBUTE_UNUSED,
case I387_TRUNC:
case I387_FLOOR:
case I387_CEIL:
- case I387_MASK_PM:
if (mode != I387_CW_ANY
&& mode != I387_CW_UNINITIALIZED)
emit_i387_cw_initialization (mode);
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index e77dac7..b68fc80 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2456,7 +2456,6 @@ enum ix86_stack_slot
SLOT_CW_TRUNC,
SLOT_CW_FLOOR,
SLOT_CW_CEIL,
- SLOT_CW_MASK_PM,
SLOT_STV_TEMP,
MAX_386_STACK_LOCALS
};
@@ -2468,7 +2467,6 @@ enum ix86_entity
I387_TRUNC,
I387_FLOOR,
I387_CEIL,
- I387_MASK_PM,
MAX_386_ENTITIES
};
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e08b2b7..75e2edb 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -144,7 +144,6 @@
UNSPEC_FRNDINT_FLOOR
UNSPEC_FRNDINT_CEIL
UNSPEC_FRNDINT_TRUNC
- UNSPEC_FRNDINT_MASK_PM
UNSPEC_FIST_FLOOR
UNSPEC_FIST_CEIL
@@ -775,7 +774,7 @@
;; Defines rounding mode of an FP operation.
-(define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
+(define_attr "i387_cw" "trunc,floor,ceil,uninitialized,any"
(const_string "any"))
;; Define attribute to classify add/sub insns that consumes carry flag (CF)
@@ -16341,67 +16340,35 @@
DONE;
})
-;; Rounding mode control word calculation could clobber FLAGS_REG.
-(define_insn_and_split "frndintxf2_mask_pm"
+(define_expand "nearbyintxf2"
[(set (match_operand:XF 0 "register_operand")
(unspec:XF [(match_operand:XF 1 "register_operand")]
- UNSPEC_FRNDINT_MASK_PM))
- (clobber (reg:CC FLAGS_REG))]
- "TARGET_USE_FANCY_MATH_387
- && flag_unsafe_math_optimizations
- && can_create_pseudo_p ()"
- "#"
- "&& 1"
- [(const_int 0)]
-{
- ix86_optimize_mode_switching[I387_MASK_PM] = 1;
-
- operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
- operands[3] = assign_386_stack_local (HImode, SLOT_CW_MASK_PM);
-
- emit_insn (gen_frndintxf2_mask_pm_i387 (operands[0], operands[1],
- operands[2], operands[3]));
- DONE;
-}
- [(set_attr "type" "frndint")
- (set_attr "i387_cw" "mask_pm")
- (set_attr "mode" "XF")])
-
-(define_insn "frndintxf2_mask_pm_i387"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
- UNSPEC_FRNDINT_MASK_PM))
- (use (match_operand:HI 2 "memory_operand" "m"))
- (use (match_operand:HI 3 "memory_operand" "m"))]
- "TARGET_USE_FANCY_MATH_387
- && flag_unsafe_math_optimizations"
- "fldcw\t%3\n\tfrndint\n\tfclex\n\tfldcw\t%2"
- [(set_attr "type" "frndint")
- (set_attr "i387_cw" "mask_pm")
- (set_attr "mode" "XF")])
-
-(define_expand "nearbyintxf2"
- [(parallel [(set (match_operand:XF 0 "register_operand")
- (unspec:XF [(match_operand:XF 1 "register_operand")]
- UNSPEC_FRNDINT_MASK_PM))
- (clobber (reg:CC FLAGS_REG))])]
+ UNSPEC_FRNDINT))]
"TARGET_USE_FANCY_MATH_387
- && flag_unsafe_math_optimizations")
+ && !flag_trapping_math")
(define_expand "nearbyint<mode>2"
[(use (match_operand:MODEF 0 "register_operand"))
- (use (match_operand:MODEF 1 "register_operand"))]
- "TARGET_USE_FANCY_MATH_387
- && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
- || TARGET_MIX_SSE_I387)
- && flag_unsafe_math_optimizations"
-{
- rtx op0 = gen_reg_rtx (XFmode);
- rtx op1 = gen_reg_rtx (XFmode);
+ (use (match_operand:MODEF 1 "nonimmediate_operand"))]
+ "(TARGET_USE_FANCY_MATH_387
+ && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+ || TARGET_MIX_SSE_I387)
+ && !flag_trapping_math)
+ || (TARGET_SSE4_1 && TARGET_SSE_MATH)"
+{
+ if (TARGET_SSE4_1 && TARGET_SSE_MATH)
+ emit_insn (gen_sse4_1_round<mode>2
+ (operands[0], operands[1], GEN_INT (ROUND_MXCSR
+ | ROUND_NO_EXC)));
+ else
+ {
+ rtx op0 = gen_reg_rtx (XFmode);
+ rtx op1 = gen_reg_rtx (XFmode);
- emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
- emit_insn (gen_frndintxf2_mask_pm (op0, op1));
- emit_insn (gen_truncxf<mode>2 (operands[0], op0));
+ emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
+ emit_insn (gen_nearbyintxf2 (op0, op1));
+ emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0));
+ }
DONE;
})
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index 97d758c..8b45ecf 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -1818,7 +1818,6 @@ subst_stack_regs_pat (rtx_insn *insn, stack_ptr regstack, rtx pat)
case UNSPEC_FRNDINT_FLOOR:
case UNSPEC_FRNDINT_CEIL:
case UNSPEC_FRNDINT_TRUNC:
- case UNSPEC_FRNDINT_MASK_PM:
/* Above insns operate on the top of the stack. */