mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-24 23:32:06 +00:00
137 lines
2.6 KiB
ArmAsm
137 lines
2.6 KiB
ArmAsm
|
/* convert psi to si inplace
|
||
|
|
||
|
Note that `fp' below isn't a segment register.
|
||
|
It's r6, the frame pointer. */
|
||
|
|
||
|
#if __CODE__==32
|
||
|
#define RET prts
|
||
|
#else
|
||
|
#define RET rts
|
||
|
#endif
|
||
|
|
||
|
#define EXTPSISI_SN(r_msw,r_lsw,sp) ; \
|
||
|
.global __extpsisi##r_msw ; \
|
||
|
__extpsisi##r_msw: ; \
|
||
|
mov r_msw,r_lsw ; \
|
||
|
stc sp,r_msw ; \
|
||
|
RET
|
||
|
|
||
|
EXTPSISI_SN(r2,r3,dp)
|
||
|
EXTPSISI_SN(r4,r5,ep)
|
||
|
|
||
|
|
||
|
#define ADDPSI_AR_RN(sr,an,r_msw,r_lsw) \
|
||
|
.global __addpsi##an##r_msw ; \
|
||
|
__addpsi##an##r_msw: ; \
|
||
|
stc sr,@-sp ; \
|
||
|
add an,r_lsw ; \
|
||
|
addx @sp+,r_msw ; \
|
||
|
RET
|
||
|
|
||
|
ADDPSI_AR_RN(dp,r2,r0,r1)
|
||
|
ADDPSI_AR_RN(dp,r2,r3,r4)
|
||
|
ADDPSI_AR_RN(ep,r4,r0,r1)
|
||
|
ADDPSI_AR_RN(ep,r4,r1,r2)
|
||
|
ADDPSI_AR_RN(ep,r4,r3,r4)
|
||
|
ADDPSI_AR_RN(ep,r4,r5,fp)
|
||
|
|
||
|
ADDPSI_AR_RN(tp,fp,r0,r1)
|
||
|
|
||
|
|
||
|
#define ADDPSI_RN_AR(r_msw,r_lsw,sr,an,t_msw,t_lsw) \
|
||
|
.global __addpsi##r_msw##an ; \
|
||
|
__addpsi##r_msw##an: ; \
|
||
|
mov.w t_msw,@-sp ; \
|
||
|
mov.w t_lsw,@-sp ; \
|
||
|
stc sr,t_msw ; \
|
||
|
mov an,t_lsw ; \
|
||
|
add r_lsw,t_lsw ; \
|
||
|
addx r_msw,t_msw ; \
|
||
|
ldc t_msw,sr ; \
|
||
|
mov.w t_lsw,an ; \
|
||
|
mov.w @sp+,t_lsw ; \
|
||
|
mov.w @sp+,t_msw ; \
|
||
|
RET
|
||
|
|
||
|
ADDPSI_RN_AR(r0,r1,dp,r2,r4,r5)
|
||
|
ADDPSI_RN_AR(r0,r1,ep,r4,r2,r3)
|
||
|
|
||
|
|
||
|
|
||
|
#define EXTPSIHI_RN_RN(rm,r_msw,r_lsw) ; \
|
||
|
.global __extpsihi##rm##r_msw ; \
|
||
|
__extpsihi##rm##r_msw: ; \
|
||
|
mov rm,r_lsw ; \
|
||
|
clr.w r_msw ; \
|
||
|
RET
|
||
|
|
||
|
EXTPSIHI_RN_RN(r3,r0,r1)
|
||
|
EXTPSIHI_RN_RN(r4,r0,r1)
|
||
|
EXTPSIHI_RN_RN(r5,r0,r1)
|
||
|
EXTPSIHI_RN_RN(r2,r0,r1)
|
||
|
|
||
|
|
||
|
|
||
|
/* ifdefed out, because gcc doesn't like the # character in the above
|
||
|
macro. The macro expands into an assembly languange comment anyways,
|
||
|
so it serves no useful purpose. */
|
||
|
#if 0
|
||
|
#define EXTPSIHI_RN_SN(rm,r_msw,r_lsw) ; \
|
||
|
.global __extpsihi##rm##r_lsw ; \
|
||
|
__extpsihi##rm##r_lsw: ; \
|
||
|
mov rm,r_lsw ; \
|
||
|
ldc \#0,r_msw ; \
|
||
|
RET
|
||
|
|
||
|
EXTPSIHI_RN_SN(r0,dp,r2)
|
||
|
EXTPSIHI_RN_SN(r0,ep,r4)
|
||
|
EXTPSIHI_RN_SN(r1,dp,r2)
|
||
|
EXTPSIHI_RN_SN(r1,ep,r4)
|
||
|
EXTPSIHI_RN_SN(r3,dp,r2)
|
||
|
EXTPSIHI_RN_SN(r3,ep,r4)
|
||
|
EXTPSIHI_RN_SN(r5,dp,r2)
|
||
|
EXTPSIHI_RN_SN(r5,ep,r4)
|
||
|
EXTPSIHI_RN_SN(r2,ep,r4)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define EXTPSISI_RN(r_msw,r_lsw) ; \
|
||
|
.global __extpsisi##r_msw ; \
|
||
|
__extpsisi##r_msw: ; \
|
||
|
RET
|
||
|
|
||
|
EXTPSISI_RN(r0,r1)
|
||
|
|
||
|
|
||
|
|
||
|
#define ADDPSI_SA_SB(sa,ra,sb,rb) ; \
|
||
|
.global __addpsi##ra##rb ; \
|
||
|
__addpsi##ra##rb: ; \
|
||
|
mov.w r0,@-sp ; \
|
||
|
mov.w r1,@-sp ; \
|
||
|
stc sa,r0 ; \
|
||
|
stc sb,r1 ; \
|
||
|
add.w ra,rb ; \
|
||
|
addx r0,r1 ; \
|
||
|
ldc r1,sb ; \
|
||
|
mov.w @sp+,r1 ; \
|
||
|
mov.w @sp+,r0 ; \
|
||
|
RET
|
||
|
|
||
|
|
||
|
ADDPSI_SA_SB(dp,r2,ep,r4)
|
||
|
ADDPSI_SA_SB(ep,r4,dp,r2)
|
||
|
ADDPSI_SA_SB(tp,fp,dp,r2)
|
||
|
ADDPSI_SA_SB(tp,fp,ep,r4)
|
||
|
|
||
|
ADDPSI_SA_SB(dp,r2,dp,r2)
|
||
|
|
||
|
|
||
|
|
||
|
.global __addpsir0r0
|
||
|
__addpsir0r0:
|
||
|
add.w r1,r1
|
||
|
addx r0,r0
|
||
|
RET
|
||
|
|