| 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
|
| +
|
|
|