Commit 5e5b938a by Uros Bizjak

i386.md (LEAMODE): New mode attribute.

	* config/i386/i386.md (LEAMODE): New mode attribute.
	(plus to LEA splitter): Rewrite splitter using LEAMODE mode attribute.
	(ashift to LEA splitter): Rewrte splitter using SWI mode iterator
	and LEAMODE mode attribute.  Use VOIDmode const_0_to_3_operand as
	operand 2 predicate.
	(*lea<mode>_general_2): Use VOIDmode for const248_operand.
	(*lea<mode>_general_3): Ditto.
	(*lea<mode>_general_4): Use VOIDmode for const_0_to_3_operand.

From-SVN: r235987
parent e796fd77
2016-05-06 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (LEAMODE): New mode attribute.
(plus to LEA splitter): Rewrite splitter using LEAMODE mode attribute.
(ashift to LEA splitter): Rewrte splitter using SWI mode iterator
and LEAMODE mode attribute. Use VOIDmode const_0_to_3_operand as
operand 2 predicate.
(*lea<mode>_general_2): Use VOIDmode for const248_operand.
(*lea<mode>_general_3): Ditto.
(*lea<mode>_general_4): Use VOIDmode for const_0_to_3_operand.
2016-05-06 Jakub Jelinek <jakub@redhat.com> 2016-05-06 Jakub Jelinek <jakub@redhat.com>
* genmddump.c (main): Convert argv from char ** to const char **. * genmddump.c (main): Convert argv from char ** to const char **.
...@@ -34,8 +45,7 @@ ...@@ -34,8 +45,7 @@
2016-05-06 David Malcolm <dmalcolm@redhat.com> 2016-05-06 David Malcolm <dmalcolm@redhat.com>
* genattr-common.c (main): Convert argv from * genattr-common.c (main): Convert argv from char ** to const char **.
char ** to const char **.
* genattr.c (main): Likewise. * genattr.c (main): Likewise.
* genattrtab.c (main): Likewise. * genattrtab.c (main): Likewise.
* genautomata.c (initiate_automaton_gen): Likewise. * genautomata.c (initiate_automaton_gen): Likewise.
......
...@@ -1024,6 +1024,9 @@ ...@@ -1024,6 +1024,9 @@
(define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")]) (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")])
(define_mode_attr dwi [(QI "hi") (HI "si") (SI "di") (DI "ti")]) (define_mode_attr dwi [(QI "hi") (HI "si") (SI "di") (DI "ti")])
;; LEA mode corresponding to an integer mode
(define_mode_attr LEAMODE [(QI "SI") (HI "SI") (SI "SI") (DI "DI")])
;; Half mode for double word integer modes. ;; Half mode for double word integer modes.
(define_mode_iterator DWIH [(SI "!TARGET_64BIT") (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
(DI "TARGET_64BIT")]) (DI "TARGET_64BIT")])
...@@ -5710,32 +5713,6 @@ ...@@ -5710,32 +5713,6 @@
(parallel [(set (match_dup 0) (plus:SWI48 (match_dup 0) (match_dup 2))) (parallel [(set (match_dup 0) (plus:SWI48 (match_dup 0) (match_dup 2)))
(clobber (reg:CC FLAGS_REG))])]) (clobber (reg:CC FLAGS_REG))])])
;; Convert add to the lea pattern to avoid flags dependency.
(define_split
[(set (match_operand:SWI 0 "register_operand")
(plus:SWI (match_operand:SWI 1 "register_operand")
(match_operand:SWI 2 "<nonmemory_operand>")))
(clobber (reg:CC FLAGS_REG))]
"reload_completed && ix86_lea_for_add_ok (insn, operands)"
[(const_int 0)]
{
machine_mode mode = <MODE>mode;
rtx pat;
if (<MODE_SIZE> < GET_MODE_SIZE (SImode))
{
mode = SImode;
operands[0] = gen_lowpart (mode, operands[0]);
operands[1] = gen_lowpart (mode, operands[1]);
operands[2] = gen_lowpart (mode, operands[2]);
}
pat = gen_rtx_PLUS (mode, operands[1], operands[2]);
emit_insn (gen_rtx_SET (operands[0], pat));
DONE;
})
;; Split non destructive adds if we cannot use lea. ;; Split non destructive adds if we cannot use lea.
(define_split (define_split
[(set (match_operand:DI 0 "register_operand") [(set (match_operand:DI 0 "register_operand")
...@@ -5753,6 +5730,24 @@ ...@@ -5753,6 +5730,24 @@
;; Convert add to the lea pattern to avoid flags dependency. ;; Convert add to the lea pattern to avoid flags dependency.
(define_split (define_split
[(set (match_operand:SWI 0 "register_operand")
(plus:SWI (match_operand:SWI 1 "register_operand")
(match_operand:SWI 2 "<nonmemory_operand>")))
(clobber (reg:CC FLAGS_REG))]
"reload_completed && ix86_lea_for_add_ok (insn, operands)"
[(set (match_dup 0)
(plus:<LEAMODE> (match_dup 1) (match_dup 2)))]
{
if (<MODE>mode != <LEAMODE>mode)
{
operands[0] = gen_lowpart (<LEAMODE>mode, operands[0]);
operands[1] = gen_lowpart (<LEAMODE>mode, operands[1]);
operands[2] = gen_lowpart (<LEAMODE>mode, operands[2]);
}
})
;; Convert add to the lea pattern to avoid flags dependency.
(define_split
[(set (match_operand:DI 0 "register_operand") [(set (match_operand:DI 0 "register_operand")
(zero_extend:DI (zero_extend:DI
(plus:SI (match_operand:SI 1 "register_operand") (plus:SI (match_operand:SI 1 "register_operand")
...@@ -6237,7 +6232,7 @@ ...@@ -6237,7 +6232,7 @@
[(set (match_operand:SWI12 0 "register_operand" "=r") [(set (match_operand:SWI12 0 "register_operand" "=r")
(plus:SWI12 (plus:SWI12
(mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l") (mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l")
(match_operand:SWI12 2 "const248_operand" "n")) (match_operand 2 "const248_operand" "n"))
(match_operand:SWI12 3 "nonmemory_operand" "ri")))] (match_operand:SWI12 3 "nonmemory_operand" "ri")))]
"!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)" "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
"#" "#"
...@@ -6259,7 +6254,7 @@ ...@@ -6259,7 +6254,7 @@
(plus:SWI12 (plus:SWI12
(plus:SWI12 (plus:SWI12
(mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l") (mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l")
(match_operand:SWI12 2 "const248_operand" "n")) (match_operand 2 "const248_operand" "n"))
(match_operand:SWI12 3 "register_operand" "r")) (match_operand:SWI12 3 "register_operand" "r"))
(match_operand:SWI12 4 "immediate_operand" "i")))] (match_operand:SWI12 4 "immediate_operand" "i")))]
"!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)" "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
...@@ -6285,8 +6280,8 @@ ...@@ -6285,8 +6280,8 @@
(any_or:SWI12 (any_or:SWI12
(ashift:SWI12 (ashift:SWI12
(match_operand:SWI12 1 "index_register_operand" "l") (match_operand:SWI12 1 "index_register_operand" "l")
(match_operand:SWI12 2 "const_0_to_3_operand" "n")) (match_operand 2 "const_0_to_3_operand" "n"))
(match_operand:SWI12 3 "const_int_operand" "n")))] (match_operand 3 "const_int_operand" "n")))]
"(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)) "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
&& ((unsigned HOST_WIDE_INT) INTVAL (operands[3]) && ((unsigned HOST_WIDE_INT) INTVAL (operands[3])
< (HOST_WIDE_INT_1U << INTVAL (operands[2])))" < (HOST_WIDE_INT_1U << INTVAL (operands[2])))"
...@@ -6309,8 +6304,8 @@ ...@@ -6309,8 +6304,8 @@
(any_or:SWI48 (any_or:SWI48
(ashift:SWI48 (ashift:SWI48
(match_operand:SWI48 1 "index_register_operand" "l") (match_operand:SWI48 1 "index_register_operand" "l")
(match_operand:SWI48 2 "const_0_to_3_operand" "n")) (match_operand 2 "const_0_to_3_operand" "n"))
(match_operand:SWI48 3 "const_int_operand" "n")))] (match_operand 3 "const_int_operand" "n")))]
"(unsigned HOST_WIDE_INT) INTVAL (operands[3]) "(unsigned HOST_WIDE_INT) INTVAL (operands[3])
< (HOST_WIDE_INT_1U << INTVAL (operands[2]))" < (HOST_WIDE_INT_1U << INTVAL (operands[2]))"
"#" "#"
...@@ -10063,31 +10058,21 @@ ...@@ -10063,31 +10058,21 @@
;; Convert ashift to the lea pattern to avoid flags dependency. ;; Convert ashift to the lea pattern to avoid flags dependency.
(define_split (define_split
[(set (match_operand 0 "register_operand") [(set (match_operand:SWI 0 "register_operand")
(ashift (match_operand 1 "index_register_operand") (ashift:SWI (match_operand:SWI 1 "index_register_operand")
(match_operand:QI 2 "const_int_operand"))) (match_operand 2 "const_0_to_3_operand")))
(clobber (reg:CC FLAGS_REG))] (clobber (reg:CC FLAGS_REG))]
"GET_MODE (operands[0]) == GET_MODE (operands[1]) "reload_completed
&& reload_completed
&& REGNO (operands[0]) != REGNO (operands[1])" && REGNO (operands[0]) != REGNO (operands[1])"
[(const_int 0)] [(set (match_dup 0)
(mult:<LEAMODE> (match_dup 1) (match_dup 2)))]
{ {
machine_mode mode = GET_MODE (operands[0]); if (<MODE>mode != <LEAMODE>mode)
rtx pat; {
operands[0] = gen_lowpart (<LEAMODE>mode, operands[0]);
if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (SImode)) operands[1] = gen_lowpart (<LEAMODE>mode, operands[1]);
{
mode = SImode;
operands[0] = gen_lowpart (mode, operands[0]);
operands[1] = gen_lowpart (mode, operands[1]);
} }
operands[2] = GEN_INT (1 << INTVAL (operands[2]));
operands[2] = gen_int_mode (1 << INTVAL (operands[2]), mode);
pat = gen_rtx_MULT (mode, operands[1], operands[2]);
emit_insn (gen_rtx_SET (operands[0], pat));
DONE;
}) })
;; Convert ashift to the lea pattern to avoid flags dependency. ;; Convert ashift to the lea pattern to avoid flags dependency.
...@@ -10095,7 +10080,7 @@ ...@@ -10095,7 +10080,7 @@
[(set (match_operand:DI 0 "register_operand") [(set (match_operand:DI 0 "register_operand")
(zero_extend:DI (zero_extend:DI
(ashift:SI (match_operand:SI 1 "index_register_operand") (ashift:SI (match_operand:SI 1 "index_register_operand")
(match_operand:QI 2 "const_int_operand")))) (match_operand 2 "const_0_to_3_operand"))))
(clobber (reg:CC FLAGS_REG))] (clobber (reg:CC FLAGS_REG))]
"TARGET_64BIT && reload_completed "TARGET_64BIT && reload_completed
&& REGNO (operands[0]) != REGNO (operands[1])" && REGNO (operands[0]) != REGNO (operands[1])"
...@@ -10103,7 +10088,7 @@ ...@@ -10103,7 +10088,7 @@
(zero_extend:DI (mult:SI (match_dup 1) (match_dup 2))))] (zero_extend:DI (mult:SI (match_dup 1) (match_dup 2))))]
{ {
operands[1] = gen_lowpart (SImode, operands[1]); operands[1] = gen_lowpart (SImode, operands[1]);
operands[2] = gen_int_mode (1 << INTVAL (operands[2]), SImode); operands[2] = GEN_INT (1 << INTVAL (operands[2]));
}) })
;; This pattern can't accept a variable shift count, since shifts by ;; This pattern can't accept a variable shift count, since shifts by
......
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