aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Chertykov <denisc@overta.ru>2000-05-11 18:53:24 +0000
committerDenis Chertykov <denisc@gcc.gnu.org>2000-05-11 22:53:24 +0400
commitb58c068a646378dace11c00354c9f8132d856304 (patch)
treef8b7b11e7761a392f63eb714232c7fda9e0b228e
parent38b8de2fe15314c4a3034e638e9874f1d413a923 (diff)
downloadgcc-b58c068a646378dace11c00354c9f8132d856304.zip
gcc-b58c068a646378dace11c00354c9f8132d856304.tar.gz
gcc-b58c068a646378dace11c00354c9f8132d856304.tar.bz2
avr-protos.c (jump_over_one_insn_p): New declaration.
* config/avr/avr-protos.c (jump_over_one_insn_p): New declaration. * config/avr/avr.c (jump_over_one_insn_p): New function. * config/avr/avr.md: New peepholes added. Output test and conditional jump to "sbrc" or "sbrs" command. From-SVN: r33855
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/avr/avr-protos.h1
-rw-r--r--gcc/config/avr/avr.c14
-rw-r--r--gcc/config/avr/avr.md53
4 files changed, 74 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e4e346..3c9aecb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Thu May 11 22:28:05 2000 Denis Chertykov <denisc@overta.ru>
+
+ * config/avr/avr-protos.c (jump_over_one_insn_p): New declaration.
+ * config/avr/avr.c (jump_over_one_insn_p): New function.
+ * config/avr/avr.md: New peepholes added. Output test and
+ conditional jump to "sbrc" or "sbrs" command.
+
2000-05-11 Mark Elbrecht <snowball3@bigfoot.com>
* cppmain.c (main): Use IS_DIR_SEPARATOR.
diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h
index 90dc5aa..7532754 100644
--- a/gcc/config/avr/avr-protos.h
+++ b/gcc/config/avr/avr-protos.h
@@ -136,6 +136,7 @@ extern int avr_jump_mode PARAMS ((rtx x, rtx insn));
extern int byte_immediate_operand PARAMS ((register rtx op,
enum machine_mode mode));
extern int test_hard_reg_class PARAMS ((enum reg_class class, rtx x));
+extern int jump_over_one_insn_p PARAMS ((rtx insn, rtx dest));
#endif /* RTX_CODE */
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index 73758ca..fbb96cf 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -3869,4 +3869,16 @@ debug_hard_reg_set (HARD_REG_SET set)
}
fprintf (stderr, "\n");
}
-
+
+int
+jump_over_one_insn_p (insn, dest)
+ rtx insn;
+ rtx dest;
+{
+ int uid = INSN_UID (GET_CODE (dest) == LABEL_REF
+ ? XEXP (dest, 0)
+ : dest);
+ int jump_addr = insn_addresses[INSN_UID (insn)];
+ int dest_addr = insn_addresses[uid];
+ return dest_addr - jump_addr == 2;
+}
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index 064e9ab..9f2afc6 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -1832,3 +1832,56 @@
AS1 (jmp,%1));
}")
+(define_peephole
+ [(set (cc0) (match_operand:QI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (lt (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (insn, operands[1])"
+ "sbrs %0,7")
+
+(define_peephole
+ [(set (cc0) (match_operand:QI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (ge (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (insn, operands[1])"
+ "sbrc %0,7")
+
+(define_peephole
+ [(set (cc0) (match_operand:HI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (lt (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (NEXT_INSN (insn), operands[1])"
+ "sbrs %B0,7")
+
+(define_peephole
+ [(set (cc0) (match_operand:HI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (ge (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (insn, operands[1])"
+ "sbrc %B0,7")
+
+(define_peephole
+ [(set (cc0) (match_operand:SI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (lt (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (NEXT_INSN (insn), operands[1])"
+ "sbrs %D0,7")
+
+(define_peephole
+ [(set (cc0) (match_operand:SI 0 "register_operand" ""))
+ (set (pc)
+ (if_then_else (ge (cc0) (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ "jump_over_one_insn_p (insn, operands[1])"
+ "sbrc %D0,7")