Index: gcc/gcc/config/bfin/bfin.md |
diff --git a/gcc/gcc/config/bfin/bfin.md b/gcc/gcc/config/bfin/bfin.md |
index 516a2052f7861070059adedbb25b8183bfb1f4e4..3fac01ca564669fd77ac7f7856ee54e6aac8459b 100644 |
--- a/gcc/gcc/config/bfin/bfin.md |
+++ b/gcc/gcc/config/bfin/bfin.md |
@@ -138,15 +138,16 @@ |
;; Distinguish a 32-bit version of an insn from a 16-bit version. |
(UNSPEC_32BIT 11) |
(UNSPEC_NOP 12) |
- (UNSPEC_ONES 12)]) |
+ (UNSPEC_ONES 13) |
+ (UNSPEC_ATOMIC 14)]) |
(define_constants |
- [(UNSPEC_VOLATILE_EH_RETURN 0) |
- (UNSPEC_VOLATILE_CSYNC 1) |
+ [(UNSPEC_VOLATILE_CSYNC 1) |
(UNSPEC_VOLATILE_SSYNC 2) |
(UNSPEC_VOLATILE_LOAD_FUNCDESC 3) |
(UNSPEC_VOLATILE_STORE_EH_HANDLER 4) |
- (UNSPEC_VOLATILE_DUMMY 5)]) |
+ (UNSPEC_VOLATILE_DUMMY 5) |
+ (UNSPEC_VOLATILE_STALL 6)]) |
(define_constants |
[(MACFLAG_NONE 0) |
@@ -163,28 +164,42 @@ |
(MACFLAG_IH 11)]) |
(define_attr "type" |
- "move,movcc,mvi,mcld,mcst,dsp32,mult,alu0,shft,brcc,br,call,misc,sync,compare,dummy" |
+ "move,movcc,mvi,mcld,mcst,dsp32,dsp32shiftimm,mult,alu0,shft,brcc,br,call,misc,sync,compare,dummy,stall" |
(const_string "misc")) |
-(define_attr "addrtype" "32bit,preg,ireg" |
+(define_attr "addrtype" "32bit,preg,spreg,ireg" |
(cond [(and (eq_attr "type" "mcld") |
- (and (match_operand 0 "d_register_operand" "") |
+ (and (match_operand 0 "dp_register_operand" "") |
(match_operand 1 "mem_p_address_operand" ""))) |
(const_string "preg") |
(and (eq_attr "type" "mcld") |
- (and (match_operand 0 "d_register_operand" "") |
+ (and (match_operand 0 "dp_register_operand" "") |
+ (match_operand 1 "mem_spfp_address_operand" ""))) |
+ (const_string "spreg") |
+ (and (eq_attr "type" "mcld") |
+ (and (match_operand 0 "dp_register_operand" "") |
(match_operand 1 "mem_i_address_operand" ""))) |
(const_string "ireg") |
(and (eq_attr "type" "mcst") |
- (and (match_operand 1 "d_register_operand" "") |
+ (and (match_operand 1 "dp_register_operand" "") |
(match_operand 0 "mem_p_address_operand" ""))) |
(const_string "preg") |
(and (eq_attr "type" "mcst") |
- (and (match_operand 1 "d_register_operand" "") |
+ (and (match_operand 1 "dp_register_operand" "") |
+ (match_operand 0 "mem_spfp_address_operand" ""))) |
+ (const_string "spreg") |
+ (and (eq_attr "type" "mcst") |
+ (and (match_operand 1 "dp_register_operand" "") |
(match_operand 0 "mem_i_address_operand" ""))) |
(const_string "ireg")] |
(const_string "32bit"))) |
+(define_attr "storereg" "preg,other" |
+ (cond [(and (eq_attr "type" "mcst") |
+ (match_operand 1 "p_register_operand" "")) |
+ (const_string "preg")] |
+ (const_string "other"))) |
+ |
;; Scheduling definitions |
(define_automaton "bfin") |
@@ -199,6 +214,13 @@ |
(define_cpu_unit "store" "bfin") |
(define_cpu_unit "pregs" "bfin") |
+;; A dummy unit used to delay scheduling of loads after a conditional |
+;; branch. |
+(define_cpu_unit "load" "bfin") |
+ |
+;; A logical unit used to work around anomaly 05000074. |
+(define_cpu_unit "anomaly_05000074" "bfin") |
+ |
(define_reservation "core" "slot0+slot1+slot2") |
(define_insn_reservation "alu" 1 |
@@ -213,20 +235,37 @@ |
(eq_attr "type" "dsp32") |
"slot0") |
+(define_insn_reservation "dsp32shiftimm" 1 |
+ (and (eq_attr "type" "dsp32shiftimm") |
+ (eq (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0))) |
+ "slot0") |
+ |
+(define_insn_reservation "dsp32shiftimm_anomaly_05000074" 1 |
+ (and (eq_attr "type" "dsp32shiftimm") |
+ (ne (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0))) |
+ "slot0+anomaly_05000074") |
+ |
(define_insn_reservation "load32" 1 |
(and (not (eq_attr "seq_insns" "multi")) |
(and (eq_attr "type" "mcld") (eq_attr "addrtype" "32bit"))) |
- "core") |
+ "core+load") |
(define_insn_reservation "loadp" 1 |
(and (not (eq_attr "seq_insns" "multi")) |
(and (eq_attr "type" "mcld") (eq_attr "addrtype" "preg"))) |
- "(slot1|slot2)+pregs") |
+ "slot1+pregs+load") |
+ |
+(define_insn_reservation "loadsp" 1 |
+ (and (not (eq_attr "seq_insns" "multi")) |
+ (and (eq_attr "type" "mcld") (eq_attr "addrtype" "spreg"))) |
+ "slot1+pregs") |
(define_insn_reservation "loadi" 1 |
(and (not (eq_attr "seq_insns" "multi")) |
(and (eq_attr "type" "mcld") (eq_attr "addrtype" "ireg"))) |
- "(slot1|slot2)") |
+ "(slot1|slot2)+load") |
(define_insn_reservation "store32" 1 |
(and (not (eq_attr "seq_insns" "multi")) |
@@ -234,19 +273,55 @@ |
"core") |
(define_insn_reservation "storep" 1 |
- (and (not (eq_attr "seq_insns" "multi")) |
- (and (eq_attr "type" "mcst") (eq_attr "addrtype" "preg"))) |
- "(slot1|slot2)+pregs+store") |
+ (and (and (not (eq_attr "seq_insns" "multi")) |
+ (and (eq_attr "type" "mcst") |
+ (ior (eq_attr "addrtype" "preg") |
+ (eq_attr "addrtype" "spreg")))) |
+ (ior (eq (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0)) |
+ (eq_attr "storereg" "other"))) |
+ "slot1+pregs+store") |
+ |
+(define_insn_reservation "storep_anomaly_05000074" 1 |
+ (and (and (not (eq_attr "seq_insns" "multi")) |
+ (and (eq_attr "type" "mcst") |
+ (ior (eq_attr "addrtype" "preg") |
+ (eq_attr "addrtype" "spreg")))) |
+ (and (ne (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0)) |
+ (eq_attr "storereg" "preg"))) |
+ "slot1+anomaly_05000074+pregs+store") |
(define_insn_reservation "storei" 1 |
- (and (not (eq_attr "seq_insns" "multi")) |
- (and (eq_attr "type" "mcst") (eq_attr "addrtype" "ireg"))) |
+ (and (and (not (eq_attr "seq_insns" "multi")) |
+ (and (eq_attr "type" "mcst") (eq_attr "addrtype" "ireg"))) |
+ (ior (eq (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0)) |
+ (eq_attr "storereg" "other"))) |
"(slot1|slot2)+store") |
+(define_insn_reservation "storei_anomaly_05000074" 1 |
+ (and (and (not (eq_attr "seq_insns" "multi")) |
+ (and (eq_attr "type" "mcst") (eq_attr "addrtype" "ireg"))) |
+ (and (ne (symbol_ref "ENABLE_WA_05000074") |
+ (const_int 0)) |
+ (eq_attr "storereg" "preg"))) |
+ "((slot1+anomaly_05000074)|slot2)+store") |
+ |
(define_insn_reservation "multi" 2 |
(eq_attr "seq_insns" "multi") |
"core") |
+(define_insn_reservation "load_stall1" 1 |
+ (and (eq_attr "type" "stall") |
+ (match_operand 0 "const1_operand" "")) |
+ "core+load*2") |
+ |
+(define_insn_reservation "load_stall3" 1 |
+ (and (eq_attr "type" "stall") |
+ (match_operand 0 "const3_operand" "")) |
+ "core+load*4") |
+ |
(absence_set "slot0" "slot1,slot2") |
(absence_set "slot1" "slot2") |
@@ -303,6 +378,7 @@ |
(eq_attr "type" "move") (const_int 2) |
(eq_attr "type" "dsp32") (const_int 4) |
+ (eq_attr "type" "dsp32shiftimm") (const_int 4) |
(eq_attr "type" "call") (const_int 4) |
(eq_attr "type" "br") |
@@ -532,20 +608,22 @@ |
;; with a PLUS. We generally require fewer secondary reloads this way. |
(define_insn "*movsi_insn" |
- [(set (match_operand:SI 0 "nonimmediate_operand" "=da,x*y,da,x,x,x,da,mr") |
- (match_operand:SI 1 "general_operand" "da,x*y,xKs7,xKsh,xKuh,ix,mr,da"))] |
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=da,x,da,y,da,x,x,x,da,mr") |
+ (match_operand:SI 1 "general_operand" "da,x,y,da,xKs7,xKsh,xKuh,ix,mr,da"))] |
"GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) == REG" |
"@ |
%0 = %1; |
%0 = %1; |
+ %0 = %1; |
+ %0 = %1; |
%0 = %1 (X); |
%0 = %1 (X); |
%0 = %1 (Z); |
# |
%0 = %1%! |
%0 = %1%!" |
- [(set_attr "type" "move,move,mvi,mvi,mvi,*,mcld,mcst") |
- (set_attr "length" "2,2,2,4,4,*,*,*")]) |
+ [(set_attr "type" "move,move,move,move,mvi,mvi,mvi,*,mcld,mcst") |
+ (set_attr "length" "2,2,2,2,2,4,4,*,*,*")]) |
(define_insn "*movsi_insn32" |
[(set (match_operand:SI 0 "register_operand" "=d,d") |
@@ -554,7 +632,7 @@ |
"@ |
%0 = ROT %1 BY 0%! |
%0 = %0 -|- %0%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm,dsp32")]) |
(define_split |
[(set (match_operand:SI 0 "d_register_operand" "") |
@@ -677,7 +755,7 @@ |
"@ |
%d0 = %h1 << 0%! |
%d0 = %1;" |
- [(set_attr "type" "dsp32,mvi")]) |
+ [(set_attr "type" "dsp32shiftimm,mvi")]) |
(define_expand "insv" |
[(set (zero_extract:SI (match_operand:SI 0 "register_operand" "") |
@@ -1587,7 +1665,7 @@ |
[(set (match_dup 0) (ashift:SI (match_dup 1) (const_int 2))) |
(set (match_dup 0) (ashift:SI (match_dup 0) (match_dup 3)))] |
"operands[3] = GEN_INT (INTVAL (operands[2]) - 2);" |
- [(set_attr "type" "shft,dsp32,shft,shft,*")]) |
+ [(set_attr "type" "shft,dsp32shiftimm,shft,shft,*")]) |
(define_insn "ashrsi3" |
[(set (match_operand:SI 0 "register_operand" "=d,d") |
@@ -1597,7 +1675,7 @@ |
"@ |
%0 >>>= %2; |
%0 = %1 >>> %2%!" |
- [(set_attr "type" "shft,dsp32")]) |
+ [(set_attr "type" "shft,dsp32shiftimm")]) |
(define_insn "rotl16" |
[(set (match_operand:SI 0 "register_operand" "=d") |
@@ -1638,7 +1716,7 @@ |
(zero_extract:BI (match_dup 1) (const_int 1) (const_int 0)))] |
"" |
"%0 = ROT %1 BY -1%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
(define_insn "rol_one" |
[(set (match_operand:SI 0 "register_operand" "+d") |
@@ -1648,7 +1726,7 @@ |
(zero_extract:BI (match_dup 1) (const_int 31) (const_int 0)))] |
"" |
"%0 = ROT %1 BY 1%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
(define_expand "lshrdi3" |
[(set (match_operand:DI 0 "register_operand" "") |
@@ -1723,7 +1801,7 @@ |
%0 >>= %2; |
%0 = %1 >> %2%! |
%0 = %1 >> %2;" |
- [(set_attr "type" "shft,dsp32,shft")]) |
+ [(set_attr "type" "shft,dsp32shiftimm,shft")]) |
(define_insn "lshrpdi3" |
[(set (match_operand:PDI 0 "register_operand" "=e") |
@@ -1731,7 +1809,7 @@ |
(match_operand:SI 2 "nonmemory_operand" "Ku5")))] |
"" |
"%0 = %1 >> %2%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
(define_insn "ashrpdi3" |
[(set (match_operand:PDI 0 "register_operand" "=e") |
@@ -1739,7 +1817,7 @@ |
(match_operand:SI 2 "nonmemory_operand" "Ku5")))] |
"" |
"%0 = %1 >>> %2%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
;; A pattern to reload the equivalent of |
;; (set (Dreg) (plus (FP) (large_constant))) |
@@ -1763,9 +1841,11 @@ |
DONE; |
}) |
-(define_insn "reload_inpdi" |
- [(set (match_operand:PDI 0 "register_operand" "=e") |
- (match_operand:PDI 1 "memory_operand" "m")) |
+(define_mode_iterator AREG [PDI V2PDI]) |
+ |
+(define_insn "reload_in<mode>" |
+ [(set (match_operand:AREG 0 "register_operand" "=e") |
+ (match_operand:AREG 1 "memory_operand" "m")) |
(clobber (match_operand:SI 2 "register_operand" "=d"))] |
"" |
{ |
@@ -1783,9 +1863,9 @@ |
(set_attr "type" "mcld") |
(set_attr "length" "12")]) |
-(define_insn "reload_outpdi" |
- [(set (match_operand:PDI 0 "memory_operand" "=m") |
- (match_operand:PDI 1 "register_operand" "e")) |
+(define_insn "reload_out<mode>" |
+ [(set (match_operand:AREG 0 "memory_operand" "=m") |
+ (match_operand:AREG 1 "register_operand" "e")) |
(clobber (match_operand:SI 2 "register_operand" "=d"))] |
"" |
{ |
@@ -1908,7 +1988,7 @@ |
(const_int -1))) |
(unspec [(const_int 0)] UNSPEC_LSETUP_END) |
(clobber (match_scratch:SI 2 "=&r"))] |
- "reload_completed" |
+ "splitting_loops" |
[(set (match_dup 2) (match_dup 0)) |
(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1))) |
(set (match_dup 0) (match_dup 2)) |
@@ -2004,7 +2084,8 @@ |
[(call (mem:SI (match_operand:SI 0 "symbol_ref_operand" "Q")) |
(match_operand 1 "general_operand" "g")) |
(use (match_operand:SI 2 "register_operand" "Z")) |
- (use (match_operand 3 "" ""))] |
+ (use (match_operand 3 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn) |
&& GET_CODE (operands[0]) == SYMBOL_REF |
&& !bfin_longcall_p (operands[0], INTVAL (operands[3]))" |
@@ -2030,7 +2111,8 @@ |
(call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "Q")) |
(match_operand 2 "general_operand" "g"))) |
(use (match_operand:SI 3 "register_operand" "Z")) |
- (use (match_operand 4 "" ""))] |
+ (use (match_operand 4 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn) |
&& GET_CODE (operands[1]) == SYMBOL_REF |
&& !bfin_longcall_p (operands[1], INTVAL (operands[4]))" |
@@ -2056,7 +2138,8 @@ |
[(call (mem:SI (match_operand:SI 0 "register_no_elim_operand" "Y")) |
(match_operand 1 "general_operand" "g")) |
(use (match_operand:SI 2 "register_operand" "Z")) |
- (use (match_operand 3 "" ""))] |
+ (use (match_operand 3 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn)" |
"call (%0);" |
[(set_attr "type" "call") |
@@ -2078,7 +2161,8 @@ |
(call (mem:SI (match_operand:SI 1 "register_no_elim_operand" "Y")) |
(match_operand 2 "general_operand" "g"))) |
(use (match_operand:SI 3 "register_operand" "Z")) |
- (use (match_operand 4 "" ""))] |
+ (use (match_operand 4 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn)" |
"call (%1);" |
[(set_attr "type" "call") |
@@ -2099,7 +2183,8 @@ |
(define_insn "*call_symbol" |
[(call (mem:SI (match_operand:SI 0 "symbol_ref_operand" "Q")) |
(match_operand 1 "general_operand" "g")) |
- (use (match_operand 2 "" ""))] |
+ (use (match_operand 2 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn) |
&& (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) |
&& GET_CODE (operands[0]) == SYMBOL_REF |
@@ -2125,7 +2210,8 @@ |
[(set (match_operand 0 "register_operand" "=d") |
(call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "Q")) |
(match_operand 2 "general_operand" "g"))) |
- (use (match_operand 3 "" ""))] |
+ (use (match_operand 3 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn) |
&& (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) |
&& GET_CODE (operands[1]) == SYMBOL_REF |
@@ -2151,7 +2237,8 @@ |
(define_insn "*call_insn" |
[(call (mem:SI (match_operand:SI 0 "register_no_elim_operand" "a")) |
(match_operand 1 "general_operand" "g")) |
- (use (match_operand 2 "" ""))] |
+ (use (match_operand 2 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn)" |
"call (%0);" |
[(set_attr "type" "call") |
@@ -2171,7 +2258,8 @@ |
[(set (match_operand 0 "register_operand" "=d") |
(call (mem:SI (match_operand:SI 1 "register_no_elim_operand" "a")) |
(match_operand 2 "general_operand" "g"))) |
- (use (match_operand 3 "" ""))] |
+ (use (match_operand 3 "" "")) |
+ (clobber (reg:SI REG_RETS))] |
"! SIBLING_CALL_P (insn)" |
"call (%1);" |
[(set_attr "type" "call") |
@@ -2253,29 +2341,6 @@ |
;; Conditional branch patterns |
;; The Blackfin has only few condition codes: eq, lt, lte, ltu, leu |
-;; The only outcome of this pattern is that global variables |
-;; bfin_compare_op[01] are set for use in bcond patterns. |
- |
-(define_expand "cmpbi" |
- [(set (cc0) (compare (match_operand:BI 0 "register_operand" "") |
- (match_operand:BI 1 "immediate_operand" "")))] |
- "" |
-{ |
- bfin_compare_op0 = operands[0]; |
- bfin_compare_op1 = operands[1]; |
- DONE; |
-}) |
- |
-(define_expand "cmpsi" |
- [(set (cc0) (compare (match_operand:SI 0 "register_operand" "") |
- (match_operand:SI 1 "reg_or_const_int_operand" "")))] |
- "" |
-{ |
- bfin_compare_op0 = operands[0]; |
- bfin_compare_op1 = operands[1]; |
- DONE; |
-}) |
- |
(define_insn "compare_eq" |
[(set (match_operand:BI 0 "register_operand" "=C,C") |
(eq:BI (match_operand:SI 1 "register_operand" "d,a") |
@@ -2324,106 +2389,6 @@ |
"cc =%1<%2 (iu);" |
[(set_attr "type" "compare")]) |
-(define_expand "beq" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- rtx op0 = bfin_compare_op0, op1 = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; /* hard register: CC */ |
- operands[2] = gen_rtx_EQ (BImode, op0, op1); |
- /* If we have a BImode input, then we already have a compare result, and |
- do not need to emit another comparison. */ |
- if (GET_MODE (bfin_compare_op0) == BImode) |
- { |
- gcc_assert (bfin_compare_op1 == const0_rtx); |
- emit_insn (gen_cbranchbi4 (operands[2], op0, op1, operands[0])); |
- DONE; |
- } |
- |
- operands[3] = gen_rtx_NE (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bne" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- rtx op0 = bfin_compare_op0, op1 = bfin_compare_op1; |
- /* If we have a BImode input, then we already have a compare result, and |
- do not need to emit another comparison. */ |
- if (GET_MODE (bfin_compare_op0) == BImode) |
- { |
- rtx cmp = gen_rtx_NE (BImode, op0, op1); |
- |
- gcc_assert (bfin_compare_op1 == const0_rtx); |
- emit_insn (gen_cbranchbi4 (cmp, op0, op1, operands[0])); |
- DONE; |
- } |
- |
- operands[1] = bfin_cc_rtx; /* hard register: CC */ |
- operands[2] = gen_rtx_EQ (BImode, op0, op1); |
- operands[3] = gen_rtx_EQ (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bgt" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LE (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_EQ (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bgtu" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LEU (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_EQ (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "blt" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LT (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_NE (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bltu" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LTU (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_NE (BImode, operands[1], const0_rtx); |
-}) |
- |
;; Same as above, but and CC with the overflow bit generated by the first |
;; multiplication. |
(define_insn "flag_mul_macv2hi_parts_acconly_andcc0" |
@@ -2488,63 +2453,25 @@ |
(set_attr "length" "6") |
(set_attr "seq_insns" "multi")]) |
-(define_expand "bge" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LT (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_EQ (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bgeu" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LTU (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_EQ (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "ble" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc)))] |
- "" |
-{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LE (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_NE (BImode, operands[1], const0_rtx); |
-}) |
- |
-(define_expand "bleu" |
- [(set (match_dup 1) (match_dup 2)) |
- (set (pc) |
- (if_then_else (match_dup 3) |
- (label_ref (match_operand 0 "" "")) |
- (pc))) |
- ] |
+(define_expand "cbranchsi4" |
+ [(set (pc) |
+ (if_then_else (match_operator 0 "ordered_comparison_operator" |
+ [(match_operand:SI 1 "register_operand" "") |
+ (match_operand:SI 2 "reg_or_const_int_operand" "")]) |
+ (label_ref (match_operand 3 "" "")) |
+ (pc)))] |
"" |
{ |
- operands[1] = bfin_cc_rtx; |
- operands[2] = gen_rtx_LEU (BImode, bfin_compare_op0, bfin_compare_op1); |
- operands[3] = gen_rtx_NE (BImode, operands[1], const0_rtx); |
+ rtx bi_compare = bfin_gen_compare (operands[0], SImode); |
+ emit_jump_insn (gen_cbranchbi4 (bi_compare, bfin_cc_rtx, CONST0_RTX (BImode), |
+ operands[3])); |
+ DONE; |
}) |
(define_insn "cbranchbi4" |
[(set (pc) |
(if_then_else |
- (match_operator 0 "bfin_cbranch_operator" |
+ (match_operator 0 "bfin_bimode_comparison_operator" |
[(match_operand:BI 1 "register_operand" "C") |
(match_operand:BI 2 "immediate_operand" "P0")]) |
(label_ref (match_operand 3 "" "")) |
@@ -2562,7 +2489,7 @@ |
(define_insn "cbranch_predicted_taken" |
[(set (pc) |
(if_then_else |
- (match_operator 0 "bfin_cbranch_operator" |
+ (match_operator 0 "bfin_bimode_comparison_operator" |
[(match_operand:BI 1 "register_operand" "C") |
(match_operand:BI 2 "immediate_operand" "P0")]) |
(label_ref (match_operand 3 "" "")) |
@@ -2578,7 +2505,7 @@ |
(define_insn "cbranch_with_nops" |
[(set (pc) |
(if_then_else |
- (match_operator 0 "bfin_cbranch_operator" |
+ (match_operator 0 "bfin_bimode_comparison_operator" |
[(match_operand:BI 1 "register_operand" "C") |
(match_operand:BI 2 "immediate_operand" "P0")]) |
(label_ref (match_operand 3 "" "")) |
@@ -2592,60 +2519,49 @@ |
[(set_attr "type" "brcc") |
(set_attr "length" "8")]) |
-;; setcc insns. */ |
-(define_expand "seq" |
- [(set (match_dup 1) (eq:BI (match_dup 2) (match_dup 3))) |
- (set (match_operand:SI 0 "register_operand" "") |
- (ne:SI (match_dup 1) (const_int 0)))] |
- "" |
-{ |
- operands[2] = bfin_compare_op0; |
- operands[3] = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; |
-}) |
+;; setcc insns. |
-(define_expand "slt" |
- [(set (match_dup 1) (lt:BI (match_dup 2) (match_dup 3))) |
+(define_expand "cstorebi4" |
+ [(set (match_dup 4) |
+ (match_operator:BI 1 "bfin_bimode_comparison_operator" |
+ [(match_operand:BI 2 "register_operand" "") |
+ (match_operand:BI 3 "reg_or_const_int_operand" "")])) |
(set (match_operand:SI 0 "register_operand" "") |
- (ne:SI (match_dup 1) (const_int 0)))] |
+ (ne:SI (match_dup 4) (const_int 0)))] |
"" |
{ |
- operands[2] = bfin_compare_op0; |
- operands[3] = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; |
-}) |
+ /* It could be expanded as a movbisi instruction, but the portable |
+ alternative produces better code. */ |
+ if (GET_CODE (operands[1]) == NE) |
+ FAIL; |
-(define_expand "sle" |
- [(set (match_dup 1) (le:BI (match_dup 2) (match_dup 3))) |
- (set (match_operand:SI 0 "register_operand" "") |
- (ne:SI (match_dup 1) (const_int 0)))] |
- "" |
-{ |
- operands[2] = bfin_compare_op0; |
- operands[3] = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; |
+ operands[4] = bfin_cc_rtx; |
}) |
-(define_expand "sltu" |
- [(set (match_dup 1) (ltu:BI (match_dup 2) (match_dup 3))) |
- (set (match_operand:SI 0 "register_operand" "") |
- (ne:SI (match_dup 1) (const_int 0)))] |
+(define_expand "cstoresi4" |
+ [(set (match_operand:SI 0 "register_operand") |
+ (match_operator:SI 1 "ordered_comparison_operator" |
+ [(match_operand:SI 2 "register_operand" "") |
+ (match_operand:SI 3 "reg_or_const_int_operand" "")]))] |
"" |
{ |
- operands[2] = bfin_compare_op0; |
- operands[3] = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; |
-}) |
+ rtx bi_compare, test; |
-(define_expand "sleu" |
- [(set (match_dup 1) (leu:BI (match_dup 2) (match_dup 3))) |
- (set (match_operand:SI 0 "register_operand" "") |
- (ne:SI (match_dup 1) (const_int 0)))] |
- "" |
-{ |
- operands[2] = bfin_compare_op0; |
- operands[3] = bfin_compare_op1; |
- operands[1] = bfin_cc_rtx; |
+ if (!bfin_direct_comparison_operator (operands[1], SImode)) |
+ { |
+ if (!register_operand (operands[3], SImode) |
+ || GET_CODE (operands[1]) == NE) |
+ FAIL; |
+ test = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[1])), |
+ SImode, operands[3], operands[2]); |
+ } |
+ else |
+ test = operands[1]; |
+ |
+ bi_compare = bfin_gen_compare (test, SImode); |
+ gcc_assert (GET_CODE (bi_compare) == NE); |
+ emit_insn (gen_movbisi (operands[0], bfin_cc_rtx)); |
+ DONE; |
}) |
(define_insn "nop" |
@@ -2674,13 +2590,16 @@ |
"CC = %1;" |
[(set_attr "length" "2")]) |
-(define_insn "movbisi" |
+(define_insn_and_split "movbisi" |
[(set (match_operand:SI 0 "register_operand" "=d") |
(ne:SI (match_operand:BI 1 "register_operand" "C") |
(const_int 0)))] |
"" |
- "%0 = CC;" |
- [(set_attr "length" "2")]) |
+ "#" |
+ "" |
+ [(set (match_operand:SI 0 "register_operand" "") |
+ (zero_extend:SI (match_operand:BI 1 "register_operand" "")))] |
+ "") |
(define_insn "notbi" |
[(set (match_operand:BI 0 "register_operand" "=C") |
@@ -2740,8 +2659,7 @@ |
"bfin_expand_epilogue (0, 0, 1); DONE;") |
(define_expand "eh_return" |
- [(unspec_volatile [(match_operand:SI 0 "register_operand" "")] |
- UNSPEC_VOLATILE_EH_RETURN)] |
+ [(use (match_operand:SI 0 "register_operand" ""))] |
"" |
{ |
emit_insn (gen_eh_store_handler (EH_RETURN_HANDLER_RTX, operands[0])); |
@@ -2759,11 +2677,10 @@ |
[(set_attr "type" "mcst")]) |
(define_insn_and_split "eh_return_internal" |
- [(set (pc) |
- (unspec_volatile [(reg:SI REG_P2)] UNSPEC_VOLATILE_EH_RETURN))] |
+ [(eh_return)] |
"" |
"#" |
- "reload_completed" |
+ "epilogue_completed" |
[(const_int 1)] |
"bfin_expand_epilogue (1, 1, 0); DONE;") |
@@ -2811,23 +2728,26 @@ |
(define_insn "return_internal" |
[(return) |
- (unspec [(match_operand 0 "immediate_operand" "i")] UNSPEC_RETURN)] |
+ (use (match_operand 0 "register_operand" ""))] |
"reload_completed" |
{ |
- switch (INTVAL (operands[0])) |
+ switch (REGNO (operands[0])) |
{ |
- case EXCPT_HANDLER: |
+ case REG_RETX: |
return "rtx;"; |
- case NMI_HANDLER: |
+ case REG_RETN: |
return "rtn;"; |
- case INTERRUPT_HANDLER: |
+ case REG_RETI: |
return "rti;"; |
- case SUBROUTINE: |
+ case REG_RETS: |
return "rts;"; |
} |
gcc_unreachable (); |
}) |
+;; When used at a location where CC contains 1, causes a speculative load |
+;; that is later cancelled. This is used for certain workarounds in |
+;; interrupt handler prologues. |
(define_insn "dummy_load" |
[(unspec_volatile [(match_operand 0 "register_operand" "a") |
(match_operand 1 "register_operand" "C")] |
@@ -2838,6 +2758,17 @@ |
(set_attr "length" "4") |
(set_attr "seq_insns" "multi")]) |
+;; A placeholder insn inserted before the final scheduling pass. It is used |
+;; to improve scheduling of loads when workarounds for speculative loads are |
+;; needed, by not placing them in the first few cycles after a conditional |
+;; branch. |
+(define_insn "stall" |
+ [(unspec_volatile [(match_operand 0 "const_int_operand" "P1P3")] |
+ UNSPEC_VOLATILE_STALL)] |
+ "" |
+ "" |
+ [(set_attr "type" "stall")]) |
+ |
(define_insn "csync" |
[(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_CSYNC)] |
"" |
@@ -2877,7 +2808,7 @@ |
(parallel [(const_int 1)]))))] |
"" |
"%h0 = %h2 << 0%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
(define_insn "movhiv2hi_high" |
[(set (match_operand:V2HI 0 "register_operand" "=d") |
@@ -2887,7 +2818,7 @@ |
(match_operand:HI 2 "register_operand" "d")))] |
"" |
"%d0 = %h2 << 0%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
;; No earlyclobber on alternative two since our sequence ought to be safe. |
;; The order of operands is intentional to match the VDSP builtin (high word |
@@ -2910,7 +2841,7 @@ |
(match_dup 2) |
(vec_select:HI (match_dup 0) (parallel [(const_int 1)]))))] |
"" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
; Like composev2hi, but operating on elements of V2HI vectors. |
; Useful on its own, and as a combiner bridge for the multiply and |
@@ -2933,7 +2864,7 @@ |
%0 = PACK (%h2,%d1)%! |
%0 = PACK (%d2,%h1)%! |
%0 = PACK (%d2,%d1)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm,dsp32shiftimm,dsp32shiftimm,dsp32shiftimm,dsp32,dsp32,dsp32,dsp32")]) |
(define_insn "movv2hi_hi" |
[(set (match_operand:HI 0 "register_operand" "=d,d,d") |
@@ -2944,7 +2875,7 @@ |
/* optimized out */ |
%h0 = %h1 << 0%! |
%h0 = %d1 << 0%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32shiftimm")]) |
(define_expand "movv2hi_hi_low" |
[(set (match_operand:HI 0 "register_operand" "") |
@@ -2962,74 +2893,82 @@ |
;; Unusual arithmetic operations on 16-bit registers. |
-(define_insn "ssaddhi3" |
+(define_code_iterator sp_or_sm [ss_plus ss_minus]) |
+(define_code_attr spm_string [(ss_plus "+") (ss_minus "-")]) |
+(define_code_attr spm_name [(ss_plus "add") (ss_minus "sub")]) |
+ |
+(define_insn "ss<spm_name>hi3" |
[(set (match_operand:HI 0 "register_operand" "=d") |
- (ss_plus:HI (match_operand:HI 1 "register_operand" "d") |
+ (sp_or_sm:HI (match_operand:HI 1 "register_operand" "d") |
(match_operand:HI 2 "register_operand" "d")))] |
"" |
- "%h0 = %h1 + %h2 (S)%!" |
+ "%h0 = %h1 <spm_string> %h2 (S)%!" |
[(set_attr "type" "dsp32")]) |
-(define_insn "ssaddhi3_parts" |
- [(set (vec_select:HI |
- (match_operand:V2HI 0 "register_operand" "d") |
- (parallel [(match_operand 3 "const01_operand" "P0P1")])) |
- (ss_plus:HI (vec_select:HI |
- (match_operand:V2HI 1 "register_operand" "d") |
- (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
- (vec_select:HI |
- (match_operand:V2HI 2 "register_operand" "d") |
- (parallel [(match_operand 5 "const01_operand" "P0P1")]))))] |
- "" |
+(define_insn "ss<spm_name>hi3_parts" |
+ [(set (match_operand:HI 0 "register_operand" "=d") |
+ (sp_or_sm:HI (vec_select:HI |
+ (match_operand:V2HI 1 "register_operand" "d") |
+ (parallel [(match_operand 3 "const01_operand" "P0P1")])) |
+ (vec_select:HI |
+ (match_operand:V2HI 2 "register_operand" "d") |
+ (parallel [(match_operand 4 "const01_operand" "P0P1")]))))] |
+ "" |
{ |
const char *templates[] = { |
- "%h0 = %h1 + %h2 (S)%!", |
- "%d0 = %h1 + %h2 (S)%!", |
- "%h0 = %d1 + %h2 (S)%!", |
- "%d0 = %d1 + %h2 (S)%!", |
- "%h0 = %h1 + %d2 (S)%!", |
- "%d0 = %h1 + %d2 (S)%!", |
- "%h0 = %d1 + %d2 (S)%!", |
- "%d0 = %d1 + %d2 (S)%!" }; |
- int alt = INTVAL (operands[3]) + (INTVAL (operands[4]) << 1) |
- + (INTVAL (operands[5]) << 2); |
+ "%h0 = %h1 <spm_string> %h2 (S)%!", |
+ "%h0 = %d1 <spm_string> %h2 (S)%!", |
+ "%h0 = %h1 <spm_string> %d2 (S)%!", |
+ "%h0 = %d1 <spm_string> %d2 (S)%!" }; |
+ int alt = INTVAL (operands[3]) + (INTVAL (operands[4]) << 1); |
return templates[alt]; |
} |
[(set_attr "type" "dsp32")]) |
-(define_insn "sssubhi3_parts" |
- [(set (vec_select:HI |
- (match_operand:V2HI 0 "register_operand" "d") |
- (parallel [(match_operand 3 "const01_operand" "P0P1")])) |
- (ss_minus:HI (vec_select:HI |
- (match_operand:V2HI 1 "register_operand" "d") |
- (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
- (vec_select:HI |
- (match_operand:V2HI 2 "register_operand" "d") |
- (parallel [(match_operand 5 "const01_operand" "P0P1")]))))] |
- "" |
+(define_insn "ss<spm_name>hi3_low_parts" |
+ [(set (match_operand:V2HI 0 "register_operand" "=d") |
+ (vec_concat:V2HI |
+ (vec_select:HI (match_operand:V2HI 1 "register_operand" "0") |
+ (parallel [(const_int 0)])) |
+ (sp_or_sm:HI (vec_select:HI |
+ (match_operand:V2HI 2 "register_operand" "d") |
+ (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
+ (vec_select:HI |
+ (match_operand:V2HI 3 "register_operand" "d") |
+ (parallel [(match_operand 5 "const01_operand" "P0P1")])))))] |
+ "" |
{ |
const char *templates[] = { |
- "%h0 = %h1 - %h2 (S)%!", |
- "%d0 = %h1 - %h2 (S)%!", |
- "%h0 = %d1 - %h2 (S)%!", |
- "%d0 = %d1 - %h2 (S)%!", |
- "%h0 = %h1 - %d2 (S)%!", |
- "%d0 = %h1 - %d2 (S)%!", |
- "%h0 = %d1 - %d2 (S)%!", |
- "%d0 = %d1 - %d2 (S)%!" }; |
- int alt = INTVAL (operands[3]) + (INTVAL (operands[4]) << 1) |
- + (INTVAL (operands[5]) << 2); |
+ "%h0 = %h2 <spm_string> %h3 (S)%!", |
+ "%h0 = %d2 <spm_string> %h3 (S)%!", |
+ "%h0 = %h2 <spm_string> %d3 (S)%!", |
+ "%h0 = %d2 <spm_string> %d3 (S)%!" }; |
+ int alt = INTVAL (operands[4]) + (INTVAL (operands[5]) << 1); |
return templates[alt]; |
} |
[(set_attr "type" "dsp32")]) |
-(define_insn "sssubhi3" |
- [(set (match_operand:HI 0 "register_operand" "=d") |
- (ss_minus:HI (match_operand:HI 1 "register_operand" "d") |
- (match_operand:HI 2 "register_operand" "d")))] |
- "" |
- "%h0 = %h1 - %h2 (S)%!" |
+(define_insn "ss<spm_name>hi3_high_parts" |
+ [(set (match_operand:V2HI 0 "register_operand" "=d") |
+ (vec_concat:V2HI |
+ (sp_or_sm:HI (vec_select:HI |
+ (match_operand:V2HI 2 "register_operand" "d") |
+ (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
+ (vec_select:HI |
+ (match_operand:V2HI 3 "register_operand" "d") |
+ (parallel [(match_operand 5 "const01_operand" "P0P1")]))) |
+ (vec_select:HI (match_operand:V2HI 1 "register_operand" "0") |
+ (parallel [(const_int 1)]))))] |
+ "" |
+{ |
+ const char *templates[] = { |
+ "%d0 = %h2 <spm_string> %h3 (S)%!", |
+ "%d0 = %d2 <spm_string> %h3 (S)%!", |
+ "%d0 = %h2 <spm_string> %d3 (S)%!", |
+ "%d0 = %d2 <spm_string> %d3 (S)%!" }; |
+ int alt = INTVAL (operands[4]) + (INTVAL (operands[5]) << 1); |
+ return templates[alt]; |
+} |
[(set_attr "type" "dsp32")]) |
;; V2HI vector insns |
@@ -3239,30 +3178,23 @@ |
[(set_attr "type" "dsp32")]) |
(define_insn "flag_mulhi_parts" |
- [(set (vec_select:HI |
- (match_operand:V2HI 0 "register_operand" "d") |
- (parallel [(match_operand 3 "const01_operand" "P0P1")])) |
+ [(set (match_operand:HI 0 "register_operand" "=d") |
(unspec:HI [(vec_select:HI |
(match_operand:V2HI 1 "register_operand" "d") |
- (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
+ (parallel [(match_operand 3 "const01_operand" "P0P1")])) |
(vec_select:HI |
(match_operand:V2HI 2 "register_operand" "d") |
- (parallel [(match_operand 5 "const01_operand" "P0P1")])) |
- (match_operand 6 "const_int_operand" "n")] |
+ (parallel [(match_operand 4 "const01_operand" "P0P1")])) |
+ (match_operand 5 "const_int_operand" "n")] |
UNSPEC_MUL_WITH_FLAG))] |
"" |
{ |
const char *templates[] = { |
- "%h0 = %h1 * %h2 %M6%!", |
- "%d0 = %h1 * %h2 %M6%!", |
- "%h0 = %d1 * %h2 %M6%!", |
- "%d0 = %d1 * %h2 %M6%!", |
- "%h0 = %h1 * %d2 %M6%!", |
- "%d0 = %h1 * %d2 %M6%!", |
- "%h0 = %d1 * %d2 %M6%!", |
- "%d0 = %d1 * %d2 %M6%!" }; |
- int alt = INTVAL (operands[3]) + (INTVAL (operands[4]) << 1) |
- + (INTVAL (operands[5]) << 2); |
+ "%h0 = %h1 * %h2 %M5%!", |
+ "%h0 = %d1 * %h2 %M5%!", |
+ "%h0 = %h1 * %d2 %M5%!", |
+ "%h0 = %d1 * %d2 %M5%!" }; |
+ int alt = INTVAL (operands[3]) + (INTVAL (operands[4]) << 1); |
return templates[alt]; |
} |
[(set_attr "type" "dsp32")]) |
@@ -4207,7 +4139,7 @@ |
%0 = ASHIFT %1 BY %h2 (V, S)%! |
%0 = %1 << %2 (V,S)%! |
%0 = %1 >>> %N2 (V,S)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32,dsp32shiftimm,dsp32shiftimm")]) |
(define_insn "ssashifthi3" |
[(set (match_operand:HI 0 "register_operand" "=d,d,d") |
@@ -4221,7 +4153,7 @@ |
%0 = ASHIFT %1 BY %h2 (V, S)%! |
%0 = %1 << %2 (V,S)%! |
%0 = %1 >>> %N2 (V,S)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32,dsp32shiftimm,dsp32shiftimm")]) |
(define_insn "ssashiftsi3" |
[(set (match_operand:SI 0 "register_operand" "=d,d,d") |
@@ -4235,7 +4167,7 @@ |
%0 = ASHIFT %1 BY %h2 (S)%! |
%0 = %1 << %2 (S)%! |
%0 = %1 >>> %N2 (S)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32,dsp32shiftimm,dsp32shiftimm")]) |
(define_insn "lshiftv2hi3" |
[(set (match_operand:V2HI 0 "register_operand" "=d,d,d") |
@@ -4249,7 +4181,7 @@ |
%0 = LSHIFT %1 BY %h2 (V)%! |
%0 = %1 << %2 (V)%! |
%0 = %1 >> %N2 (V)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32,dsp32shiftimm,dsp32shiftimm")]) |
(define_insn "lshifthi3" |
[(set (match_operand:HI 0 "register_operand" "=d,d,d") |
@@ -4263,7 +4195,7 @@ |
%0 = LSHIFT %1 BY %h2 (V)%! |
%0 = %1 << %2 (V)%! |
%0 = %1 >> %N2 (V)%!" |
- [(set_attr "type" "dsp32")]) |
+ [(set_attr "type" "dsp32,dsp32shiftimm,dsp32shiftimm")]) |
;; Load without alignment exception (masking off low bits) |
@@ -4275,3 +4207,5 @@ |
"DISALGNEXCPT || %0 = [%1];" |
[(set_attr "type" "mcld") |
(set_attr "length" "8")]) |
+ |
+(include "sync.md") |