Message ID | 000001cdce17$eca26dd0$c5e74970$@yorsh@arm.com |
---|---|
State | New |
Headers | show |
; ??? Check Thumb-2 split length (define_insn_and_split "*arm_subsi3_insn" - [(set (match_operand:SI 0 "s_register_operand" "=r,r,rk,r") - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,rk,r") + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] "TARGET_32BIT" "@ rsb%?\\t%0, %2, %1 sub%?\\t%0, %1, %2 sub%?\\t%0, %1, %2 + sub%?\\t%0, %1, %2 #" "&& (CONST_INT_P (operands[1]) && !const_ok_for_arm (INTVAL (operands[1])))" @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn INTVAL (operands[1]), operands[0], operands[2], 0); DONE; " - [(set_attr "length" "4,4,4,16") - (set_attr "predicable" "yes")] + [(set_attr "length" "4,4,4,4,16") + (set_attr "predicable" "yes") + (set_attr "type" "*,simple_alu_imm,*,*,*")] ) There's something wrong here. MINUS (reg, imm) should be canonicalized elsewhere to PLUS (reg, -imm), so the alternative you've split /should/ never match anything. On the other hand, you haven't split the first alternative (that generates RSB), which is a legitimate use of an immediate in MINUS. Otherwise, OK. R. On 29/11/12 09:57, Greta Yorsh wrote: > For attribute named "type", subdivide "alu" into "alu_reg" and > "simple_alu_imm". > Set type attribute as appropriate in define_insn patterns with immediate > operands. > Update pipeline descriptions to use the new values of type attribute. > > No regression on qemu arm-none-eabi -mcpu=cortex-a15/cortex-a7. > > Bootstrap successful on Cortex-A15. > > No difference in generated assembly when compiling all of preprocessed > sources of gcc 4.8 as a test in various configurations: -mcpu=cortex-a15 > -march=armv6t2 -marm/-mthumb -O0/-O1/-O2/-O3/-Os. > > The motivation for this patch is cortex-a7 pipeline description, which will > be submitted separately. > > Ok for trunk? > > Thanks, > Greta > > ChangeLog > > gcc/ > > 2012-11-28 Ramana Radhakrishnan <Ramana.Radhakrishnan@arm.com> > Greta Yorsh <Greta.Yorsh@arm.com> > > * config/arm/arm.md (type): Subdivide "alu" into "alu_reg" and > "simple_alu_imm". > (core_cycles): Use new names. > (arm_addsi3): Set type attribute for patterns involving > simple_alu_imm. > (addsi3_compare0, addsi3_compare0_scratch): Likewise. > (addsi3_compare_op1, addsi3_compare_op2, compare_addsi2_op0): > Likewise. > (compare_addsi2_op1, arm_subsi3_insn, subsi3_compare0): Likewise. > (subsi3_compare, arm_decscc,arm_andsi3_insn): Likewise. > (thumb1_andsi3_insn, andsi3_compare0_scratch): Likewise. > (zeroextractsi_compare0_scratch, iorsi3_insn, iorsi3_compare0): > Likewise. > (iorsi3_compare0_scratch, arm_xorsi3, thumb1_xorsi3_insn): Likewise. > (xorsi3_compare0, xorsi3_compare0_scratch, thumb1_zero_extendhisi2): > Likewise. > (arm_zero_extendhisi2_v6, thumb1_zero_extendqisi2_v): Likewise. > (arm_zero_extendqisi2_v6, thumb1_extendhisi2, arm_extendqisi_v6): > Likewise. > (thumb1_extendqisi2, arm_movsi_insn): Likewise. > (movsi_compare0, movhi_insn_arch4, movhi_bytes): Likewise. > (arm_movqi_insn, thumb1_movqi_insn, arm_cmpsi_insn): Likewise. > (movsicc_insn, if_plus_move, if_move_plus): Likewise. > * config/arm/neon.md (neon_mov<mode>/VDX): Likewise. > (neon_mov<mode>/VQXMOV): Likewise. > * config/arm/arm1020e.md (1020alu_op): Likewise. > * config/arm/fmp626.md (mp626_alu_op): Likewise. > * config/arm/fa726te.md (726te_alu_op): Likewise. > * config/arm/fa626te.md (626te_alu_op): Likewise. > * config/arm/fa606te.md (606te_alu_op): Likewise. > * config/arm/fa526.md (526_alu_op): Likewise. > * config/arm/cortex-r4.md (cortex_r4_alu, cortex_r4_mov): Likewise. > * config/arm/cortex-m4.md (cortex_m4_alu): Likewise. > * config/arm/cortex-a9.md (cprtex_a9_dp): Likewise. > * config/arm/cortex-a8.md (cortex_a8_alu, cortex_a8_mov): Likewise. > * config/arm/cortex-a5.md (cortex_a5_alu): Likewise. > * config/arm/cortex-a15.md (cortex_a15_alu): Likewise. > * config/arm/arm926ejs.md (9_alu_op): Likewise. > * config/arm/arm1136jfs.md (11_alu_op): Likewise. > * config/arm/arm1026ejs.md (alu_op): Likewise. > > > 1-split-alu-type-attr.v2.patch.txt > > > diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md > index 7e92b69ad861fe90ed409494d451854f30888462..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/arm.md > +++ b/gcc/config/arm/arm.md > @@ -323,8 +323,14 @@ (define_attr "insn" > ; Classification of each insn > ; Note: vfp.md has different meanings for some of these, and some further > ; types as well. See that file for details. > -; alu any alu instruction that doesn't hit memory or fp > -; regs or have a shifted source operand > +; simple_alu_imm a simple alu instruction that doesn't hit memory or fp > +; regs or have a shifted source operand and has an immediate > +; operand. This currently only tracks very basic immediate > +; alu operations. > +; alu_reg any alu instruction that doesn't hit memory or fp > +; regs or have a shifted source operand > +; and does not have an immediate operand. This is > +; also the default > ; alu_shift any data instruction that doesn't hit memory or fp > ; regs, but has a source operand shifted by a constant > ; alu_shift_reg any data instruction that doesn't hit memory or fp > @@ -354,7 +360,8 @@ (define_attr "insn" > ; > > (define_attr "type" > - "alu,\ > + "simple_alu_imm,\ > + alu_reg,\ > alu_shift,\ > alu_shift_reg,\ > mult,\ > @@ -398,7 +405,7 @@ (define_attr "type" > (eq_attr "insn" "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\ > umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") > (const_string "mult") > - (const_string "alu"))) > + (const_string "alu_reg"))) > > ; Is this an (integer side) multiply with a 64-bit result? > (define_attr "mul64" "no,yes" > @@ -536,7 +543,7 @@ (define_attr "write_conflict" "no,yes" > ; than one on the main cpu execution unit. > (define_attr "core_cycles" "single,multi" > (if_then_else (eq_attr "type" > - "alu,alu_shift,float,fdivd,fdivs") > + "simple_alu_imm,alu_reg,alu_shift,float,fdivd,fdivs") > (const_string "single") > (const_string "multi"))) > > @@ -796,7 +803,11 @@ (define_insn_and_split "*arm_addsi3" > " > [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16") > (set_attr "predicable" "yes") > - (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*")] > + (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*") > + (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") > + (const_string "simple_alu_imm") > + (const_string "alu_reg"))) > + ] > ) > > (define_insn_and_split "*thumb1_addsi3" > @@ -865,30 +876,35 @@ (define_peephole2 > (define_insn "addsi3_compare0" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 1 "s_register_operand" "r, r,r") > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > (const_int 0))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (plus:SI (match_dup 1) (match_dup 2)))] > "TARGET_ARM" > "@ > add%.\\t%0, %1, %2 > - sub%.\\t%0, %1, #%n2" > - [(set_attr "conds" "set")] > + sub%.\\t%0, %1, #%n2 > + add%.\\t%0, %1, %2" > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm, simple_alu_imm, *")] > ) > > (define_insn "*addsi3_compare0_scratch" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (plus:SI (match_operand:SI 0 "s_register_operand" "r, r") > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 0 "s_register_operand" "r, r, r") > + (match_operand:SI 1 "arm_add_operand" "I,L, r")) > (const_int 0)))] > "TARGET_ARM" > "@ > cmn%?\\t%0, %1 > - cmp%?\\t%0, #%n1" > + cmp%?\\t%0, #%n1 > + cmn%?\\t%0, %1" > [(set_attr "conds" "set") > - (set_attr "predicable" "yes")] > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm, simple_alu_imm, *") > + ] > ) > > (define_insn "*compare_negsi_si" > @@ -963,59 +979,67 @@ (define_peephole2 > (define_insn "*addsi3_compare_op1" > [(set (reg:CC_C CC_REGNUM) > (compare:CC_C > - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > (match_dup 1))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (plus:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "@ > add%.\\t%0, %1, %2 > - sub%.\\t%0, %1, #%n2" > - [(set_attr "conds" "set")] > + sub%.\\t%0, %1, #%n2 > + add%.\\t%0, %1, %2" > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*addsi3_compare_op2" > [(set (reg:CC_C CC_REGNUM) > (compare:CC_C > - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > (match_dup 2))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (plus:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "@ > add%.\\t%0, %1, %2 > + add%.\\t%0, %1, %2 > sub%.\\t%0, %1, #%n2" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*compare_addsi2_op0" > [(set (reg:CC_C CC_REGNUM) > (compare:CC_C > - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > + (match_operand:SI 1 "arm_add_operand" "I,L,r")) > (match_dup 0)))] > "TARGET_32BIT" > "@ > cmn%?\\t%0, %1 > - cmp%?\\t%0, #%n1" > + cmp%?\\t%0, #%n1 > + cmn%?\\t%0, %1" > [(set_attr "conds" "set") > - (set_attr "predicable" "yes")] > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*compare_addsi2_op1" > [(set (reg:CC_C CC_REGNUM) > (compare:CC_C > - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > + (match_operand:SI 1 "arm_add_operand" "I,L,r")) > (match_dup 1)))] > "TARGET_32BIT" > "@ > cmn%?\\t%0, %1 > - cmp%?\\t%0, #%n1" > + cmp%?\\t%0, #%n1 > + cmn%?\\t%0, %1" > [(set_attr "conds" "set") > - (set_attr "predicable" "yes")] > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*addsi3_carryin_<optab>" > @@ -1253,14 +1277,15 @@ (define_insn "thumb1_subsi3_insn" > > ; ??? Check Thumb-2 split length > (define_insn_and_split "*arm_subsi3_insn" > - [(set (match_operand:SI 0 "s_register_operand" "=r,r,rk,r") > - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") > - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,rk,r") > + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") > + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] > "TARGET_32BIT" > "@ > rsb%?\\t%0, %2, %1 > sub%?\\t%0, %1, %2 > sub%?\\t%0, %1, %2 > + sub%?\\t%0, %1, %2 > #" > "&& (CONST_INT_P (operands[1]) > && !const_ok_for_arm (INTVAL (operands[1])))" > @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn > INTVAL (operands[1]), operands[0], operands[2], 0); > DONE; > " > - [(set_attr "length" "4,4,4,16") > - (set_attr "predicable" "yes")] > + [(set_attr "length" "4,4,4,4,16") > + (set_attr "predicable" "yes") > + (set_attr "type" "*,simple_alu_imm,*,*,*")] > ) > > (define_peephole2 > @@ -1290,29 +1316,33 @@ (define_peephole2 > (define_insn "*subsi3_compare0" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I") > - (match_operand:SI 2 "arm_rhs_operand" "rI,r")) > + (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,r,I") > + (match_operand:SI 2 "arm_rhs_operand" "I,r,r")) > (const_int 0))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (minus:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "@ > sub%.\\t%0, %1, %2 > + sub%.\\t%0, %1, %2 > rsb%.\\t%0, %2, %1" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,*,*")] > ) > > (define_insn "*subsi3_compare" > [(set (reg:CC CC_REGNUM) > - (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,I") > - (match_operand:SI 2 "arm_rhs_operand" "rI,r"))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I") > + (match_operand:SI 2 "arm_rhs_operand" "I,r,r"))) > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (minus:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "@ > sub%.\\t%0, %1, %2 > + sub%.\\t%0, %1, %2 > rsb%.\\t%0, %2, %1" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,*,*")] > ) > > (define_expand "decscc" > @@ -1334,7 +1364,8 @@ (define_insn "*arm_decscc" > sub%d2\\t%0, %1, #1 > mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" > [(set_attr "conds" "use") > - (set_attr "length" "*,8")] > + (set_attr "length" "*,8") > + (set_attr "type" "simple_alu_imm,*")] > ) > > (define_expand "subsf3" > @@ -2190,13 +2221,14 @@ (define_expand "andsi3" > > ; ??? Check split length for Thumb-2 > (define_insn_and_split "*arm_andsi3_insn" > - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > - (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") > + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r") > + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] > "TARGET_32BIT" > "@ > and%?\\t%0, %1, %2 > bic%?\\t%0, %1, #%B2 > + and%?\\t%0, %1, %2 > #" > "TARGET_32BIT > && CONST_INT_P (operands[2]) > @@ -2208,8 +2240,9 @@ (define_insn_and_split "*arm_andsi3_insn > INTVAL (operands[2]), operands[0], operands[1], 0); > DONE; > " > - [(set_attr "length" "4,4,16") > - (set_attr "predicable" "yes")] > + [(set_attr "length" "4,4,4,16") > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")] > ) > > (define_insn "*thumb1_andsi3_insn" > @@ -2219,35 +2252,40 @@ (define_insn "*thumb1_andsi3_insn" > "TARGET_THUMB1" > "and\\t%0, %2" > [(set_attr "length" "2") > + (set_attr "type" "simple_alu_imm") > (set_attr "conds" "set")]) > > (define_insn "*andsi3_compare0" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (and:SI (match_operand:SI 1 "s_register_operand" "r,r") > - (match_operand:SI 2 "arm_not_operand" "rI,K")) > + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > + (match_operand:SI 2 "arm_not_operand" "I,K,r")) > (const_int 0))) > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > (and:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "@ > and%.\\t%0, %1, %2 > - bic%.\\t%0, %1, #%B2" > - [(set_attr "conds" "set")] > + bic%.\\t%0, %1, #%B2 > + and%.\\t%0, %1, %2" > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*andsi3_compare0_scratch" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (and:SI (match_operand:SI 0 "s_register_operand" "r,r") > - (match_operand:SI 1 "arm_not_operand" "rI,K")) > + (and:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > + (match_operand:SI 1 "arm_not_operand" "I,K,r")) > (const_int 0))) > - (clobber (match_scratch:SI 2 "=X,r"))] > + (clobber (match_scratch:SI 2 "=X,r,X"))] > "TARGET_32BIT" > "@ > tst%?\\t%0, %1 > - bic%.\\t%2, %0, #%B1" > - [(set_attr "conds" "set")] > + bic%.\\t%2, %0, #%B1 > + tst%?\\t%0, %1" > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > ) > > (define_insn "*zeroextractsi_compare0_scratch" > @@ -2269,7 +2307,8 @@ (define_insn "*zeroextractsi_compare0_sc > return \"\"; > " > [(set_attr "conds" "set") > - (set_attr "predicable" "yes")] > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm")] > ) > > (define_insn_and_split "*ne_zeroextractsi" > @@ -2916,13 +2955,14 @@ (define_expand "iorsi3" > ) > > (define_insn_and_split "*iorsi3_insn" > - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > - (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") > - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") > + (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r") > + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] > "TARGET_32BIT" > "@ > orr%?\\t%0, %1, %2 > orn%?\\t%0, %1, #%B2 > + orr%?\\t%0, %1, %2 > #" > "TARGET_32BIT > && CONST_INT_P (operands[2]) > @@ -2934,9 +2974,11 @@ (define_insn_and_split "*iorsi3_insn" > INTVAL (operands[2]), operands[0], operands[1], 0); > DONE; > } > - [(set_attr "length" "4,4,16") > - (set_attr "arch" "32,t2,32") > - (set_attr "predicable" "yes")]) > + [(set_attr "length" "4,4,4,16") > + (set_attr "arch" "32,t2,32,32") > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")] > +) > > (define_insn "*thumb1_iorsi3_insn" > [(set (match_operand:SI 0 "register_operand" "=l") > @@ -2962,25 +3004,27 @@ (define_peephole2 > > (define_insn "*iorsi3_compare0" > [(set (reg:CC_NOOV CC_REGNUM) > - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r") > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > (const_int 0))) > - (set (match_operand:SI 0 "s_register_operand" "=r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r") > (ior:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "orr%.\\t%0, %1, %2" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,*")] > ) > > (define_insn "*iorsi3_compare0_scratch" > [(set (reg:CC_NOOV CC_REGNUM) > - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r") > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > (const_int 0))) > - (clobber (match_scratch:SI 0 "=r"))] > + (clobber (match_scratch:SI 0 "=r,r"))] > "TARGET_32BIT" > "orr%.\\t%0, %1, %2" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm, *")] > ) > > (define_expand "xordi3" > @@ -3054,12 +3098,13 @@ (define_expand "xorsi3" > ) > > (define_insn_and_split "*arm_xorsi3" > - [(set (match_operand:SI 0 "s_register_operand" "=r,r") > - (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r") > - (match_operand:SI 2 "reg_or_int_operand" "rI,?n")))] > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > + (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") > + (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))] > "TARGET_32BIT" > "@ > eor%?\\t%0, %1, %2 > + eor%?\\t%0, %1, %2 > #" > "TARGET_32BIT > && CONST_INT_P (operands[2]) > @@ -3070,8 +3115,9 @@ (define_insn_and_split "*arm_xorsi3" > INTVAL (operands[2]), operands[0], operands[1], 0); > DONE; > } > - [(set_attr "length" "4,16") > - (set_attr "predicable" "yes")] > + [(set_attr "length" "4,4,16") > + (set_attr "predicable" "yes") > + (set_attr "type" "simple_alu_imm,*,*")] > ) > > (define_insn "*thumb1_xorsi3_insn" > @@ -3081,28 +3127,32 @@ (define_insn "*thumb1_xorsi3_insn" > "TARGET_THUMB1" > "eor\\t%0, %2" > [(set_attr "length" "2") > - (set_attr "conds" "set")]) > + (set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm")] > +) > > (define_insn "*xorsi3_compare0" > [(set (reg:CC_NOOV CC_REGNUM) > - (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r") > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > + (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r,r") > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > (const_int 0))) > - (set (match_operand:SI 0 "s_register_operand" "=r") > + (set (match_operand:SI 0 "s_register_operand" "=r,r") > (xor:SI (match_dup 1) (match_dup 2)))] > "TARGET_32BIT" > "eor%.\\t%0, %1, %2" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,*")] > ) > > (define_insn "*xorsi3_compare0_scratch" > [(set (reg:CC_NOOV CC_REGNUM) > - (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r") > - (match_operand:SI 1 "arm_rhs_operand" "rI")) > + (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r,r") > + (match_operand:SI 1 "arm_rhs_operand" "I,r")) > (const_int 0)))] > "TARGET_32BIT" > "teq%?\\t%0, %1" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm, *")] > ) > > ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), > @@ -4663,7 +4713,11 @@ (define_insn "*thumb1_zero_extendhisi2" > [(if_then_else (eq_attr "is_arch6" "yes") > (const_int 2) (const_int 4)) > (const_int 4)]) > - (set_attr "type" "alu_shift,load_byte")] > + (set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")])] > ) > > (define_insn "*arm_zero_extendhisi2" > @@ -4684,8 +4738,12 @@ (define_insn "*arm_zero_extendhisi2_v6" > "@ > uxth%?\\t%0, %1 > ldr%(h%)\\t%0, %1" > - [(set_attr "type" "alu_shift,load_byte") > - (set_attr "predicable" "yes")] > + [(set_attr "predicable" "yes") > + (set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")])] > ) > > (define_insn "*arm_zero_extendhisi2addsi" > @@ -4755,7 +4813,11 @@ (define_insn "*thumb1_zero_extendqisi2_v > uxtb\\t%0, %1 > ldrb\\t%0, %1" > [(set_attr "length" "2") > - (set_attr "type" "alu_shift,load_byte")] > + (set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")])] > ) > > (define_insn "*arm_zero_extendqisi2" > @@ -4777,7 +4839,11 @@ (define_insn "*arm_zero_extendqisi2_v6" > "@ > uxtb%(%)\\t%0, %1 > ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes")] > ) > > @@ -4951,7 +5017,11 @@ (define_insn "thumb1_extendhisi2" > [(if_then_else (eq_attr "is_arch6" "yes") > (const_int 2) (const_int 4)) > (const_int 4)]) > - (set_attr "type" "alu_shift,load_byte") > + (set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "pool_range" "*,1020")] > ) > > @@ -5024,7 +5094,11 @@ (define_insn "*arm_extendhisi2_v6" > "@ > sxth%?\\t%0, %1 > ldr%(sh%)\\t%0, %1" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,256") > (set_attr "neg_pool_range" "*,244")] > @@ -5124,7 +5198,11 @@ (define_insn "*arm_extendqisi_v6" > "@ > sxtb%?\\t%0, %1 > ldr%(sb%)\\t%0, %1" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,256") > (set_attr "neg_pool_range" "*,244")] > @@ -5237,7 +5315,12 @@ (define_insn "thumb1_extendqisi2" > (const_int 2) > (if_then_else (eq_attr "is_arch6" "yes") > (const_int 4) (const_int 6))]) > - (set_attr "type" "alu_shift,load_byte,load_byte")] > + (set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte") > + (const_string "load_byte")])] > ) > > (define_expand "extendsfdf2" > @@ -5611,7 +5694,7 @@ (define_insn "*arm_movsi_insn" > movw%?\\t%0, %1 > ldr%?\\t%0, %1 > str%?\\t%1, %0" > - [(set_attr "type" "*,*,*,*,load1,store1") > + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1") > (set_attr "insn" "mov,mov,mvn,mov,*,*") > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,*,*,*,4096,*") > @@ -5910,7 +5993,8 @@ (define_insn "*movsi_compare0" > "@ > cmp%?\\t%0, #0 > sub%.\\t%0, %1, #0" > - [(set_attr "conds" "set")] > + [(set_attr "conds" "set") > + (set_attr "type" "simple_alu_imm,simple_alu_imm")] > ) > > ;; Subroutine to store a half word from a register into memory. > @@ -6323,22 +6407,30 @@ (define_insn "*movhi_insn_arch4" > mvn%?\\t%0, #%B1\\t%@ movhi > str%(h%)\\t%1, %0\\t%@ movhi > ldr%(h%)\\t%0, %1\\t%@ movhi" > - [(set_attr "type" "*,*,store1,load1") > - (set_attr "predicable" "yes") > + [(set_attr "predicable" "yes") > (set_attr "insn" "mov,mvn,*,*") > (set_attr "pool_range" "*,*,*,256") > - (set_attr "neg_pool_range" "*,*,*,244")] > + (set_attr "neg_pool_range" "*,*,*,244") > + (set_attr_alternative "type" > + [(if_then_else (match_operand 1 "const_int_operand" "") > + (const_string "simple_alu_imm" ) > + (const_string "*")) > + (const_string "simple_alu_imm") > + (const_string "store1") > + (const_string "load1")])] > ) > > (define_insn "*movhi_bytes" > - [(set (match_operand:HI 0 "s_register_operand" "=r,r") > - (match_operand:HI 1 "arm_rhs_operand" "rI,K"))] > + [(set (match_operand:HI 0 "s_register_operand" "=r,r,r") > + (match_operand:HI 1 "arm_rhs_operand" "I,r,K"))] > "TARGET_ARM" > "@ > mov%?\\t%0, %1\\t%@ movhi > + mov%?\\t%0, %1\\t%@ movhi > mvn%?\\t%0, #%B1\\t%@ movhi" > [(set_attr "predicable" "yes") > - (set_attr "insn" "mov,mvn")] > + (set_attr "insn" "mov, mov,mvn") > + (set_attr "type" "simple_alu_imm,*,simple_alu_imm")] > ) > > (define_expand "thumb_movhi_clobber" > @@ -6463,23 +6555,24 @@ (define_expand "movqi" > > > (define_insn "*arm_movqi_insn" > - [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,l,Uu,r,m") > - (match_operand:QI 1 "general_operand" "rI,K,Uu,l,m,r"))] > + [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,Uu,r,m") > + (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))] > "TARGET_32BIT > && ( register_operand (operands[0], QImode) > || register_operand (operands[1], QImode))" > "@ > mov%?\\t%0, %1 > + mov%?\\t%0, %1 > mvn%?\\t%0, #%B1 > ldr%(b%)\\t%0, %1 > str%(b%)\\t%1, %0 > ldr%(b%)\\t%0, %1 > str%(b%)\\t%1, %0" > - [(set_attr "type" "*,*,load1,store1,load1,store1") > - (set_attr "insn" "mov,mvn,*,*,*,*") > + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, load1, store1") > + (set_attr "insn" "mov,mov,mvn,*,*,*,*") > (set_attr "predicable" "yes") > - (set_attr "arch" "any,any,t2,t2,any,any") > - (set_attr "length" "4,4,2,2,4,4")] > + (set_attr "arch" "any,any,any,t2,t2,any,any") > + (set_attr "length" "4,4,4,2,2,4,4")] > ) > > (define_insn "*thumb1_movqi_insn" > @@ -6496,7 +6589,7 @@ (define_insn "*thumb1_movqi_insn" > mov\\t%0, %1 > mov\\t%0, %1" > [(set_attr "length" "2") > - (set_attr "type" "*,load1,store1,*,*,*") > + (set_attr "type" "simple_alu_imm,load1,store1,*,*,simple_alu_imm") > (set_attr "insn" "*,*,*,mov,mov,mov") > (set_attr "pool_range" "*,32,*,*,*,*") > (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")]) > @@ -7617,7 +7710,8 @@ (define_insn "*arm_cmpsi_insn" > [(set_attr "conds" "set") > (set_attr "arch" "t2,t2,any,any") > (set_attr "length" "2,2,4,4") > - (set_attr "predicable" "yes")] > + (set_attr "predicable" "yes") > + (set_attr "type" "*,*,*,simple_alu_imm")] > ) > > (define_insn "*cmpsi_shiftsi" > @@ -8182,7 +8276,20 @@ (define_insn "*movsicc_insn" > mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" > [(set_attr "length" "4,4,4,4,8,8,8,8") > (set_attr "conds" "use") > - (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")] > + (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn") > + (set_attr_alternative "type" > + [(if_then_else (match_operand 2 "const_int_operand" "") > + (const_string "simple_alu_imm") > + (const_string "*")) > + (const_string "simple_alu_imm") > + (if_then_else (match_operand 1 "const_int_operand" "") > + (const_string "simple_alu_imm") > + (const_string "*")) > + (const_string "simple_alu_imm") > + (const_string "*") > + (const_string "*") > + (const_string "*") > + (const_string "*")])] > ) > > (define_insn "*movsfcc_soft_insn" > @@ -9982,7 +10089,13 @@ (define_insn "*if_plus_move" > sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" > [(set_attr "conds" "use") > (set_attr "length" "4,4,8,8") > - (set_attr "type" "*,*,*,*")] > + (set_attr_alternative "type" > + [(if_then_else (match_operand 3 "const_int_operand" "") > + (const_string "simple_alu_imm" ) > + (const_string "*")) > + (const_string "simple_alu_imm") > + (const_string "*") > + (const_string "*")])] > ) > > (define_insn "*ifcompare_move_plus" > @@ -10018,7 +10131,13 @@ (define_insn "*if_move_plus" > sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" > [(set_attr "conds" "use") > (set_attr "length" "4,4,8,8") > - (set_attr "type" "*,*,*,*")] > + (set_attr_alternative "type" > + [(if_then_else (match_operand 3 "const_int_operand" "") > + (const_string "simple_alu_imm" ) > + (const_string "*")) > + (const_string "simple_alu_imm") > + (const_string "*") > + (const_string "*")])] > ) > > (define_insn "*ifcompare_arith_arith" > diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md > index 280af12f93222ce76ab0351898d567e3017fc34e..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/arm1020e.md > +++ b/gcc/config/arm/arm1020e.md > @@ -66,7 +66,7 @@ (define_cpu_unit "1020l_e,1020l_m,1020l_ > ;; ALU operations with no shifted operand > (define_insn_reservation "1020alu_op" 1 > (and (eq_attr "tune" "arm1020e,arm1022e") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "1020a_e,1020a_m,1020a_w") > > ;; ALU operations with a shift-by-constant operand > diff --git a/gcc/config/arm/arm1026ejs.md b/gcc/config/arm/arm1026ejs.md > index e6221363898102c566f8be5423f5509a0df49acd..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/arm1026ejs.md > +++ b/gcc/config/arm/arm1026ejs.md > @@ -66,7 +66,7 @@ (define_cpu_unit "l_e,l_m,l_w" "arm1026e > ;; ALU operations with no shifted operand > (define_insn_reservation "alu_op" 1 > (and (eq_attr "tune" "arm1026ejs") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "a_e,a_m,a_w") > > ;; ALU operations with a shift-by-constant operand > diff --git a/gcc/config/arm/arm1136jfs.md b/gcc/config/arm/arm1136jfs.md > index 8fc30e976f0fbfe45f360ee93706cf64f9ef8f08..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/arm1136jfs.md > +++ b/gcc/config/arm/arm1136jfs.md > @@ -75,7 +75,7 @@ (define_cpu_unit "l_a,l_dc1,l_dc2,l_wb" > ;; ALU operations with no shifted operand > (define_insn_reservation "11_alu_op" 2 > (and (eq_attr "tune" "arm1136js,arm1136jfs") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "e_1,e_2,e_3,e_wb") > > ;; ALU operations with a shift-by-constant operand > diff --git a/gcc/config/arm/arm926ejs.md b/gcc/config/arm/arm926ejs.md > index d3908f9e3ecd972c6f93a77bfd1bde4e501dcdba..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/arm926ejs.md > +++ b/gcc/config/arm/arm926ejs.md > @@ -58,7 +58,7 @@ (define_cpu_unit "e,m,w" "arm926ejs") > ;; ALU operations with no shifted operand > (define_insn_reservation "9_alu_op" 1 > (and (eq_attr "tune" "arm926ejs") > - (eq_attr "type" "alu,alu_shift")) > + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift")) > "e,m,w") > > ;; ALU operations with a shift-by-register operand > diff --git a/gcc/config/arm/cortex-a15.md b/gcc/config/arm/cortex-a15.md > index b86c6e706900b81adea9c5a487b96bcb473b8f62..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-a15.md > +++ b/gcc/config/arm/cortex-a15.md > @@ -61,7 +61,7 @@ (define_cpu_unit "ca15_sx2_alu, ca15_sx2 > ;; Simple ALU without shift > (define_insn_reservation "cortex_a15_alu" 2 > (and (eq_attr "tune" "cortexa15") > - (and (eq_attr "type" "alu") > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > (eq_attr "neon_type" "none"))) > "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)") > > diff --git a/gcc/config/arm/cortex-a5.md b/gcc/config/arm/cortex-a5.md > index eb154e2980382befc77027ec8a0a35fcc34a1ff5..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-a5.md > +++ b/gcc/config/arm/cortex-a5.md > @@ -58,7 +58,7 @@ (define_cpu_unit "cortex_a5_fp_div_sqrt" > > (define_insn_reservation "cortex_a5_alu" 2 > (and (eq_attr "tune" "cortexa5") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "cortex_a5_ex1") > > (define_insn_reservation "cortex_a5_alu_shift" 2 > diff --git a/gcc/config/arm/cortex-a8.md b/gcc/config/arm/cortex-a8.md > index 1922e5cf4c66c147830ba3e7b195263a3aac3015..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-a8.md > +++ b/gcc/config/arm/cortex-a8.md > @@ -85,7 +85,7 @@ (define_reservation "cortex_a8_multiply_ > ;; (source read in E2 and destination available at the end of that cycle). > (define_insn_reservation "cortex_a8_alu" 2 > (and (eq_attr "tune" "cortexa8") > - (ior (and (and (eq_attr "type" "alu") > + (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm") > (eq_attr "neon_type" "none")) > (not (eq_attr "insn" "mov,mvn"))) > (eq_attr "insn" "clz"))) > @@ -107,7 +107,7 @@ (define_insn_reservation "cortex_a8_alu_ > > (define_insn_reservation "cortex_a8_mov" 1 > (and (eq_attr "tune" "cortexa8") > - (and (eq_attr "type" "alu,alu_shift,alu_shift_reg") > + (and (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg") > (eq_attr "insn" "mov,mvn"))) > "cortex_a8_default") > > diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex-a9.md > index 12c19efb12132e932dea03031ed5fd364e4b9aef..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-a9.md > +++ b/gcc/config/arm/cortex-a9.md > @@ -80,7 +80,7 @@ (define_reservation "cortex_a9_mult_long > ;; which can go down E2 without any problem. > (define_insn_reservation "cortex_a9_dp" 2 > (and (eq_attr "tune" "cortexa9") > - (ior (and (eq_attr "type" "alu") > + (ior (and (eq_attr "type" "alu_reg,simple_alu_imm") > (eq_attr "neon_type" "none")) > (and (and (eq_attr "type" "alu_shift_reg, alu_shift") > (eq_attr "insn" "mov")) > diff --git a/gcc/config/arm/cortex-m4.md b/gcc/config/arm/cortex-m4.md > index 57479853610ebdcdff8db4cc5ff3052c1a09b276..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-m4.md > +++ b/gcc/config/arm/cortex-m4.md > @@ -31,7 +31,7 @@ (define_reservation "cortex_m4_ex" "cort > ;; ALU and multiply is one cycle. > (define_insn_reservation "cortex_m4_alu" 1 > (and (eq_attr "tune" "cortexm4") > - (eq_attr "type" "alu,alu_shift,alu_shift_reg,mult")) > + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg,mult")) > "cortex_m4_ex") > > ;; Byte, half-word and word load is two cycles. > diff --git a/gcc/config/arm/cortex-r4.md b/gcc/config/arm/cortex-r4.md > index e26c3d45d5e6c5926500510c653619fb2a686851..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/cortex-r4.md > +++ b/gcc/config/arm/cortex-r4.md > @@ -78,13 +78,13 @@ (define_reservation "cortex_r4_branch" " > ;; for the purposes of the dual-issue constraints above. > (define_insn_reservation "cortex_r4_alu" 2 > (and (eq_attr "tune_cortexr4" "yes") > - (and (eq_attr "type" "alu") > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > (not (eq_attr "insn" "mov")))) > "cortex_r4_alu") > > (define_insn_reservation "cortex_r4_mov" 2 > (and (eq_attr "tune_cortexr4" "yes") > - (and (eq_attr "type" "alu") > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > (eq_attr "insn" "mov"))) > "cortex_r4_mov") > > diff --git a/gcc/config/arm/fa526.md b/gcc/config/arm/fa526.md > index 42eb9b272fb1b9df553c566e8c41cb4d44c306ca..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/fa526.md > +++ b/gcc/config/arm/fa526.md > @@ -62,7 +62,7 @@ (define_cpu_unit "fa526_core" "fa526") > ;; ALU operations > (define_insn_reservation "526_alu_op" 1 > (and (eq_attr "tune" "fa526") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "fa526_core") > > (define_insn_reservation "526_alu_shift_op" 2 > diff --git a/gcc/config/arm/fa606te.md b/gcc/config/arm/fa606te.md > index 06e63d696bde2e13556982e053cf2b0fd719d1ce..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/fa606te.md > +++ b/gcc/config/arm/fa606te.md > @@ -62,7 +62,7 @@ (define_cpu_unit "fa606te_core" "fa606te > ;; ALU operations > (define_insn_reservation "606te_alu_op" 1 > (and (eq_attr "tune" "fa606te") > - (eq_attr "type" "alu,alu_shift,alu_shift_reg")) > + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg")) > "fa606te_core") > > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > diff --git a/gcc/config/arm/fa626te.md b/gcc/config/arm/fa626te.md > index 7fe1c8724bef3feae8a291777379a5dac3cf31d1..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/fa626te.md > +++ b/gcc/config/arm/fa626te.md > @@ -68,7 +68,7 @@ (define_cpu_unit "fa626te_core" "fa626te > ;; ALU operations > (define_insn_reservation "626te_alu_op" 1 > (and (eq_attr "tune" "fa626,fa626te") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "fa626te_core") > > (define_insn_reservation "626te_alu_shift_op" 2 > diff --git a/gcc/config/arm/fa726te.md b/gcc/config/arm/fa726te.md > index 3c33d59710478a5a46435e4df3177bbfcca1faff..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/fa726te.md > +++ b/gcc/config/arm/fa726te.md > @@ -85,7 +85,7 @@ (define_insn_reservation "726te_shift_op > ;; Other ALU instructions 2 cycles. > (define_insn_reservation "726te_alu_op" 1 > (and (eq_attr "tune" "fa726te") > - (and (eq_attr "type" "alu") > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > (not (eq_attr "insn" "mov,mvn")))) > "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") > > diff --git a/gcc/config/arm/fmp626.md b/gcc/config/arm/fmp626.md > index 9ba33ddec4741ef3124c23ca8cf9f42f38feb6c8..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/fmp626.md > +++ b/gcc/config/arm/fmp626.md > @@ -63,7 +63,7 @@ (define_cpu_unit "fmp626_core" "fmp626") > ;; ALU operations > (define_insn_reservation "mp626_alu_op" 1 > (and (eq_attr "tune" "fmp626") > - (eq_attr "type" "alu")) > + (eq_attr "type" "alu_reg,simple_alu_imm")) > "fmp626_core") > > (define_insn_reservation "mp626_alu_shift_op" 2 > diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md > index 21035808c0e5964d29b7c903b5721210223153e0..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/neon.md > +++ b/gcc/config/arm/neon.md > @@ -193,7 +193,7 @@ (define_insn "*neon_mov<mode>" > } > } > [(set_attr "neon_type" "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*") > - (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu,load2,store2") > + (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2") > (set_attr "insn" "*,*,*,*,*,*,mov,*,*") > (set_attr "length" "4,4,4,4,4,4,8,8,8") > (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") > @@ -238,7 +238,7 @@ (define_insn "*neon_mov<mode>" > } > [(set_attr "neon_type" "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\ > neon_mrrc,neon_mcr_2_mcrr,*,*,*") > - (set_attr "type" "*,*,*,*,*,*,alu,load4,store4") > + (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4") > (set_attr "insn" "*,*,*,*,*,*,mov,*,*") > (set_attr "length" "4,8,4,8,8,8,16,8,16") > (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") > diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md > index a5302f479f5091d08f4bf1a9ee9b0423692372af..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/thumb2.md > +++ b/gcc/config/arm/thumb2.md > @@ -1,5 +1,5 @@ > ;; ARM Thumb-2 Machine Description > -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. > +;; Copyright (C) 2007, 2008, 2010, 2012 Free Software Foundation, Inc. > ;; Written by CodeSourcery, LLC. > ;; > ;; This file is part of GCC. > @@ -180,7 +180,7 @@ (define_insn "*thumb2_movsi_insn" > ldr%?\\t%0, %1 > str%?\\t%1, %0 > str%?\\t%1, %0" > - [(set_attr "type" "*,*,*,*,load1,load1,store1,store1") > + [(set_attr "type" "*,*,simple_alu_imm,*,load1,load1,store1,store1") > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,*,*,*,1020,4096,*,*") > (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")] > @@ -568,7 +568,11 @@ (define_insn "*thumb2_extendqisi_v6" > "@ > sxtb%?\\t%0, %1 > ldr%(sb%)\\t%0, %1" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,4096") > (set_attr "neg_pool_range" "*,250")] > @@ -581,7 +585,11 @@ (define_insn "*thumb2_zero_extendhisi2_v > "@ > uxth%?\\t%0, %1 > ldr%(h%)\\t%0, %1" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,4096") > (set_attr "neg_pool_range" "*,250")] > @@ -594,7 +602,11 @@ (define_insn "thumb2_zero_extendqisi2_v6 > "@ > uxtb%(%)\\t%0, %1 > ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" > - [(set_attr "type" "alu_shift,load_byte") > + [(set_attr_alternative "type" > + [(if_then_else (eq_attr "tune" "cortexa7") > + (const_string "simple_alu_imm") > + (const_string "alu_shift")) > + (const_string "load_byte")]) > (set_attr "predicable" "yes") > (set_attr "pool_range" "*,4096") > (set_attr "neg_pool_range" "*,250")] > @@ -790,8 +802,8 @@ (define_insn "thumb2_addsi3_compare0" > (define_insn "*thumb2_addsi3_compare0_scratch" > [(set (reg:CC_NOOV CC_REGNUM) > (compare:CC_NOOV > - (plus:SI (match_operand:SI 0 "s_register_operand" "l, r") > - (match_operand:SI 1 "arm_add_operand" "lPv,rIL")) > + (plus:SI (match_operand:SI 0 "s_register_operand" "l,l, r,r") > + (match_operand:SI 1 "arm_add_operand" "Pv,l,IL,r")) > (const_int 0)))] > "TARGET_THUMB2" > "* > @@ -808,7 +820,8 @@ (define_insn "*thumb2_addsi3_compare0_sc > return \"cmn\\t%0, %1\"; > " > [(set_attr "conds" "set") > - (set_attr "length" "2,4")] > + (set_attr "length" "2,2,4,4") > + (set_attr "type" "simple_alu_imm,*,simple_alu_imm,*")] > ) > > (define_insn "*thumb2_mulsi_short" > diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md > index d48d4e66a6c827ec6d471a218a175537f038d798..0000000000000000000000000000000000000000 100644 > --- a/gcc/config/arm/vfp.md > +++ b/gcc/config/arm/vfp.md > @@ -77,7 +77,7 @@ (define_insn "*arm_movsi_vfp" > } > " > [(set_attr "predicable" "yes") > - (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") > + (set_attr "type" "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") > (set_attr "neon_type" "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") > (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*") > (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*") >
> -----Original Message----- > From: Richard Earnshaw > Sent: 29 November 2012 10:12 > To: Greta Yorsh > Cc: GCC Patches; Ramana Radhakrishnan; nickc@redhat.com; > paul@codesourcery.com > Subject: Re: [PATCH,ARM] Subdivide alu into alu_reg and simple_alu_imm > > > ; ??? Check Thumb-2 split length > (define_insn_and_split "*arm_subsi3_insn" > - [(set (match_operand:SI 0 "s_register_operand" > "=r,r,rk,r") > - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") > - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] > + [(set (match_operand:SI 0 "s_register_operand" > "=r,r,r,rk,r") > + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") > + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] > "TARGET_32BIT" > "@ > rsb%?\\t%0, %2, %1 > sub%?\\t%0, %1, %2 > sub%?\\t%0, %1, %2 > + sub%?\\t%0, %1, %2 > #" > "&& (CONST_INT_P (operands[1]) > && !const_ok_for_arm (INTVAL (operands[1])))" > @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn > INTVAL (operands[1]), operands[0], operands[2], > 0); > DONE; > " > - [(set_attr "length" "4,4,4,16") > - (set_attr "predicable" "yes")] > + [(set_attr "length" "4,4,4,4,16") > + (set_attr "predicable" "yes") > + (set_attr "type" "*,simple_alu_imm,*,*,*")] > ) > > > There's something wrong here. MINUS (reg, imm) should be canonicalized > elsewhere to PLUS (reg, -imm), so the alternative you've split /should/ > never match anything. On the other hand, you haven't split the first > alternative (that generates RSB), which is a legitimate use of an > immediate in MINUS. The "rI" constraint on operand 1 in the first alternative is not split because RSB instruction it generates cannot dual-issue (even with an immediate operand) in the second slot on Cortex-A7, and so the alternative should not be marked as simple_alu_imm. Thanks, Greta > > Otherwise, OK. > > R. > > On 29/11/12 09:57, Greta Yorsh wrote: > > For attribute named "type", subdivide "alu" into "alu_reg" and > > "simple_alu_imm". > > Set type attribute as appropriate in define_insn patterns with > immediate > > operands. > > Update pipeline descriptions to use the new values of type attribute. > > > > No regression on qemu arm-none-eabi -mcpu=cortex-a15/cortex-a7. > > > > Bootstrap successful on Cortex-A15. > > > > No difference in generated assembly when compiling all of > preprocessed > > sources of gcc 4.8 as a test in various configurations: -mcpu=cortex- > a15 > > -march=armv6t2 -marm/-mthumb -O0/-O1/-O2/-O3/-Os. > > > > The motivation for this patch is cortex-a7 pipeline description, > which will > > be submitted separately. > > > > Ok for trunk? > > > > Thanks, > > Greta > > > > ChangeLog > > > > gcc/ > > > > 2012-11-28 Ramana Radhakrishnan <Ramana.Radhakrishnan@arm.com> > > Greta Yorsh <Greta.Yorsh@arm.com> > > > > * config/arm/arm.md (type): Subdivide "alu" into "alu_reg" > and > > "simple_alu_imm". > > (core_cycles): Use new names. > > (arm_addsi3): Set type attribute for patterns involving > > simple_alu_imm. > > (addsi3_compare0, addsi3_compare0_scratch): Likewise. > > (addsi3_compare_op1, addsi3_compare_op2, > compare_addsi2_op0): > > Likewise. > > (compare_addsi2_op1, arm_subsi3_insn, subsi3_compare0): > Likewise. > > (subsi3_compare, arm_decscc,arm_andsi3_insn): Likewise. > > (thumb1_andsi3_insn, andsi3_compare0_scratch): Likewise. > > (zeroextractsi_compare0_scratch, iorsi3_insn, > iorsi3_compare0): > > Likewise. > > (iorsi3_compare0_scratch, arm_xorsi3, thumb1_xorsi3_insn): > Likewise. > > (xorsi3_compare0, xorsi3_compare0_scratch, > thumb1_zero_extendhisi2): > > Likewise. > > (arm_zero_extendhisi2_v6, thumb1_zero_extendqisi2_v): > Likewise. > > (arm_zero_extendqisi2_v6, thumb1_extendhisi2, > arm_extendqisi_v6): > > Likewise. > > (thumb1_extendqisi2, arm_movsi_insn): Likewise. > > (movsi_compare0, movhi_insn_arch4, movhi_bytes): Likewise. > > (arm_movqi_insn, thumb1_movqi_insn, arm_cmpsi_insn): > Likewise. > > (movsicc_insn, if_plus_move, if_move_plus): Likewise. > > * config/arm/neon.md (neon_mov<mode>/VDX): Likewise. > > (neon_mov<mode>/VQXMOV): Likewise. > > * config/arm/arm1020e.md (1020alu_op): Likewise. > > * config/arm/fmp626.md (mp626_alu_op): Likewise. > > * config/arm/fa726te.md (726te_alu_op): Likewise. > > * config/arm/fa626te.md (626te_alu_op): Likewise. > > * config/arm/fa606te.md (606te_alu_op): Likewise. > > * config/arm/fa526.md (526_alu_op): Likewise. > > * config/arm/cortex-r4.md (cortex_r4_alu, cortex_r4_mov): > Likewise. > > * config/arm/cortex-m4.md (cortex_m4_alu): Likewise. > > * config/arm/cortex-a9.md (cprtex_a9_dp): Likewise. > > * config/arm/cortex-a8.md (cortex_a8_alu, cortex_a8_mov): > Likewise. > > * config/arm/cortex-a5.md (cortex_a5_alu): Likewise. > > * config/arm/cortex-a15.md (cortex_a15_alu): Likewise. > > * config/arm/arm926ejs.md (9_alu_op): Likewise. > > * config/arm/arm1136jfs.md (11_alu_op): Likewise. > > * config/arm/arm1026ejs.md (alu_op): Likewise. > > > > > > 1-split-alu-type-attr.v2.patch.txt > > > > > > diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md > > index > 7e92b69ad861fe90ed409494d451854f30888462..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/arm.md > > +++ b/gcc/config/arm/arm.md > > @@ -323,8 +323,14 @@ (define_attr "insn" > > ; Classification of each insn > > ; Note: vfp.md has different meanings for some of these, and some > further > > ; types as well. See that file for details. > > -; alu any alu instruction that doesn't hit memory or fp > > -; regs or have a shifted source operand > > +; simple_alu_imm a simple alu instruction that doesn't hit memory > or fp > > +; regs or have a shifted source operand and has an > immediate > > +; operand. This currently only tracks very basic > immediate > > +; alu operations. > > +; alu_reg any alu instruction that doesn't hit memory or fp > > +; regs or have a shifted source operand > > +; and does not have an immediate operand. This is > > +; also the default > > ; alu_shift any data instruction that doesn't hit memory or fp > > ; regs, but has a source operand shifted by a constant > > ; alu_shift_reg any data instruction that doesn't hit memory or > fp > > @@ -354,7 +360,8 @@ (define_attr "insn" > > ; > > > > (define_attr "type" > > - "alu,\ > > + "simple_alu_imm,\ > > + alu_reg,\ > > alu_shift,\ > > alu_shift_reg,\ > > mult,\ > > @@ -398,7 +405,7 @@ (define_attr "type" > > (eq_attr "insn" > "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\ > > umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") > > (const_string "mult") > > - (const_string "alu"))) > > + (const_string "alu_reg"))) > > > > ; Is this an (integer side) multiply with a 64-bit result? > > (define_attr "mul64" "no,yes" > > @@ -536,7 +543,7 @@ (define_attr "write_conflict" "no,yes" > > ; than one on the main cpu execution unit. > > (define_attr "core_cycles" "single,multi" > > (if_then_else (eq_attr "type" > > - "alu,alu_shift,float,fdivd,fdivs") > > + "simple_alu_imm,alu_reg,alu_shift,float,fdivd,fdivs") > > (const_string "single") > > (const_string "multi"))) > > > > @@ -796,7 +803,11 @@ (define_insn_and_split "*arm_addsi3" > > " > > [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16") > > (set_attr "predicable" "yes") > > - (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*")] > > + (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*") > > + (set (attr "type") (if_then_else (match_operand 2 > "const_int_operand" "") > > + (const_string "simple_alu_imm") > > + (const_string "alu_reg"))) > > + ] > > ) > > > > (define_insn_and_split "*thumb1_addsi3" > > @@ -865,30 +876,35 @@ (define_peephole2 > > (define_insn "addsi3_compare0" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") > > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 1 "s_register_operand" "r, r,r") > > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > > (const_int 0))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (plus:SI (match_dup 1) (match_dup 2)))] > > "TARGET_ARM" > > "@ > > add%.\\t%0, %1, %2 > > - sub%.\\t%0, %1, #%n2" > > - [(set_attr "conds" "set")] > > + sub%.\\t%0, %1, #%n2 > > + add%.\\t%0, %1, %2" > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm, simple_alu_imm, *")] > > ) > > > > (define_insn "*addsi3_compare0_scratch" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (plus:SI (match_operand:SI 0 "s_register_operand" "r, r") > > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 0 "s_register_operand" "r, r, r") > > + (match_operand:SI 1 "arm_add_operand" "I,L, r")) > > (const_int 0)))] > > "TARGET_ARM" > > "@ > > cmn%?\\t%0, %1 > > - cmp%?\\t%0, #%n1" > > + cmp%?\\t%0, #%n1 > > + cmn%?\\t%0, %1" > > [(set_attr "conds" "set") > > - (set_attr "predicable" "yes")] > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm, simple_alu_imm, *") > > + ] > > ) > > > > (define_insn "*compare_negsi_si" > > @@ -963,59 +979,67 @@ (define_peephole2 > > (define_insn "*addsi3_compare_op1" > > [(set (reg:CC_C CC_REGNUM) > > (compare:CC_C > > - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") > > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > > (match_dup 1))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (plus:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "@ > > add%.\\t%0, %1, %2 > > - sub%.\\t%0, %1, #%n2" > > - [(set_attr "conds" "set")] > > + sub%.\\t%0, %1, #%n2 > > + add%.\\t%0, %1, %2" > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*addsi3_compare_op2" > > [(set (reg:CC_C CC_REGNUM) > > (compare:CC_C > > - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") > > - (match_operand:SI 2 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > > + (match_operand:SI 2 "arm_add_operand" "I,L,r")) > > (match_dup 2))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (plus:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "@ > > add%.\\t%0, %1, %2 > > + add%.\\t%0, %1, %2 > > sub%.\\t%0, %1, #%n2" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*compare_addsi2_op0" > > [(set (reg:CC_C CC_REGNUM) > > (compare:CC_C > > - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") > > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > > + (match_operand:SI 1 "arm_add_operand" "I,L,r")) > > (match_dup 0)))] > > "TARGET_32BIT" > > "@ > > cmn%?\\t%0, %1 > > - cmp%?\\t%0, #%n1" > > + cmp%?\\t%0, #%n1 > > + cmn%?\\t%0, %1" > > [(set_attr "conds" "set") > > - (set_attr "predicable" "yes")] > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*compare_addsi2_op1" > > [(set (reg:CC_C CC_REGNUM) > > (compare:CC_C > > - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") > > - (match_operand:SI 1 "arm_add_operand" "rI,L")) > > + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > > + (match_operand:SI 1 "arm_add_operand" "I,L,r")) > > (match_dup 1)))] > > "TARGET_32BIT" > > "@ > > cmn%?\\t%0, %1 > > - cmp%?\\t%0, #%n1" > > + cmp%?\\t%0, #%n1 > > + cmn%?\\t%0, %1" > > [(set_attr "conds" "set") > > - (set_attr "predicable" "yes")] > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*addsi3_carryin_<optab>" > > @@ -1253,14 +1277,15 @@ (define_insn "thumb1_subsi3_insn" > > > > ; ??? Check Thumb-2 split length > > (define_insn_and_split "*arm_subsi3_insn" > > - [(set (match_operand:SI 0 "s_register_operand" > "=r,r,rk,r") > > - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") > > - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] > > + [(set (match_operand:SI 0 "s_register_operand" > "=r,r,r,rk,r") > > + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") > > + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] > > "TARGET_32BIT" > > "@ > > rsb%?\\t%0, %2, %1 > > sub%?\\t%0, %1, %2 > > sub%?\\t%0, %1, %2 > > + sub%?\\t%0, %1, %2 > > #" > > "&& (CONST_INT_P (operands[1]) > > && !const_ok_for_arm (INTVAL (operands[1])))" > > @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn > > INTVAL (operands[1]), operands[0], > operands[2], 0); > > DONE; > > " > > - [(set_attr "length" "4,4,4,16") > > - (set_attr "predicable" "yes")] > > + [(set_attr "length" "4,4,4,4,16") > > + (set_attr "predicable" "yes") > > + (set_attr "type" "*,simple_alu_imm,*,*,*")] > > ) > > > > (define_peephole2 > > @@ -1290,29 +1316,33 @@ (define_peephole2 > > (define_insn "*subsi3_compare0" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I") > > - (match_operand:SI 2 "arm_rhs_operand" "rI,r")) > > + (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,r,I") > > + (match_operand:SI 2 "arm_rhs_operand" "I,r,r")) > > (const_int 0))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (minus:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "@ > > sub%.\\t%0, %1, %2 > > + sub%.\\t%0, %1, %2 > > rsb%.\\t%0, %2, %1" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,*,*")] > > ) > > > > (define_insn "*subsi3_compare" > > [(set (reg:CC CC_REGNUM) > > - (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,I") > > - (match_operand:SI 2 "arm_rhs_operand" "rI,r"))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I") > > + (match_operand:SI 2 "arm_rhs_operand" "I,r,r"))) > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (minus:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "@ > > sub%.\\t%0, %1, %2 > > + sub%.\\t%0, %1, %2 > > rsb%.\\t%0, %2, %1" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,*,*")] > > ) > > > > (define_expand "decscc" > > @@ -1334,7 +1364,8 @@ (define_insn "*arm_decscc" > > sub%d2\\t%0, %1, #1 > > mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" > > [(set_attr "conds" "use") > > - (set_attr "length" "*,8")] > > + (set_attr "length" "*,8") > > + (set_attr "type" "simple_alu_imm,*")] > > ) > > > > (define_expand "subsf3" > > @@ -2190,13 +2221,14 @@ (define_expand "andsi3" > > > > ; ??? Check split length for Thumb-2 > > (define_insn_and_split "*arm_andsi3_insn" > > - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > - (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > > - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] > > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") > > + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r") > > + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] > > "TARGET_32BIT" > > "@ > > and%?\\t%0, %1, %2 > > bic%?\\t%0, %1, #%B2 > > + and%?\\t%0, %1, %2 > > #" > > "TARGET_32BIT > > && CONST_INT_P (operands[2]) > > @@ -2208,8 +2240,9 @@ (define_insn_and_split "*arm_andsi3_insn > > INTVAL (operands[2]), operands[0], operands[1], > 0); > > DONE; > > " > > - [(set_attr "length" "4,4,16") > > - (set_attr "predicable" "yes")] > > + [(set_attr "length" "4,4,4,16") > > + (set_attr "predicable" "yes") > > + (set_attr "type" > "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")] > > ) > > > > (define_insn "*thumb1_andsi3_insn" > > @@ -2219,35 +2252,40 @@ (define_insn "*thumb1_andsi3_insn" > > "TARGET_THUMB1" > > "and\\t%0, %2" > > [(set_attr "length" "2") > > + (set_attr "type" "simple_alu_imm") > > (set_attr "conds" "set")]) > > > > (define_insn "*andsi3_compare0" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (and:SI (match_operand:SI 1 "s_register_operand" "r,r") > > - (match_operand:SI 2 "arm_not_operand" "rI,K")) > > + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") > > + (match_operand:SI 2 "arm_not_operand" "I,K,r")) > > (const_int 0))) > > - (set (match_operand:SI 0 "s_register_operand" "=r,r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > (and:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "@ > > and%.\\t%0, %1, %2 > > - bic%.\\t%0, %1, #%B2" > > - [(set_attr "conds" "set")] > > + bic%.\\t%0, %1, #%B2 > > + and%.\\t%0, %1, %2" > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*andsi3_compare0_scratch" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (and:SI (match_operand:SI 0 "s_register_operand" "r,r") > > - (match_operand:SI 1 "arm_not_operand" "rI,K")) > > + (and:SI (match_operand:SI 0 "s_register_operand" "r,r,r") > > + (match_operand:SI 1 "arm_not_operand" "I,K,r")) > > (const_int 0))) > > - (clobber (match_scratch:SI 2 "=X,r"))] > > + (clobber (match_scratch:SI 2 "=X,r,X"))] > > "TARGET_32BIT" > > "@ > > tst%?\\t%0, %1 > > - bic%.\\t%2, %0, #%B1" > > - [(set_attr "conds" "set")] > > + bic%.\\t%2, %0, #%B1 > > + tst%?\\t%0, %1" > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] > > ) > > > > (define_insn "*zeroextractsi_compare0_scratch" > > @@ -2269,7 +2307,8 @@ (define_insn "*zeroextractsi_compare0_sc > > return \"\"; > > " > > [(set_attr "conds" "set") > > - (set_attr "predicable" "yes")] > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm")] > > ) > > > > (define_insn_and_split "*ne_zeroextractsi" > > @@ -2916,13 +2955,14 @@ (define_expand "iorsi3" > > ) > > > > (define_insn_and_split "*iorsi3_insn" > > - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > - (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") > > - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] > > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") > > + (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r") > > + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] > > "TARGET_32BIT" > > "@ > > orr%?\\t%0, %1, %2 > > orn%?\\t%0, %1, #%B2 > > + orr%?\\t%0, %1, %2 > > #" > > "TARGET_32BIT > > && CONST_INT_P (operands[2]) > > @@ -2934,9 +2974,11 @@ (define_insn_and_split "*iorsi3_insn" > > INTVAL (operands[2]), operands[0], > operands[1], 0); > > DONE; > > } > > - [(set_attr "length" "4,4,16") > > - (set_attr "arch" "32,t2,32") > > - (set_attr "predicable" "yes")]) > > + [(set_attr "length" "4,4,4,16") > > + (set_attr "arch" "32,t2,32,32") > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")] > > +) > > > > (define_insn "*thumb1_iorsi3_insn" > > [(set (match_operand:SI 0 "register_operand" "=l") > > @@ -2962,25 +3004,27 @@ (define_peephole2 > > > > (define_insn "*iorsi3_compare0" > > [(set (reg:CC_NOOV CC_REGNUM) > > - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" > "%r") > > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > > + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" > "%r,r") > > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > > (const_int 0))) > > - (set (match_operand:SI 0 "s_register_operand" "=r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r") > > (ior:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "orr%.\\t%0, %1, %2" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,*")] > > ) > > > > (define_insn "*iorsi3_compare0_scratch" > > [(set (reg:CC_NOOV CC_REGNUM) > > - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" > "%r") > > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > > + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" > "%r,r") > > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > > (const_int 0))) > > - (clobber (match_scratch:SI 0 "=r"))] > > + (clobber (match_scratch:SI 0 "=r,r"))] > > "TARGET_32BIT" > > "orr%.\\t%0, %1, %2" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm, *")] > > ) > > > > (define_expand "xordi3" > > @@ -3054,12 +3098,13 @@ (define_expand "xorsi3" > > ) > > > > (define_insn_and_split "*arm_xorsi3" > > - [(set (match_operand:SI 0 "s_register_operand" "=r,r") > > - (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r") > > - (match_operand:SI 2 "reg_or_int_operand" "rI,?n")))] > > + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") > > + (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") > > + (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))] > > "TARGET_32BIT" > > "@ > > eor%?\\t%0, %1, %2 > > + eor%?\\t%0, %1, %2 > > #" > > "TARGET_32BIT > > && CONST_INT_P (operands[2]) > > @@ -3070,8 +3115,9 @@ (define_insn_and_split "*arm_xorsi3" > > INTVAL (operands[2]), operands[0], > operands[1], 0); > > DONE; > > } > > - [(set_attr "length" "4,16") > > - (set_attr "predicable" "yes")] > > + [(set_attr "length" "4,4,16") > > + (set_attr "predicable" "yes") > > + (set_attr "type" "simple_alu_imm,*,*")] > > ) > > > > (define_insn "*thumb1_xorsi3_insn" > > @@ -3081,28 +3127,32 @@ (define_insn "*thumb1_xorsi3_insn" > > "TARGET_THUMB1" > > "eor\\t%0, %2" > > [(set_attr "length" "2") > > - (set_attr "conds" "set")]) > > + (set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm")] > > +) > > > > (define_insn "*xorsi3_compare0" > > [(set (reg:CC_NOOV CC_REGNUM) > > - (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" > "r") > > - (match_operand:SI 2 "arm_rhs_operand" "rI")) > > + (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" > "r,r") > > + (match_operand:SI 2 "arm_rhs_operand" "I,r")) > > (const_int 0))) > > - (set (match_operand:SI 0 "s_register_operand" "=r") > > + (set (match_operand:SI 0 "s_register_operand" "=r,r") > > (xor:SI (match_dup 1) (match_dup 2)))] > > "TARGET_32BIT" > > "eor%.\\t%0, %1, %2" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,*")] > > ) > > > > (define_insn "*xorsi3_compare0_scratch" > > [(set (reg:CC_NOOV CC_REGNUM) > > - (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" > "r") > > - (match_operand:SI 1 "arm_rhs_operand" "rI")) > > + (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" > "r,r") > > + (match_operand:SI 1 "arm_rhs_operand" "I,r")) > > (const_int 0)))] > > "TARGET_32BIT" > > "teq%?\\t%0, %1" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm, *")] > > ) > > > > ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) > (NOT C), > > @@ -4663,7 +4713,11 @@ (define_insn "*thumb1_zero_extendhisi2" > > [(if_then_else (eq_attr "is_arch6" "yes") > > (const_int 2) (const_int 4)) > > (const_int 4)]) > > - (set_attr "type" "alu_shift,load_byte")] > > + (set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")])] > > ) > > > > (define_insn "*arm_zero_extendhisi2" > > @@ -4684,8 +4738,12 @@ (define_insn "*arm_zero_extendhisi2_v6" > > "@ > > uxth%?\\t%0, %1 > > ldr%(h%)\\t%0, %1" > > - [(set_attr "type" "alu_shift,load_byte") > > - (set_attr "predicable" "yes")] > > + [(set_attr "predicable" "yes") > > + (set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")])] > > ) > > > > (define_insn "*arm_zero_extendhisi2addsi" > > @@ -4755,7 +4813,11 @@ (define_insn "*thumb1_zero_extendqisi2_v > > uxtb\\t%0, %1 > > ldrb\\t%0, %1" > > [(set_attr "length" "2") > > - (set_attr "type" "alu_shift,load_byte")] > > + (set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")])] > > ) > > > > (define_insn "*arm_zero_extendqisi2" > > @@ -4777,7 +4839,11 @@ (define_insn "*arm_zero_extendqisi2_v6" > > "@ > > uxtb%(%)\\t%0, %1 > > ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes")] > > ) > > > > @@ -4951,7 +5017,11 @@ (define_insn "thumb1_extendhisi2" > > [(if_then_else (eq_attr "is_arch6" "yes") > > (const_int 2) (const_int 4)) > > (const_int 4)]) > > - (set_attr "type" "alu_shift,load_byte") > > + (set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "pool_range" "*,1020")] > > ) > > > > @@ -5024,7 +5094,11 @@ (define_insn "*arm_extendhisi2_v6" > > "@ > > sxth%?\\t%0, %1 > > ldr%(sh%)\\t%0, %1" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,256") > > (set_attr "neg_pool_range" "*,244")] > > @@ -5124,7 +5198,11 @@ (define_insn "*arm_extendqisi_v6" > > "@ > > sxtb%?\\t%0, %1 > > ldr%(sb%)\\t%0, %1" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,256") > > (set_attr "neg_pool_range" "*,244")] > > @@ -5237,7 +5315,12 @@ (define_insn "thumb1_extendqisi2" > > (const_int 2) > > (if_then_else (eq_attr "is_arch6" "yes") > > (const_int 4) (const_int 6))]) > > - (set_attr "type" "alu_shift,load_byte,load_byte")] > > + (set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte") > > + (const_string "load_byte")])] > > ) > > > > (define_expand "extendsfdf2" > > @@ -5611,7 +5694,7 @@ (define_insn "*arm_movsi_insn" > > movw%?\\t%0, %1 > > ldr%?\\t%0, %1 > > str%?\\t%1, %0" > > - [(set_attr "type" "*,*,*,*,load1,store1") > > + [(set_attr "type" > "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1") > > (set_attr "insn" "mov,mov,mvn,mov,*,*") > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,*,*,*,4096,*") > > @@ -5910,7 +5993,8 @@ (define_insn "*movsi_compare0" > > "@ > > cmp%?\\t%0, #0 > > sub%.\\t%0, %1, #0" > > - [(set_attr "conds" "set")] > > + [(set_attr "conds" "set") > > + (set_attr "type" "simple_alu_imm,simple_alu_imm")] > > ) > > > > ;; Subroutine to store a half word from a register into memory. > > @@ -6323,22 +6407,30 @@ (define_insn "*movhi_insn_arch4" > > mvn%?\\t%0, #%B1\\t%@ movhi > > str%(h%)\\t%1, %0\\t%@ movhi > > ldr%(h%)\\t%0, %1\\t%@ movhi" > > - [(set_attr "type" "*,*,store1,load1") > > - (set_attr "predicable" "yes") > > + [(set_attr "predicable" "yes") > > (set_attr "insn" "mov,mvn,*,*") > > (set_attr "pool_range" "*,*,*,256") > > - (set_attr "neg_pool_range" "*,*,*,244")] > > + (set_attr "neg_pool_range" "*,*,*,244") > > + (set_attr_alternative "type" > > + [(if_then_else (match_operand 1 > "const_int_operand" "") > > + (const_string > "simple_alu_imm" ) > > + (const_string "*")) > > + (const_string "simple_alu_imm") > > + (const_string "store1") > > + (const_string "load1")])] > > ) > > > > (define_insn "*movhi_bytes" > > - [(set (match_operand:HI 0 "s_register_operand" "=r,r") > > - (match_operand:HI 1 "arm_rhs_operand" "rI,K"))] > > + [(set (match_operand:HI 0 "s_register_operand" "=r,r,r") > > + (match_operand:HI 1 "arm_rhs_operand" "I,r,K"))] > > "TARGET_ARM" > > "@ > > mov%?\\t%0, %1\\t%@ movhi > > + mov%?\\t%0, %1\\t%@ movhi > > mvn%?\\t%0, #%B1\\t%@ movhi" > > [(set_attr "predicable" "yes") > > - (set_attr "insn" "mov,mvn")] > > + (set_attr "insn" "mov, mov,mvn") > > + (set_attr "type" "simple_alu_imm,*,simple_alu_imm")] > > ) > > > > (define_expand "thumb_movhi_clobber" > > @@ -6463,23 +6555,24 @@ (define_expand "movqi" > > > > > > (define_insn "*arm_movqi_insn" > > - [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,l,Uu,r,m") > > - (match_operand:QI 1 "general_operand" "rI,K,Uu,l,m,r"))] > > + [(set (match_operand:QI 0 "nonimmediate_operand" > "=r,r,r,l,Uu,r,m") > > + (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))] > > "TARGET_32BIT > > && ( register_operand (operands[0], QImode) > > || register_operand (operands[1], QImode))" > > "@ > > mov%?\\t%0, %1 > > + mov%?\\t%0, %1 > > mvn%?\\t%0, #%B1 > > ldr%(b%)\\t%0, %1 > > str%(b%)\\t%1, %0 > > ldr%(b%)\\t%0, %1 > > str%(b%)\\t%1, %0" > > - [(set_attr "type" "*,*,load1,store1,load1,store1") > > - (set_attr "insn" "mov,mvn,*,*,*,*") > > + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, > load1, store1") > > + (set_attr "insn" "mov,mov,mvn,*,*,*,*") > > (set_attr "predicable" "yes") > > - (set_attr "arch" "any,any,t2,t2,any,any") > > - (set_attr "length" "4,4,2,2,4,4")] > > + (set_attr "arch" "any,any,any,t2,t2,any,any") > > + (set_attr "length" "4,4,4,2,2,4,4")] > > ) > > > > (define_insn "*thumb1_movqi_insn" > > @@ -6496,7 +6589,7 @@ (define_insn "*thumb1_movqi_insn" > > mov\\t%0, %1 > > mov\\t%0, %1" > > [(set_attr "length" "2") > > - (set_attr "type" "*,load1,store1,*,*,*") > > + (set_attr "type" > "simple_alu_imm,load1,store1,*,*,simple_alu_imm") > > (set_attr "insn" "*,*,*,mov,mov,mov") > > (set_attr "pool_range" "*,32,*,*,*,*") > > (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")]) > > @@ -7617,7 +7710,8 @@ (define_insn "*arm_cmpsi_insn" > > [(set_attr "conds" "set") > > (set_attr "arch" "t2,t2,any,any") > > (set_attr "length" "2,2,4,4") > > - (set_attr "predicable" "yes")] > > + (set_attr "predicable" "yes") > > + (set_attr "type" "*,*,*,simple_alu_imm")] > > ) > > > > (define_insn "*cmpsi_shiftsi" > > @@ -8182,7 +8276,20 @@ (define_insn "*movsicc_insn" > > mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" > > [(set_attr "length" "4,4,4,4,8,8,8,8") > > (set_attr "conds" "use") > > - (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")] > > + (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn") > > + (set_attr_alternative "type" > > + [(if_then_else (match_operand 2 > "const_int_operand" "") > > + (const_string > "simple_alu_imm") > > + (const_string "*")) > > + (const_string "simple_alu_imm") > > + (if_then_else (match_operand 1 > "const_int_operand" "") > > + (const_string > "simple_alu_imm") > > + (const_string "*")) > > + (const_string "simple_alu_imm") > > + (const_string "*") > > + (const_string "*") > > + (const_string "*") > > + (const_string "*")])] > > ) > > > > (define_insn "*movsfcc_soft_insn" > > @@ -9982,7 +10089,13 @@ (define_insn "*if_plus_move" > > sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" > > [(set_attr "conds" "use") > > (set_attr "length" "4,4,8,8") > > - (set_attr "type" "*,*,*,*")] > > + (set_attr_alternative "type" > > + [(if_then_else (match_operand 3 > "const_int_operand" "") > > + (const_string > "simple_alu_imm" ) > > + (const_string "*")) > > + (const_string "simple_alu_imm") > > + (const_string "*") > > + (const_string "*")])] > > ) > > > > (define_insn "*ifcompare_move_plus" > > @@ -10018,7 +10131,13 @@ (define_insn "*if_move_plus" > > sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" > > [(set_attr "conds" "use") > > (set_attr "length" "4,4,8,8") > > - (set_attr "type" "*,*,*,*")] > > + (set_attr_alternative "type" > > + [(if_then_else (match_operand 3 > "const_int_operand" "") > > + (const_string > "simple_alu_imm" ) > > + (const_string "*")) > > + (const_string "simple_alu_imm") > > + (const_string "*") > > + (const_string "*")])] > > ) > > > > (define_insn "*ifcompare_arith_arith" > > diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md > > index > 280af12f93222ce76ab0351898d567e3017fc34e..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/arm1020e.md > > +++ b/gcc/config/arm/arm1020e.md > > @@ -66,7 +66,7 @@ (define_cpu_unit "1020l_e,1020l_m,1020l_ > > ;; ALU operations with no shifted operand > > (define_insn_reservation "1020alu_op" 1 > > (and (eq_attr "tune" "arm1020e,arm1022e") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "1020a_e,1020a_m,1020a_w") > > > > ;; ALU operations with a shift-by-constant operand > > diff --git a/gcc/config/arm/arm1026ejs.md > b/gcc/config/arm/arm1026ejs.md > > index > e6221363898102c566f8be5423f5509a0df49acd..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/arm1026ejs.md > > +++ b/gcc/config/arm/arm1026ejs.md > > @@ -66,7 +66,7 @@ (define_cpu_unit "l_e,l_m,l_w" "arm1026e > > ;; ALU operations with no shifted operand > > (define_insn_reservation "alu_op" 1 > > (and (eq_attr "tune" "arm1026ejs") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "a_e,a_m,a_w") > > > > ;; ALU operations with a shift-by-constant operand > > diff --git a/gcc/config/arm/arm1136jfs.md > b/gcc/config/arm/arm1136jfs.md > > index > 8fc30e976f0fbfe45f360ee93706cf64f9ef8f08..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/arm1136jfs.md > > +++ b/gcc/config/arm/arm1136jfs.md > > @@ -75,7 +75,7 @@ (define_cpu_unit "l_a,l_dc1,l_dc2,l_wb" > > ;; ALU operations with no shifted operand > > (define_insn_reservation "11_alu_op" 2 > > (and (eq_attr "tune" "arm1136js,arm1136jfs") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "e_1,e_2,e_3,e_wb") > > > > ;; ALU operations with a shift-by-constant operand > > diff --git a/gcc/config/arm/arm926ejs.md > b/gcc/config/arm/arm926ejs.md > > index > d3908f9e3ecd972c6f93a77bfd1bde4e501dcdba..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/arm926ejs.md > > +++ b/gcc/config/arm/arm926ejs.md > > @@ -58,7 +58,7 @@ (define_cpu_unit "e,m,w" "arm926ejs") > > ;; ALU operations with no shifted operand > > (define_insn_reservation "9_alu_op" 1 > > (and (eq_attr "tune" "arm926ejs") > > - (eq_attr "type" "alu,alu_shift")) > > + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift")) > > "e,m,w") > > > > ;; ALU operations with a shift-by-register operand > > diff --git a/gcc/config/arm/cortex-a15.md b/gcc/config/arm/cortex- > a15.md > > index > b86c6e706900b81adea9c5a487b96bcb473b8f62..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-a15.md > > +++ b/gcc/config/arm/cortex-a15.md > > @@ -61,7 +61,7 @@ (define_cpu_unit "ca15_sx2_alu, ca15_sx2 > > ;; Simple ALU without shift > > (define_insn_reservation "cortex_a15_alu" 2 > > (and (eq_attr "tune" "cortexa15") > > - (and (eq_attr "type" "alu") > > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (eq_attr "neon_type" "none"))) > > "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)") > > > > diff --git a/gcc/config/arm/cortex-a5.md b/gcc/config/arm/cortex- > a5.md > > index > eb154e2980382befc77027ec8a0a35fcc34a1ff5..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-a5.md > > +++ b/gcc/config/arm/cortex-a5.md > > @@ -58,7 +58,7 @@ (define_cpu_unit "cortex_a5_fp_div_sqrt" > > > > (define_insn_reservation "cortex_a5_alu" 2 > > (and (eq_attr "tune" "cortexa5") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "cortex_a5_ex1") > > > > (define_insn_reservation "cortex_a5_alu_shift" 2 > > diff --git a/gcc/config/arm/cortex-a8.md b/gcc/config/arm/cortex- > a8.md > > index > 1922e5cf4c66c147830ba3e7b195263a3aac3015..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-a8.md > > +++ b/gcc/config/arm/cortex-a8.md > > @@ -85,7 +85,7 @@ (define_reservation "cortex_a8_multiply_ > > ;; (source read in E2 and destination available at the end of that > cycle). > > (define_insn_reservation "cortex_a8_alu" 2 > > (and (eq_attr "tune" "cortexa8") > > - (ior (and (and (eq_attr "type" "alu") > > + (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (eq_attr "neon_type" "none")) > > (not (eq_attr "insn" "mov,mvn"))) > > (eq_attr "insn" "clz"))) > > @@ -107,7 +107,7 @@ (define_insn_reservation "cortex_a8_alu_ > > > > (define_insn_reservation "cortex_a8_mov" 1 > > (and (eq_attr "tune" "cortexa8") > > - (and (eq_attr "type" "alu,alu_shift,alu_shift_reg") > > + (and (eq_attr "type" > "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg") > > (eq_attr "insn" "mov,mvn"))) > > "cortex_a8_default") > > > > diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex- > a9.md > > index > 12c19efb12132e932dea03031ed5fd364e4b9aef..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-a9.md > > +++ b/gcc/config/arm/cortex-a9.md > > @@ -80,7 +80,7 @@ (define_reservation "cortex_a9_mult_long > > ;; which can go down E2 without any problem. > > (define_insn_reservation "cortex_a9_dp" 2 > > (and (eq_attr "tune" "cortexa9") > > - (ior (and (eq_attr "type" "alu") > > + (ior (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (eq_attr "neon_type" "none")) > > (and (and (eq_attr "type" "alu_shift_reg, alu_shift") > > (eq_attr "insn" "mov")) > > diff --git a/gcc/config/arm/cortex-m4.md b/gcc/config/arm/cortex- > m4.md > > index > 57479853610ebdcdff8db4cc5ff3052c1a09b276..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-m4.md > > +++ b/gcc/config/arm/cortex-m4.md > > @@ -31,7 +31,7 @@ (define_reservation "cortex_m4_ex" "cort > > ;; ALU and multiply is one cycle. > > (define_insn_reservation "cortex_m4_alu" 1 > > (and (eq_attr "tune" "cortexm4") > > - (eq_attr "type" "alu,alu_shift,alu_shift_reg,mult")) > > + (eq_attr "type" > "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg,mult")) > > "cortex_m4_ex") > > > > ;; Byte, half-word and word load is two cycles. > > diff --git a/gcc/config/arm/cortex-r4.md b/gcc/config/arm/cortex- > r4.md > > index > e26c3d45d5e6c5926500510c653619fb2a686851..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/cortex-r4.md > > +++ b/gcc/config/arm/cortex-r4.md > > @@ -78,13 +78,13 @@ (define_reservation "cortex_r4_branch" " > > ;; for the purposes of the dual-issue constraints above. > > (define_insn_reservation "cortex_r4_alu" 2 > > (and (eq_attr "tune_cortexr4" "yes") > > - (and (eq_attr "type" "alu") > > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (not (eq_attr "insn" "mov")))) > > "cortex_r4_alu") > > > > (define_insn_reservation "cortex_r4_mov" 2 > > (and (eq_attr "tune_cortexr4" "yes") > > - (and (eq_attr "type" "alu") > > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (eq_attr "insn" "mov"))) > > "cortex_r4_mov") > > > > diff --git a/gcc/config/arm/fa526.md b/gcc/config/arm/fa526.md > > index > 42eb9b272fb1b9df553c566e8c41cb4d44c306ca..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/fa526.md > > +++ b/gcc/config/arm/fa526.md > > @@ -62,7 +62,7 @@ (define_cpu_unit "fa526_core" "fa526") > > ;; ALU operations > > (define_insn_reservation "526_alu_op" 1 > > (and (eq_attr "tune" "fa526") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "fa526_core") > > > > (define_insn_reservation "526_alu_shift_op" 2 > > diff --git a/gcc/config/arm/fa606te.md b/gcc/config/arm/fa606te.md > > index > 06e63d696bde2e13556982e053cf2b0fd719d1ce..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/fa606te.md > > +++ b/gcc/config/arm/fa606te.md > > @@ -62,7 +62,7 @@ (define_cpu_unit "fa606te_core" "fa606te > > ;; ALU operations > > (define_insn_reservation "606te_alu_op" 1 > > (and (eq_attr "tune" "fa606te") > > - (eq_attr "type" "alu,alu_shift,alu_shift_reg")) > > + (eq_attr "type" > "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg")) > > "fa606te_core") > > > > > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > ; > > diff --git a/gcc/config/arm/fa626te.md b/gcc/config/arm/fa626te.md > > index > 7fe1c8724bef3feae8a291777379a5dac3cf31d1..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/fa626te.md > > +++ b/gcc/config/arm/fa626te.md > > @@ -68,7 +68,7 @@ (define_cpu_unit "fa626te_core" "fa626te > > ;; ALU operations > > (define_insn_reservation "626te_alu_op" 1 > > (and (eq_attr "tune" "fa626,fa626te") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "fa626te_core") > > > > (define_insn_reservation "626te_alu_shift_op" 2 > > diff --git a/gcc/config/arm/fa726te.md b/gcc/config/arm/fa726te.md > > index > 3c33d59710478a5a46435e4df3177bbfcca1faff..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/fa726te.md > > +++ b/gcc/config/arm/fa726te.md > > @@ -85,7 +85,7 @@ (define_insn_reservation "726te_shift_op > > ;; Other ALU instructions 2 cycles. > > (define_insn_reservation "726te_alu_op" 1 > > (and (eq_attr "tune" "fa726te") > > - (and (eq_attr "type" "alu") > > + (and (eq_attr "type" "alu_reg,simple_alu_imm") > > (not (eq_attr "insn" "mov,mvn")))) > > "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") > > > > diff --git a/gcc/config/arm/fmp626.md b/gcc/config/arm/fmp626.md > > index > 9ba33ddec4741ef3124c23ca8cf9f42f38feb6c8..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/fmp626.md > > +++ b/gcc/config/arm/fmp626.md > > @@ -63,7 +63,7 @@ (define_cpu_unit "fmp626_core" "fmp626") > > ;; ALU operations > > (define_insn_reservation "mp626_alu_op" 1 > > (and (eq_attr "tune" "fmp626") > > - (eq_attr "type" "alu")) > > + (eq_attr "type" "alu_reg,simple_alu_imm")) > > "fmp626_core") > > > > (define_insn_reservation "mp626_alu_shift_op" 2 > > diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md > > index > 21035808c0e5964d29b7c903b5721210223153e0..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/neon.md > > +++ b/gcc/config/arm/neon.md > > @@ -193,7 +193,7 @@ (define_insn "*neon_mov<mode>" > > } > > } > > [(set_attr "neon_type" > "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*") > > - (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu,load2,store2") > > + (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2") > > (set_attr "insn" "*,*,*,*,*,*,mov,*,*") > > (set_attr "length" "4,4,4,4,4,4,8,8,8") > > (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") > > @@ -238,7 +238,7 @@ (define_insn "*neon_mov<mode>" > > } > > [(set_attr "neon_type" > "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\ > > neon_mrrc,neon_mcr_2_mcrr,*,*,*") > > - (set_attr "type" "*,*,*,*,*,*,alu,load4,store4") > > + (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4") > > (set_attr "insn" "*,*,*,*,*,*,mov,*,*") > > (set_attr "length" "4,8,4,8,8,8,16,8,16") > > (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") > > diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md > > index > a5302f479f5091d08f4bf1a9ee9b0423692372af..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/thumb2.md > > +++ b/gcc/config/arm/thumb2.md > > @@ -1,5 +1,5 @@ > > ;; ARM Thumb-2 Machine Description > > -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. > > +;; Copyright (C) 2007, 2008, 2010, 2012 Free Software Foundation, > Inc. > > ;; Written by CodeSourcery, LLC. > > ;; > > ;; This file is part of GCC. > > @@ -180,7 +180,7 @@ (define_insn "*thumb2_movsi_insn" > > ldr%?\\t%0, %1 > > str%?\\t%1, %0 > > str%?\\t%1, %0" > > - [(set_attr "type" "*,*,*,*,load1,load1,store1,store1") > > + [(set_attr "type" > "*,*,simple_alu_imm,*,load1,load1,store1,store1") > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,*,*,*,1020,4096,*,*") > > (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")] > > @@ -568,7 +568,11 @@ (define_insn "*thumb2_extendqisi_v6" > > "@ > > sxtb%?\\t%0, %1 > > ldr%(sb%)\\t%0, %1" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,4096") > > (set_attr "neg_pool_range" "*,250")] > > @@ -581,7 +585,11 @@ (define_insn "*thumb2_zero_extendhisi2_v > > "@ > > uxth%?\\t%0, %1 > > ldr%(h%)\\t%0, %1" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,4096") > > (set_attr "neg_pool_range" "*,250")] > > @@ -594,7 +602,11 @@ (define_insn "thumb2_zero_extendqisi2_v6 > > "@ > > uxtb%(%)\\t%0, %1 > > ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" > > - [(set_attr "type" "alu_shift,load_byte") > > + [(set_attr_alternative "type" > > + [(if_then_else (eq_attr "tune" "cortexa7") > > + (const_string > "simple_alu_imm") > > + (const_string "alu_shift")) > > + (const_string "load_byte")]) > > (set_attr "predicable" "yes") > > (set_attr "pool_range" "*,4096") > > (set_attr "neg_pool_range" "*,250")] > > @@ -790,8 +802,8 @@ (define_insn "thumb2_addsi3_compare0" > > (define_insn "*thumb2_addsi3_compare0_scratch" > > [(set (reg:CC_NOOV CC_REGNUM) > > (compare:CC_NOOV > > - (plus:SI (match_operand:SI 0 "s_register_operand" "l, r") > > - (match_operand:SI 1 "arm_add_operand" "lPv,rIL")) > > + (plus:SI (match_operand:SI 0 "s_register_operand" "l,l, r,r") > > + (match_operand:SI 1 "arm_add_operand" "Pv,l,IL,r")) > > (const_int 0)))] > > "TARGET_THUMB2" > > "* > > @@ -808,7 +820,8 @@ (define_insn "*thumb2_addsi3_compare0_sc > > return \"cmn\\t%0, %1\"; > > " > > [(set_attr "conds" "set") > > - (set_attr "length" "2,4")] > > + (set_attr "length" "2,2,4,4") > > + (set_attr "type" "simple_alu_imm,*,simple_alu_imm,*")] > > ) > > > > (define_insn "*thumb2_mulsi_short" > > diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md > > index > d48d4e66a6c827ec6d471a218a175537f038d798..00000000000000000000000000000 > 00000000000 100644 > > --- a/gcc/config/arm/vfp.md > > +++ b/gcc/config/arm/vfp.md > > @@ -77,7 +77,7 @@ (define_insn "*arm_movsi_vfp" > > } > > " > > [(set_attr "predicable" "yes") > > - (set_attr "type" > "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") > > + (set_attr "type" > "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loa > ds,f_stores") > > (set_attr "neon_type" > "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") > > (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*") > > (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*") > >
On 29/11/12 14:58, Greta Yorsh wrote: > > >> -----Original Message----- >> From: Richard Earnshaw >> Sent: 29 November 2012 10:12 >> To: Greta Yorsh >> Cc: GCC Patches; Ramana Radhakrishnan; nickc@redhat.com; >> paul@codesourcery.com >> Subject: Re: [PATCH,ARM] Subdivide alu into alu_reg and simple_alu_imm >> >> >> ; ??? Check Thumb-2 split length >> (define_insn_and_split "*arm_subsi3_insn" >> - [(set (match_operand:SI 0 "s_register_operand" >> "=r,r,rk,r") >> - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") >> - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] >> + [(set (match_operand:SI 0 "s_register_operand" >> "=r,r,r,rk,r") >> + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") >> + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] >> "TARGET_32BIT" >> "@ >> rsb%?\\t%0, %2, %1 >> sub%?\\t%0, %1, %2 >> sub%?\\t%0, %1, %2 >> + sub%?\\t%0, %1, %2 >> #" >> "&& (CONST_INT_P (operands[1]) >> && !const_ok_for_arm (INTVAL (operands[1])))" >> @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn >> INTVAL (operands[1]), operands[0], operands[2], >> 0); >> DONE; >> " >> - [(set_attr "length" "4,4,4,16") >> - (set_attr "predicable" "yes")] >> + [(set_attr "length" "4,4,4,4,16") >> + (set_attr "predicable" "yes") >> + (set_attr "type" "*,simple_alu_imm,*,*,*")] >> ) >> >> >> There's something wrong here. MINUS (reg, imm) should be canonicalized >> elsewhere to PLUS (reg, -imm), so the alternative you've split /should/ >> never match anything. On the other hand, you haven't split the first >> alternative (that generates RSB), which is a legitimate use of an >> immediate in MINUS. > > The "rI" constraint on operand 1 in the first alternative is not split because RSB instruction it generates cannot dual-issue (even with an immediate operand) in the second slot on Cortex-A7, and so the alternative should not be marked as simple_alu_imm. > > Thanks, > Greta > Ah! Um... OK then. R. > >> >> Otherwise, OK. >> >> R. >> >> On 29/11/12 09:57, Greta Yorsh wrote: >>> For attribute named "type", subdivide "alu" into "alu_reg" and >>> "simple_alu_imm". >>> Set type attribute as appropriate in define_insn patterns with >> immediate >>> operands. >>> Update pipeline descriptions to use the new values of type attribute. >>> >>> No regression on qemu arm-none-eabi -mcpu=cortex-a15/cortex-a7. >>> >>> Bootstrap successful on Cortex-A15. >>> >>> No difference in generated assembly when compiling all of >> preprocessed >>> sources of gcc 4.8 as a test in various configurations: -mcpu=cortex- >> a15 >>> -march=armv6t2 -marm/-mthumb -O0/-O1/-O2/-O3/-Os. >>> >>> The motivation for this patch is cortex-a7 pipeline description, >> which will >>> be submitted separately. >>> >>> Ok for trunk? >>> >>> Thanks, >>> Greta >>> >>> ChangeLog >>> >>> gcc/ >>> >>> 2012-11-28 Ramana Radhakrishnan <Ramana.Radhakrishnan@arm.com> >>> Greta Yorsh <Greta.Yorsh@arm.com> >>> >>> * config/arm/arm.md (type): Subdivide "alu" into "alu_reg" >> and >>> "simple_alu_imm". >>> (core_cycles): Use new names. >>> (arm_addsi3): Set type attribute for patterns involving >>> simple_alu_imm. >>> (addsi3_compare0, addsi3_compare0_scratch): Likewise. >>> (addsi3_compare_op1, addsi3_compare_op2, >> compare_addsi2_op0): >>> Likewise. >>> (compare_addsi2_op1, arm_subsi3_insn, subsi3_compare0): >> Likewise. >>> (subsi3_compare, arm_decscc,arm_andsi3_insn): Likewise. >>> (thumb1_andsi3_insn, andsi3_compare0_scratch): Likewise. >>> (zeroextractsi_compare0_scratch, iorsi3_insn, >> iorsi3_compare0): >>> Likewise. >>> (iorsi3_compare0_scratch, arm_xorsi3, thumb1_xorsi3_insn): >> Likewise. >>> (xorsi3_compare0, xorsi3_compare0_scratch, >> thumb1_zero_extendhisi2): >>> Likewise. >>> (arm_zero_extendhisi2_v6, thumb1_zero_extendqisi2_v): >> Likewise. >>> (arm_zero_extendqisi2_v6, thumb1_extendhisi2, >> arm_extendqisi_v6): >>> Likewise. >>> (thumb1_extendqisi2, arm_movsi_insn): Likewise. >>> (movsi_compare0, movhi_insn_arch4, movhi_bytes): Likewise. >>> (arm_movqi_insn, thumb1_movqi_insn, arm_cmpsi_insn): >> Likewise. >>> (movsicc_insn, if_plus_move, if_move_plus): Likewise. >>> * config/arm/neon.md (neon_mov<mode>/VDX): Likewise. >>> (neon_mov<mode>/VQXMOV): Likewise. >>> * config/arm/arm1020e.md (1020alu_op): Likewise. >>> * config/arm/fmp626.md (mp626_alu_op): Likewise. >>> * config/arm/fa726te.md (726te_alu_op): Likewise. >>> * config/arm/fa626te.md (626te_alu_op): Likewise. >>> * config/arm/fa606te.md (606te_alu_op): Likewise. >>> * config/arm/fa526.md (526_alu_op): Likewise. >>> * config/arm/cortex-r4.md (cortex_r4_alu, cortex_r4_mov): >> Likewise. >>> * config/arm/cortex-m4.md (cortex_m4_alu): Likewise. >>> * config/arm/cortex-a9.md (cprtex_a9_dp): Likewise. >>> * config/arm/cortex-a8.md (cortex_a8_alu, cortex_a8_mov): >> Likewise. >>> * config/arm/cortex-a5.md (cortex_a5_alu): Likewise. >>> * config/arm/cortex-a15.md (cortex_a15_alu): Likewise. >>> * config/arm/arm926ejs.md (9_alu_op): Likewise. >>> * config/arm/arm1136jfs.md (11_alu_op): Likewise. >>> * config/arm/arm1026ejs.md (alu_op): Likewise. >>> >>> >>> 1-split-alu-type-attr.v2.patch.txt >>> >>> >>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md >>> index >> 7e92b69ad861fe90ed409494d451854f30888462..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/arm.md >>> +++ b/gcc/config/arm/arm.md >>> @@ -323,8 +323,14 @@ (define_attr "insn" >>> ; Classification of each insn >>> ; Note: vfp.md has different meanings for some of these, and some >> further >>> ; types as well. See that file for details. >>> -; alu any alu instruction that doesn't hit memory or fp >>> -; regs or have a shifted source operand >>> +; simple_alu_imm a simple alu instruction that doesn't hit memory >> or fp >>> +; regs or have a shifted source operand and has an >> immediate >>> +; operand. This currently only tracks very basic >> immediate >>> +; alu operations. >>> +; alu_reg any alu instruction that doesn't hit memory or fp >>> +; regs or have a shifted source operand >>> +; and does not have an immediate operand. This is >>> +; also the default >>> ; alu_shift any data instruction that doesn't hit memory or fp >>> ; regs, but has a source operand shifted by a constant >>> ; alu_shift_reg any data instruction that doesn't hit memory or >> fp >>> @@ -354,7 +360,8 @@ (define_attr "insn" >>> ; >>> >>> (define_attr "type" >>> - "alu,\ >>> + "simple_alu_imm,\ >>> + alu_reg,\ >>> alu_shift,\ >>> alu_shift_reg,\ >>> mult,\ >>> @@ -398,7 +405,7 @@ (define_attr "type" >>> (eq_attr "insn" >> "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\ >>> umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") >>> (const_string "mult") >>> - (const_string "alu"))) >>> + (const_string "alu_reg"))) >>> >>> ; Is this an (integer side) multiply with a 64-bit result? >>> (define_attr "mul64" "no,yes" >>> @@ -536,7 +543,7 @@ (define_attr "write_conflict" "no,yes" >>> ; than one on the main cpu execution unit. >>> (define_attr "core_cycles" "single,multi" >>> (if_then_else (eq_attr "type" >>> - "alu,alu_shift,float,fdivd,fdivs") >>> + "simple_alu_imm,alu_reg,alu_shift,float,fdivd,fdivs") >>> (const_string "single") >>> (const_string "multi"))) >>> >>> @@ -796,7 +803,11 @@ (define_insn_and_split "*arm_addsi3" >>> " >>> [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16") >>> (set_attr "predicable" "yes") >>> - (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*")] >>> + (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*") >>> + (set (attr "type") (if_then_else (match_operand 2 >> "const_int_operand" "") >>> + (const_string "simple_alu_imm") >>> + (const_string "alu_reg"))) >>> + ] >>> ) >>> >>> (define_insn_and_split "*thumb1_addsi3" >>> @@ -865,30 +876,35 @@ (define_peephole2 >>> (define_insn "addsi3_compare0" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") >>> - (match_operand:SI 2 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 1 "s_register_operand" "r, r,r") >>> + (match_operand:SI 2 "arm_add_operand" "I,L,r")) >>> (const_int 0))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (plus:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_ARM" >>> "@ >>> add%.\\t%0, %1, %2 >>> - sub%.\\t%0, %1, #%n2" >>> - [(set_attr "conds" "set")] >>> + sub%.\\t%0, %1, #%n2 >>> + add%.\\t%0, %1, %2" >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm, simple_alu_imm, *")] >>> ) >>> >>> (define_insn "*addsi3_compare0_scratch" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (plus:SI (match_operand:SI 0 "s_register_operand" "r, r") >>> - (match_operand:SI 1 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 0 "s_register_operand" "r, r, r") >>> + (match_operand:SI 1 "arm_add_operand" "I,L, r")) >>> (const_int 0)))] >>> "TARGET_ARM" >>> "@ >>> cmn%?\\t%0, %1 >>> - cmp%?\\t%0, #%n1" >>> + cmp%?\\t%0, #%n1 >>> + cmn%?\\t%0, %1" >>> [(set_attr "conds" "set") >>> - (set_attr "predicable" "yes")] >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm, simple_alu_imm, *") >>> + ] >>> ) >>> >>> (define_insn "*compare_negsi_si" >>> @@ -963,59 +979,67 @@ (define_peephole2 >>> (define_insn "*addsi3_compare_op1" >>> [(set (reg:CC_C CC_REGNUM) >>> (compare:CC_C >>> - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") >>> - (match_operand:SI 2 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") >>> + (match_operand:SI 2 "arm_add_operand" "I,L,r")) >>> (match_dup 1))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (plus:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "@ >>> add%.\\t%0, %1, %2 >>> - sub%.\\t%0, %1, #%n2" >>> - [(set_attr "conds" "set")] >>> + sub%.\\t%0, %1, #%n2 >>> + add%.\\t%0, %1, %2" >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*addsi3_compare_op2" >>> [(set (reg:CC_C CC_REGNUM) >>> (compare:CC_C >>> - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") >>> - (match_operand:SI 2 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") >>> + (match_operand:SI 2 "arm_add_operand" "I,L,r")) >>> (match_dup 2))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (plus:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "@ >>> add%.\\t%0, %1, %2 >>> + add%.\\t%0, %1, %2 >>> sub%.\\t%0, %1, #%n2" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*compare_addsi2_op0" >>> [(set (reg:CC_C CC_REGNUM) >>> (compare:CC_C >>> - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") >>> - (match_operand:SI 1 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") >>> + (match_operand:SI 1 "arm_add_operand" "I,L,r")) >>> (match_dup 0)))] >>> "TARGET_32BIT" >>> "@ >>> cmn%?\\t%0, %1 >>> - cmp%?\\t%0, #%n1" >>> + cmp%?\\t%0, #%n1 >>> + cmn%?\\t%0, %1" >>> [(set_attr "conds" "set") >>> - (set_attr "predicable" "yes")] >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*compare_addsi2_op1" >>> [(set (reg:CC_C CC_REGNUM) >>> (compare:CC_C >>> - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") >>> - (match_operand:SI 1 "arm_add_operand" "rI,L")) >>> + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") >>> + (match_operand:SI 1 "arm_add_operand" "I,L,r")) >>> (match_dup 1)))] >>> "TARGET_32BIT" >>> "@ >>> cmn%?\\t%0, %1 >>> - cmp%?\\t%0, #%n1" >>> + cmp%?\\t%0, #%n1 >>> + cmn%?\\t%0, %1" >>> [(set_attr "conds" "set") >>> - (set_attr "predicable" "yes")] >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*addsi3_carryin_<optab>" >>> @@ -1253,14 +1277,15 @@ (define_insn "thumb1_subsi3_insn" >>> >>> ; ??? Check Thumb-2 split length >>> (define_insn_and_split "*arm_subsi3_insn" >>> - [(set (match_operand:SI 0 "s_register_operand" >> "=r,r,rk,r") >>> - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") >>> - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] >>> + [(set (match_operand:SI 0 "s_register_operand" >> "=r,r,r,rk,r") >>> + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") >>> + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] >>> "TARGET_32BIT" >>> "@ >>> rsb%?\\t%0, %2, %1 >>> sub%?\\t%0, %1, %2 >>> sub%?\\t%0, %1, %2 >>> + sub%?\\t%0, %1, %2 >>> #" >>> "&& (CONST_INT_P (operands[1]) >>> && !const_ok_for_arm (INTVAL (operands[1])))" >>> @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn >>> INTVAL (operands[1]), operands[0], >> operands[2], 0); >>> DONE; >>> " >>> - [(set_attr "length" "4,4,4,16") >>> - (set_attr "predicable" "yes")] >>> + [(set_attr "length" "4,4,4,4,16") >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "*,simple_alu_imm,*,*,*")] >>> ) >>> >>> (define_peephole2 >>> @@ -1290,29 +1316,33 @@ (define_peephole2 >>> (define_insn "*subsi3_compare0" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I") >>> - (match_operand:SI 2 "arm_rhs_operand" "rI,r")) >>> + (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,r,I") >>> + (match_operand:SI 2 "arm_rhs_operand" "I,r,r")) >>> (const_int 0))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (minus:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "@ >>> sub%.\\t%0, %1, %2 >>> + sub%.\\t%0, %1, %2 >>> rsb%.\\t%0, %2, %1" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,*,*")] >>> ) >>> >>> (define_insn "*subsi3_compare" >>> [(set (reg:CC CC_REGNUM) >>> - (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,I") >>> - (match_operand:SI 2 "arm_rhs_operand" "rI,r"))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I") >>> + (match_operand:SI 2 "arm_rhs_operand" "I,r,r"))) >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (minus:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "@ >>> sub%.\\t%0, %1, %2 >>> + sub%.\\t%0, %1, %2 >>> rsb%.\\t%0, %2, %1" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,*,*")] >>> ) >>> >>> (define_expand "decscc" >>> @@ -1334,7 +1364,8 @@ (define_insn "*arm_decscc" >>> sub%d2\\t%0, %1, #1 >>> mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" >>> [(set_attr "conds" "use") >>> - (set_attr "length" "*,8")] >>> + (set_attr "length" "*,8") >>> + (set_attr "type" "simple_alu_imm,*")] >>> ) >>> >>> (define_expand "subsf3" >>> @@ -2190,13 +2221,14 @@ (define_expand "andsi3" >>> >>> ; ??? Check split length for Thumb-2 >>> (define_insn_and_split "*arm_andsi3_insn" >>> - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> - (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") >>> - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] >>> + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") >>> + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r") >>> + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] >>> "TARGET_32BIT" >>> "@ >>> and%?\\t%0, %1, %2 >>> bic%?\\t%0, %1, #%B2 >>> + and%?\\t%0, %1, %2 >>> #" >>> "TARGET_32BIT >>> && CONST_INT_P (operands[2]) >>> @@ -2208,8 +2240,9 @@ (define_insn_and_split "*arm_andsi3_insn >>> INTVAL (operands[2]), operands[0], operands[1], >> 0); >>> DONE; >>> " >>> - [(set_attr "length" "4,4,16") >>> - (set_attr "predicable" "yes")] >>> + [(set_attr "length" "4,4,4,16") >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" >> "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")] >>> ) >>> >>> (define_insn "*thumb1_andsi3_insn" >>> @@ -2219,35 +2252,40 @@ (define_insn "*thumb1_andsi3_insn" >>> "TARGET_THUMB1" >>> "and\\t%0, %2" >>> [(set_attr "length" "2") >>> + (set_attr "type" "simple_alu_imm") >>> (set_attr "conds" "set")]) >>> >>> (define_insn "*andsi3_compare0" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (and:SI (match_operand:SI 1 "s_register_operand" "r,r") >>> - (match_operand:SI 2 "arm_not_operand" "rI,K")) >>> + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") >>> + (match_operand:SI 2 "arm_not_operand" "I,K,r")) >>> (const_int 0))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> (and:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "@ >>> and%.\\t%0, %1, %2 >>> - bic%.\\t%0, %1, #%B2" >>> - [(set_attr "conds" "set")] >>> + bic%.\\t%0, %1, #%B2 >>> + and%.\\t%0, %1, %2" >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*andsi3_compare0_scratch" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (and:SI (match_operand:SI 0 "s_register_operand" "r,r") >>> - (match_operand:SI 1 "arm_not_operand" "rI,K")) >>> + (and:SI (match_operand:SI 0 "s_register_operand" "r,r,r") >>> + (match_operand:SI 1 "arm_not_operand" "I,K,r")) >>> (const_int 0))) >>> - (clobber (match_scratch:SI 2 "=X,r"))] >>> + (clobber (match_scratch:SI 2 "=X,r,X"))] >>> "TARGET_32BIT" >>> "@ >>> tst%?\\t%0, %1 >>> - bic%.\\t%2, %0, #%B1" >>> - [(set_attr "conds" "set")] >>> + bic%.\\t%2, %0, #%B1 >>> + tst%?\\t%0, %1" >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*zeroextractsi_compare0_scratch" >>> @@ -2269,7 +2307,8 @@ (define_insn "*zeroextractsi_compare0_sc >>> return \"\"; >>> " >>> [(set_attr "conds" "set") >>> - (set_attr "predicable" "yes")] >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm")] >>> ) >>> >>> (define_insn_and_split "*ne_zeroextractsi" >>> @@ -2916,13 +2955,14 @@ (define_expand "iorsi3" >>> ) >>> >>> (define_insn_and_split "*iorsi3_insn" >>> - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> - (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") >>> - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] >>> + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") >>> + (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r") >>> + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] >>> "TARGET_32BIT" >>> "@ >>> orr%?\\t%0, %1, %2 >>> orn%?\\t%0, %1, #%B2 >>> + orr%?\\t%0, %1, %2 >>> #" >>> "TARGET_32BIT >>> && CONST_INT_P (operands[2]) >>> @@ -2934,9 +2974,11 @@ (define_insn_and_split "*iorsi3_insn" >>> INTVAL (operands[2]), operands[0], >> operands[1], 0); >>> DONE; >>> } >>> - [(set_attr "length" "4,4,16") >>> - (set_attr "arch" "32,t2,32") >>> - (set_attr "predicable" "yes")]) >>> + [(set_attr "length" "4,4,4,16") >>> + (set_attr "arch" "32,t2,32,32") >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")] >>> +) >>> >>> (define_insn "*thumb1_iorsi3_insn" >>> [(set (match_operand:SI 0 "register_operand" "=l") >>> @@ -2962,25 +3004,27 @@ (define_peephole2 >>> >>> (define_insn "*iorsi3_compare0" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" >> "%r") >>> - (match_operand:SI 2 "arm_rhs_operand" "rI")) >>> + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" >> "%r,r") >>> + (match_operand:SI 2 "arm_rhs_operand" "I,r")) >>> (const_int 0))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> (ior:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "orr%.\\t%0, %1, %2" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*iorsi3_compare0_scratch" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" >> "%r") >>> - (match_operand:SI 2 "arm_rhs_operand" "rI")) >>> + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" >> "%r,r") >>> + (match_operand:SI 2 "arm_rhs_operand" "I,r")) >>> (const_int 0))) >>> - (clobber (match_scratch:SI 0 "=r"))] >>> + (clobber (match_scratch:SI 0 "=r,r"))] >>> "TARGET_32BIT" >>> "orr%.\\t%0, %1, %2" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm, *")] >>> ) >>> >>> (define_expand "xordi3" >>> @@ -3054,12 +3098,13 @@ (define_expand "xorsi3" >>> ) >>> >>> (define_insn_and_split "*arm_xorsi3" >>> - [(set (match_operand:SI 0 "s_register_operand" "=r,r") >>> - (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r") >>> - (match_operand:SI 2 "reg_or_int_operand" "rI,?n")))] >>> + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") >>> + (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") >>> + (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))] >>> "TARGET_32BIT" >>> "@ >>> eor%?\\t%0, %1, %2 >>> + eor%?\\t%0, %1, %2 >>> #" >>> "TARGET_32BIT >>> && CONST_INT_P (operands[2]) >>> @@ -3070,8 +3115,9 @@ (define_insn_and_split "*arm_xorsi3" >>> INTVAL (operands[2]), operands[0], >> operands[1], 0); >>> DONE; >>> } >>> - [(set_attr "length" "4,16") >>> - (set_attr "predicable" "yes")] >>> + [(set_attr "length" "4,4,16") >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "simple_alu_imm,*,*")] >>> ) >>> >>> (define_insn "*thumb1_xorsi3_insn" >>> @@ -3081,28 +3127,32 @@ (define_insn "*thumb1_xorsi3_insn" >>> "TARGET_THUMB1" >>> "eor\\t%0, %2" >>> [(set_attr "length" "2") >>> - (set_attr "conds" "set")]) >>> + (set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm")] >>> +) >>> >>> (define_insn "*xorsi3_compare0" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> - (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" >> "r") >>> - (match_operand:SI 2 "arm_rhs_operand" "rI")) >>> + (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" >> "r,r") >>> + (match_operand:SI 2 "arm_rhs_operand" "I,r")) >>> (const_int 0))) >>> - (set (match_operand:SI 0 "s_register_operand" "=r") >>> + (set (match_operand:SI 0 "s_register_operand" "=r,r") >>> (xor:SI (match_dup 1) (match_dup 2)))] >>> "TARGET_32BIT" >>> "eor%.\\t%0, %1, %2" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*xorsi3_compare0_scratch" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> - (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" >> "r") >>> - (match_operand:SI 1 "arm_rhs_operand" "rI")) >>> + (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" >> "r,r") >>> + (match_operand:SI 1 "arm_rhs_operand" "I,r")) >>> (const_int 0)))] >>> "TARGET_32BIT" >>> "teq%?\\t%0, %1" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm, *")] >>> ) >>> >>> ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) >> (NOT C), >>> @@ -4663,7 +4713,11 @@ (define_insn "*thumb1_zero_extendhisi2" >>> [(if_then_else (eq_attr "is_arch6" "yes") >>> (const_int 2) (const_int 4)) >>> (const_int 4)]) >>> - (set_attr "type" "alu_shift,load_byte")] >>> + (set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")])] >>> ) >>> >>> (define_insn "*arm_zero_extendhisi2" >>> @@ -4684,8 +4738,12 @@ (define_insn "*arm_zero_extendhisi2_v6" >>> "@ >>> uxth%?\\t%0, %1 >>> ldr%(h%)\\t%0, %1" >>> - [(set_attr "type" "alu_shift,load_byte") >>> - (set_attr "predicable" "yes")] >>> + [(set_attr "predicable" "yes") >>> + (set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")])] >>> ) >>> >>> (define_insn "*arm_zero_extendhisi2addsi" >>> @@ -4755,7 +4813,11 @@ (define_insn "*thumb1_zero_extendqisi2_v >>> uxtb\\t%0, %1 >>> ldrb\\t%0, %1" >>> [(set_attr "length" "2") >>> - (set_attr "type" "alu_shift,load_byte")] >>> + (set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")])] >>> ) >>> >>> (define_insn "*arm_zero_extendqisi2" >>> @@ -4777,7 +4839,11 @@ (define_insn "*arm_zero_extendqisi2_v6" >>> "@ >>> uxtb%(%)\\t%0, %1 >>> ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes")] >>> ) >>> >>> @@ -4951,7 +5017,11 @@ (define_insn "thumb1_extendhisi2" >>> [(if_then_else (eq_attr "is_arch6" "yes") >>> (const_int 2) (const_int 4)) >>> (const_int 4)]) >>> - (set_attr "type" "alu_shift,load_byte") >>> + (set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "pool_range" "*,1020")] >>> ) >>> >>> @@ -5024,7 +5094,11 @@ (define_insn "*arm_extendhisi2_v6" >>> "@ >>> sxth%?\\t%0, %1 >>> ldr%(sh%)\\t%0, %1" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,256") >>> (set_attr "neg_pool_range" "*,244")] >>> @@ -5124,7 +5198,11 @@ (define_insn "*arm_extendqisi_v6" >>> "@ >>> sxtb%?\\t%0, %1 >>> ldr%(sb%)\\t%0, %1" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,256") >>> (set_attr "neg_pool_range" "*,244")] >>> @@ -5237,7 +5315,12 @@ (define_insn "thumb1_extendqisi2" >>> (const_int 2) >>> (if_then_else (eq_attr "is_arch6" "yes") >>> (const_int 4) (const_int 6))]) >>> - (set_attr "type" "alu_shift,load_byte,load_byte")] >>> + (set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte") >>> + (const_string "load_byte")])] >>> ) >>> >>> (define_expand "extendsfdf2" >>> @@ -5611,7 +5694,7 @@ (define_insn "*arm_movsi_insn" >>> movw%?\\t%0, %1 >>> ldr%?\\t%0, %1 >>> str%?\\t%1, %0" >>> - [(set_attr "type" "*,*,*,*,load1,store1") >>> + [(set_attr "type" >> "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1") >>> (set_attr "insn" "mov,mov,mvn,mov,*,*") >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,*,*,*,4096,*") >>> @@ -5910,7 +5993,8 @@ (define_insn "*movsi_compare0" >>> "@ >>> cmp%?\\t%0, #0 >>> sub%.\\t%0, %1, #0" >>> - [(set_attr "conds" "set")] >>> + [(set_attr "conds" "set") >>> + (set_attr "type" "simple_alu_imm,simple_alu_imm")] >>> ) >>> >>> ;; Subroutine to store a half word from a register into memory. >>> @@ -6323,22 +6407,30 @@ (define_insn "*movhi_insn_arch4" >>> mvn%?\\t%0, #%B1\\t%@ movhi >>> str%(h%)\\t%1, %0\\t%@ movhi >>> ldr%(h%)\\t%0, %1\\t%@ movhi" >>> - [(set_attr "type" "*,*,store1,load1") >>> - (set_attr "predicable" "yes") >>> + [(set_attr "predicable" "yes") >>> (set_attr "insn" "mov,mvn,*,*") >>> (set_attr "pool_range" "*,*,*,256") >>> - (set_attr "neg_pool_range" "*,*,*,244")] >>> + (set_attr "neg_pool_range" "*,*,*,244") >>> + (set_attr_alternative "type" >>> + [(if_then_else (match_operand 1 >> "const_int_operand" "") >>> + (const_string >> "simple_alu_imm" ) >>> + (const_string "*")) >>> + (const_string "simple_alu_imm") >>> + (const_string "store1") >>> + (const_string "load1")])] >>> ) >>> >>> (define_insn "*movhi_bytes" >>> - [(set (match_operand:HI 0 "s_register_operand" "=r,r") >>> - (match_operand:HI 1 "arm_rhs_operand" "rI,K"))] >>> + [(set (match_operand:HI 0 "s_register_operand" "=r,r,r") >>> + (match_operand:HI 1 "arm_rhs_operand" "I,r,K"))] >>> "TARGET_ARM" >>> "@ >>> mov%?\\t%0, %1\\t%@ movhi >>> + mov%?\\t%0, %1\\t%@ movhi >>> mvn%?\\t%0, #%B1\\t%@ movhi" >>> [(set_attr "predicable" "yes") >>> - (set_attr "insn" "mov,mvn")] >>> + (set_attr "insn" "mov, mov,mvn") >>> + (set_attr "type" "simple_alu_imm,*,simple_alu_imm")] >>> ) >>> >>> (define_expand "thumb_movhi_clobber" >>> @@ -6463,23 +6555,24 @@ (define_expand "movqi" >>> >>> >>> (define_insn "*arm_movqi_insn" >>> - [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,l,Uu,r,m") >>> - (match_operand:QI 1 "general_operand" "rI,K,Uu,l,m,r"))] >>> + [(set (match_operand:QI 0 "nonimmediate_operand" >> "=r,r,r,l,Uu,r,m") >>> + (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))] >>> "TARGET_32BIT >>> && ( register_operand (operands[0], QImode) >>> || register_operand (operands[1], QImode))" >>> "@ >>> mov%?\\t%0, %1 >>> + mov%?\\t%0, %1 >>> mvn%?\\t%0, #%B1 >>> ldr%(b%)\\t%0, %1 >>> str%(b%)\\t%1, %0 >>> ldr%(b%)\\t%0, %1 >>> str%(b%)\\t%1, %0" >>> - [(set_attr "type" "*,*,load1,store1,load1,store1") >>> - (set_attr "insn" "mov,mvn,*,*,*,*") >>> + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, >> load1, store1") >>> + (set_attr "insn" "mov,mov,mvn,*,*,*,*") >>> (set_attr "predicable" "yes") >>> - (set_attr "arch" "any,any,t2,t2,any,any") >>> - (set_attr "length" "4,4,2,2,4,4")] >>> + (set_attr "arch" "any,any,any,t2,t2,any,any") >>> + (set_attr "length" "4,4,4,2,2,4,4")] >>> ) >>> >>> (define_insn "*thumb1_movqi_insn" >>> @@ -6496,7 +6589,7 @@ (define_insn "*thumb1_movqi_insn" >>> mov\\t%0, %1 >>> mov\\t%0, %1" >>> [(set_attr "length" "2") >>> - (set_attr "type" "*,load1,store1,*,*,*") >>> + (set_attr "type" >> "simple_alu_imm,load1,store1,*,*,simple_alu_imm") >>> (set_attr "insn" "*,*,*,mov,mov,mov") >>> (set_attr "pool_range" "*,32,*,*,*,*") >>> (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")]) >>> @@ -7617,7 +7710,8 @@ (define_insn "*arm_cmpsi_insn" >>> [(set_attr "conds" "set") >>> (set_attr "arch" "t2,t2,any,any") >>> (set_attr "length" "2,2,4,4") >>> - (set_attr "predicable" "yes")] >>> + (set_attr "predicable" "yes") >>> + (set_attr "type" "*,*,*,simple_alu_imm")] >>> ) >>> >>> (define_insn "*cmpsi_shiftsi" >>> @@ -8182,7 +8276,20 @@ (define_insn "*movsicc_insn" >>> mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" >>> [(set_attr "length" "4,4,4,4,8,8,8,8") >>> (set_attr "conds" "use") >>> - (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")] >>> + (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn") >>> + (set_attr_alternative "type" >>> + [(if_then_else (match_operand 2 >> "const_int_operand" "") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "*")) >>> + (const_string "simple_alu_imm") >>> + (if_then_else (match_operand 1 >> "const_int_operand" "") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "*")) >>> + (const_string "simple_alu_imm") >>> + (const_string "*") >>> + (const_string "*") >>> + (const_string "*") >>> + (const_string "*")])] >>> ) >>> >>> (define_insn "*movsfcc_soft_insn" >>> @@ -9982,7 +10089,13 @@ (define_insn "*if_plus_move" >>> sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" >>> [(set_attr "conds" "use") >>> (set_attr "length" "4,4,8,8") >>> - (set_attr "type" "*,*,*,*")] >>> + (set_attr_alternative "type" >>> + [(if_then_else (match_operand 3 >> "const_int_operand" "") >>> + (const_string >> "simple_alu_imm" ) >>> + (const_string "*")) >>> + (const_string "simple_alu_imm") >>> + (const_string "*") >>> + (const_string "*")])] >>> ) >>> >>> (define_insn "*ifcompare_move_plus" >>> @@ -10018,7 +10131,13 @@ (define_insn "*if_move_plus" >>> sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" >>> [(set_attr "conds" "use") >>> (set_attr "length" "4,4,8,8") >>> - (set_attr "type" "*,*,*,*")] >>> + (set_attr_alternative "type" >>> + [(if_then_else (match_operand 3 >> "const_int_operand" "") >>> + (const_string >> "simple_alu_imm" ) >>> + (const_string "*")) >>> + (const_string "simple_alu_imm") >>> + (const_string "*") >>> + (const_string "*")])] >>> ) >>> >>> (define_insn "*ifcompare_arith_arith" >>> diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md >>> index >> 280af12f93222ce76ab0351898d567e3017fc34e..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/arm1020e.md >>> +++ b/gcc/config/arm/arm1020e.md >>> @@ -66,7 +66,7 @@ (define_cpu_unit "1020l_e,1020l_m,1020l_ >>> ;; ALU operations with no shifted operand >>> (define_insn_reservation "1020alu_op" 1 >>> (and (eq_attr "tune" "arm1020e,arm1022e") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "1020a_e,1020a_m,1020a_w") >>> >>> ;; ALU operations with a shift-by-constant operand >>> diff --git a/gcc/config/arm/arm1026ejs.md >> b/gcc/config/arm/arm1026ejs.md >>> index >> e6221363898102c566f8be5423f5509a0df49acd..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/arm1026ejs.md >>> +++ b/gcc/config/arm/arm1026ejs.md >>> @@ -66,7 +66,7 @@ (define_cpu_unit "l_e,l_m,l_w" "arm1026e >>> ;; ALU operations with no shifted operand >>> (define_insn_reservation "alu_op" 1 >>> (and (eq_attr "tune" "arm1026ejs") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "a_e,a_m,a_w") >>> >>> ;; ALU operations with a shift-by-constant operand >>> diff --git a/gcc/config/arm/arm1136jfs.md >> b/gcc/config/arm/arm1136jfs.md >>> index >> 8fc30e976f0fbfe45f360ee93706cf64f9ef8f08..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/arm1136jfs.md >>> +++ b/gcc/config/arm/arm1136jfs.md >>> @@ -75,7 +75,7 @@ (define_cpu_unit "l_a,l_dc1,l_dc2,l_wb" >>> ;; ALU operations with no shifted operand >>> (define_insn_reservation "11_alu_op" 2 >>> (and (eq_attr "tune" "arm1136js,arm1136jfs") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "e_1,e_2,e_3,e_wb") >>> >>> ;; ALU operations with a shift-by-constant operand >>> diff --git a/gcc/config/arm/arm926ejs.md >> b/gcc/config/arm/arm926ejs.md >>> index >> d3908f9e3ecd972c6f93a77bfd1bde4e501dcdba..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/arm926ejs.md >>> +++ b/gcc/config/arm/arm926ejs.md >>> @@ -58,7 +58,7 @@ (define_cpu_unit "e,m,w" "arm926ejs") >>> ;; ALU operations with no shifted operand >>> (define_insn_reservation "9_alu_op" 1 >>> (and (eq_attr "tune" "arm926ejs") >>> - (eq_attr "type" "alu,alu_shift")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift")) >>> "e,m,w") >>> >>> ;; ALU operations with a shift-by-register operand >>> diff --git a/gcc/config/arm/cortex-a15.md b/gcc/config/arm/cortex- >> a15.md >>> index >> b86c6e706900b81adea9c5a487b96bcb473b8f62..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-a15.md >>> +++ b/gcc/config/arm/cortex-a15.md >>> @@ -61,7 +61,7 @@ (define_cpu_unit "ca15_sx2_alu, ca15_sx2 >>> ;; Simple ALU without shift >>> (define_insn_reservation "cortex_a15_alu" 2 >>> (and (eq_attr "tune" "cortexa15") >>> - (and (eq_attr "type" "alu") >>> + (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (eq_attr "neon_type" "none"))) >>> "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)") >>> >>> diff --git a/gcc/config/arm/cortex-a5.md b/gcc/config/arm/cortex- >> a5.md >>> index >> eb154e2980382befc77027ec8a0a35fcc34a1ff5..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-a5.md >>> +++ b/gcc/config/arm/cortex-a5.md >>> @@ -58,7 +58,7 @@ (define_cpu_unit "cortex_a5_fp_div_sqrt" >>> >>> (define_insn_reservation "cortex_a5_alu" 2 >>> (and (eq_attr "tune" "cortexa5") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "cortex_a5_ex1") >>> >>> (define_insn_reservation "cortex_a5_alu_shift" 2 >>> diff --git a/gcc/config/arm/cortex-a8.md b/gcc/config/arm/cortex- >> a8.md >>> index >> 1922e5cf4c66c147830ba3e7b195263a3aac3015..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-a8.md >>> +++ b/gcc/config/arm/cortex-a8.md >>> @@ -85,7 +85,7 @@ (define_reservation "cortex_a8_multiply_ >>> ;; (source read in E2 and destination available at the end of that >> cycle). >>> (define_insn_reservation "cortex_a8_alu" 2 >>> (and (eq_attr "tune" "cortexa8") >>> - (ior (and (and (eq_attr "type" "alu") >>> + (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (eq_attr "neon_type" "none")) >>> (not (eq_attr "insn" "mov,mvn"))) >>> (eq_attr "insn" "clz"))) >>> @@ -107,7 +107,7 @@ (define_insn_reservation "cortex_a8_alu_ >>> >>> (define_insn_reservation "cortex_a8_mov" 1 >>> (and (eq_attr "tune" "cortexa8") >>> - (and (eq_attr "type" "alu,alu_shift,alu_shift_reg") >>> + (and (eq_attr "type" >> "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg") >>> (eq_attr "insn" "mov,mvn"))) >>> "cortex_a8_default") >>> >>> diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex- >> a9.md >>> index >> 12c19efb12132e932dea03031ed5fd364e4b9aef..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-a9.md >>> +++ b/gcc/config/arm/cortex-a9.md >>> @@ -80,7 +80,7 @@ (define_reservation "cortex_a9_mult_long >>> ;; which can go down E2 without any problem. >>> (define_insn_reservation "cortex_a9_dp" 2 >>> (and (eq_attr "tune" "cortexa9") >>> - (ior (and (eq_attr "type" "alu") >>> + (ior (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (eq_attr "neon_type" "none")) >>> (and (and (eq_attr "type" "alu_shift_reg, alu_shift") >>> (eq_attr "insn" "mov")) >>> diff --git a/gcc/config/arm/cortex-m4.md b/gcc/config/arm/cortex- >> m4.md >>> index >> 57479853610ebdcdff8db4cc5ff3052c1a09b276..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-m4.md >>> +++ b/gcc/config/arm/cortex-m4.md >>> @@ -31,7 +31,7 @@ (define_reservation "cortex_m4_ex" "cort >>> ;; ALU and multiply is one cycle. >>> (define_insn_reservation "cortex_m4_alu" 1 >>> (and (eq_attr "tune" "cortexm4") >>> - (eq_attr "type" "alu,alu_shift,alu_shift_reg,mult")) >>> + (eq_attr "type" >> "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg,mult")) >>> "cortex_m4_ex") >>> >>> ;; Byte, half-word and word load is two cycles. >>> diff --git a/gcc/config/arm/cortex-r4.md b/gcc/config/arm/cortex- >> r4.md >>> index >> e26c3d45d5e6c5926500510c653619fb2a686851..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/cortex-r4.md >>> +++ b/gcc/config/arm/cortex-r4.md >>> @@ -78,13 +78,13 @@ (define_reservation "cortex_r4_branch" " >>> ;; for the purposes of the dual-issue constraints above. >>> (define_insn_reservation "cortex_r4_alu" 2 >>> (and (eq_attr "tune_cortexr4" "yes") >>> - (and (eq_attr "type" "alu") >>> + (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (not (eq_attr "insn" "mov")))) >>> "cortex_r4_alu") >>> >>> (define_insn_reservation "cortex_r4_mov" 2 >>> (and (eq_attr "tune_cortexr4" "yes") >>> - (and (eq_attr "type" "alu") >>> + (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (eq_attr "insn" "mov"))) >>> "cortex_r4_mov") >>> >>> diff --git a/gcc/config/arm/fa526.md b/gcc/config/arm/fa526.md >>> index >> 42eb9b272fb1b9df553c566e8c41cb4d44c306ca..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/fa526.md >>> +++ b/gcc/config/arm/fa526.md >>> @@ -62,7 +62,7 @@ (define_cpu_unit "fa526_core" "fa526") >>> ;; ALU operations >>> (define_insn_reservation "526_alu_op" 1 >>> (and (eq_attr "tune" "fa526") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "fa526_core") >>> >>> (define_insn_reservation "526_alu_shift_op" 2 >>> diff --git a/gcc/config/arm/fa606te.md b/gcc/config/arm/fa606te.md >>> index >> 06e63d696bde2e13556982e053cf2b0fd719d1ce..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/fa606te.md >>> +++ b/gcc/config/arm/fa606te.md >>> @@ -62,7 +62,7 @@ (define_cpu_unit "fa606te_core" "fa606te >>> ;; ALU operations >>> (define_insn_reservation "606te_alu_op" 1 >>> (and (eq_attr "tune" "fa606te") >>> - (eq_attr "type" "alu,alu_shift,alu_shift_reg")) >>> + (eq_attr "type" >> "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg")) >>> "fa606te_core") >>> >>> >> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; >> ; >>> diff --git a/gcc/config/arm/fa626te.md b/gcc/config/arm/fa626te.md >>> index >> 7fe1c8724bef3feae8a291777379a5dac3cf31d1..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/fa626te.md >>> +++ b/gcc/config/arm/fa626te.md >>> @@ -68,7 +68,7 @@ (define_cpu_unit "fa626te_core" "fa626te >>> ;; ALU operations >>> (define_insn_reservation "626te_alu_op" 1 >>> (and (eq_attr "tune" "fa626,fa626te") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "fa626te_core") >>> >>> (define_insn_reservation "626te_alu_shift_op" 2 >>> diff --git a/gcc/config/arm/fa726te.md b/gcc/config/arm/fa726te.md >>> index >> 3c33d59710478a5a46435e4df3177bbfcca1faff..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/fa726te.md >>> +++ b/gcc/config/arm/fa726te.md >>> @@ -85,7 +85,7 @@ (define_insn_reservation "726te_shift_op >>> ;; Other ALU instructions 2 cycles. >>> (define_insn_reservation "726te_alu_op" 1 >>> (and (eq_attr "tune" "fa726te") >>> - (and (eq_attr "type" "alu") >>> + (and (eq_attr "type" "alu_reg,simple_alu_imm") >>> (not (eq_attr "insn" "mov,mvn")))) >>> "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") >>> >>> diff --git a/gcc/config/arm/fmp626.md b/gcc/config/arm/fmp626.md >>> index >> 9ba33ddec4741ef3124c23ca8cf9f42f38feb6c8..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/fmp626.md >>> +++ b/gcc/config/arm/fmp626.md >>> @@ -63,7 +63,7 @@ (define_cpu_unit "fmp626_core" "fmp626") >>> ;; ALU operations >>> (define_insn_reservation "mp626_alu_op" 1 >>> (and (eq_attr "tune" "fmp626") >>> - (eq_attr "type" "alu")) >>> + (eq_attr "type" "alu_reg,simple_alu_imm")) >>> "fmp626_core") >>> >>> (define_insn_reservation "mp626_alu_shift_op" 2 >>> diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md >>> index >> 21035808c0e5964d29b7c903b5721210223153e0..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/neon.md >>> +++ b/gcc/config/arm/neon.md >>> @@ -193,7 +193,7 @@ (define_insn "*neon_mov<mode>" >>> } >>> } >>> [(set_attr "neon_type" >> "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*") >>> - (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu,load2,store2") >>> + (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2") >>> (set_attr "insn" "*,*,*,*,*,*,mov,*,*") >>> (set_attr "length" "4,4,4,4,4,4,8,8,8") >>> (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") >>> @@ -238,7 +238,7 @@ (define_insn "*neon_mov<mode>" >>> } >>> [(set_attr "neon_type" >> "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\ >>> neon_mrrc,neon_mcr_2_mcrr,*,*,*") >>> - (set_attr "type" "*,*,*,*,*,*,alu,load4,store4") >>> + (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4") >>> (set_attr "insn" "*,*,*,*,*,*,mov,*,*") >>> (set_attr "length" "4,8,4,8,8,8,16,8,16") >>> (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") >>> diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md >>> index >> a5302f479f5091d08f4bf1a9ee9b0423692372af..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/thumb2.md >>> +++ b/gcc/config/arm/thumb2.md >>> @@ -1,5 +1,5 @@ >>> ;; ARM Thumb-2 Machine Description >>> -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. >>> +;; Copyright (C) 2007, 2008, 2010, 2012 Free Software Foundation, >> Inc. >>> ;; Written by CodeSourcery, LLC. >>> ;; >>> ;; This file is part of GCC. >>> @@ -180,7 +180,7 @@ (define_insn "*thumb2_movsi_insn" >>> ldr%?\\t%0, %1 >>> str%?\\t%1, %0 >>> str%?\\t%1, %0" >>> - [(set_attr "type" "*,*,*,*,load1,load1,store1,store1") >>> + [(set_attr "type" >> "*,*,simple_alu_imm,*,load1,load1,store1,store1") >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,*,*,*,1020,4096,*,*") >>> (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")] >>> @@ -568,7 +568,11 @@ (define_insn "*thumb2_extendqisi_v6" >>> "@ >>> sxtb%?\\t%0, %1 >>> ldr%(sb%)\\t%0, %1" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,4096") >>> (set_attr "neg_pool_range" "*,250")] >>> @@ -581,7 +585,11 @@ (define_insn "*thumb2_zero_extendhisi2_v >>> "@ >>> uxth%?\\t%0, %1 >>> ldr%(h%)\\t%0, %1" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,4096") >>> (set_attr "neg_pool_range" "*,250")] >>> @@ -594,7 +602,11 @@ (define_insn "thumb2_zero_extendqisi2_v6 >>> "@ >>> uxtb%(%)\\t%0, %1 >>> ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" >>> - [(set_attr "type" "alu_shift,load_byte") >>> + [(set_attr_alternative "type" >>> + [(if_then_else (eq_attr "tune" "cortexa7") >>> + (const_string >> "simple_alu_imm") >>> + (const_string "alu_shift")) >>> + (const_string "load_byte")]) >>> (set_attr "predicable" "yes") >>> (set_attr "pool_range" "*,4096") >>> (set_attr "neg_pool_range" "*,250")] >>> @@ -790,8 +802,8 @@ (define_insn "thumb2_addsi3_compare0" >>> (define_insn "*thumb2_addsi3_compare0_scratch" >>> [(set (reg:CC_NOOV CC_REGNUM) >>> (compare:CC_NOOV >>> - (plus:SI (match_operand:SI 0 "s_register_operand" "l, r") >>> - (match_operand:SI 1 "arm_add_operand" "lPv,rIL")) >>> + (plus:SI (match_operand:SI 0 "s_register_operand" "l,l, r,r") >>> + (match_operand:SI 1 "arm_add_operand" "Pv,l,IL,r")) >>> (const_int 0)))] >>> "TARGET_THUMB2" >>> "* >>> @@ -808,7 +820,8 @@ (define_insn "*thumb2_addsi3_compare0_sc >>> return \"cmn\\t%0, %1\"; >>> " >>> [(set_attr "conds" "set") >>> - (set_attr "length" "2,4")] >>> + (set_attr "length" "2,2,4,4") >>> + (set_attr "type" "simple_alu_imm,*,simple_alu_imm,*")] >>> ) >>> >>> (define_insn "*thumb2_mulsi_short" >>> diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md >>> index >> d48d4e66a6c827ec6d471a218a175537f038d798..00000000000000000000000000000 >> 00000000000 100644 >>> --- a/gcc/config/arm/vfp.md >>> +++ b/gcc/config/arm/vfp.md >>> @@ -77,7 +77,7 @@ (define_insn "*arm_movsi_vfp" >>> } >>> " >>> [(set_attr "predicable" "yes") >>> - (set_attr "type" >> "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") >>> + (set_attr "type" >> "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loa >> ds,f_stores") >>> (set_attr "neon_type" >> "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") >>> (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*") >>> (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*") >>> >
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 7e92b69ad861fe90ed409494d451854f30888462..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -323,8 +323,14 @@ (define_attr "insn" ; Classification of each insn ; Note: vfp.md has different meanings for some of these, and some further ; types as well. See that file for details. -; alu any alu instruction that doesn't hit memory or fp -; regs or have a shifted source operand +; simple_alu_imm a simple alu instruction that doesn't hit memory or fp +; regs or have a shifted source operand and has an immediate +; operand. This currently only tracks very basic immediate +; alu operations. +; alu_reg any alu instruction that doesn't hit memory or fp +; regs or have a shifted source operand +; and does not have an immediate operand. This is +; also the default ; alu_shift any data instruction that doesn't hit memory or fp ; regs, but has a source operand shifted by a constant ; alu_shift_reg any data instruction that doesn't hit memory or fp @@ -354,7 +360,8 @@ (define_attr "insn" ; (define_attr "type" - "alu,\ + "simple_alu_imm,\ + alu_reg,\ alu_shift,\ alu_shift_reg,\ mult,\ @@ -398,7 +405,7 @@ (define_attr "type" (eq_attr "insn" "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\ umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") (const_string "mult") - (const_string "alu"))) + (const_string "alu_reg"))) ; Is this an (integer side) multiply with a 64-bit result? (define_attr "mul64" "no,yes" @@ -536,7 +543,7 @@ (define_attr "write_conflict" "no,yes" ; than one on the main cpu execution unit. (define_attr "core_cycles" "single,multi" (if_then_else (eq_attr "type" - "alu,alu_shift,float,fdivd,fdivs") + "simple_alu_imm,alu_reg,alu_shift,float,fdivd,fdivs") (const_string "single") (const_string "multi"))) @@ -796,7 +803,11 @@ (define_insn_and_split "*arm_addsi3" " [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16") (set_attr "predicable" "yes") - (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*")] + (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*") + (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") + (const_string "simple_alu_imm") + (const_string "alu_reg"))) + ] ) (define_insn_and_split "*thumb1_addsi3" @@ -865,30 +876,35 @@ (define_peephole2 (define_insn "addsi3_compare0" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") - (match_operand:SI 2 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 1 "s_register_operand" "r, r,r") + (match_operand:SI 2 "arm_add_operand" "I,L,r")) (const_int 0))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_ARM" "@ add%.\\t%0, %1, %2 - sub%.\\t%0, %1, #%n2" - [(set_attr "conds" "set")] + sub%.\\t%0, %1, #%n2 + add%.\\t%0, %1, %2" + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm, simple_alu_imm, *")] ) (define_insn "*addsi3_compare0_scratch" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (plus:SI (match_operand:SI 0 "s_register_operand" "r, r") - (match_operand:SI 1 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 0 "s_register_operand" "r, r, r") + (match_operand:SI 1 "arm_add_operand" "I,L, r")) (const_int 0)))] "TARGET_ARM" "@ cmn%?\\t%0, %1 - cmp%?\\t%0, #%n1" + cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1" [(set_attr "conds" "set") - (set_attr "predicable" "yes")] + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm, simple_alu_imm, *") + ] ) (define_insn "*compare_negsi_si" @@ -963,59 +979,67 @@ (define_peephole2 (define_insn "*addsi3_compare_op1" [(set (reg:CC_C CC_REGNUM) (compare:CC_C - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") - (match_operand:SI 2 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") + (match_operand:SI 2 "arm_add_operand" "I,L,r")) (match_dup 1))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ add%.\\t%0, %1, %2 - sub%.\\t%0, %1, #%n2" - [(set_attr "conds" "set")] + sub%.\\t%0, %1, #%n2 + add%.\\t%0, %1, %2" + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*addsi3_compare_op2" [(set (reg:CC_C CC_REGNUM) (compare:CC_C - (plus:SI (match_operand:SI 1 "s_register_operand" "r,r") - (match_operand:SI 2 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 1 "s_register_operand" "r,r,r") + (match_operand:SI 2 "arm_add_operand" "I,L,r")) (match_dup 2))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ add%.\\t%0, %1, %2 + add%.\\t%0, %1, %2 sub%.\\t%0, %1, #%n2" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*compare_addsi2_op0" [(set (reg:CC_C CC_REGNUM) (compare:CC_C - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") - (match_operand:SI 1 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") + (match_operand:SI 1 "arm_add_operand" "I,L,r")) (match_dup 0)))] "TARGET_32BIT" "@ cmn%?\\t%0, %1 - cmp%?\\t%0, #%n1" + cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1" [(set_attr "conds" "set") - (set_attr "predicable" "yes")] + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*compare_addsi2_op1" [(set (reg:CC_C CC_REGNUM) (compare:CC_C - (plus:SI (match_operand:SI 0 "s_register_operand" "r,r") - (match_operand:SI 1 "arm_add_operand" "rI,L")) + (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") + (match_operand:SI 1 "arm_add_operand" "I,L,r")) (match_dup 1)))] "TARGET_32BIT" "@ cmn%?\\t%0, %1 - cmp%?\\t%0, #%n1" + cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1" [(set_attr "conds" "set") - (set_attr "predicable" "yes")] + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*addsi3_carryin_<optab>" @@ -1253,14 +1277,15 @@ (define_insn "thumb1_subsi3_insn" ; ??? Check Thumb-2 split length (define_insn_and_split "*arm_subsi3_insn" - [(set (match_operand:SI 0 "s_register_operand" "=r,r,rk,r") - (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,k,?n") - (match_operand:SI 2 "reg_or_int_operand" "r,rI,r, r")))] + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,rk,r") + (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") + (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] "TARGET_32BIT" "@ rsb%?\\t%0, %2, %1 sub%?\\t%0, %1, %2 sub%?\\t%0, %1, %2 + sub%?\\t%0, %1, %2 #" "&& (CONST_INT_P (operands[1]) && !const_ok_for_arm (INTVAL (operands[1])))" @@ -1270,8 +1295,9 @@ (define_insn_and_split "*arm_subsi3_insn INTVAL (operands[1]), operands[0], operands[2], 0); DONE; " - [(set_attr "length" "4,4,4,16") - (set_attr "predicable" "yes")] + [(set_attr "length" "4,4,4,4,16") + (set_attr "predicable" "yes") + (set_attr "type" "*,simple_alu_imm,*,*,*")] ) (define_peephole2 @@ -1290,29 +1316,33 @@ (define_peephole2 (define_insn "*subsi3_compare0" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I") - (match_operand:SI 2 "arm_rhs_operand" "rI,r")) + (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,r,I") + (match_operand:SI 2 "arm_rhs_operand" "I,r,r")) (const_int 0))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (minus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ sub%.\\t%0, %1, %2 + sub%.\\t%0, %1, %2 rsb%.\\t%0, %2, %1" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,*,*")] ) (define_insn "*subsi3_compare" [(set (reg:CC CC_REGNUM) - (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,I") - (match_operand:SI 2 "arm_rhs_operand" "rI,r"))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I") + (match_operand:SI 2 "arm_rhs_operand" "I,r,r"))) + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (minus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ sub%.\\t%0, %1, %2 + sub%.\\t%0, %1, %2 rsb%.\\t%0, %2, %1" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,*,*")] ) (define_expand "decscc" @@ -1334,7 +1364,8 @@ (define_insn "*arm_decscc" sub%d2\\t%0, %1, #1 mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" [(set_attr "conds" "use") - (set_attr "length" "*,8")] + (set_attr "length" "*,8") + (set_attr "type" "simple_alu_imm,*")] ) (define_expand "subsf3" @@ -2190,13 +2221,14 @@ (define_expand "andsi3" ; ??? Check split length for Thumb-2 (define_insn_and_split "*arm_andsi3_insn" - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") - (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r") + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] "TARGET_32BIT" "@ and%?\\t%0, %1, %2 bic%?\\t%0, %1, #%B2 + and%?\\t%0, %1, %2 #" "TARGET_32BIT && CONST_INT_P (operands[2]) @@ -2208,8 +2240,9 @@ (define_insn_and_split "*arm_andsi3_insn INTVAL (operands[2]), operands[0], operands[1], 0); DONE; " - [(set_attr "length" "4,4,16") - (set_attr "predicable" "yes")] + [(set_attr "length" "4,4,4,16") + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")] ) (define_insn "*thumb1_andsi3_insn" @@ -2219,35 +2252,40 @@ (define_insn "*thumb1_andsi3_insn" "TARGET_THUMB1" "and\\t%0, %2" [(set_attr "length" "2") + (set_attr "type" "simple_alu_imm") (set_attr "conds" "set")]) (define_insn "*andsi3_compare0" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (and:SI (match_operand:SI 1 "s_register_operand" "r,r") - (match_operand:SI 2 "arm_not_operand" "rI,K")) + (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") + (match_operand:SI 2 "arm_not_operand" "I,K,r")) (const_int 0))) - (set (match_operand:SI 0 "s_register_operand" "=r,r") + (set (match_operand:SI 0 "s_register_operand" "=r,r,r") (and:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ and%.\\t%0, %1, %2 - bic%.\\t%0, %1, #%B2" - [(set_attr "conds" "set")] + bic%.\\t%0, %1, #%B2 + and%.\\t%0, %1, %2" + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*andsi3_compare0_scratch" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (and:SI (match_operand:SI 0 "s_register_operand" "r,r") - (match_operand:SI 1 "arm_not_operand" "rI,K")) + (and:SI (match_operand:SI 0 "s_register_operand" "r,r,r") + (match_operand:SI 1 "arm_not_operand" "I,K,r")) (const_int 0))) - (clobber (match_scratch:SI 2 "=X,r"))] + (clobber (match_scratch:SI 2 "=X,r,X"))] "TARGET_32BIT" "@ tst%?\\t%0, %1 - bic%.\\t%2, %0, #%B1" - [(set_attr "conds" "set")] + bic%.\\t%2, %0, #%B1 + tst%?\\t%0, %1" + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ) (define_insn "*zeroextractsi_compare0_scratch" @@ -2269,7 +2307,8 @@ (define_insn "*zeroextractsi_compare0_sc return \"\"; " [(set_attr "conds" "set") - (set_attr "predicable" "yes")] + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm")] ) (define_insn_and_split "*ne_zeroextractsi" @@ -2916,13 +2955,14 @@ (define_expand "iorsi3" ) (define_insn_and_split "*iorsi3_insn" - [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") - (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") - (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") + (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r") + (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] "TARGET_32BIT" "@ orr%?\\t%0, %1, %2 orn%?\\t%0, %1, #%B2 + orr%?\\t%0, %1, %2 #" "TARGET_32BIT && CONST_INT_P (operands[2]) @@ -2934,9 +2974,11 @@ (define_insn_and_split "*iorsi3_insn" INTVAL (operands[2]), operands[0], operands[1], 0); DONE; } - [(set_attr "length" "4,4,16") - (set_attr "arch" "32,t2,32") - (set_attr "predicable" "yes")]) + [(set_attr "length" "4,4,4,16") + (set_attr "arch" "32,t2,32,32") + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")] +) (define_insn "*thumb1_iorsi3_insn" [(set (match_operand:SI 0 "register_operand" "=l") @@ -2962,25 +3004,27 @@ (define_peephole2 (define_insn "*iorsi3_compare0" [(set (reg:CC_NOOV CC_REGNUM) - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") - (match_operand:SI 2 "arm_rhs_operand" "rI")) + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r") + (match_operand:SI 2 "arm_rhs_operand" "I,r")) (const_int 0))) - (set (match_operand:SI 0 "s_register_operand" "=r") + (set (match_operand:SI 0 "s_register_operand" "=r,r") (ior:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "orr%.\\t%0, %1, %2" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,*")] ) (define_insn "*iorsi3_compare0_scratch" [(set (reg:CC_NOOV CC_REGNUM) - (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") - (match_operand:SI 2 "arm_rhs_operand" "rI")) + (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r") + (match_operand:SI 2 "arm_rhs_operand" "I,r")) (const_int 0))) - (clobber (match_scratch:SI 0 "=r"))] + (clobber (match_scratch:SI 0 "=r,r"))] "TARGET_32BIT" "orr%.\\t%0, %1, %2" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm, *")] ) (define_expand "xordi3" @@ -3054,12 +3098,13 @@ (define_expand "xorsi3" ) (define_insn_and_split "*arm_xorsi3" - [(set (match_operand:SI 0 "s_register_operand" "=r,r") - (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r") - (match_operand:SI 2 "reg_or_int_operand" "rI,?n")))] + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") + (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") + (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))] "TARGET_32BIT" "@ eor%?\\t%0, %1, %2 + eor%?\\t%0, %1, %2 #" "TARGET_32BIT && CONST_INT_P (operands[2]) @@ -3070,8 +3115,9 @@ (define_insn_and_split "*arm_xorsi3" INTVAL (operands[2]), operands[0], operands[1], 0); DONE; } - [(set_attr "length" "4,16") - (set_attr "predicable" "yes")] + [(set_attr "length" "4,4,16") + (set_attr "predicable" "yes") + (set_attr "type" "simple_alu_imm,*,*")] ) (define_insn "*thumb1_xorsi3_insn" @@ -3081,28 +3127,32 @@ (define_insn "*thumb1_xorsi3_insn" "TARGET_THUMB1" "eor\\t%0, %2" [(set_attr "length" "2") - (set_attr "conds" "set")]) + (set_attr "conds" "set") + (set_attr "type" "simple_alu_imm")] +) (define_insn "*xorsi3_compare0" [(set (reg:CC_NOOV CC_REGNUM) - (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r") - (match_operand:SI 2 "arm_rhs_operand" "rI")) + (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r,r") + (match_operand:SI 2 "arm_rhs_operand" "I,r")) (const_int 0))) - (set (match_operand:SI 0 "s_register_operand" "=r") + (set (match_operand:SI 0 "s_register_operand" "=r,r") (xor:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "eor%.\\t%0, %1, %2" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,*")] ) (define_insn "*xorsi3_compare0_scratch" [(set (reg:CC_NOOV CC_REGNUM) - (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r") - (match_operand:SI 1 "arm_rhs_operand" "rI")) + (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r,r") + (match_operand:SI 1 "arm_rhs_operand" "I,r")) (const_int 0)))] "TARGET_32BIT" "teq%?\\t%0, %1" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm, *")] ) ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), @@ -4663,7 +4713,11 @@ (define_insn "*thumb1_zero_extendhisi2" [(if_then_else (eq_attr "is_arch6" "yes") (const_int 2) (const_int 4)) (const_int 4)]) - (set_attr "type" "alu_shift,load_byte")] + (set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")])] ) (define_insn "*arm_zero_extendhisi2" @@ -4684,8 +4738,12 @@ (define_insn "*arm_zero_extendhisi2_v6" "@ uxth%?\\t%0, %1 ldr%(h%)\\t%0, %1" - [(set_attr "type" "alu_shift,load_byte") - (set_attr "predicable" "yes")] + [(set_attr "predicable" "yes") + (set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")])] ) (define_insn "*arm_zero_extendhisi2addsi" @@ -4755,7 +4813,11 @@ (define_insn "*thumb1_zero_extendqisi2_v uxtb\\t%0, %1 ldrb\\t%0, %1" [(set_attr "length" "2") - (set_attr "type" "alu_shift,load_byte")] + (set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")])] ) (define_insn "*arm_zero_extendqisi2" @@ -4777,7 +4839,11 @@ (define_insn "*arm_zero_extendqisi2_v6" "@ uxtb%(%)\\t%0, %1 ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes")] ) @@ -4951,7 +5017,11 @@ (define_insn "thumb1_extendhisi2" [(if_then_else (eq_attr "is_arch6" "yes") (const_int 2) (const_int 4)) (const_int 4)]) - (set_attr "type" "alu_shift,load_byte") + (set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "pool_range" "*,1020")] ) @@ -5024,7 +5094,11 @@ (define_insn "*arm_extendhisi2_v6" "@ sxth%?\\t%0, %1 ldr%(sh%)\\t%0, %1" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes") (set_attr "pool_range" "*,256") (set_attr "neg_pool_range" "*,244")] @@ -5124,7 +5198,11 @@ (define_insn "*arm_extendqisi_v6" "@ sxtb%?\\t%0, %1 ldr%(sb%)\\t%0, %1" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes") (set_attr "pool_range" "*,256") (set_attr "neg_pool_range" "*,244")] @@ -5237,7 +5315,12 @@ (define_insn "thumb1_extendqisi2" (const_int 2) (if_then_else (eq_attr "is_arch6" "yes") (const_int 4) (const_int 6))]) - (set_attr "type" "alu_shift,load_byte,load_byte")] + (set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte") + (const_string "load_byte")])] ) (define_expand "extendsfdf2" @@ -5611,7 +5694,7 @@ (define_insn "*arm_movsi_insn" movw%?\\t%0, %1 ldr%?\\t%0, %1 str%?\\t%1, %0" - [(set_attr "type" "*,*,*,*,load1,store1") + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1") (set_attr "insn" "mov,mov,mvn,mov,*,*") (set_attr "predicable" "yes") (set_attr "pool_range" "*,*,*,*,4096,*") @@ -5910,7 +5993,8 @@ (define_insn "*movsi_compare0" "@ cmp%?\\t%0, #0 sub%.\\t%0, %1, #0" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set_attr "type" "simple_alu_imm,simple_alu_imm")] ) ;; Subroutine to store a half word from a register into memory. @@ -6323,22 +6407,30 @@ (define_insn "*movhi_insn_arch4" mvn%?\\t%0, #%B1\\t%@ movhi str%(h%)\\t%1, %0\\t%@ movhi ldr%(h%)\\t%0, %1\\t%@ movhi" - [(set_attr "type" "*,*,store1,load1") - (set_attr "predicable" "yes") + [(set_attr "predicable" "yes") (set_attr "insn" "mov,mvn,*,*") (set_attr "pool_range" "*,*,*,256") - (set_attr "neg_pool_range" "*,*,*,244")] + (set_attr "neg_pool_range" "*,*,*,244") + (set_attr_alternative "type" + [(if_then_else (match_operand 1 "const_int_operand" "") + (const_string "simple_alu_imm" ) + (const_string "*")) + (const_string "simple_alu_imm") + (const_string "store1") + (const_string "load1")])] ) (define_insn "*movhi_bytes" - [(set (match_operand:HI 0 "s_register_operand" "=r,r") - (match_operand:HI 1 "arm_rhs_operand" "rI,K"))] + [(set (match_operand:HI 0 "s_register_operand" "=r,r,r") + (match_operand:HI 1 "arm_rhs_operand" "I,r,K"))] "TARGET_ARM" "@ mov%?\\t%0, %1\\t%@ movhi + mov%?\\t%0, %1\\t%@ movhi mvn%?\\t%0, #%B1\\t%@ movhi" [(set_attr "predicable" "yes") - (set_attr "insn" "mov,mvn")] + (set_attr "insn" "mov, mov,mvn") + (set_attr "type" "simple_alu_imm,*,simple_alu_imm")] ) (define_expand "thumb_movhi_clobber" @@ -6463,23 +6555,24 @@ (define_expand "movqi" (define_insn "*arm_movqi_insn" - [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,l,Uu,r,m") - (match_operand:QI 1 "general_operand" "rI,K,Uu,l,m,r"))] + [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,Uu,r,m") + (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))] "TARGET_32BIT && ( register_operand (operands[0], QImode) || register_operand (operands[1], QImode))" "@ mov%?\\t%0, %1 + mov%?\\t%0, %1 mvn%?\\t%0, #%B1 ldr%(b%)\\t%0, %1 str%(b%)\\t%1, %0 ldr%(b%)\\t%0, %1 str%(b%)\\t%1, %0" - [(set_attr "type" "*,*,load1,store1,load1,store1") - (set_attr "insn" "mov,mvn,*,*,*,*") + [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, load1, store1") + (set_attr "insn" "mov,mov,mvn,*,*,*,*") (set_attr "predicable" "yes") - (set_attr "arch" "any,any,t2,t2,any,any") - (set_attr "length" "4,4,2,2,4,4")] + (set_attr "arch" "any,any,any,t2,t2,any,any") + (set_attr "length" "4,4,4,2,2,4,4")] ) (define_insn "*thumb1_movqi_insn" @@ -6496,7 +6589,7 @@ (define_insn "*thumb1_movqi_insn" mov\\t%0, %1 mov\\t%0, %1" [(set_attr "length" "2") - (set_attr "type" "*,load1,store1,*,*,*") + (set_attr "type" "simple_alu_imm,load1,store1,*,*,simple_alu_imm") (set_attr "insn" "*,*,*,mov,mov,mov") (set_attr "pool_range" "*,32,*,*,*,*") (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")]) @@ -7617,7 +7710,8 @@ (define_insn "*arm_cmpsi_insn" [(set_attr "conds" "set") (set_attr "arch" "t2,t2,any,any") (set_attr "length" "2,2,4,4") - (set_attr "predicable" "yes")] + (set_attr "predicable" "yes") + (set_attr "type" "*,*,*,simple_alu_imm")] ) (define_insn "*cmpsi_shiftsi" @@ -8182,7 +8276,20 @@ (define_insn "*movsicc_insn" mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" [(set_attr "length" "4,4,4,4,8,8,8,8") (set_attr "conds" "use") - (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")] + (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn") + (set_attr_alternative "type" + [(if_then_else (match_operand 2 "const_int_operand" "") + (const_string "simple_alu_imm") + (const_string "*")) + (const_string "simple_alu_imm") + (if_then_else (match_operand 1 "const_int_operand" "") + (const_string "simple_alu_imm") + (const_string "*")) + (const_string "simple_alu_imm") + (const_string "*") + (const_string "*") + (const_string "*") + (const_string "*")])] ) (define_insn "*movsfcc_soft_insn" @@ -9982,7 +10089,13 @@ (define_insn "*if_plus_move" sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" [(set_attr "conds" "use") (set_attr "length" "4,4,8,8") - (set_attr "type" "*,*,*,*")] + (set_attr_alternative "type" + [(if_then_else (match_operand 3 "const_int_operand" "") + (const_string "simple_alu_imm" ) + (const_string "*")) + (const_string "simple_alu_imm") + (const_string "*") + (const_string "*")])] ) (define_insn "*ifcompare_move_plus" @@ -10018,7 +10131,13 @@ (define_insn "*if_move_plus" sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" [(set_attr "conds" "use") (set_attr "length" "4,4,8,8") - (set_attr "type" "*,*,*,*")] + (set_attr_alternative "type" + [(if_then_else (match_operand 3 "const_int_operand" "") + (const_string "simple_alu_imm" ) + (const_string "*")) + (const_string "simple_alu_imm") + (const_string "*") + (const_string "*")])] ) (define_insn "*ifcompare_arith_arith" diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md index 280af12f93222ce76ab0351898d567e3017fc34e..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/arm1020e.md +++ b/gcc/config/arm/arm1020e.md @@ -66,7 +66,7 @@ (define_cpu_unit "1020l_e,1020l_m,1020l_ ;; ALU operations with no shifted operand (define_insn_reservation "1020alu_op" 1 (and (eq_attr "tune" "arm1020e,arm1022e") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "1020a_e,1020a_m,1020a_w") ;; ALU operations with a shift-by-constant operand diff --git a/gcc/config/arm/arm1026ejs.md b/gcc/config/arm/arm1026ejs.md index e6221363898102c566f8be5423f5509a0df49acd..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/arm1026ejs.md +++ b/gcc/config/arm/arm1026ejs.md @@ -66,7 +66,7 @@ (define_cpu_unit "l_e,l_m,l_w" "arm1026e ;; ALU operations with no shifted operand (define_insn_reservation "alu_op" 1 (and (eq_attr "tune" "arm1026ejs") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "a_e,a_m,a_w") ;; ALU operations with a shift-by-constant operand diff --git a/gcc/config/arm/arm1136jfs.md b/gcc/config/arm/arm1136jfs.md index 8fc30e976f0fbfe45f360ee93706cf64f9ef8f08..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/arm1136jfs.md +++ b/gcc/config/arm/arm1136jfs.md @@ -75,7 +75,7 @@ (define_cpu_unit "l_a,l_dc1,l_dc2,l_wb" ;; ALU operations with no shifted operand (define_insn_reservation "11_alu_op" 2 (and (eq_attr "tune" "arm1136js,arm1136jfs") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "e_1,e_2,e_3,e_wb") ;; ALU operations with a shift-by-constant operand diff --git a/gcc/config/arm/arm926ejs.md b/gcc/config/arm/arm926ejs.md index d3908f9e3ecd972c6f93a77bfd1bde4e501dcdba..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/arm926ejs.md +++ b/gcc/config/arm/arm926ejs.md @@ -58,7 +58,7 @@ (define_cpu_unit "e,m,w" "arm926ejs") ;; ALU operations with no shifted operand (define_insn_reservation "9_alu_op" 1 (and (eq_attr "tune" "arm926ejs") - (eq_attr "type" "alu,alu_shift")) + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift")) "e,m,w") ;; ALU operations with a shift-by-register operand diff --git a/gcc/config/arm/cortex-a15.md b/gcc/config/arm/cortex-a15.md index b86c6e706900b81adea9c5a487b96bcb473b8f62..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-a15.md +++ b/gcc/config/arm/cortex-a15.md @@ -61,7 +61,7 @@ (define_cpu_unit "ca15_sx2_alu, ca15_sx2 ;; Simple ALU without shift (define_insn_reservation "cortex_a15_alu" 2 (and (eq_attr "tune" "cortexa15") - (and (eq_attr "type" "alu") + (and (eq_attr "type" "alu_reg,simple_alu_imm") (eq_attr "neon_type" "none"))) "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)") diff --git a/gcc/config/arm/cortex-a5.md b/gcc/config/arm/cortex-a5.md index eb154e2980382befc77027ec8a0a35fcc34a1ff5..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-a5.md +++ b/gcc/config/arm/cortex-a5.md @@ -58,7 +58,7 @@ (define_cpu_unit "cortex_a5_fp_div_sqrt" (define_insn_reservation "cortex_a5_alu" 2 (and (eq_attr "tune" "cortexa5") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "cortex_a5_ex1") (define_insn_reservation "cortex_a5_alu_shift" 2 diff --git a/gcc/config/arm/cortex-a8.md b/gcc/config/arm/cortex-a8.md index 1922e5cf4c66c147830ba3e7b195263a3aac3015..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-a8.md +++ b/gcc/config/arm/cortex-a8.md @@ -85,7 +85,7 @@ (define_reservation "cortex_a8_multiply_ ;; (source read in E2 and destination available at the end of that cycle). (define_insn_reservation "cortex_a8_alu" 2 (and (eq_attr "tune" "cortexa8") - (ior (and (and (eq_attr "type" "alu") + (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm") (eq_attr "neon_type" "none")) (not (eq_attr "insn" "mov,mvn"))) (eq_attr "insn" "clz"))) @@ -107,7 +107,7 @@ (define_insn_reservation "cortex_a8_alu_ (define_insn_reservation "cortex_a8_mov" 1 (and (eq_attr "tune" "cortexa8") - (and (eq_attr "type" "alu,alu_shift,alu_shift_reg") + (and (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg") (eq_attr "insn" "mov,mvn"))) "cortex_a8_default") diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex-a9.md index 12c19efb12132e932dea03031ed5fd364e4b9aef..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-a9.md +++ b/gcc/config/arm/cortex-a9.md @@ -80,7 +80,7 @@ (define_reservation "cortex_a9_mult_long ;; which can go down E2 without any problem. (define_insn_reservation "cortex_a9_dp" 2 (and (eq_attr "tune" "cortexa9") - (ior (and (eq_attr "type" "alu") + (ior (and (eq_attr "type" "alu_reg,simple_alu_imm") (eq_attr "neon_type" "none")) (and (and (eq_attr "type" "alu_shift_reg, alu_shift") (eq_attr "insn" "mov")) diff --git a/gcc/config/arm/cortex-m4.md b/gcc/config/arm/cortex-m4.md index 57479853610ebdcdff8db4cc5ff3052c1a09b276..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-m4.md +++ b/gcc/config/arm/cortex-m4.md @@ -31,7 +31,7 @@ (define_reservation "cortex_m4_ex" "cort ;; ALU and multiply is one cycle. (define_insn_reservation "cortex_m4_alu" 1 (and (eq_attr "tune" "cortexm4") - (eq_attr "type" "alu,alu_shift,alu_shift_reg,mult")) + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg,mult")) "cortex_m4_ex") ;; Byte, half-word and word load is two cycles. diff --git a/gcc/config/arm/cortex-r4.md b/gcc/config/arm/cortex-r4.md index e26c3d45d5e6c5926500510c653619fb2a686851..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/cortex-r4.md +++ b/gcc/config/arm/cortex-r4.md @@ -78,13 +78,13 @@ (define_reservation "cortex_r4_branch" " ;; for the purposes of the dual-issue constraints above. (define_insn_reservation "cortex_r4_alu" 2 (and (eq_attr "tune_cortexr4" "yes") - (and (eq_attr "type" "alu") + (and (eq_attr "type" "alu_reg,simple_alu_imm") (not (eq_attr "insn" "mov")))) "cortex_r4_alu") (define_insn_reservation "cortex_r4_mov" 2 (and (eq_attr "tune_cortexr4" "yes") - (and (eq_attr "type" "alu") + (and (eq_attr "type" "alu_reg,simple_alu_imm") (eq_attr "insn" "mov"))) "cortex_r4_mov") diff --git a/gcc/config/arm/fa526.md b/gcc/config/arm/fa526.md index 42eb9b272fb1b9df553c566e8c41cb4d44c306ca..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/fa526.md +++ b/gcc/config/arm/fa526.md @@ -62,7 +62,7 @@ (define_cpu_unit "fa526_core" "fa526") ;; ALU operations (define_insn_reservation "526_alu_op" 1 (and (eq_attr "tune" "fa526") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "fa526_core") (define_insn_reservation "526_alu_shift_op" 2 diff --git a/gcc/config/arm/fa606te.md b/gcc/config/arm/fa606te.md index 06e63d696bde2e13556982e053cf2b0fd719d1ce..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/fa606te.md +++ b/gcc/config/arm/fa606te.md @@ -62,7 +62,7 @@ (define_cpu_unit "fa606te_core" "fa606te ;; ALU operations (define_insn_reservation "606te_alu_op" 1 (and (eq_attr "tune" "fa606te") - (eq_attr "type" "alu,alu_shift,alu_shift_reg")) + (eq_attr "type" "alu_reg,simple_alu_imm,alu_shift,alu_shift_reg")) "fa606te_core") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/gcc/config/arm/fa626te.md b/gcc/config/arm/fa626te.md index 7fe1c8724bef3feae8a291777379a5dac3cf31d1..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/fa626te.md +++ b/gcc/config/arm/fa626te.md @@ -68,7 +68,7 @@ (define_cpu_unit "fa626te_core" "fa626te ;; ALU operations (define_insn_reservation "626te_alu_op" 1 (and (eq_attr "tune" "fa626,fa626te") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "fa626te_core") (define_insn_reservation "626te_alu_shift_op" 2 diff --git a/gcc/config/arm/fa726te.md b/gcc/config/arm/fa726te.md index 3c33d59710478a5a46435e4df3177bbfcca1faff..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/fa726te.md +++ b/gcc/config/arm/fa726te.md @@ -85,7 +85,7 @@ (define_insn_reservation "726te_shift_op ;; Other ALU instructions 2 cycles. (define_insn_reservation "726te_alu_op" 1 (and (eq_attr "tune" "fa726te") - (and (eq_attr "type" "alu") + (and (eq_attr "type" "alu_reg,simple_alu_imm") (not (eq_attr "insn" "mov,mvn")))) "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") diff --git a/gcc/config/arm/fmp626.md b/gcc/config/arm/fmp626.md index 9ba33ddec4741ef3124c23ca8cf9f42f38feb6c8..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/fmp626.md +++ b/gcc/config/arm/fmp626.md @@ -63,7 +63,7 @@ (define_cpu_unit "fmp626_core" "fmp626") ;; ALU operations (define_insn_reservation "mp626_alu_op" 1 (and (eq_attr "tune" "fmp626") - (eq_attr "type" "alu")) + (eq_attr "type" "alu_reg,simple_alu_imm")) "fmp626_core") (define_insn_reservation "mp626_alu_shift_op" 2 diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 21035808c0e5964d29b7c903b5721210223153e0..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -193,7 +193,7 @@ (define_insn "*neon_mov<mode>" } } [(set_attr "neon_type" "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*") - (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu,load2,store2") + (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2") (set_attr "insn" "*,*,*,*,*,*,mov,*,*") (set_attr "length" "4,4,4,4,4,4,8,8,8") (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") @@ -238,7 +238,7 @@ (define_insn "*neon_mov<mode>" } [(set_attr "neon_type" "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\ neon_mrrc,neon_mcr_2_mcrr,*,*,*") - (set_attr "type" "*,*,*,*,*,*,alu,load4,store4") + (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4") (set_attr "insn" "*,*,*,*,*,*,mov,*,*") (set_attr "length" "4,8,4,8,8,8,16,8,16") (set_attr "pool_range" "*,*,*,1020,*,*,*,1020,*") diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index a5302f479f5091d08f4bf1a9ee9b0423692372af..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -1,5 +1,5 @@ ;; ARM Thumb-2 Machine Description -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2007, 2008, 2010, 2012 Free Software Foundation, Inc. ;; Written by CodeSourcery, LLC. ;; ;; This file is part of GCC. @@ -180,7 +180,7 @@ (define_insn "*thumb2_movsi_insn" ldr%?\\t%0, %1 str%?\\t%1, %0 str%?\\t%1, %0" - [(set_attr "type" "*,*,*,*,load1,load1,store1,store1") + [(set_attr "type" "*,*,simple_alu_imm,*,load1,load1,store1,store1") (set_attr "predicable" "yes") (set_attr "pool_range" "*,*,*,*,1020,4096,*,*") (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")] @@ -568,7 +568,11 @@ (define_insn "*thumb2_extendqisi_v6" "@ sxtb%?\\t%0, %1 ldr%(sb%)\\t%0, %1" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes") (set_attr "pool_range" "*,4096") (set_attr "neg_pool_range" "*,250")] @@ -581,7 +585,11 @@ (define_insn "*thumb2_zero_extendhisi2_v "@ uxth%?\\t%0, %1 ldr%(h%)\\t%0, %1" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes") (set_attr "pool_range" "*,4096") (set_attr "neg_pool_range" "*,250")] @@ -594,7 +602,11 @@ (define_insn "thumb2_zero_extendqisi2_v6 "@ uxtb%(%)\\t%0, %1 ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" - [(set_attr "type" "alu_shift,load_byte") + [(set_attr_alternative "type" + [(if_then_else (eq_attr "tune" "cortexa7") + (const_string "simple_alu_imm") + (const_string "alu_shift")) + (const_string "load_byte")]) (set_attr "predicable" "yes") (set_attr "pool_range" "*,4096") (set_attr "neg_pool_range" "*,250")] @@ -790,8 +802,8 @@ (define_insn "thumb2_addsi3_compare0" (define_insn "*thumb2_addsi3_compare0_scratch" [(set (reg:CC_NOOV CC_REGNUM) (compare:CC_NOOV - (plus:SI (match_operand:SI 0 "s_register_operand" "l, r") - (match_operand:SI 1 "arm_add_operand" "lPv,rIL")) + (plus:SI (match_operand:SI 0 "s_register_operand" "l,l, r,r") + (match_operand:SI 1 "arm_add_operand" "Pv,l,IL,r")) (const_int 0)))] "TARGET_THUMB2" "* @@ -808,7 +820,8 @@ (define_insn "*thumb2_addsi3_compare0_sc return \"cmn\\t%0, %1\"; " [(set_attr "conds" "set") - (set_attr "length" "2,4")] + (set_attr "length" "2,2,4,4") + (set_attr "type" "simple_alu_imm,*,simple_alu_imm,*")] ) (define_insn "*thumb2_mulsi_short" diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index d48d4e66a6c827ec6d471a218a175537f038d798..0000000000000000000000000000000000000000 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -77,7 +77,7 @@ (define_insn "*arm_movsi_vfp" } " [(set_attr "predicable" "yes") - (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") + (set_attr "type" "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") (set_attr "neon_type" "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*") (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")