summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jmp.S12
-rw-r--r--unwind.h11
2 files changed, 22 insertions, 1 deletions
diff --git a/jmp.S b/jmp.S
index 57ea7e6e..1be87323 100644
--- a/jmp.S
+++ b/jmp.S
@@ -248,9 +248,14 @@ DEFUN(jmp_restore)
#elif __PPC64__
+
DEFUN(jmp_save)
mflr %r11
mfcr %r12
+#if __ALTIVEC__
+ stvx %v31, 0, %r3
+ addi %r3, %r3, 32
+#endif
std %r1, 0(%r3)
std %r2, 8(%r3)
std %r11, 16(%r3)
@@ -274,10 +279,17 @@ DEFUN(jmp_save)
std %r29, 160(%r3)
std %r30, 168(%r3)
std %r31, 176(%r3)
+#if __ALTIVEC__
+ std %r11, 184(%r3) /* clobber padding */
+#endif
li %r3, 0
blr
DEFUN(jmp_restore)
+#if __ALTIVEC__
+ lvx %v31, 0, %r3
+ addi %r3, %r3, 32
+#endif
ld %r31, 176(%r3)
ld %r30, 168(%r3)
ld %r29, 160(%r3)
diff --git a/unwind.h b/unwind.h
index eda4b9f5..0bd569f5 100644
--- a/unwind.h
+++ b/unwind.h
@@ -86,7 +86,16 @@ struct jmp {
#elif __PPC64__
-struct jmp {
+#if __ALTIVEC__
+#define UW_JMP_ALIGN __attribute__ ((aligned (32)))
+#else
+#define UW_JMP_ALIGN
+#endif
+
+struct UW_JMP_ALIGN jmp {
+#if __ALTIVEC__
+ unsigned long vr31[4];
+#endif
unsigned long r1;
unsigned long r2;
unsigned long r11;