scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

commit b212e291e22b9e70485520b48c1d250d52712b09
parent c3803dee4dae45c862f6c9d6498f8c8a8f16edb5
Author: Roberto E. Vargas Caballero <roberto@clue.aero>
Date:   Thu, 23 Apr 2020 15:50:52 +0200

libc: Add setjmp and longjmp for ppc32

Diffstat:
Msrc/libc/arch/ppc32/longjmp.s | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/libc/arch/ppc32/setjmp.s | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 118 insertions(+), 0 deletions(-)

diff --git a/src/libc/arch/ppc32/longjmp.s b/src/libc/arch/ppc32/longjmp.s @@ -0,0 +1,62 @@ + .file "longjmp.s" + .text + .global longjmp + +longjmp: + /* 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 + diff --git a/src/libc/arch/ppc32/setjmp.s b/src/libc/arch/ppc32/setjmp.s @@ -0,0 +1,56 @@ + .file "setjmp.s" + .text + .global setjmp + +setjmp: + /* 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) */ + mflr 0 + stw 0,0(3) + /* 1) store reg1 (SP) */ + stw 1, 4(3) + /* 2) store cr */ + mfcr 0 + stw 0,8(3) + /* 3) store r14-31 */ + stw 14,12(3) + stw 15,16(3) + stw 16,20(3) + stw 17,24(3) + stw 18,28(3) + stw 19,32(3) + stw 20,36(3) + stw 21,40(3) + stw 22,44(3) + stw 23,48(3) + stw 24,52(3) + stw 25,56(3) + stw 26,60(3) + stw 27,64(3) + stw 28,68(3) + stw 29,72(3) + stw 30,76(3) + stw 31,80(3) + stfd 14,88(3) + stfd 15,96(3) + stfd 16,104(3) + stfd 17,112(3) + stfd 18,120(3) + stfd 19,128(3) + stfd 20,136(3) + stfd 21,144(3) + stfd 22,152(3) + stfd 23,160(3) + stfd 24,168(3) + stfd 25,176(3) + stfd 26,184(3) + stfd 27,192(3) + stfd 28,200(3) + stfd 29,208(3) + stfd 30,216(3) + stfd 31,224(3) + + /* 4) set return value to 0 */ + li 3,0 + + /* 5) return */ + blr