aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>1999-05-14 19:16:36 +0000
committerMichael Hayes <m.hayes@gcc.gnu.org>1999-05-14 19:16:36 +0000
commit152d5997620ef463541f3e9550a4477336552f30 (patch)
treee012cadbf56e55aacbacb899584688ce91011c4a /gcc
parenta017abecb9bf9e5fc508abe2eeca2cbdb6033102 (diff)
downloadgcc-152d5997620ef463541f3e9550a4477336552f30.zip
gcc-152d5997620ef463541f3e9550a4477336552f30.tar.gz
gcc-152d5997620ef463541f3e9550a4477336552f30.tar.bz2
c4x.md (decrement_and_branch_on_count): Disabled.
* config/c4x/c4x.md (decrement_and_branch_on_count): Disabled. (doloop_begin, doloop_end): New patterns. (*rptb_init): Added extra operands. From-SVN: r26939
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/c4x/c4x.md57
2 files changed, 58 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cbd52b1..461524b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Sat May 15 14:09:08 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
+
+ * config/c4x/c4x.md (decrement_and_branch_on_count): Disabled.
+ (doloop_begin, doloop_end): New patterns.
+ (*rptb_init): Added extra operands.
+
Fri May 14 21:31:36 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.md (*umulqi3_highpart_clobber): Fix operand 2
diff --git a/gcc/config/c4x/c4x.md b/gcc/config/c4x/c4x.md
index 467bf10..1b7bd2b 100644
--- a/gcc/config/c4x/c4x.md
+++ b/gcc/config/c4x/c4x.md
@@ -4788,6 +4788,9 @@
; say that RS and RE are loaded.
(define_insn "*rptb_init"
[(unspec[(match_operand:QI 0 "register_operand" "va")] 22)
+ (use (match_operand:QI 1 "const_int_operand" ""))
+ (use (match_operand:QI 2 "const_int_operand" ""))
+ (use (match_operand:QI 3 "const_int_operand" ""))
(clobber (reg:QI 25))
(clobber (reg:QI 26))]
""
@@ -4795,6 +4798,18 @@
[(set_attr "type" "repeat")])
+(define_expand "doloop_begin"
+ [(parallel [(unspec[(match_operand:QI 0 "register_operand" "va")] 22)
+ (use (match_operand:QI 1 "const_int_operand" ""))
+ (use (match_operand:QI 2 "const_int_operand" ""))
+ (use (match_operand:QI 3 "const_int_operand" ""))
+ (clobber (reg:QI 25))
+ (clobber (reg:QI 26))])]
+ ""
+ "if (INTVAL (operands[3]) > 1 || ! TARGET_RPTB)
+ FAIL;")
+
+
; The RS (25) and RE (26) registers must be unviolate from the top of the loop
; to here.
(define_insn "rptb_end"
@@ -4806,6 +4821,9 @@
(set (match_dup 0)
(plus:QI (match_dup 0)
(const_int -1)))
+ (use (match_operand:QI 2 "const_int_operand" ""))
+ (use (match_operand:QI 3 "const_int_operand" ""))
+ (use (match_operand:QI 4 "const_int_operand" ""))
(use (reg:QI 25))
(use (reg:QI 26))
(clobber (reg:CC_NOOV 21))]
@@ -4824,8 +4842,12 @@
"
[(set_attr "type" "repeat,db,jmpc,jmpc,jmpc")])
-
-(define_expand "decrement_and_branch_on_count"
+; operand 0 is the loop count register
+; operand 1 is the label to jump to at the top of the loop
+; operand 2 is the number of loop iterations or 0 if it is unknown
+; operand 3 is the maximum number of loop iterations
+; operand 4 is the number of levels of enclosed loops
+(define_expand "doloop_end"
[(parallel [(set (pc)
(if_then_else (ge (match_operand:QI 0 "register_operand" "")
(const_int 0))
@@ -4834,20 +4856,45 @@
(set (match_dup 0)
(plus:QI (match_dup 0)
(const_int -1)))
+ (use (match_operand:QI 2 "const_int_operand" ""))
+ (use (match_operand:QI 3 "const_int_operand" ""))
+ (use (match_operand:QI 4 "const_int_operand" ""))
(use (reg:QI 25))
(use (reg:QI 26))
(clobber (reg:CC_NOOV 21))])]
""
- "if (0)
+ "if (! TARGET_LOOP_UNSIGNED
+ && (unsigned HOST_WIDE_INT) INTVAL (operands[3]) > (1U << 31))
+ FAIL;
+ if (INTVAL (operands[4]) > 1 || ! TARGET_RPTB)
{
/* The C30 maximum iteration count for DB is 2^24. */
- if (!TARGET_DB)
- FAIL;
+ if (! TARGET_DB)
+ FAIL;
emit_insn (gen_decrement_and_branch_until_zero (operands[0],
operands[1]));
DONE;
}")
+; The current low overhead looping code is naff and is not failsafe
+; If you want RTPB instructions to be generated, apply the patches
+; from www.elec.canterbury.ac.nz/c4x. This will utilise the
+; doloop_begin and doloop_end patterns in this MD.
+(define_expand "decrement_and_branch_on_count"
+ [(parallel [(set (pc)
+ (if_then_else (ge (match_operand:QI 0 "register_operand" "")
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:QI (match_dup 0)
+ (const_int -1)))
+ (use (reg:QI 25))
+ (use (reg:QI 26))
+ (clobber (reg:CC_NOOV 21))])]
+ "0"
+ "")
+
(define_expand "movstrqi_small2"
[(parallel [(set (mem:BLK (match_operand:BLK 0 "src_operand" ""))
(mem:BLK (match_operand:BLK 1 "src_operand" "")))