Index: fusl/src/setjmp/powerpc/longjmp.s |
diff --git a/fusl/src/setjmp/powerpc/longjmp.s b/fusl/src/setjmp/powerpc/longjmp.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bab1751176ecdde88458de482bcb9c04617454d6 |
--- /dev/null |
+++ b/fusl/src/setjmp/powerpc/longjmp.s |
@@ -0,0 +1,65 @@ |
+ .global _longjmp |
+ .global longjmp |
+ .type _longjmp,@function |
+ .type longjmp,@function |
+_longjmp: |
+longjmp: |
+# void longjmp(jmp_buf env, int val); |
+# put val into return register and restore the env saved in setjmp |
+# if val(r4) is 0, put 1 there. |
+ # 0) move old return address into r0 |
+ lwz 0, 0(3) |
+ # 1) put it into link reg |
+ mtlr 0 |
+ #2 ) restore stack ptr |
+ lwz 1, 4(3) |
+ #3) restore control reg |
+ lwz 0, 8(3) |
+ mtcr 0 |
+ #4) restore r14-r31 |
+ lwz 14, 12(3) |
+ lwz 15, 16(3) |
+ lwz 16, 20(3) |
+ lwz 17, 24(3) |
+ lwz 18, 28(3) |
+ lwz 19, 32(3) |
+ lwz 20, 36(3) |
+ lwz 21, 40(3) |
+ lwz 22, 44(3) |
+ lwz 23, 48(3) |
+ lwz 24, 52(3) |
+ lwz 25, 56(3) |
+ lwz 26, 60(3) |
+ lwz 27, 64(3) |
+ lwz 28, 68(3) |
+ lwz 29, 72(3) |
+ lwz 30, 76(3) |
+ lwz 31, 80(3) |
+ lfd 14,88(3) |
+ lfd 15,96(3) |
+ lfd 16,104(3) |
+ lfd 17,112(3) |
+ lfd 18,120(3) |
+ lfd 19,128(3) |
+ lfd 20,136(3) |
+ lfd 21,144(3) |
+ lfd 22,152(3) |
+ lfd 23,160(3) |
+ lfd 24,168(3) |
+ lfd 25,176(3) |
+ lfd 26,184(3) |
+ lfd 27,192(3) |
+ lfd 28,200(3) |
+ lfd 29,208(3) |
+ lfd 30,216(3) |
+ lfd 31,224(3) |
+ #5) put val into return reg r3 |
+ mr 3, 4 |
+ |
+ #6) check if return value is 0, make it 1 in that case |
+ cmpwi cr7, 4, 0 |
+ bne cr7, 1f |
+ li 3, 1 |
+1: |
+ blr |
+ |