From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- unix/as.linuxppc/README | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 unix/as.linuxppc/README (limited to 'unix/as.linuxppc/README') diff --git a/unix/as.linuxppc/README b/unix/as.linuxppc/README new file mode 100644 index 00000000..d19b2a3e --- /dev/null +++ b/unix/as.linuxppc/README @@ -0,0 +1,68 @@ +# LinuxPPC Assembler - LinuxPPC 2000, Aug 2000 + + .file "zz.c" +# zsvjmp_(buf,status) +# int *buf; +# int *status; +# { +# *status = 0; +# buf[0] = *status; +# setjmp (&buf[1]); +# } + +gcc2_compiled.: + .section ".text" + .align 2 + .globl zsvjmp_ + .type zsvjmp_,@function + + # Addressing: 12(31) means effective address (EA) is r31+12 + # lwz 9,12(31) means move value at EA to r9 + + # REGISTERS: r1 = stack pointer, r31 = frame pointer, r3+ = args + # Function always saves r1, r31 on stack. Sets up frame with + # required auto storage. Saves LR as well if any functions will + # be called. + +zsvjmp_: + # -- Push old r1 on stack; start new stack frame at r1 + stwu 1,-32(1) # Store word with update (push on stack) + # EA = r1-32; (r1) -> (EA), EA -> r1 + + # -- Save LR, r31 in stack frame + mflr 0 # Move from Link Register: LR -> r0 + stw 31,28(1) # Store word: r31 -> r1+28 + stw 0,36(1) # Store word: r0 -> r1+36 + + # -- Save r3 (arg1), r4 (arg2) on stack + mr 31,1 # Move register: r1 -> r31 + stw 3,8(31) # r3 -> r31+8 + stw 4,12(31) # r4 -> r31+12 + + # -- *status = 0; + lwz 9,12(31) # Load word and zero: (r31+12) -> r9 + li 0,0 # Load zero: 0 -> r0 + stw 0,0(9) # Store: r0 -> r9+0 + + # -- buf[0] = *status; + lwz 9,8(31) # buf -> r9 + lwz 11,12(31) # status -> r11 + lwz 0,0(11) # *status -> r0 + stw 0,0(9) # r0 -> buf[0] + + # -- setjmp (&buf[1]); + lwz 9,8(31) # buf -> r9 + addi 0,9,4 # Add immediate; r9+4 -> r0 + mr 3,0 # R3 is first arg + crxor 6,6,6 # Condition reg XOR: xor(b6,b6) -> b6 + bl setjmp # Branch to setjmp; addr(.L2) -> LR +.L2: + lwz 11,0(1) # load old r1 into r11 + lwz 0,4(11) # load old LR into r0 + mtlr 0 # restore return addr to LR + lwz 31,-4(11) # restore old r31 + mr 1,11 # restore old r1 + blr # Branch unconditionally (to LR addr) +.Lfe1: + .size zsvjmp_,.Lfe1-zsvjmp_ + .ident "GCC: (GNU) 2.95.2 19991024 (release/franzo)" -- cgit