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
This commit is contained in:
Uros Bizjak 2016-05-06 23:14:20 +02:00
parent e796fd77d3
commit 5e5b938aba
2 changed files with 52 additions and 57 deletions

View File

@ -1,3 +1,14 @@
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>
* genmddump.c (main): Convert argv from char ** to const char **.
@ -34,8 +45,7 @@
2016-05-06 David Malcolm <dmalcolm@redhat.com>
* genattr-common.c (main): Convert argv from
char ** to const char **.
* genattr-common.c (main): Convert argv from char ** to const char **.
* genattr.c (main): Likewise.
* genattrtab.c (main): Likewise.
* genautomata.c (initiate_automaton_gen): Likewise.

View File

@ -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")])
;; 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.
(define_mode_iterator DWIH [(SI "!TARGET_64BIT")
(DI "TARGET_64BIT")])
@ -5710,32 +5713,6 @@
(parallel [(set (match_dup 0) (plus:SWI48 (match_dup 0) (match_dup 2)))
(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.
(define_split
[(set (match_operand:DI 0 "register_operand")
@ -5751,6 +5728,24 @@
(clobber (reg:CC FLAGS_REG))])]
"operands[3] = gen_lowpart (SImode, operands[0]);")
;; 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)"
[(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")
@ -6237,7 +6232,7 @@
[(set (match_operand:SWI12 0 "register_operand" "=r")
(plus:SWI12
(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")))]
"!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
"#"
@ -6259,7 +6254,7 @@
(plus:SWI12
(plus:SWI12
(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 4 "immediate_operand" "i")))]
"!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
@ -6285,8 +6280,8 @@
(any_or:SWI12
(ashift:SWI12
(match_operand:SWI12 1 "index_register_operand" "l")
(match_operand:SWI12 2 "const_0_to_3_operand" "n"))
(match_operand:SWI12 3 "const_int_operand" "n")))]
(match_operand 2 "const_0_to_3_operand" "n"))
(match_operand 3 "const_int_operand" "n")))]
"(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
&& ((unsigned HOST_WIDE_INT) INTVAL (operands[3])
< (HOST_WIDE_INT_1U << INTVAL (operands[2])))"
@ -6309,8 +6304,8 @@
(any_or:SWI48
(ashift:SWI48
(match_operand:SWI48 1 "index_register_operand" "l")
(match_operand:SWI48 2 "const_0_to_3_operand" "n"))
(match_operand:SWI48 3 "const_int_operand" "n")))]
(match_operand 2 "const_0_to_3_operand" "n"))
(match_operand 3 "const_int_operand" "n")))]
"(unsigned HOST_WIDE_INT) INTVAL (operands[3])
< (HOST_WIDE_INT_1U << INTVAL (operands[2]))"
"#"
@ -10063,31 +10058,21 @@
;; Convert ashift to the lea pattern to avoid flags dependency.
(define_split
[(set (match_operand 0 "register_operand")
(ashift (match_operand 1 "index_register_operand")
(match_operand:QI 2 "const_int_operand")))
[(set (match_operand:SWI 0 "register_operand")
(ashift:SWI (match_operand:SWI 1 "index_register_operand")
(match_operand 2 "const_0_to_3_operand")))
(clobber (reg:CC FLAGS_REG))]
"GET_MODE (operands[0]) == GET_MODE (operands[1])
&& reload_completed
"reload_completed
&& 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]);
rtx pat;
if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (SImode))
{
mode = SImode;
operands[0] = gen_lowpart (mode, operands[0]);
operands[1] = gen_lowpart (mode, operands[1]);
if (<MODE>mode != <LEAMODE>mode)
{
operands[0] = gen_lowpart (<LEAMODE>mode, operands[0]);
operands[1] = gen_lowpart (<LEAMODE>mode, operands[1]);
}
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;
operands[2] = GEN_INT (1 << INTVAL (operands[2]));
})
;; Convert ashift to the lea pattern to avoid flags dependency.
@ -10095,7 +10080,7 @@
[(set (match_operand:DI 0 "register_operand")
(zero_extend:DI
(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))]
"TARGET_64BIT && reload_completed
&& REGNO (operands[0]) != REGNO (operands[1])"
@ -10103,7 +10088,7 @@
(zero_extend:DI (mult:SI (match_dup 1) (match_dup 2))))]
{
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