diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2016-05-02 11:49:39 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2016-05-02 11:49:39 +0200 |
commit | ebae28e91ba5a5df5b59e2b114deeb080ec82b27 (patch) | |
tree | a15ebd7e29e7fd3474467a62879e9bdcdb4addab /gcc | |
parent | eff69022b3937d69e567c2ce397af7a601d3c64b (diff) | |
download | gcc-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/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 83 | ||||
-rw-r--r-- | gcc/config/i386/predicates.md | 13 |
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" |