Commit 917e14f3 by Georg-Johann Lay Committed by Georg-Johann Lay

avr.md (*tablejump_rjmp): Change insn condition to !AVR_HAVE_JMP_CALL.

	* config/avr/avr.md (*tablejump_rjmp): Change insn condition to
	!AVR_HAVE_JMP_CALL.
	(*tablejump_lib): Change insn condition to AVR_HAVE_JMP_CALL.
	(*tablejump_enh, *tablejump): Remove insns.
	* config/avr/libgcc.S (__tablejump__): Use RET instead of EIND +
	EIJMP for indirect jump.  Use LPM Z+ where available.

From-SVN: r179760
parent 82675d94
2011-10-10 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr.md (*tablejump_rjmp): Change insn condition to
!AVR_HAVE_JMP_CALL.
(*tablejump_lib): Change insn condition to AVR_HAVE_JMP_CALL.
(*tablejump_enh, *tablejump): Remove insns.
* config/avr/libgcc.S (__tablejump__): Use RET instead of EIND +
EIJMP for indirect jump. Use LPM Z+ where available.
2011-10-10 Richard Henderson <rth@redhat.com> 2011-10-10 Richard Henderson <rth@redhat.com>
* doc/md.texi (vec_perm_const): Fix typo in cindex. * doc/md.texi (vec_perm_const): Fix typo in cindex.
...@@ -3719,62 +3719,36 @@ ...@@ -3719,62 +3719,36 @@
(set_attr "cc" "none")]) (set_attr "cc" "none")])
;; table jump ;; table jump
;; For entries in jump table see avr_output_addr_vec_elt.
;; Table made from "rjmp" instructions for <=8K devices. ;; Table made from "rjmp .L<n>" instructions for <= 8K devices.
(define_insn "*tablejump_rjmp" (define_insn "*tablejump_rjmp"
[(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r")] [(set (pc)
UNSPEC_INDEX_JMP)) (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r")]
UNSPEC_INDEX_JMP))
(use (label_ref (match_operand 1 "" ""))) (use (label_ref (match_operand 1 "" "")))
(clobber (match_dup 0))] (clobber (match_dup 0))]
"(!AVR_HAVE_JMP_CALL) && (!AVR_HAVE_EIJMP_EICALL)" "!AVR_HAVE_JMP_CALL"
"@ "@
ijmp ijmp
push %A0\;push %B0\;ret" push %A0\;push %B0\;ret"
[(set_attr "length" "1,3") [(set_attr "length" "1,3")
(set_attr "cc" "none,none")]) (set_attr "cc" "none,none")])
;; Not a prologue, but similar idea - move the common piece of code to libgcc. ;; Move the common piece of code to libgcc.
;; Table made from ".word gs(.L<n>)" addresses for > 8K devices.
;; Read jump address from table and perform indirect jump.
(define_insn "*tablejump_lib" (define_insn "*tablejump_lib"
[(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")] [(set (pc)
UNSPEC_INDEX_JMP)) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
UNSPEC_INDEX_JMP))
(use (label_ref (match_operand 1 "" ""))) (use (label_ref (match_operand 1 "" "")))
(clobber (match_dup 0))] (clobber (match_dup 0))]
"AVR_HAVE_JMP_CALL && TARGET_CALL_PROLOGUES" "AVR_HAVE_JMP_CALL"
"%~jmp __tablejump2__" "jmp __tablejump2__"
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
(define_insn "*tablejump_enh"
[(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
UNSPEC_INDEX_JMP))
(use (label_ref (match_operand 1 "" "")))
(clobber (match_dup 0))]
"AVR_HAVE_JMP_CALL && AVR_HAVE_LPMX"
"lsl r30
rol r31
lpm __tmp_reg__,Z+
lpm r31,Z
mov r30,__tmp_reg__
%!ijmp"
[(set_attr "length" "6")
(set_attr "cc" "clobber")])
(define_insn "*tablejump"
[(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
UNSPEC_INDEX_JMP))
(use (label_ref (match_operand 1 "" "")))
(clobber (match_dup 0))]
"AVR_HAVE_JMP_CALL && !AVR_HAVE_EIJMP_EICALL"
"lsl r30
rol r31
lpm
inc r30
push r0
lpm
push r0
ret"
[(set_attr "length" "8")
(set_attr "cc" "clobber")])
(define_expand "casesi" (define_expand "casesi"
[(set (match_dup 6) [(set (match_dup 6)
......
...@@ -821,27 +821,31 @@ ENDF __tablejump2__ ...@@ -821,27 +821,31 @@ ENDF __tablejump2__
DEFUN __tablejump__ DEFUN __tablejump__
#if defined (__AVR_HAVE_LPMX__) #if defined (__AVR_HAVE_LPMX__)
lpm __tmp_reg__, Z+
lpm r31, Z
mov r30, __tmp_reg__
#if defined (__AVR_HAVE_EIJMP_EICALL__) #if defined (__AVR_HAVE_EIJMP_EICALL__)
eijmp lpm __tmp_reg__, Z+
#else push __tmp_reg__
lpm __tmp_reg__, Z
push __tmp_reg__
push __zero_reg__
ret
#else
lpm __tmp_reg__, Z+
lpm r31, Z
mov r30, __tmp_reg__
ijmp ijmp
#endif #endif
#else #else /* !HAVE_LPMX */
lpm lpm
adiw r30, 1 adiw r30, 1
push r0 push r0
lpm lpm
push r0 push r0
#if defined (__AVR_HAVE_EIJMP_EICALL__) #if defined (__AVR_HAVE_EIJMP_EICALL__)
push __zero_reg__ push __zero_reg__
#endif #endif
ret ret
#endif #endif /* !HAVE_LPMX */
ENDF __tablejump__ ENDF __tablejump__
#endif /* defined (L_tablejump) */ #endif /* defined (L_tablejump) */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment