summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/h8500/psi.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/h8500/psi.S')
-rw-r--r--newlib/libc/machine/h8500/psi.S136
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 00000000000..47c8183291e
--- /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
+