summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/ppc/miscasm.s
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/ppc/miscasm.s')
-rw-r--r--private/crt32/misc/ppc/miscasm.s273
1 files changed, 273 insertions, 0 deletions
diff --git a/private/crt32/misc/ppc/miscasm.s b/private/crt32/misc/ppc/miscasm.s
new file mode 100644
index 000000000..8fab2f64e
--- /dev/null
+++ b/private/crt32/misc/ppc/miscasm.s
@@ -0,0 +1,273 @@
+//
+// Miscellaneous assembly-language routines and data for
+// PowerPC RTL
+//
+#include "ksppc.h"
+//
+// Copyright 1993 IBM Corporation
+//
+// By Rick Simpson, 17 August 1993
+//
+//-----------------------------------------------------------------------------
+//
+// These routines save and restore only the GPRs and FPRs.
+//
+// Saving and restoring of other non-volatile registers (LR, certain
+// fields of CR) is the responsibility of in-line prologue and epilogue
+// code.
+//
+//-----------------------------------------------------------------------------
+//
+// _savegpr_<n>
+// Inputs:
+// r12 = pointer to END of GPR save area
+// LR = return address to invoking prologue
+// Saves GPR<n> through GPR31 in area preceeding where r12 points
+//
+// _savefpr_<n>
+// Inputs:
+// r1 = pointer to stack frame header
+// LR = return address to invoking prologue
+// Saves FPR<m> through FPR31 in area preceeding stack frame header
+//
+//-----------------------------------------------------------------------------
+//
+// _restgpr_<n>
+// Inputs:
+// r12 = pointer to END of GPR save area
+// LR = return address to invoking prologue
+// Restores GPR<n> through GPR31 from area preceeding where r12 points
+//
+// _restfpr_<m>
+// Inputs:
+// r1 = pointer to stack frame header
+// LR = return address to invoking prologue
+// Restores FPR<m> through FPR31 from area preceeding stack frame header
+//
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// _savegpr_<n> -- Save GPRs when FPRs are also saved
+//
+// On entry:
+// r12 = address of END of GPR save area
+// LR = return address to prologue
+//
+// Saves GPR<n> through GPR31 in area preceeding where r12 points
+//
+//-----------------------------------------------------------------------------
+
+ FN_TABLE(_savegpr_13,0,1)
+ DUMMY_ENTRY(_savegpr_13)
+ .set _savegpr_13.body,.._savegpr_13-1
+ stw r13, -4*(32-13)(r12)
+ DUMMY_ENTRY(_savegpr_14)
+ stw r14, -4*(32-14)(r12)
+ DUMMY_ENTRY(_savegpr_15)
+ stw r15, -4*(32-15)(r12)
+ DUMMY_ENTRY(_savegpr_16)
+ stw r16, -4*(32-16)(r12)
+ DUMMY_ENTRY(_savegpr_17)
+ stw r17, -4*(32-17)(r12)
+ DUMMY_ENTRY(_savegpr_18)
+ stw r18, -4*(32-18)(r12)
+ DUMMY_ENTRY(_savegpr_19)
+ stw r19, -4*(32-19)(r12)
+ DUMMY_ENTRY(_savegpr_20)
+ stw r20, -4*(32-20)(r12)
+ DUMMY_ENTRY(_savegpr_21)
+ stw r21, -4*(32-21)(r12)
+ DUMMY_ENTRY(_savegpr_22)
+ stw r22, -4*(32-22)(r12)
+ DUMMY_ENTRY(_savegpr_23)
+ stw r23, -4*(32-23)(r12)
+ DUMMY_ENTRY(_savegpr_24)
+ stw r24, -4*(32-24)(r12)
+ DUMMY_ENTRY(_savegpr_25)
+ stw r25, -4*(32-25)(r12)
+ DUMMY_ENTRY(_savegpr_26)
+ stw r26, -4*(32-26)(r12)
+ DUMMY_ENTRY(_savegpr_27)
+ stw r27, -4*(32-27)(r12)
+ DUMMY_ENTRY(_savegpr_28)
+ stw r28, -4*(32-28)(r12)
+ DUMMY_ENTRY(_savegpr_29)
+ stw r29, -4*(32-29)(r12)
+ DUMMY_ENTRY(_savegpr_30)
+ stw r30, -4*(32-30)(r12)
+ DUMMY_ENTRY(_savegpr_31)
+ stw r31, -4*(32-31)(r12)
+ SPECIAL_EXIT(_savegpr_13)
+
+//-----------------------------------------------------------------------------
+//
+// _savefpr_<n> -- Saves FPRs
+//
+// On entry:
+// r1 = pointer to stack frame header
+// LR = return address to prologue
+//
+// Saves FPR<n> through FPR31 in area preceeding stack frame header
+//
+//-----------------------------------------------------------------------------
+
+ FN_TABLE(_savefpr_14,0,1)
+ DUMMY_ENTRY(_savefpr_14)
+ .set _savefpr_14.body,.._savefpr_14-1
+ stfd f14, -8*(32-14)(r1)
+ DUMMY_ENTRY(_savefpr_15)
+ stfd f15, -8*(32-15)(r1)
+ DUMMY_ENTRY(_savefpr_16)
+ stfd f16, -8*(32-16)(r1)
+ DUMMY_ENTRY(_savefpr_17)
+ stfd f17, -8*(32-17)(r1)
+ DUMMY_ENTRY(_savefpr_18)
+ stfd f18, -8*(32-18)(r1)
+ DUMMY_ENTRY(_savefpr_19)
+ stfd f19, -8*(32-19)(r1)
+ DUMMY_ENTRY(_savefpr_20)
+ stfd f20, -8*(32-20)(r1)
+ DUMMY_ENTRY(_savefpr_21)
+ stfd f21, -8*(32-21)(r1)
+ DUMMY_ENTRY(_savefpr_22)
+ stfd f22, -8*(32-22)(r1)
+ DUMMY_ENTRY(_savefpr_23)
+ stfd f23, -8*(32-23)(r1)
+ DUMMY_ENTRY(_savefpr_24)
+ stfd f24, -8*(32-24)(r1)
+ DUMMY_ENTRY(_savefpr_25)
+ stfd f25, -8*(32-25)(r1)
+ DUMMY_ENTRY(_savefpr_26)
+ stfd f26, -8*(32-26)(r1)
+ DUMMY_ENTRY(_savefpr_27)
+ stfd f27, -8*(32-27)(r1)
+ DUMMY_ENTRY(_savefpr_28)
+ stfd f28, -8*(32-28)(r1)
+ DUMMY_ENTRY(_savefpr_29)
+ stfd f29, -8*(32-29)(r1)
+ DUMMY_ENTRY(_savefpr_30)
+ stfd f30, -8*(32-30)(r1)
+ DUMMY_ENTRY(_savefpr_31)
+ stfd f31, -8*(32-31)(r1)
+ SPECIAL_EXIT(_savefpr_14)
+
+//-----------------------------------------------------------------------------
+//
+// _restgpr_<n> -- Restore GPRs when FPRs are also restored
+//
+// On entry:
+// r12 = address of END of GPR save area
+// LR = return address
+//
+// Restores GPR<n> through GPR31 from area preceeding where r12 points
+//
+//-----------------------------------------------------------------------------
+
+ FN_TABLE(_restgpr_13,0,2)
+ DUMMY_ENTRY(_restgpr_13)
+ .set _restgpr_13.body,.._restgpr_13-2
+ lwz r13, -4*(32-13)(r12)
+ DUMMY_ENTRY(_restgpr_14)
+ lwz r14, -4*(32-14)(r12)
+ DUMMY_ENTRY(_restgpr_15)
+ lwz r15, -4*(32-15)(r12)
+ DUMMY_ENTRY(_restgpr_16)
+ lwz r16, -4*(32-16)(r12)
+ DUMMY_ENTRY(_restgpr_17)
+ lwz r17, -4*(32-17)(r12)
+ DUMMY_ENTRY(_restgpr_18)
+ lwz r18, -4*(32-18)(r12)
+ DUMMY_ENTRY(_restgpr_19)
+ lwz r19, -4*(32-19)(r12)
+ DUMMY_ENTRY(_restgpr_20)
+ lwz r20, -4*(32-20)(r12)
+ DUMMY_ENTRY(_restgpr_21)
+ lwz r21, -4*(32-21)(r12)
+ DUMMY_ENTRY(_restgpr_22)
+ lwz r22, -4*(32-22)(r12)
+ DUMMY_ENTRY(_restgpr_23)
+ lwz r23, -4*(32-23)(r12)
+ DUMMY_ENTRY(_restgpr_24)
+ lwz r24, -4*(32-24)(r12)
+ DUMMY_ENTRY(_restgpr_25)
+ lwz r25, -4*(32-25)(r12)
+ DUMMY_ENTRY(_restgpr_26)
+ lwz r26, -4*(32-26)(r12)
+ DUMMY_ENTRY(_restgpr_27)
+ lwz r27, -4*(32-27)(r12)
+ DUMMY_ENTRY(_restgpr_28)
+ lwz r28, -4*(32-28)(r12)
+ DUMMY_ENTRY(_restgpr_29)
+ lwz r29, -4*(32-29)(r12)
+ DUMMY_ENTRY(_restgpr_30)
+ lwz r30, -4*(32-30)(r12)
+ DUMMY_ENTRY(_restgpr_31)
+ lwz r31, -4*(32-31)(r12)
+ SPECIAL_EXIT(_restgpr_13)
+
+//-----------------------------------------------------------------------------
+//
+// _restfpr_<n> -- Restores FPRs
+//
+// On entry:
+// r1 = pointer to stack frame header
+// LR = return address
+//
+// Restores FPR<n> through FPR31 from area preceeding stack frame header
+//
+//-----------------------------------------------------------------------------
+
+ FN_TABLE(_restfpr_14,0,2)
+ DUMMY_ENTRY(_restfpr_14)
+ .set _restfpr_14.body,.._restfpr_14-2
+ lfd f14, -8*(32-14)(r1)
+ DUMMY_ENTRY(_restfpr_15)
+ lfd f15, -8*(32-15)(r1)
+ DUMMY_ENTRY(_restfpr_16)
+ lfd f16, -8*(32-16)(r1)
+ DUMMY_ENTRY(_restfpr_17)
+ lfd f17, -8*(32-17)(r1)
+ DUMMY_ENTRY(_restfpr_18)
+ lfd f18, -8*(32-18)(r1)
+ DUMMY_ENTRY(_restfpr_19)
+ lfd f19, -8*(32-19)(r1)
+ DUMMY_ENTRY(_restfpr_20)
+ lfd f20, -8*(32-20)(r1)
+ DUMMY_ENTRY(_restfpr_21)
+ lfd f21, -8*(32-21)(r1)
+ DUMMY_ENTRY(_restfpr_22)
+ lfd f22, -8*(32-22)(r1)
+ DUMMY_ENTRY(_restfpr_23)
+ lfd f23, -8*(32-23)(r1)
+ DUMMY_ENTRY(_restfpr_24)
+ lfd f24, -8*(32-24)(r1)
+ DUMMY_ENTRY(_restfpr_25)
+ lfd f25, -8*(32-25)(r1)
+ DUMMY_ENTRY(_restfpr_26)
+ lfd f26, -8*(32-26)(r1)
+ DUMMY_ENTRY(_restfpr_27)
+ lfd f27, -8*(32-27)(r1)
+ DUMMY_ENTRY(_restfpr_28)
+ lfd f28, -8*(32-28)(r1)
+ DUMMY_ENTRY(_restfpr_29)
+ lfd f29, -8*(32-29)(r1)
+ DUMMY_ENTRY(_restfpr_30)
+ lfd f30, -8*(32-30)(r1)
+ DUMMY_ENTRY(_restfpr_31)
+ lfd f31, -8*(32-31)(r1)
+ SPECIAL_EXIT(_restfpr_14)
+
+//
+// This is a copy of the function table entries for the millicode. It's
+// used with the PPCKD_SYMBOL_SEARCH mechanism in vunwind.c to allow
+// for older versions of miscasm.obj.
+//
+
+ .reldata
+ .globl _millicode_table
+_millicode_table:
+ .long .._savegpr_13, _savegpr_13.end, 0, 1, .._savegpr_13
+ .long .._savefpr_14, _savefpr_14.end, 0, 1, .._savefpr_14
+ .long .._restgpr_13, _restgpr_13.end, 0, 2, .._restgpr_13
+ .long .._restfpr_14, _restfpr_14.end, 0, 2, .._restfpr_14