diff options
Diffstat (limited to 'newlib/libc/machine/h8500/psi.S')
-rw-r--r-- | newlib/libc/machine/h8500/psi.S | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/newlib/libc/machine/h8500/psi.S b/newlib/libc/machine/h8500/psi.S new file mode 100644 index 0000000..47c8183 --- /dev/null +++ b/newlib/libc/machine/h8500/psi.S @@ -0,0 +1,136 @@ +/* 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 + |