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:
parent
e796fd77d3
commit
5e5b938aba
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue