summaryrefslogtreecommitdiff
path: root/gcc/config/c4x/c4x.md
diff options
context:
space:
mode:
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1999-01-26 02:33:29 +0000
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1999-01-26 02:33:29 +0000
commitda7e2f82240b392e9a200fe925ca37b51862cb14 (patch)
tree26b970f2bf4e614c87cce9c00f41529608de4ab1 /gcc/config/c4x/c4x.md
parent02e19191a77b0f1918baa3a4ac7472c7ea4ea33f (diff)
downloadgcc-da7e2f82240b392e9a200fe925ca37b51862cb14.tar.gz
Tue Jan 26 23:21:49 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.h (COUNTER_REGS): New register class. * config/c4x/c4x.md (*rptb_init): Change constraints. (rptb_end): Emit alternate looping instructions if RC register not allocated for loop counter. (decrement_and_branch_on_count): Allow other registers for loop counter. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@24868 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/c4x/c4x.md')
-rw-r--r--gcc/config/c4x/c4x.md26
1 files changed, 17 insertions, 9 deletions
diff --git a/gcc/config/c4x/c4x.md b/gcc/config/c4x/c4x.md
index 60bc43fd99f..8e406cc28a0 100644
--- a/gcc/config/c4x/c4x.md
+++ b/gcc/config/c4x/c4x.md
@@ -4582,23 +4582,24 @@
; This pattern needs to be emitted at the start of the loop to
; say that RS and RE are loaded.
-(define_insn "init_branch_on_count"
- [(unspec[(match_operand:QI 0 "rc_reg_operand" "v")] 22)
+(define_insn "*rptb_init"
+ [(unspec[(match_operand:QI 0 "register_operand" "va")] 22)
(clobber (reg:QI 25))
(clobber (reg:QI 26))]
""
""
[(set_attr "type" "repeat")])
+
; The RS (25) and RE (26) registers must be unviolate from the top of the loop
; to here.
(define_insn "rptb_end"
[(set (pc)
- (if_then_else (ge (match_operand:QI 2 "rc_reg_operand" "0,0,0,0,0")
+ (if_then_else (ge (match_operand:QI 0 "register_operand" "+v,?a,!*d,!*x*k,!m")
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))
- (set (match_operand:QI 0 "rc_reg_operand" "+v,*a,*d,*x*k,*m")
+ (set (match_dup 0)
(plus:QI (match_dup 0)
(const_int -1)))
(use (reg:QI 25))
@@ -4608,11 +4609,11 @@
"*
if (which_alternative == 0)
return c4x_rptb_nop_p (insn) ? \"nop\" : \"\";
- else if (which_alternative == 1)
+ else if (which_alternative == 1 && TARGET_DB)
return \"dbu%#\\t%0,%l1\";
else if (which_alternative == 2)
return c4x_output_cbranch (\"subi\\t1,%0\\n\\tbge\", insn);
- else if (which_alternative == 3)
+ else if (which_alternative == 3 || (which_alternative == 1 && ! TARGET_DB))
return c4x_output_cbranch (\"subi\\t1,%0\\n\\tcmpi\\t0,%0\\n\\tbge\", insn);
else
return c4x_output_cbranch (\"push\\tr0\\n\\tldi\\t%0,r0\\n\\tsubi\\t1,r0\\n\\tsti\\tr0,%0\\n\\tpop\\tr0\\n\\tbhs\", insn);
@@ -4622,7 +4623,7 @@
(define_expand "decrement_and_branch_on_count"
[(parallel [(set (pc)
- (if_then_else (ge (match_operand:QI 0 "rc_reg_operand" "")
+ (if_then_else (ge (match_operand:QI 0 "register_operand" "")
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))
@@ -4633,8 +4634,15 @@
(use (reg:QI 26))
(clobber (reg:CC_NOOV 21))])]
""
- "")
-
+ "if (1)
+ {
+ /* The C30 maximum iteration count for DB is 2^24. */
+ if (!TARGET_DB)
+ FAIL;
+ emit_insn (gen_decrement_and_branch_until_zero (operands[0],
+ operands[1]));
+ DONE;
+ }")
(define_expand "movstrqi_small2"
[(parallel [(set (mem:BLK (match_operand:BLK 0 "src_operand" ""))