Commit 31daf7a3 by Uros Bizjak Committed by Uros Bizjak

i386.md (*jcc<mode>_0_i387): Macroize insn from *fp_jcc_3_387 using X87MODEF mode iterator.

	* config/i386/i386.md (*jcc<mode>_0_i387): Macroize insn
	from *fp_jcc_3_387 using X87MODEF mode iterator.
	(*jcc<mode>_0_r_i387): New.
	(*jccxf_i387): Ditto.
	(*jccxf_r_i387): Ditto.
	(*jcc<mode>_i387): Macroize insn from *fp_jcc_1_387 using
	MODEF mode iterator.
	(*jcc<mode>_r_i387): Macroize insn from *fp_jcc_1r_387 using
	MODEF mode iterator.
	(*jccu<mode>_i387): Macroize insn from *fp_jcc_2_387 using
	X87MODEF mode iterator.
	(*jccu<mode>_r_i387): Macroize insn from *fp_jcc_2r_387 using
	X87MODEF mode iterator.
	(*jcc{,u}<mode>_i387 splitters): Macroize splitters using
	X87MODEF mode iterator.
	(*jcc<X87MODEF:mode>_<SWI24:mode>_i387): Macroize insn
	from *fp_jcc_4_<mode>_387 using X87MODEF mode iterator.
	(*jcc<X87MODEF:mode>_<SWI24:mode>_r_i387): New.
	(*jcc<X87MODEF:mode>_<SWI24:mode>_i387 splitters): Macroize
	splitters using X87MODEF and SWI24 mode iterators.

From-SVN: r193734
parent f6d53c02
...@@ -4,6 +4,29 @@ ...@@ -4,6 +4,29 @@
2012-11-22 Uros Bizjak <ubizjak@gmail.com> 2012-11-22 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (*jcc<mode>_0_i387): Macroize insn
from *fp_jcc_3_387 using X87MODEF mode iterator.
(*jcc<mode>_0_r_i387): New.
(*jccxf_i387): Ditto.
(*jccxf_r_i387): Ditto.
(*jcc<mode>_i387): Macroize insn from *fp_jcc_1_387 using
MODEF mode iterator.
(*jcc<mode>_r_i387): Macroize insn from *fp_jcc_1r_387 using
MODEF mode iterator.
(*jccu<mode>_i387): Macroize insn from *fp_jcc_2_387 using
X87MODEF mode iterator.
(*jccu<mode>_r_i387): Macroize insn from *fp_jcc_2r_387 using
X87MODEF mode iterator.
(*jcc{,u}<mode>_i387 splitters): Macroize splitters using
X87MODEF mode iterator.
(*jcc<X87MODEF:mode>_<SWI24:mode>_i387): Macroize insn
from *fp_jcc_4_<mode>_387 using X87MODEF mode iterator.
(*jcc<X87MODEF:mode>_<SWI24:mode>_r_i387): New.
(*jcc<X87MODEF:mode>_<SWI24:mode>_i387 splitters): Macroize
splitters using X87MODEF and SWI24 mode iterators.
2012-11-22 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (FPCMP): New mode iterator. * config/i386/i386.md (FPCMP): New mode iterator.
(unord): New mode attribute. (unord): New mode attribute.
(*cmp<mode>_0_i387): Macroize insn from *cmpfp_0 (*cmp<mode>_0_i387): Macroize insn from *cmpfp_0
...@@ -10948,99 +10948,121 @@ ...@@ -10948,99 +10948,121 @@
;; Define combination compare-and-branch fp compare instructions to help ;; Define combination compare-and-branch fp compare instructions to help
;; combine. ;; combine.
(define_insn "*fp_jcc_1_387" (define_insn "*jcc<mode>_0_i387"
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand" "f") [(match_operand:X87MODEF 1 "register_operand" "f")
(match_operand 2 "nonimmediate_operand" "fm")]) (match_operand:X87MODEF 2 "const0_operand")])
(label_ref (match_operand 3)) (label_ref (match_operand 3))
(pc))) (pc)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))] (clobber (match_scratch:HI 4 "=a"))]
"TARGET_80387 "TARGET_80387 && !TARGET_CMOVE"
&& (GET_MODE (operands[1]) == SFmode || GET_MODE (operands[1]) == DFmode)
&& GET_MODE (operands[1]) == GET_MODE (operands[2])
&& SELECT_CC_MODE (GET_CODE (operands[0]),
operands[1], operands[2]) == CCFPmode
&& !TARGET_CMOVE"
"#") "#")
(define_insn "*fp_jcc_1r_387" (define_insn "*jcc<mode>_0_r_i387"
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand" "f") [(match_operand:X87MODEF 1 "register_operand" "f")
(match_operand 2 "nonimmediate_operand" "fm")]) (match_operand:X87MODEF 2 "const0_operand")])
(pc) (pc)
(label_ref (match_operand 3)))) (label_ref (match_operand 3))))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))] (clobber (match_scratch:HI 4 "=a"))]
"TARGET_80387 "TARGET_80387 && !TARGET_CMOVE"
&& (GET_MODE (operands[1]) == SFmode || GET_MODE (operands[1]) == DFmode)
&& GET_MODE (operands[1]) == GET_MODE (operands[2])
&& SELECT_CC_MODE (GET_CODE (operands[0]),
operands[1], operands[2]) == CCFPmode
&& !TARGET_CMOVE"
"#") "#")
(define_insn "*fp_jcc_2_387" (define_insn "*jccxf_i387"
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand" "f") [(match_operand:XF 1 "register_operand" "f")
(match_operand 2 "register_operand" "f")]) (match_operand:XF 2 "register_operand" "f")])
(label_ref (match_operand 3)) (label_ref (match_operand 3))
(pc))) (pc)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))] (clobber (match_scratch:HI 4 "=a"))]
"X87_FLOAT_MODE_P (GET_MODE (operands[1])) "TARGET_80387 && !TARGET_CMOVE"
&& GET_MODE (operands[1]) == GET_MODE (operands[2])
&& !TARGET_CMOVE"
"#") "#")
(define_insn "*fp_jcc_2r_387" (define_insn "*jccxf_r_i387"
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand" "f") [(match_operand:XF 1 "register_operand" "f")
(match_operand 2 "register_operand" "f")]) (match_operand:XF 2 "register_operand" "f")])
(pc) (pc)
(label_ref (match_operand 3)))) (label_ref (match_operand 3))))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))] (clobber (match_scratch:HI 4 "=a"))]
"X87_FLOAT_MODE_P (GET_MODE (operands[1])) "TARGET_80387 && !TARGET_CMOVE"
&& GET_MODE (operands[1]) == GET_MODE (operands[2])
&& !TARGET_CMOVE"
"#") "#")
(define_insn "*fp_jcc_3_387" (define_insn "*jcc<mode>_i387"
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand" "f") [(match_operand:MODEF 1 "register_operand" "f")
(match_operand 2 "const0_operand")]) (match_operand:MODEF 2 "nonimmediate_operand" "fm")])
(label_ref (match_operand 3)) (label_ref (match_operand 3))
(pc))) (pc)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))] (clobber (match_scratch:HI 4 "=a"))]
"X87_FLOAT_MODE_P (GET_MODE (operands[1])) "TARGET_80387 && !TARGET_CMOVE"
&& GET_MODE (operands[1]) == GET_MODE (operands[2]) "#")
&& SELECT_CC_MODE (GET_CODE (operands[0]),
operands[1], operands[2]) == CCFPmode (define_insn "*jcc<mode>_r_i387"
&& !TARGET_CMOVE" [(set (pc)
(if_then_else (match_operator:CCFP 0 "ix86_fp_comparison_operator"
[(match_operand:MODEF 1 "register_operand" "f")
(match_operand:MODEF 2 "nonimmediate_operand" "fm")])
(pc)
(label_ref (match_operand 3))))
(clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))]
"TARGET_80387 && !TARGET_CMOVE"
"#")
(define_insn "*jccu<mode>_i387"
[(set (pc)
(if_then_else (match_operator:CCFPU 0 "ix86_fp_comparison_operator"
[(match_operand:X87MODEF 1 "register_operand" "f")
(match_operand:X87MODEF 2 "register_operand" "f")])
(label_ref (match_operand 3))
(pc)))
(clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))]
"TARGET_80387 && !TARGET_CMOVE"
"#")
(define_insn "*jccu<mode>_r_i387"
[(set (pc)
(if_then_else (match_operator:CCFPU 0 "ix86_fp_comparison_operator"
[(match_operand:X87MODEF 1 "register_operand" "f")
(match_operand:X87MODEF 2 "register_operand" "f")])
(pc)
(label_ref (match_operand 3))))
(clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 4 "=a"))]
"TARGET_80387 && !TARGET_CMOVE"
"#") "#")
(define_split (define_split
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand") [(match_operand:X87MODEF 1 "register_operand")
(match_operand 2 "nonimmediate_operand")]) (match_operand:X87MODEF 2 "nonimmediate_operand")])
(match_operand 3) (match_operand 3)
(match_operand 4))) (match_operand 4)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG))] (clobber (reg:CCFP FLAGS_REG))]
"reload_completed" "TARGET_80387 && !TARGET_CMOVE
&& reload_completed"
[(const_int 0)] [(const_int 0)]
{ {
ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2], ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2],
...@@ -11051,14 +11073,15 @@ ...@@ -11051,14 +11073,15 @@
(define_split (define_split
[(set (pc) [(set (pc)
(if_then_else (match_operator 0 "ix86_fp_comparison_operator" (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
[(match_operand 1 "register_operand") [(match_operand:X87MODEF 1 "register_operand")
(match_operand 2 "general_operand")]) (match_operand:X87MODEF 2 "general_operand")])
(match_operand 3) (match_operand 3)
(match_operand 4))) (match_operand 4)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 5 "=a"))] (clobber (match_scratch:HI 5))]
"reload_completed" "TARGET_80387 && !TARGET_CMOVE
&& reload_completed"
[(const_int 0)] [(const_int 0)]
{ {
ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2], ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2],
...@@ -11066,49 +11089,63 @@ ...@@ -11066,49 +11089,63 @@
DONE; DONE;
}) })
;; The order of operands in *fp_jcc_4_387 is forced by combine in ;; The order of operands in *jcc<fp>_<int>_i387 is forced by combine in
;; simplify_comparison () function. Float operator is treated as RTX_OBJ ;; simplify_comparison () function. Float operator is treated as RTX_OBJ
;; with a precedence over other operators and is always put in the first ;; with a precedence over other operators and is always put in the first
;; place. Swap condition and operands to match ficom instruction. ;; place. Swap condition and operands to match ficom instruction.
(define_insn "*fp_jcc_4_<mode>_387" (define_insn "*jcc<X87MODEF:mode>_<SWI24:mode>_i387"
[(set (pc) [(set (pc)
(if_then_else (if_then_else
(match_operator 0 "ix86_swapped_fp_comparison_operator" (match_operator:CCFP 0 "ix86_swapped_fp_comparison_operator"
[(match_operator 1 "float_operator" [(match_operator:X87MODEF 1 "float_operator"
[(match_operand:SWI24 2 "nonimmediate_operand" "m,?r")]) [(match_operand:SWI24 2 "nonimmediate_operand" "m,?r")])
(match_operand 3 "register_operand" "f,f")]) (match_operand:X87MODEF 3 "register_operand" "f,f")])
(label_ref (match_operand 4)) (label_ref (match_operand 4))
(pc))) (pc)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 5 "=a,a"))] (clobber (match_scratch:HI 5 "=a,a"))]
"X87_FLOAT_MODE_P (GET_MODE (operands[3])) "TARGET_80387 && !TARGET_CMOVE
&& (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun)) && (TARGET_USE_<SWI24:MODE>MODE_FIOP
&& GET_MODE (operands[1]) == GET_MODE (operands[3]) || optimize_function_for_size_p (cfun))"
&& ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode "#")
&& !TARGET_CMOVE"
(define_insn "*jcc<X87MODEF:mode>_<SWI24:mode>_r_i387"
[(set (pc)
(if_then_else
(match_operator:CCFP 0 "ix86_swapped_fp_comparison_operator"
[(match_operator:X87MODEF 1 "float_operator"
[(match_operand:SWI24 2 "nonimmediate_operand" "m,?r")])
(match_operand:X87MODEF 3 "register_operand" "f,f")])
(pc)
(label_ref (match_operand 4))))
(clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 5 "=a,a"))]
"TARGET_80387 && !TARGET_CMOVE
&& (TARGET_USE_<SWI24:MODE>MODE_FIOP
|| optimize_function_for_size_p (cfun))"
"#") "#")
(define_split (define_split
[(set (pc) [(set (pc)
(if_then_else (if_then_else
(match_operator 0 "ix86_swapped_fp_comparison_operator" (match_operator:CCFP 0 "ix86_swapped_fp_comparison_operator"
[(match_operator 1 "float_operator" [(match_operator:X87MODEF 1 "float_operator"
[(match_operand:SWI24 2 "memory_operand")]) [(match_operand:SWI24 2 "memory_operand")])
(match_operand 3 "register_operand")]) (match_operand:X87MODEF 3 "register_operand")])
(match_operand 4) (match_operand 4)
(match_operand 5))) (match_operand 5)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 6 "=a"))] (clobber (match_scratch:HI 6))]
"reload_completed" "TARGET_80387 && !TARGET_CMOVE
&& reload_completed"
[(const_int 0)] [(const_int 0)]
{ {
operands[7] = gen_rtx_FLOAT (GET_MODE (operands[1]), operands[2]); ix86_split_fp_branch (swap_condition (GET_CODE (operands[0])), operands[3],
gen_rtx_FLOAT (GET_MODE (operands[1]), operands[2]),
ix86_split_fp_branch (swap_condition (GET_CODE (operands[0])),
operands[3], operands[7],
operands[4], operands[5], operands[6], NULL_RTX); operands[4], operands[5], operands[6], NULL_RTX);
DONE; DONE;
}) })
...@@ -11117,23 +11154,23 @@ ...@@ -11117,23 +11154,23 @@
(define_split (define_split
[(set (pc) [(set (pc)
(if_then_else (if_then_else
(match_operator 0 "ix86_swapped_fp_comparison_operator" (match_operator:CCFP 0 "ix86_swapped_fp_comparison_operator"
[(match_operator 1 "float_operator" [(match_operator:X87MODEF 1 "float_operator"
[(match_operand:SWI24 2 "register_operand")]) [(match_operand:SWI24 2 "register_operand")])
(match_operand 3 "register_operand")]) (match_operand:X87MODEF 3 "register_operand")])
(match_operand 4) (match_operand 4)
(match_operand 5))) (match_operand 5)))
(clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FPSR_REG))
(clobber (reg:CCFP FLAGS_REG)) (clobber (reg:CCFP FLAGS_REG))
(clobber (match_scratch:HI 6 "=a"))] (clobber (match_scratch:HI 6))]
"reload_completed" "TARGET_80387 && !TARGET_CMOVE
&& reload_completed"
[(const_int 0)] [(const_int 0)]
{ {
operands[7] = ix86_force_to_memory (GET_MODE (operands[2]), operands[2]); rtx tmp = ix86_force_to_memory (GET_MODE (operands[2]), operands[2]);
operands[7] = gen_rtx_FLOAT (GET_MODE (operands[1]), operands[7]);
ix86_split_fp_branch (swap_condition (GET_CODE (operands[0])), ix86_split_fp_branch (swap_condition (GET_CODE (operands[0])), operands[3],
operands[3], operands[7], gen_rtx_FLOAT (GET_MODE (operands[1]), tmp),
operands[4], operands[5], operands[6], operands[2]); operands[4], operands[5], operands[6], operands[2]);
DONE; DONE;
}) })
......
...@@ -1110,7 +1110,7 @@ ...@@ -1110,7 +1110,7 @@
(match_operand 0 "comparison_operator") (match_operand 0 "comparison_operator")
(match_operand 0 "ix86_trivial_fp_comparison_operator"))) (match_operand 0 "ix86_trivial_fp_comparison_operator")))
;; Same as above, but for swapped comparison used in fp_jcc_4_387. ;; Same as above, but for swapped comparison used in *jcc<fp>_<int>_i387.
(define_predicate "ix86_swapped_fp_comparison_operator" (define_predicate "ix86_swapped_fp_comparison_operator"
(match_operand 0 "comparison_operator") (match_operand 0 "comparison_operator")
{ {
......
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