195 lines
3.7 KiB
ArmAsm
195 lines
3.7 KiB
ArmAsm
|
#include "config.h"
|
||
|
#ifdef ROCKBOX_LITTLE_ENDIAN
|
||
|
#define __LITTLE_ENDIAN__
|
||
|
#endif
|
||
|
|
||
|
/* SH7034, the only supported sh target supported by Rockbox is sh1 */
|
||
|
#define __SH5__ 0
|
||
|
#define __SHMEDIA__ 0
|
||
|
|
||
|
/* below is unmodified setjmp.S revision 1.3 from newlib cvs */
|
||
|
#if __SHMEDIA__
|
||
|
.mode SHmedia
|
||
|
#endif
|
||
|
|
||
|
#include "asm.h"
|
||
|
|
||
|
ENTRY(setjmp)
|
||
|
#if __SH5__
|
||
|
ptabs r18, tr0
|
||
|
gettr tr5, r5
|
||
|
gettr tr6, r6
|
||
|
gettr tr7, r7
|
||
|
st.q r2, 0*8, r18
|
||
|
st.q r2, 1*8, r10
|
||
|
st.q r2, 2*8, r11
|
||
|
st.q r2, 3*8, r12
|
||
|
st.q r2, 4*8, r13
|
||
|
st.q r2, 5*8, r14
|
||
|
st.q r2, 6*8, r15
|
||
|
st.q r2, 7*8, r28
|
||
|
st.q r2, 8*8, r29
|
||
|
st.q r2, 9*8, r30
|
||
|
st.q r2, 10*8, r31
|
||
|
st.q r2, 11*8, r32
|
||
|
st.q r2, 12*8, r33
|
||
|
st.q r2, 13*8, r34
|
||
|
st.q r2, 14*8, r35
|
||
|
st.q r2, 15*8, r44
|
||
|
st.q r2, 16*8, r45
|
||
|
st.q r2, 17*8, r46
|
||
|
st.q r2, 18*8, r47
|
||
|
st.q r2, 19*8, r48
|
||
|
st.q r2, 20*8, r49
|
||
|
st.q r2, 21*8, r50
|
||
|
st.q r2, 22*8, r51
|
||
|
st.q r2, 23*8, r52
|
||
|
st.q r2, 24*8, r53
|
||
|
st.q r2, 25*8, r54
|
||
|
st.q r2, 26*8, r55
|
||
|
st.q r2, 27*8, r56
|
||
|
st.q r2, 28*8, r57
|
||
|
st.q r2, 29*8, r58
|
||
|
st.q r2, 30*8, r59
|
||
|
st.q r2, 31*8, r5
|
||
|
st.q r2, 32*8, r6
|
||
|
st.q r2, 33*8, r7
|
||
|
#if ! __SH4_NOFPU__
|
||
|
fst.d r2, 34*8, dr12
|
||
|
fst.d r2, 35*8, dr14
|
||
|
fst.d r2, 36*8, dr36
|
||
|
fst.d r2, 37*8, dr38
|
||
|
fst.d r2, 38*8, dr40
|
||
|
fst.d r2, 39*8, dr42
|
||
|
fst.d r2, 40*8, dr44
|
||
|
fst.d r2, 41*8, dr46
|
||
|
fst.d r2, 42*8, dr48
|
||
|
fst.d r2, 43*8, dr50
|
||
|
fst.d r2, 44*8, dr52
|
||
|
fst.d r2, 45*8, dr54
|
||
|
fst.d r2, 46*8, dr56
|
||
|
fst.d r2, 47*8, dr58
|
||
|
fst.d r2, 48*8, dr60
|
||
|
fst.d r2, 49*8, dr62
|
||
|
#endif
|
||
|
movi 0, r2
|
||
|
blink tr0, r63
|
||
|
#else
|
||
|
#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
|
||
|
add #(13*4),r4
|
||
|
#else
|
||
|
add #(9*4),r4
|
||
|
#endif
|
||
|
|
||
|
sts.l pr,@-r4
|
||
|
|
||
|
#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
|
||
|
fmov.s fr15,@-r4 ! call saved floating point registers
|
||
|
fmov.s fr14,@-r4
|
||
|
fmov.s fr13,@-r4
|
||
|
fmov.s fr12,@-r4
|
||
|
#endif
|
||
|
|
||
|
mov.l r15,@-r4 ! call saved integer registers
|
||
|
mov.l r14,@-r4
|
||
|
mov.l r13,@-r4
|
||
|
mov.l r12,@-r4
|
||
|
|
||
|
mov.l r11,@-r4
|
||
|
mov.l r10,@-r4
|
||
|
mov.l r9,@-r4
|
||
|
mov.l r8,@-r4
|
||
|
|
||
|
rts
|
||
|
mov #0,r0
|
||
|
#endif /* __SH5__ */
|
||
|
|
||
|
ENTRY(longjmp)
|
||
|
#if __SH5__
|
||
|
ld.q r2, 0*8, r18
|
||
|
ptabs r18, tr0
|
||
|
ld.q r2, 1*8, r10
|
||
|
ld.q r2, 2*8, r11
|
||
|
ld.q r2, 3*8, r12
|
||
|
ld.q r2, 4*8, r13
|
||
|
ld.q r2, 5*8, r14
|
||
|
ld.q r2, 6*8, r15
|
||
|
ld.q r2, 7*8, r28
|
||
|
ld.q r2, 8*8, r29
|
||
|
ld.q r2, 9*8, r30
|
||
|
ld.q r2, 10*8, r31
|
||
|
ld.q r2, 11*8, r32
|
||
|
ld.q r2, 12*8, r33
|
||
|
ld.q r2, 13*8, r34
|
||
|
ld.q r2, 14*8, r35
|
||
|
ld.q r2, 15*8, r44
|
||
|
ld.q r2, 16*8, r45
|
||
|
ld.q r2, 17*8, r46
|
||
|
ld.q r2, 18*8, r47
|
||
|
ld.q r2, 19*8, r48
|
||
|
ld.q r2, 20*8, r49
|
||
|
ld.q r2, 21*8, r50
|
||
|
ld.q r2, 22*8, r51
|
||
|
ld.q r2, 23*8, r52
|
||
|
ld.q r2, 24*8, r53
|
||
|
ld.q r2, 25*8, r54
|
||
|
ld.q r2, 26*8, r55
|
||
|
ld.q r2, 27*8, r56
|
||
|
ld.q r2, 28*8, r57
|
||
|
ld.q r2, 29*8, r58
|
||
|
ld.q r2, 30*8, r59
|
||
|
ld.q r2, 31*8, r5
|
||
|
ld.q r2, 32*8, r6
|
||
|
ld.q r2, 33*8, r7
|
||
|
ptabs r5, tr5
|
||
|
ptabs r6, tr6
|
||
|
ptabs r7, tr7
|
||
|
#if ! __SH4_NOFPU__
|
||
|
fld.d r2, 34*8, dr12
|
||
|
fld.d r2, 35*8, dr14
|
||
|
fld.d r2, 36*8, dr36
|
||
|
fld.d r2, 37*8, dr38
|
||
|
fld.d r2, 38*8, dr40
|
||
|
fld.d r2, 39*8, dr42
|
||
|
fld.d r2, 40*8, dr44
|
||
|
fld.d r2, 41*8, dr46
|
||
|
fld.d r2, 42*8, dr48
|
||
|
fld.d r2, 43*8, dr50
|
||
|
fld.d r2, 44*8, dr52
|
||
|
fld.d r2, 45*8, dr54
|
||
|
fld.d r2, 46*8, dr56
|
||
|
fld.d r2, 47*8, dr58
|
||
|
fld.d r2, 48*8, dr60
|
||
|
fld.d r2, 49*8, dr62
|
||
|
#endif
|
||
|
movi 1, r2
|
||
|
cmvne r3, r3, r2
|
||
|
blink tr0, r63
|
||
|
#else
|
||
|
mov.l @r4+,r8
|
||
|
mov.l @r4+,r9
|
||
|
mov.l @r4+,r10
|
||
|
mov.l @r4+,r11
|
||
|
|
||
|
mov.l @r4+,r12
|
||
|
mov.l @r4+,r13
|
||
|
mov.l @r4+,r14
|
||
|
mov.l @r4+,r15
|
||
|
|
||
|
#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
|
||
|
fmov.s @r4+,fr12 ! call saved floating point registers
|
||
|
fmov.s @r4+,fr13
|
||
|
fmov.s @r4+,fr14
|
||
|
fmov.s @r4+,fr15
|
||
|
#endif
|
||
|
|
||
|
lds.l @r4+,pr
|
||
|
|
||
|
mov r5,r0
|
||
|
tst r0,r0
|
||
|
bf retr4
|
||
|
movt r0
|
||
|
retr4: rts
|
||
|
nop
|
||
|
#endif /* __SH5__ */
|