diff options
author | Denis Chertykov <denisc@overta.ru> | 2000-05-11 18:53:24 +0000 |
---|---|---|
committer | Denis Chertykov <denisc@gcc.gnu.org> | 2000-05-11 22:53:24 +0400 |
commit | b58c068a646378dace11c00354c9f8132d856304 (patch) | |
tree | f8b7b11e7761a392f63eb714232c7fda9e0b228e | |
parent | 38b8de2fe15314c4a3034e638e9874f1d413a923 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/avr/avr-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 14 | ||||
-rw-r--r-- | gcc/config/avr/avr.md | 53 |
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") |