1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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)"
|