Commit e54a38e8 by Uros Bizjak Committed by Uros Bizjak

i386.md (*fop_<mode>_1_mixed): Do not check for mult_operator when calculating "type" attribute.

	* config/i386/i386.md (*fop_<mode>_1_mixed): Do not check for
	mult_operator when calculating "type" attribute.
	(*fop_<mode>_1_i387): Ditto.
	(*fop_xf_1_i387): Ditto.
	(x87 stack loads peephole2): Add "reg = op (mem, reg)" peephole2.
	Use std::swap to swap operands.  Use RTL expressions to generate
	converted pattern.

From-SVN: r235561
parent 4877829b
2016-04-28 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (*fop_<mode>_1_mixed): Do not check for
mult_operator when calculating "type" attribute.
(*fop_<mode>_1_i387): Ditto.
(*fop_xf_1_i387): Ditto.
(x87 stack loads peephole2): Add "reg = op (mem, reg)" peephole2.
Use std::swap to swap operands. Use RTL expressions to generate
converted pattern.
2016-04-28 Claudiu Zissulescu <claziss@synopsys.com> 2016-04-28 Claudiu Zissulescu <claziss@synopsys.com>
Joern Rennecke <joern.rennecke@embecosm.com> Joern Rennecke <joern.rennecke@embecosm.com>
......
...@@ -14055,20 +14055,13 @@ ...@@ -14055,20 +14055,13 @@
&& !(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);"
[(set (attr "type") [(set (attr "type")
(cond [(and (eq_attr "alternative" "2,3") (if_then_else (eq_attr "alternative" "2,3")
(match_operand:MODEF 3 "mult_operator")) (if_then_else (match_operand:MODEF 3 "div_operator")
(const_string "ssemul")
(and (eq_attr "alternative" "2,3")
(match_operand:MODEF 3 "div_operator"))
(const_string "ssediv") (const_string "ssediv")
(eq_attr "alternative" "2,3") (const_string "sseadd"))
(const_string "sseadd") (if_then_else (match_operand:MODEF 3 "div_operator")
(match_operand:MODEF 3 "mult_operator")
(const_string "fmul")
(match_operand:MODEF 3 "div_operator")
(const_string "fdiv") (const_string "fdiv")
] (const_string "fop"))))
(const_string "fop")))
(set_attr "isa" "*,*,noavx,avx") (set_attr "isa" "*,*,noavx,avx")
(set_attr "prefix" "orig,orig,orig,vex") (set_attr "prefix" "orig,orig,orig,vex")
(set_attr "mode" "<MODE>") (set_attr "mode" "<MODE>")
...@@ -14090,11 +14083,8 @@ ...@@ -14090,11 +14083,8 @@
&& !(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);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:MODEF 3 "mult_operator") (if_then_else (match_operand:MODEF 3 "div_operator")
(const_string "fmul")
(match_operand:MODEF 3 "div_operator")
(const_string "fdiv") (const_string "fdiv")
]
(const_string "fop"))) (const_string "fop")))
(set_attr "mode" "<MODE>")]) (set_attr "mode" "<MODE>")])
...@@ -14109,7 +14099,7 @@ ...@@ -14109,7 +14099,7 @@
&& !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)
&& (TARGET_USE_<SWI24:MODE>MODE_FIOP && (TARGET_USE_<SWI24:MODE>MODE_FIOP
|| optimize_function_for_size_p (cfun))" || optimize_function_for_size_p (cfun))"
{ return output_387_binary_op (insn, operands); } "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:MODEF 3 "mult_operator") (cond [(match_operand:MODEF 3 "mult_operator")
(const_string "fmul") (const_string "fmul")
...@@ -14130,7 +14120,7 @@ ...@@ -14130,7 +14120,7 @@
&& !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)
&& (TARGET_USE_<SWI24:MODE>MODE_FIOP && (TARGET_USE_<SWI24:MODE>MODE_FIOP
|| optimize_function_for_size_p (cfun))" || optimize_function_for_size_p (cfun))"
{ return output_387_binary_op (insn, operands); } "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:MODEF 3 "mult_operator") (cond [(match_operand:MODEF 3 "mult_operator")
(const_string "fmul") (const_string "fmul")
...@@ -14220,11 +14210,8 @@ ...@@ -14220,11 +14210,8 @@
&& !COMMUTATIVE_ARITH_P (operands[3])" && !COMMUTATIVE_ARITH_P (operands[3])"
"* return output_387_binary_op (insn, operands);" "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:XF 3 "mult_operator") (if_then_else (match_operand:XF 3 "div_operator")
(const_string "fmul")
(match_operand:XF 3 "div_operator")
(const_string "fdiv") (const_string "fdiv")
]
(const_string "fop"))) (const_string "fop")))
(set_attr "mode" "XF")]) (set_attr "mode" "XF")])
...@@ -14236,7 +14223,7 @@ ...@@ -14236,7 +14223,7 @@
(match_operand:XF 2 "register_operand" "0")]))] (match_operand:XF 2 "register_operand" "0")]))]
"TARGET_80387 "TARGET_80387
&& (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))" && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
{ return output_387_binary_op (insn, operands); } "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:XF 3 "mult_operator") (cond [(match_operand:XF 3 "mult_operator")
(const_string "fmul") (const_string "fmul")
...@@ -14255,7 +14242,7 @@ ...@@ -14255,7 +14242,7 @@
(match_operand:SWI24 2 "nonimmediate_operand" "m"))]))] (match_operand:SWI24 2 "nonimmediate_operand" "m"))]))]
"TARGET_80387 "TARGET_80387
&& (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))" && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
{ return output_387_binary_op (insn, operands); } "* return output_387_binary_op (insn, operands);"
[(set (attr "type") [(set (attr "type")
(cond [(match_operand:XF 3 "mult_operator") (cond [(match_operand:XF 3 "mult_operator")
(const_string "fmul") (const_string "fmul")
...@@ -17394,6 +17381,7 @@ ...@@ -17394,6 +17381,7 @@
;; fmul bb fmul %st(1), %st ;; fmul bb fmul %st(1), %st
;; ;;
;; Actually we only match the last two instructions for simplicity. ;; Actually we only match the last two instructions for simplicity.
(define_peephole2 (define_peephole2
[(set (match_operand 0 "fp_register_operand") [(set (match_operand 0 "fp_register_operand")
(match_operand 1 "fp_register_operand")) (match_operand 1 "fp_register_operand"))
...@@ -17403,21 +17391,39 @@ ...@@ -17403,21 +17391,39 @@
(match_operand 3 "memory_operand")]))] (match_operand 3 "memory_operand")]))]
"REGNO (operands[0]) != REGNO (operands[1])" "REGNO (operands[0]) != REGNO (operands[1])"
[(set (match_dup 0) (match_dup 3)) [(set (match_dup 0) (match_dup 3))
(set (match_dup 0) (match_dup 4))] (set (match_dup 0)
(match_op_dup 2
;; The % modifier is not operational anymore in peephole2's, so we have to [(match_dup 5) (match_dup 4)]))]
;; swap the operands manually in the case of addition and multiplication.
{ {
rtx op0, op1; operands[4] = operands[0];
operands[5] = operands[1];
/* The % modifier is not operational anymore in peephole2's, so we have to
swap the operands manually in the case of addition and multiplication. */
if (COMMUTATIVE_ARITH_P (operands[2])) if (COMMUTATIVE_ARITH_P (operands[2]))
op0 = operands[0], op1 = operands[1]; std::swap (operands[4], operands[5]);
else })
op0 = operands[1], op1 = operands[0];
(define_peephole2
[(set (match_operand 0 "fp_register_operand")
(match_operand 1 "fp_register_operand"))
(set (match_dup 0)
(match_operator 2 "binary_fp_operator"
[(match_operand 3 "memory_operand")
(match_dup 0)]))]
"REGNO (operands[0]) != REGNO (operands[1])"
[(set (match_dup 0) (match_dup 3))
(set (match_dup 0)
(match_op_dup 2
[(match_dup 4) (match_dup 5)]))]
{
operands[4] = operands[0];
operands[5] = operands[1];
operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[2]), /* The % modifier is not operational anymore in peephole2's, so we have to
GET_MODE (operands[2]), swap the operands manually in the case of addition and multiplication. */
op0, op1); if (COMMUTATIVE_ARITH_P (operands[2]))
std::swap (operands[4], operands[5]);
}) })
;; Conditional addition patterns ;; Conditional addition patterns
......
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