summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S')
-rw-r--r--cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S93
1 files changed, 93 insertions, 0 deletions
diff --git a/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S b/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
index 14a6047837..17bcb92d7d 100644
--- a/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
+++ b/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
@@ -22,6 +22,99 @@
_CPU_Context_volatile_clobber:
+#ifdef PPC_MULTILIB_FPU
+.macro CLOBBER_F i
+ addi r4, r3, 0x100 + \i
+ stw r4, 16(r1)
+ addi r4, r3, 0x200 + \i
+ stw r4, 16 + 4(r1)
+ lfd \i, 16(r1)
+.endm
+
+ stwu r1, -32(r1)
+
+ /* Negate FPSCR[FPRF] bits */
+ mffs f0
+ stfd f0, 16(r1)
+ lwz r0, 20(r1)
+ nor r3, r0, r0
+ rlwinm r0, r0, 0, 20, 14
+ rlwinm r3, r3, 0, 15, 19
+ or r0, r3, r0
+ stw r0, 20(r1)
+ lfd f0, 16(r1)
+ mtfsf 0xff, f0
+
+ CLOBBER_F 0
+ CLOBBER_F 1
+ CLOBBER_F 2
+ CLOBBER_F 3
+ CLOBBER_F 4
+ CLOBBER_F 5
+ CLOBBER_F 6
+ CLOBBER_F 7
+ CLOBBER_F 8
+ CLOBBER_F 9
+ CLOBBER_F 10
+ CLOBBER_F 11
+ CLOBBER_F 12
+ CLOBBER_F 13
+ addi r1, r1, 32
+#endif
+
+#ifdef PPC_MULTILIB_ALTIVEC
+.macro CLOBBER_V i
+ addi r4, r3, 0x300 + \i
+ stw r4, 16(r1)
+ addi r4, r3, 0x400 + \i
+ stw r4, 16 + 4(r1)
+ addi r4, r3, 0x500 + \i
+ stw r4, 16 + 8(r1)
+ addi r4, r3, 0x600 + \i
+ stw r4, 16 + 12(r1)
+ li r4, 16
+ lvx \i, r1, r4
+.endm
+
+ stwu r1, -32(r1)
+
+ /* Negate VSCR[SAT] bit */
+ mfvscr v0
+ li r3, 16
+ stvewx v0, r1, r3
+ lwz r0, 16(r1)
+ nor r3, r0, r0
+ rlwinm r0, r0, 0, 0, 30
+ rlwinm r3, r3, 0, 31, 31
+ or r0, r3, r0
+ stw r0, 16(r1)
+ li r3, 16
+ lvewx v0, r1, r3
+ mtvscr v0
+
+ CLOBBER_V 0
+ CLOBBER_V 1
+ CLOBBER_V 2
+ CLOBBER_V 3
+ CLOBBER_V 4
+ CLOBBER_V 5
+ CLOBBER_V 6
+ CLOBBER_V 7
+ CLOBBER_V 8
+ CLOBBER_V 9
+ CLOBBER_V 10
+ CLOBBER_V 11
+ CLOBBER_V 12
+ CLOBBER_V 13
+ CLOBBER_V 14
+ CLOBBER_V 15
+ CLOBBER_V 16
+ CLOBBER_V 17
+ CLOBBER_V 18
+ CLOBBER_V 19
+ addi r1, r1, 32
+#endif
+
addi r4, r3, 10
rlwinm r4, r4, 0, 20, 7
mfcr r5