Commit ebae28e9 by Uros Bizjak Committed by Uros Bizjak

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
parent eff69022
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> 2016-05-02 Richard Sandiford <richard.sandiford@arm.com>
* tree.c (cst_and_fits_in_hwi): Simplify. * tree.c (cst_and_fits_in_hwi): Simplify.
......
...@@ -13989,12 +13989,13 @@ ...@@ -13989,12 +13989,13 @@
;; Gcc is slightly more smart about handling normal two address instructions ;; Gcc is slightly more smart about handling normal two address instructions
;; so use special patterns for add and mull. ;; 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") [(set (match_operand:MODEF 0 "register_operand" "=f,x,v")
(match_operator:MODEF 3 "binary_fp_operator" (match_operator:MODEF 3 "binary_fp_operator"
[(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v") [(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v")
(match_operand:MODEF 2 "nonimmediate_operand" "fm,xm,vm")]))] (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]) && COMMUTATIVE_ARITH_P (operands[3])
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))" && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
"* return output_387_binary_op (insn, operands);" "* return output_387_binary_op (insn, operands);"
...@@ -14010,25 +14011,17 @@ ...@@ -14010,25 +14011,17 @@
(set_attr "prefix" "orig,orig,vex") (set_attr "prefix" "orig,orig,vex")
(set_attr "mode" "<MODE>") (set_attr "mode" "<MODE>")
(set (attr "enabled") (set (attr "enabled")
(cond [(eq_attr "alternative" "0") (if_then_else
(symbol_ref "TARGET_MIX_SSE_I387") (match_test ("SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"))
] (if_then_else
(const_string "*")))]) (eq_attr "alternative" "0")
(symbol_ref "TARGET_MIX_SSE_I387
(define_insn "*fop_<mode>_comm_i387" && X87_ENABLE_ARITH (<MODE>mode)")
[(set (match_operand:MODEF 0 "register_operand" "=f") (const_string "*"))
(match_operator:MODEF 3 "binary_fp_operator" (if_then_else
[(match_operand:MODEF 1 "nonimmediate_operand" "%0") (eq_attr "alternative" "0")
(match_operand:MODEF 2 "nonimmediate_operand" "fm")]))] (symbol_ref "true")
"TARGET_80387 && X87_ENABLE_ARITH (<MODE>mode) (symbol_ref "false"))))])
&& 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>")])
(define_insn "*rcpsf2_sse" (define_insn "*rcpsf2_sse"
[(set (match_operand:SF 0 "register_operand" "=x") [(set (match_operand:SF 0 "register_operand" "=x")
...@@ -14042,14 +14035,15 @@ ...@@ -14042,14 +14035,15 @@
(set_attr "prefix" "maybe_vex") (set_attr "prefix" "maybe_vex")
(set_attr "mode" "SF")]) (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") [(set (match_operand:MODEF 0 "register_operand" "=f,f,x,v")
(match_operator:MODEF 3 "binary_fp_operator" (match_operator:MODEF 3 "binary_fp_operator"
[(match_operand:MODEF 1 [(match_operand:MODEF 1
"register_mixssei387nonimm_operand" "0,fm,0,v") "nonimm_ssenomem_operand" "0,fm,0,v")
(match_operand:MODEF 2 (match_operand:MODEF 2
"nonimmediate_operand" "fm,0,xm,vm")]))] "nonimmediate_operand" "fm,0,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]) && !COMMUTATIVE_ARITH_P (operands[3])
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))" && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
"* return output_387_binary_op (insn, operands);" "* return output_387_binary_op (insn, operands);"
...@@ -14065,27 +14059,17 @@ ...@@ -14065,27 +14059,17 @@
(set_attr "prefix" "orig,orig,orig,vex") (set_attr "prefix" "orig,orig,orig,vex")
(set_attr "mode" "<MODE>") (set_attr "mode" "<MODE>")
(set (attr "enabled") (set (attr "enabled")
(cond [(eq_attr "alternative" "0,1") (if_then_else
(symbol_ref "TARGET_MIX_SSE_I387") (match_test ("SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"))
] (if_then_else
(const_string "*")))]) (eq_attr "alternative" "0,1")
(symbol_ref "TARGET_MIX_SSE_I387
;; This pattern is not fully shadowed by the pattern above. && X87_ENABLE_ARITH (<MODE>mode)")
(define_insn "*fop_<mode>_1_i387" (const_string "*"))
[(set (match_operand:MODEF 0 "register_operand" "=f,f") (if_then_else
(match_operator:MODEF 3 "binary_fp_operator" (eq_attr "alternative" "0,1")
[(match_operand:MODEF 1 "nonimmediate_operand" "0,fm") (symbol_ref "true")
(match_operand:MODEF 2 "nonimmediate_operand" "fm,0")]))] (symbol_ref "false"))))])
"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>")])
;; ??? Add SSE splitters for these! ;; ??? Add SSE splitters for these!
(define_insn "*fop_<MODEF:mode>_2_i387" (define_insn "*fop_<MODEF:mode>_2_i387"
...@@ -14137,8 +14121,7 @@ ...@@ -14137,8 +14121,7 @@
(match_operand:SF 1 "nonimmediate_operand" "fm,0")) (match_operand:SF 1 "nonimmediate_operand" "fm,0"))
(match_operand:DF 2 "register_operand" "0,f")]))] (match_operand:DF 2 "register_operand" "0,f")]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode) "TARGET_80387 && X87_ENABLE_ARITH (DFmode)
&& !(TARGET_SSE2 && TARGET_SSE_MATH) && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
"* return output_387_binary_op (insn, operands);" "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator") (cond [(match_operand:DF 3 "mult_operator")
...@@ -14156,7 +14139,7 @@ ...@@ -14156,7 +14139,7 @@
(float_extend:DF (float_extend:DF
(match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))] (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode) "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);" "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator") (cond [(match_operand:DF 3 "mult_operator")
...@@ -14175,7 +14158,7 @@ ...@@ -14175,7 +14158,7 @@
(float_extend:DF (float_extend:DF
(match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))] (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
"TARGET_80387 && X87_ENABLE_ARITH (DFmode) "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);" "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:DF 3 "mult_operator") (cond [(match_operand:DF 3 "mult_operator")
......
...@@ -121,11 +121,14 @@ ...@@ -121,11 +121,14 @@
(match_operand 0 "nonmemory_operand") (match_operand 0 "nonmemory_operand")
(match_operand 0 "general_operand"))) (match_operand 0 "general_operand")))
;; Match register operands, include memory operand for TARGET_MIX_SSE_I387. ;; Match nonimmediate operands, but exclude memory operands
(define_predicate "register_mixssei387nonimm_operand" ;; for TARGET_SSE_MATH if TARGET_MIX_SSE_I387 is not enabled.
(if_then_else (match_test "TARGET_MIX_SSE_I387") (define_predicate "nonimm_ssenomem_operand"
(match_operand 0 "nonimmediate_operand") (if_then_else
(match_operand 0 "register_operand"))) (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. ;; Match register operands, include memory operand for TARGET_SSE4_1.
(define_predicate "register_sse4nonimm_operand" (define_predicate "register_sse4nonimm_operand"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment