aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2016-05-02 11:49:39 +0200
committerUros Bizjak <uros@gcc.gnu.org>2016-05-02 11:49:39 +0200
commitebae28e91ba5a5df5b59e2b114deeb080ec82b27 (patch)
treea15ebd7e29e7fd3474467a62879e9bdcdb4addab /gcc
parenteff69022b3937d69e567c2ce397af7a601d3c64b (diff)
downloadgcc-ebae28e91ba5a5df5b59e2b114deeb080ec82b27.zip
gcc-ebae28e91ba5a5df5b59e2b114deeb080ec82b27.tar.gz
gcc-ebae28e91ba5a5df5b59e2b114deeb080ec82b27.tar.bz2
predicates.md (nonimm_ssenomem_operand): New predicate.
* config/i386/predicates.md (nonimm_ssenomem_operand): New predicate. (register_mixssei387nonimm_operand): Remove predicate. * config/i386/i386.md (*fop_<mode>_comm): Merge from *fop_<mode>_comm_mixed and *fop_<mode>_comm_i387. Disable unsupported alternatives using "enabled" attribute. Also check X87_ENABLE_ARITH for TARGET_MIX_SSE_I387 alternatives. (*fop_<mode>_1): Merge from *fop_<mode>_1_mixed and *fop_<mode>_1_i387. Disable unsupported alternatives using "enabled" attribute. Use nonimm_ssenomem_operand as operand 1 predicate. Also check X87_ENABLE_ARITH for TARGET_MIX_SSE_I387 alternatives. * config/i386/predicates.md (nonimm_ssenomem_operand): New predicate. (register_mixssei387nonimm_operand): Remove predicate. From-SVN: r235727
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/config/i386/i386.md83
-rw-r--r--gcc/config/i386/predicates.md13
3 files changed, 56 insertions, 55 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7ea67aa..3982115 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+2016-05-02 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/predicates.md (nonimm_ssenomem_operand): New predicate.
+ (register_mixssei387nonimm_operand): Remove predicate.
+ * config/i386/i386.md (*fop_<mode>_comm): Merge from
+ *fop_<mode>_comm_mixed and *fop_<mode>_comm_i387. Disable unsupported
+ alternatives using "enabled" attribute. Also check X87_ENABLE_ARITH
+ for TARGET_MIX_SSE_I387 alternatives.
+ (*fop_<mode>_1): Merge from *fop_<mode>_1_mixed and *fop_<mode>_1_i387.
+ Disable unsupported alternatives using "enabled" attribute. Use
+ nonimm_ssenomem_operand as operand 1 predicate. Also check
+ X87_ENABLE_ARITH for TARGET_MIX_SSE_I387 alternatives.
+ * config/i386/predicates.md (nonimm_ssenomem_operand): New predicate.
+ (register_mixssei387nonimm_operand): Remove predicate.
+
2016-05-02 Richard Sandiford <richard.sandiford@arm.com>
* tree.c (cst_and_fits_in_hwi): Simplify.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index b2d3b72..f4d33c5 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -13989,12 +13989,13 @@
;; Gcc is slightly more smart about handling normal two address instructions
;; so use special patterns for add and mull.
-(define_insn "*fop_<mode>_comm_mixed"
+(define_insn "*fop_<mode>_comm"
[(set (match_operand:MODEF 0 "register_operand" "=f,x,v")
(match_operator:MODEF 3 "binary_fp_operator"
[(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v")
(match_operand:MODEF 2 "nonimmediate_operand" "fm,xm,vm")]))]
- "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
+ "((SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+ || (TARGET_80387 && X87_ENABLE_ARITH (<MODE>mode)))
&& COMMUTATIVE_ARITH_P (operands[3])
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
"* return output_387_binary_op (insn, operands);"
@@ -14010,25 +14011,17 @@
(set_attr "prefix" "orig,orig,vex")
(set_attr "mode" "<MODE>")
(set (attr "enabled")
- (cond [(eq_attr "alternative" "0")
- (symbol_ref "TARGET_MIX_SSE_I387")
- ]
- (const_string "*")))])
-
-(define_insn "*fop_<mode>_comm_i387"
- [(set (match_operand:MODEF 0 "register_operand" "=f")
- (match_operator:MODEF 3 "binary_fp_operator"
- [(match_operand:MODEF 1 "nonimmediate_operand" "%0")
- (match_operand:MODEF 2 "nonimmediate_operand" "fm")]))]
- "TARGET_80387 && X87_ENABLE_ARITH (<MODE>mode)
- && COMMUTATIVE_ARITH_P (operands[3])
- && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
- "* return output_387_binary_op (insn, operands);"
- [(set (attr "type")
- (if_then_else (match_operand:MODEF 3 "mult_operator")
- (const_string "fmul")
- (const_string "fop")))
- (set_attr "mode" "<MODE>")])
+ (if_then_else
+ (match_test ("SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"))
+ (if_then_else
+ (eq_attr "alternative" "0")
+ (symbol_ref "TARGET_MIX_SSE_I387
+ && X87_ENABLE_ARITH (<MODE>mode)")
+ (const_string "*"))
+ (if_then_else
+ (eq_attr "alternative" "0")
+ (symbol_ref "true")
+ (symbol_ref "false"))))])
(define_insn "*rcpsf2_sse"
[(set (match_operand:SF 0 "register_operand" "=x")
@@ -14042,14 +14035,15 @@
(set_attr "prefix" "maybe_vex")
(set_attr "mode" "SF")])
-(define_insn "*fop_<mode>_1_mixed"
+(define_insn "*fop_<mode>_1"
[(set (match_operand:MODEF 0 "register_operand" "=f,f,x,v")
(match_operator:MODEF 3 "binary_fp_operator"
[(match_operand:MODEF 1
- "register_mixssei387nonimm_operand" "0,fm,0,v")
+ "nonimm_ssenomem_operand" "0,fm,0,v")
(match_operand:MODEF 2
- "nonimmediate_operand" "fm,0,xm,vm")]))]
- "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
+ "nonimmediate_operand" "fm,0,xm,vm")]))]
+ "((SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+ || (TARGET_80387 && X87_ENABLE_ARITH (<MODE>mode)))
&& !COMMUTATIVE_ARITH_P (operands[3])
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
"* return output_387_binary_op (insn, operands);"
@@ -14065,27 +14059,17 @@
(set_attr "prefix" "orig,orig,orig,vex")
(set_attr "mode" "<MODE>")
(set (attr "enabled")
- (cond [(eq_attr "alternative" "0,1")
- (symbol_ref "TARGET_MIX_SSE_I387")
- ]
- (const_string "*")))])
-
-;; This pattern is not fully shadowed by the pattern above.
-(define_insn "*fop_<mode>_1_i387"
- [(set (match_operand:MODEF 0 "register_operand" "=f,f")
- (match_operator:MODEF 3 "binary_fp_operator"
- [(match_operand:MODEF 1 "nonimmediate_operand" "0,fm")
- (match_operand:MODEF 2 "nonimmediate_operand" "fm,0")]))]
- "TARGET_80387 && X87_ENABLE_ARITH (<MODE>mode)
- && !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
- && !COMMUTATIVE_ARITH_P (operands[3])
- && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
- "* return output_387_binary_op (insn, operands);"
- [(set (attr "type")
- (if_then_else (match_operand:MODEF 3 "div_operator")
- (const_string "fdiv")
- (const_string "fop")))
- (set_attr "mode" "<MODE>")])
+ (if_then_else
+ (match_test ("SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"))
+ (if_then_else
+ (eq_attr "alternative" "0,1")
+ (symbol_ref "TARGET_MIX_SSE_I387
+ && X87_ENABLE_ARITH (<MODE>mode)")
+ (const_string "*"))
+ (if_then_else
+ (eq_attr "alternative" "0,1")
+ (symbol_ref "true")
+ (symbol_ref "false"))))])
;; ??? Add SSE splitters for these!
(define_insn "*fop_<MODEF:mode>_2_i387"
@@ -14137,8 +14121,7 @@
(match_operand:SF 1 "nonimmediate_operand" "fm,0"))
(match_operand:DF 2 "register_operand" "0,f")]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode)
- && !(TARGET_SSE2 && TARGET_SSE_MATH)
- && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
+ && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
"* return output_387_binary_op (insn, operands);"
[(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator")
@@ -14156,7 +14139,7 @@
(float_extend:DF
(match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode)
- && !(TARGET_SSE2 && TARGET_SSE_MATH)"
+ && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
"* return output_387_binary_op (insn, operands);"
[(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator")
@@ -14175,7 +14158,7 @@
(float_extend:DF
(match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode)
- && !(TARGET_SSE2 && TARGET_SSE_MATH)"
+ && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
"* return output_387_binary_op (insn, operands);"
[(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator")
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index d15dae4..fe9bb2b 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -121,11 +121,14 @@
(match_operand 0 "nonmemory_operand")
(match_operand 0 "general_operand")))
-;; Match register operands, include memory operand for TARGET_MIX_SSE_I387.
-(define_predicate "register_mixssei387nonimm_operand"
- (if_then_else (match_test "TARGET_MIX_SSE_I387")
- (match_operand 0 "nonimmediate_operand")
- (match_operand 0 "register_operand")))
+;; Match nonimmediate operands, but exclude memory operands
+;; for TARGET_SSE_MATH if TARGET_MIX_SSE_I387 is not enabled.
+(define_predicate "nonimm_ssenomem_operand"
+ (if_then_else
+ (and (match_test "SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH")
+ (not (match_test "TARGET_MIX_SSE_I387 && X87_ENABLE_ARITH (mode)")))
+ (match_operand 0 "register_operand")
+ (match_operand 0 "nonimmediate_operand")))
;; Match register operands, include memory operand for TARGET_SSE4_1.
(define_predicate "register_sse4nonimm_operand"