; #include <stdlib.h>
;
; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
; {
; }
;
; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h)
; {
; /* use some local data */
; *(char*)alloca(10) = 'L';
; leaf_call(b, c, d, e, f, g, h);
; }
;
; int main()
; {
; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
; return 0;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <leaf_call>:
0: 94 21 ff d0 stwu r1,-48(r1)
4: 93 e1 00 2c stw r31,44(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 9f 00 0c stw r4,12(r31)
14: 90 bf 00 10 stw r5,16(r31)
18: 90 df 00 14 stw r6,20(r31)
1c: 90 ff 00 18 stw r7,24(r31)
20: 91 1f 00 1c stw r8,28(r31)
24: 91 3f 00 20 stw r9,32(r31)
28: 81 61 00 00 lwz r11,0(r1)
2c: 83 eb ff fc lwz r31,-4(r11)
30: 7d 61 5b 78 mr r1,r11
34: 4e 80 00 20 blr
00000038 <nonleaf_call>:
38: 94 21 ff c0 stwu r1,-64(r1) ; | open frame and store sp at top of stack
3c: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
40: 93 e1 00 3c stw r31,60(r1) ; | prolog store gpr31
44: 90 01 00 44 stw r0,68(r1) ; | store lr
48: 7c 3f 0b 78 mr r31,r1 ; / sp -> gpr31, latter used for some fixed addressing below
4c: 90 7f 00 08 stw r3,8(r31) ; \
50: 90 9f 00 0c stw r4,12(r31) ; |
54: 90 bf 00 10 stw r5,16(r31) ; |
58: 90 df 00 14 stw r6,20(r31) ; |
5c: 90 ff 00 18 stw r7,24(r31) ; | all in args -> temp space in local area
60: 91 1f 00 1c stw r8,28(r31) ; |
64: 91 3f 00 20 stw r9,32(r31) ; |
68: 91 5f 00 24 stw r10,36(r31) ; |
6c: 80 01 00 00 lwz r0,0(r1) ; fetch sp saved on stack of top by prolog -> gpr0, and ...
70: 94 01 ff 10 stwu r0,-240(r1) ; ... update it further up the stack for alloca(220) - with padding to guarantee alignment
74: 39 21 00 08 addi r9,r1,8 ; |
78: 91 3f 00 28 stw r9,40(r31) ; |
7c: 81 3f 00 28 lwz r9,40(r31) ; |
80: 38 09 00 0f addi r0,r9,15 ; | start of alloca()'d memory -> gpr9, by ...
84: 54 00 e1 3e rlwinm r0,r0,28,4,31 ; | ... using gpr0 as helper to align to 16b, leaving at least 8b at top of stock
88: 54 00 20 36 rlwinm r0,r0,4,0,27 ; |
8c: 90 1f 00 28 stw r0,40(r31) ; |
90: 81 3f 00 28 lwz r9,40(r31) ; |
94: 38 00 00 4c li r0,76 ; 'L' -> gpr0, and ...
98: 98 09 00 00 stb r0,0(r9) ; ... store in local area (of alloca()'d space)
9c: 80 7f 00 0c lwz r3,12(r31) ; arg 0
a0: 80 9f 00 10 lwz r4,16(r31) ; arg 1
a4: 80 bf 00 14 lwz r5,20(r31) ; arg 2
a8: 80 df 00 18 lwz r6,24(r31) ; arg 3
ac: 80 ff 00 1c lwz r7,28(r31) ; arg 4
b0: 81 1f 00 20 lwz r8,32(r31) ; arg 5
b4: 81 3f 00 24 lwz r9,36(r31) ; arg 6
b8: 48 00 00 01 bl b8 <nonleaf_call+0x80> ; call and put return address -> lr
bc: 81 61 00 00 lwz r11,0(r1) ; |
c0: 80 0b 00 04 lwz r0,4(r11) ; |
c4: 7c 08 03 a6 mtlr r0 ; |
c8: 83 eb ff fc lwz r31,-4(r11) ; | epilog
cc: 7d 61 5b 78 mr r1,r11 ; |
d0: 4e 80 00 20 blr ; |
000000d4 <main>:
d4: 94 21 ff f0 stwu r1,-16(r1) ; |
d8: 7c 08 02 a6 mflr r0 ; |
dc: 93 e1 00 0c stw r31,12(r1) ; | prolog
e0: 90 01 00 14 stw r0,20(r1) ; |
e4: 7c 3f 0b 78 mr r31,r1 ; |
e8: 38 60 00 00 li r3,0 ; arg 0
ec: 38 80 00 01 li r4,1 ; arg 1
f0: 38 a0 00 02 li r5,2 ; arg 2
f4: 38 c0 00 03 li r6,3 ; arg 3
f8: 38 e0 00 04 li r7,4 ; arg 4
fc: 39 00 00 05 li r8,5 ; arg 5
100: 39 20 00 06 li r9,6 ; arg 6
104: 39 40 00 07 li r10,7 ; arg 7
108: 48 00 00 01 bl 108 <main+0x34> ; call and put return address -> lr
10c: 38 00 00 00 li r0,0 ; return value (pointlessly) via gpr0 ...
110: 7c 03 03 78 mr r3,r0 ; ... to gpr3
114: 81 61 00 00 lwz r11,0(r1) ; |
118: 80 0b 00 04 lwz r0,4(r11) ; |
11c: 7c 08 03 a6 mtlr r0 ; |
120: 83 eb ff fc lwz r31,-4(r11) ; | epilog
124: 7d 61 5b 78 mr r1,r11 ; |
128: 4e 80 00 20 blr ; |
; output from netbsd-4.0.1-macppc w/ gcc 4.1.2
00000000 <leaf_call>:
0: 94 21 ff c0 stwu r1,-64(r1)
4: 93 e1 00 3c stw r31,60(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 9f 00 0c stw r4,12(r31)
14: 90 bf 00 10 stw r5,16(r31)
18: 90 df 00 14 stw r6,20(r31)
1c: 90 ff 00 18 stw r7,24(r31)
20: 91 1f 00 1c stw r8,28(r31)
24: 91 3f 00 20 stw r9,32(r31)
28: 81 61 00 00 lwz r11,0(r1)
2c: 83 eb ff fc lwz r31,-4(r11)
30: 7d 61 5b 78 mr r1,r11
34: 4e 80 00 20 blr
00000038 <nonleaf_call>:
38: 94 21 ff c0 stwu r1,-64(r1)
3c: 7c 08 02 a6 mflr r0
40: 93 e1 00 3c stw r31,60(r1)
44: 90 01 00 44 stw r0,68(r1)
48: 7c 3f 0b 78 mr r31,r1
4c: 90 7f 00 08 stw r3,8(r31)
50: 90 9f 00 0c stw r4,12(r31)
54: 90 bf 00 10 stw r5,16(r31)
58: 90 df 00 14 stw r6,20(r31)
5c: 90 ff 00 18 stw r7,24(r31)
60: 91 1f 00 1c stw r8,28(r31)
64: 91 3f 00 20 stw r9,32(r31)
68: 91 5f 00 24 stw r10,36(r31)
6c: 80 01 00 00 lwz r0,0(r1)
70: 94 01 ff 10 stwu r0,-240(r1)
74: 39 21 00 08 addi r9,r1,8
78: 91 3f 00 28 stw r9,40(r31)
7c: 81 3f 00 28 lwz r9,40(r31)
80: 38 09 00 0f addi r0,r9,15
84: 54 00 e1 3e rlwinm r0,r0,28,4,31
88: 54 00 20 36 rlwinm r0,r0,4,0,27
8c: 90 1f 00 28 stw r0,40(r31)
90: 81 3f 00 28 lwz r9,40(r31)
94: 38 00 00 4c li r0,76
98: 98 09 00 00 stb r0,0(r9)
9c: 80 7f 00 0c lwz r3,12(r31)
a0: 80 9f 00 10 lwz r4,16(r31)
a4: 80 bf 00 14 lwz r5,20(r31)
a8: 80 df 00 18 lwz r6,24(r31)
ac: 80 ff 00 1c lwz r7,28(r31)
b0: 81 1f 00 20 lwz r8,32(r31)
b4: 81 3f 00 24 lwz r9,36(r31)
b8: 48 00 00 01 bl b8 <nonleaf_call+0x80>
bc: 81 61 00 00 lwz r11,0(r1)
c0: 80 0b 00 04 lwz r0,4(r11)
c4: 7c 08 03 a6 mtlr r0
c8: 83 eb ff fc lwz r31,-4(r11)
cc: 7d 61 5b 78 mr r1,r11
d0: 4e 80 00 20 blr
000000d4 <main>:
d4: 94 21 ff e0 stwu r1,-32(r1)
d8: 7c 08 02 a6 mflr r0
dc: 93 e1 00 1c stw r31,28(r1)
e0: 90 01 00 24 stw r0,36(r1)
e4: 7c 3f 0b 78 mr r31,r1
e8: 38 60 00 00 li r3,0
ec: 38 80 00 01 li r4,1
f0: 38 a0 00 02 li r5,2
f4: 38 c0 00 03 li r6,3
f8: 38 e0 00 04 li r7,4
fc: 39 00 00 05 li r8,5
100: 39 20 00 06 li r9,6
104: 39 40 00 07 li r10,7
108: 48 00 00 01 bl 108 <main+0x34>
10c: 38 00 00 00 li r0,0
110: 7c 03 03 78 mr r3,r0
114: 81 61 00 00 lwz r11,0(r1)
118: 80 0b 00 04 lwz r0,4(r11)
11c: 7c 08 03 a6 mtlr r0
120: 83 eb ff fc lwz r31,-4(r11)
124: 7d 61 5b 78 mr r1,r11
128: 4e 80 00 20 blr
; ------------- check register skipping for 64bit args ----------->
; void call(int a, long long b, int c, int d, long long e, long long f)
; {
; }
;
; int main()
; {
; call(0,1,2,3,4,5);
; return 1;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <call>:
0: 94 21 ff d0 stwu r1,-48(r1)
4: 93 e1 00 2c stw r31,44(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 bf 00 10 stw r5,16(r31)
14: 90 df 00 14 stw r6,20(r31)
18: 90 ff 00 18 stw r7,24(r31)
1c: 91 1f 00 1c stw r8,28(r31)
20: 91 3f 00 20 stw r9,32(r31)
24: 91 5f 00 24 stw r10,36(r31)
28: 81 61 00 00 lwz r11,0(r1)
2c: 83 eb ff fc lwz r31,-4(r11)
30: 7d 61 5b 78 mr r1,r11
34: 4e 80 00 20 blr
00000038 <main>:
38: 94 21 ff e0 stwu r1,-32(r1) ; |
3c: 7c 08 02 a6 mflr r0 ; |
40: 93 e1 00 1c stw r31,28(r1) ; | prolog
44: 90 01 00 24 stw r0,36(r1) ; |
48: 7c 3f 0b 78 mr r31,r1 ; /
4c: 39 20 00 00 li r9,0 ; \
50: 39 40 00 05 li r10,5 ; |
54: 91 21 00 08 stw r9,8(r1) ; | arg 5 via stack
58: 91 41 00 0c stw r10,12(r1) ; |
5c: 38 60 00 00 li r3,0 ; arg 0
60: 38 a0 00 00 li r5,0 ; |
64: 38 c0 00 01 li r6,1 ; | arg 1 (note that r4 is skipped)
68: 38 e0 00 02 li r7,2 ; arg 2
6c: 39 00 00 03 li r8,3 ; arg 3
70: 39 20 00 00 li r9,0 ; |
74: 39 40 00 04 li r10,4 ; | arg 4
78: 48 00 00 01 bl 78 <main+0x40> ; call and put return address -> lr
7c: 38 00 00 01 li r0,1 ; return value (pointlessly) via gpr0 ...
80: 7c 03 03 78 mr r3,r0 ; ... to gpr3
84: 81 61 00 00 lwz r11,0(r1) ; |
88: 80 0b 00 04 lwz r0,4(r11) ; |
8c: 7c 08 03 a6 mtlr r0 ; |
90: 83 eb ff fc lwz r31,-4(r11) ; | epilog
94: 7d 61 5b 78 mr r1,r11 ; |
98: 4e 80 00 20 blr ; |
; ------------- var args with ints and floats to see spilling (which remains only int regs), b/c doubles are passed via them and floats are promoted to doubles in (...) ----------->
; #include <stdlib.h>
; #include <stdarg.h>
;
; void leaf_call(int b, int c, int d, int e, float f, float g, int h, int i, float j)
; {
; }
;
; void nonleaf_call(int a, ...)
; {
; int b, c, d, e, h, i;
; float f, g, j;
; va_list ap;
; va_start(ap, a);
; b = va_arg(ap, int);
; c = va_arg(ap, int);
; d = va_arg(ap, int);
; e = va_arg(ap, int);
; f = (float)va_arg(ap, double);
; g = (float)va_arg(ap, double);
; h = va_arg(ap, int);
; i = va_arg(ap, int);
; j = (float)va_arg(ap, double);
; /* use some local data */
; *(char*)alloca(220) = 'L';
; leaf_call(b, c, d, e, f, g, h, i, j);
; }
;
; int main()
; {
; nonleaf_call(0, 1, 2, 3, 4, 5.f, 6.f, 7, 8, 9.f);
; return 0;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <leaf_call>:
0: 94 21 ff c0 stwu r1,-64(r1)
4: 93 e1 00 3c stw r31,60(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 9f 00 0c stw r4,12(r31)
14: 90 bf 00 10 stw r5,16(r31)
18: 90 df 00 14 stw r6,20(r31)
1c: d0 3f 00 18 stfs f1,24(r31)
20: d0 5f 00 1c stfs f2,28(r31)
24: 90 ff 00 20 stw r7,32(r31)
28: 91 1f 00 24 stw r8,36(r31)
2c: d0 7f 00 28 stfs f3,40(r31)
30: 81 61 00 00 lwz r11,0(r1)
34: 83 eb ff fc lwz r31,-4(r11)
38: 7d 61 5b 78 mr r1,r11
3c: 4e 80 00 20 blr
00000040 <nonleaf_call>:
40: 94 21 ff 30 stwu r1,-208(r1)
44: 7c 08 02 a6 mflr r0
48: 93 e1 00 cc stw r31,204(r1)
4c: 90 01 00 d4 stw r0,212(r1)
50: 7c 3f 0b 78 mr r31,r1
54: 90 9f 00 3c stw r4,60(r31)
58: 90 bf 00 40 stw r5,64(r31)
5c: 90 df 00 44 stw r6,68(r31)
60: 90 ff 00 48 stw r7,72(r31)
64: 91 1f 00 4c stw r8,76(r31)
68: 91 3f 00 50 stw r9,80(r31)
6c: 91 5f 00 54 stw r10,84(r31)
70: 40 86 00 24 bne- cr1,94 <nonleaf_call+0x54>
74: d8 3f 00 58 stfd f1,88(r31)
78: d8 5f 00 60 stfd f2,96(r31)
7c: d8 7f 00 68 stfd f3,104(r31)
80: d8 9f 00 70 stfd f4,112(r31)
84: d8 bf 00 78 stfd f5,120(r31)
88: d8 df 00 80 stfd f6,128(r31)
8c: d8 ff 00 88 stfd f7,136(r31)
90: d9 1f 00 90 stfd f8,144(r31)
94: 90 7f 00 98 stw r3,152(r31)
98: 38 00 00 01 li r0,1
9c: 98 1f 00 2c stb r0,44(r31)
a0: 38 00 00 00 li r0,0
a4: 98 1f 00 2d stb r0,45(r31)
a8: 38 1f 00 d8 addi r0,r31,216 ; make r0 point to start of prev frame's param area (would make sense as no spill area to define param area start for iteration)
ac: 90 1f 00 30 stw r0,48(r31)
b0: 38 1f 00 38 addi r0,r31,56 ; make r0 point to end of prev frame's param area (would make sense as no spill area to define param area end for iteration)
b4: 90 1f 00 34 stw r0,52(r31)
b8: 88 1f 00 2c lbz r0,44(r31)
bc: 54 00 06 3e clrlwi r0,r0,24
c0: 2b 80 00 08 cmplwi cr7,r0,8
c4: 40 9c 00 30 bge- cr7,f4 <nonleaf_call+0xb4>
c8: 81 7f 00 34 lwz r11,52(r31)
cc: 88 1f 00 2c lbz r0,44(r31)
d0: 54 09 06 3e clrlwi r9,r0,24
d4: 7d 20 4b 78 mr r0,r9
d8: 54 00 10 3a rlwinm r0,r0,2,0,29
dc: 7d 6b 02 14 add r11,r11,r0
e0: 91 7f 00 c0 stw r11,192(r31)
e4: 38 09 00 01 addi r0,r9,1
e8: 54 00 06 3e clrlwi r0,r0,24
ec: 98 1f 00 2c stb r0,44(r31)
f0: 48 00 00 14 b 104 <nonleaf_call+0xc4>
f4: 81 3f 00 30 lwz r9,48(r31)
f8: 91 3f 00 c0 stw r9,192(r31)
fc: 38 09 00 04 addi r0,r9,4
100: 90 1f 00 30 stw r0,48(r31)
104: 81 3f 00 c0 lwz r9,192(r31)
108: 80 09 00 00 lwz r0,0(r9)
10c: 90 1f 00 28 stw r0,40(r31)
110: 88 1f 00 2c lbz r0,44(r31)
114: 54 00 06 3e clrlwi r0,r0,24
118: 2b 80 00 08 cmplwi cr7,r0,8
11c: 40 9c 00 30 bge- cr7,14c <nonleaf_call+0x10c>
120: 81 7f 00 34 lwz r11,52(r31)
124: 88 1f 00 2c lbz r0,44(r31)
128: 54 09 06 3e clrlwi r9,r0,24
12c: 7d 20 4b 78 mr r0,r9
130: 54 00 10 3a rlwinm r0,r0,2,0,29
134: 7d 6b 02 14 add r11,r11,r0
138: 91 7f 00 bc stw r11,188(r31)
13c: 38 09 00 01 addi r0,r9,1
140: 54 00 06 3e clrlwi r0,r0,24
144: 98 1f 00 2c stb r0,44(r31)
148: 48 00 00 14 b 15c <nonleaf_call+0x11c>
14c: 81 3f 00 30 lwz r9,48(r31)
150: 91 3f 00 bc stw r9,188(r31)
154: 38 09 00 04 addi r0,r9,4
158: 90 1f 00 30 stw r0,48(r31)
15c: 81 3f 00 bc lwz r9,188(r31)
160: 80 09 00 00 lwz r0,0(r9)
164: 90 1f 00 24 stw r0,36(r31)
168: 88 1f 00 2c lbz r0,44(r31)
16c: 54 00 06 3e clrlwi r0,r0,24
170: 2b 80 00 08 cmplwi cr7,r0,8
174: 40 9c 00 30 bge- cr7,1a4 <nonleaf_call+0x164>
178: 81 7f 00 34 lwz r11,52(r31)
17c: 88 1f 00 2c lbz r0,44(r31)
180: 54 09 06 3e clrlwi r9,r0,24
184: 7d 20 4b 78 mr r0,r9
188: 54 00 10 3a rlwinm r0,r0,2,0,29
18c: 7d 6b 02 14 add r11,r11,r0
190: 91 7f 00 b8 stw r11,184(r31)
194: 38 09 00 01 addi r0,r9,1
198: 54 00 06 3e clrlwi r0,r0,24
19c: 98 1f 00 2c stb r0,44(r31)
1a0: 48 00 00 14 b 1b4 <nonleaf_call+0x174>
1a4: 81 3f 00 30 lwz r9,48(r31)
1a8: 91 3f 00 b8 stw r9,184(r31)
1ac: 38 09 00 04 addi r0,r9,4
1b0: 90 1f 00 30 stw r0,48(r31)
1b4: 81 3f 00 b8 lwz r9,184(r31)
1b8: 80 09 00 00 lwz r0,0(r9)
1bc: 90 1f 00 20 stw r0,32(r31)
1c0: 88 1f 00 2c lbz r0,44(r31)
1c4: 54 00 06 3e clrlwi r0,r0,24
1c8: 2b 80 00 08 cmplwi cr7,r0,8
1cc: 40 9c 00 30 bge- cr7,1fc <nonleaf_call+0x1bc>
1d0: 81 7f 00 34 lwz r11,52(r31)
1d4: 88 1f 00 2c lbz r0,44(r31)
1d8: 54 09 06 3e clrlwi r9,r0,24
1dc: 7d 20 4b 78 mr r0,r9
1e0: 54 00 10 3a rlwinm r0,r0,2,0,29
1e4: 7d 6b 02 14 add r11,r11,r0
1e8: 91 7f 00 b4 stw r11,180(r31)
1ec: 38 09 00 01 addi r0,r9,1
1f0: 54 00 06 3e clrlwi r0,r0,24
1f4: 98 1f 00 2c stb r0,44(r31)
1f8: 48 00 00 14 b 20c <nonleaf_call+0x1cc>
1fc: 81 3f 00 30 lwz r9,48(r31)
200: 91 3f 00 b4 stw r9,180(r31)
204: 38 09 00 04 addi r0,r9,4
208: 90 1f 00 30 stw r0,48(r31)
20c: 81 3f 00 b4 lwz r9,180(r31)
210: 80 09 00 00 lwz r0,0(r9)
214: 90 1f 00 1c stw r0,28(r31)
218: 88 1f 00 2d lbz r0,45(r31)
21c: 54 00 06 3e clrlwi r0,r0,24
220: 2b 80 00 08 cmplwi cr7,r0,8
224: 40 9c 00 34 bge- cr7,258 <nonleaf_call+0x218>
228: 81 3f 00 34 lwz r9,52(r31)
22c: 39 69 00 20 addi r11,r9,32
230: 88 1f 00 2d lbz r0,45(r31)
234: 54 09 06 3e clrlwi r9,r0,24
238: 7d 20 4b 78 mr r0,r9
23c: 54 00 18 38 rlwinm r0,r0,3,0,28
240: 7d 6b 02 14 add r11,r11,r0
244: 91 7f 00 b0 stw r11,176(r31)
248: 38 09 00 01 addi r0,r9,1
24c: 54 00 06 3e clrlwi r0,r0,24
250: 98 1f 00 2d stb r0,45(r31)
254: 48 00 00 1c b 270 <nonleaf_call+0x230>
258: 81 3f 00 30 lwz r9,48(r31)
25c: 38 09 00 07 addi r0,r9,7
260: 54 09 00 38 rlwinm r9,r0,0,0,28
264: 91 3f 00 b0 stw r9,176(r31)
268: 38 09 00 08 addi r0,r9,8
26c: 90 1f 00 30 stw r0,48(r31)
270: 81 3f 00 b0 lwz r9,176(r31)
274: c8 09 00 00 lfd f0,0(r9)
278: fc 00 00 18 frsp f0,f0
27c: d0 1f 00 10 stfs f0,16(r31)
280: 88 1f 00 2d lbz r0,45(r31)
284: 54 00 06 3e clrlwi r0,r0,24
288: 2b 80 00 08 cmplwi cr7,r0,8
28c: 40 9c 00 34 bge- cr7,2c0 <nonleaf_call+0x280>
290: 81 3f 00 34 lwz r9,52(r31)
294: 39 69 00 20 addi r11,r9,32
298: 88 1f 00 2d lbz r0,45(r31)
29c: 54 09 06 3e clrlwi r9,r0,24
2a0: 7d 20 4b 78 mr r0,r9
2a4: 54 00 18 38 rlwinm r0,r0,3,0,28
2a8: 7d 6b 02 14 add r11,r11,r0
2ac: 91 7f 00 ac stw r11,172(r31)
2b0: 38 09 00 01 addi r0,r9,1
2b4: 54 00 06 3e clrlwi r0,r0,24
2b8: 98 1f 00 2d stb r0,45(r31)
2bc: 48 00 00 1c b 2d8 <nonleaf_call+0x298>
2c0: 81 3f 00 30 lwz r9,48(r31)
2c4: 38 09 00 07 addi r0,r9,7
2c8: 54 09 00 38 rlwinm r9,r0,0,0,28
2cc: 91 3f 00 ac stw r9,172(r31)
2d0: 38 09 00 08 addi r0,r9,8
2d4: 90 1f 00 30 stw r0,48(r31)
2d8: 81 3f 00 ac lwz r9,172(r31)
2dc: c8 09 00 00 lfd f0,0(r9)
2e0: fc 00 00 18 frsp f0,f0
2e4: d0 1f 00 0c stfs f0,12(r31)
2e8: 88 1f 00 2c lbz r0,44(r31)
2ec: 54 00 06 3e clrlwi r0,r0,24
2f0: 2b 80 00 08 cmplwi cr7,r0,8
2f4: 40 9c 00 30 bge- cr7,324 <nonleaf_call+0x2e4>
2f8: 81 7f 00 34 lwz r11,52(r31)
2fc: 88 1f 00 2c lbz r0,44(r31)
300: 54 09 06 3e clrlwi r9,r0,24
304: 7d 20 4b 78 mr r0,r9
308: 54 00 10 3a rlwinm r0,r0,2,0,29
30c: 7d 6b 02 14 add r11,r11,r0
310: 91 7f 00 a8 stw r11,168(r31)
314: 38 09 00 01 addi r0,r9,1
318: 54 00 06 3e clrlwi r0,r0,24
31c: 98 1f 00 2c stb r0,44(r31)
320: 48 00 00 14 b 334 <nonleaf_call+0x2f4>
324: 81 3f 00 30 lwz r9,48(r31)
328: 91 3f 00 a8 stw r9,168(r31)
32c: 38 09 00 04 addi r0,r9,4
330: 90 1f 00 30 stw r0,48(r31)
334: 81 3f 00 a8 lwz r9,168(r31)
338: 80 09 00 00 lwz r0,0(r9)
33c: 90 1f 00 18 stw r0,24(r31)
340: 88 1f 00 2c lbz r0,44(r31)
344: 54 00 06 3e clrlwi r0,r0,24
348: 2b 80 00 08 cmplwi cr7,r0,8
34c: 40 9c 00 30 bge- cr7,37c <nonleaf_call+0x33c>
350: 81 7f 00 34 lwz r11,52(r31)
354: 88 1f 00 2c lbz r0,44(r31)
358: 54 09 06 3e clrlwi r9,r0,24
35c: 7d 20 4b 78 mr r0,r9
360: 54 00 10 3a rlwinm r0,r0,2,0,29
364: 7d 6b 02 14 add r11,r11,r0
368: 91 7f 00 a4 stw r11,164(r31)
36c: 38 09 00 01 addi r0,r9,1
370: 54 00 06 3e clrlwi r0,r0,24
374: 98 1f 00 2c stb r0,44(r31)
378: 48 00 00 14 b 38c <nonleaf_call+0x34c>
37c: 81 3f 00 30 lwz r9,48(r31)
380: 91 3f 00 a4 stw r9,164(r31)
384: 38 09 00 04 addi r0,r9,4
388: 90 1f 00 30 stw r0,48(r31)
38c: 81 3f 00 a4 lwz r9,164(r31)
390: 80 09 00 00 lwz r0,0(r9)
394: 90 1f 00 14 stw r0,20(r31)
398: 88 1f 00 2d lbz r0,45(r31)
39c: 54 00 06 3e clrlwi r0,r0,24
3a0: 2b 80 00 08 cmplwi cr7,r0,8
3a4: 40 9c 00 34 bge- cr7,3d8 <nonleaf_call+0x398>
3a8: 81 3f 00 34 lwz r9,52(r31)
3ac: 39 69 00 20 addi r11,r9,32
3b0: 88 1f 00 2d lbz r0,45(r31)
3b4: 54 09 06 3e clrlwi r9,r0,24
3b8: 7d 20 4b 78 mr r0,r9
3bc: 54 00 18 38 rlwinm r0,r0,3,0,28
3c0: 7d 6b 02 14 add r11,r11,r0
3c4: 91 7f 00 a0 stw r11,160(r31)
3c8: 38 09 00 01 addi r0,r9,1
3cc: 54 00 06 3e clrlwi r0,r0,24
3d0: 98 1f 00 2d stb r0,45(r31)
3d4: 48 00 00 1c b 3f0 <nonleaf_call+0x3b0>
3d8: 81 3f 00 30 lwz r9,48(r31)
3dc: 38 09 00 07 addi r0,r9,7
3e0: 54 09 00 38 rlwinm r9,r0,0,0,28
3e4: 91 3f 00 a0 stw r9,160(r31)
3e8: 38 09 00 08 addi r0,r9,8
3ec: 90 1f 00 30 stw r0,48(r31)
3f0: 81 3f 00 a0 lwz r9,160(r31)
3f4: c8 09 00 00 lfd f0,0(r9)
3f8: fc 00 00 18 frsp f0,f0
3fc: d0 1f 00 08 stfs f0,8(r31)
400: 80 01 00 00 lwz r0,0(r1)
404: 94 01 ff 10 stwu r0,-240(r1)
408: 39 21 00 08 addi r9,r1,8
40c: 91 3f 00 9c stw r9,156(r31)
410: 81 3f 00 9c lwz r9,156(r31)
414: 38 09 00 0f addi r0,r9,15
418: 54 00 e1 3e rlwinm r0,r0,28,4,31
41c: 54 00 20 36 rlwinm r0,r0,4,0,27
420: 90 1f 00 9c stw r0,156(r31)
424: 81 3f 00 9c lwz r9,156(r31)
428: 38 00 00 4c li r0,76
42c: 98 09 00 00 stb r0,0(r9)
430: 80 7f 00 28 lwz r3,40(r31)
434: 80 9f 00 24 lwz r4,36(r31)
438: 80 bf 00 20 lwz r5,32(r31)
43c: 80 df 00 1c lwz r6,28(r31)
440: c0 3f 00 10 lfs f1,16(r31)
444: c0 5f 00 0c lfs f2,12(r31)
448: 80 ff 00 18 lwz r7,24(r31)
44c: 81 1f 00 14 lwz r8,20(r31)
450: c0 7f 00 08 lfs f3,8(r31)
454: 48 00 00 01 bl 454 <nonleaf_call+0x414>
458: 81 61 00 00 lwz r11,0(r1)
45c: 80 0b 00 04 lwz r0,4(r11)
460: 7c 08 03 a6 mtlr r0
464: 83 eb ff fc lwz r31,-4(r11)
468: 7d 61 5b 78 mr r1,r11
46c: 4e 80 00 20 blr
00000470 <main>:
470: 94 21 ff f0 stwu r1,-16(r1) ; |
474: 7c 08 02 a6 mflr r0 ; |
478: 93 e1 00 0c stw r31,12(r1) ; | prolog
47c: 90 01 00 14 stw r0,20(r1) ; |
480: 7c 3f 0b 78 mr r31,r1 ; /
484: 3d 20 00 00 lis r9,0 ; \ prep arg 5 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
488: c8 09 00 00 lfd f0,0(r9) ; /
48c: 3d 20 00 00 lis r9,0 ; \ prep arg 6 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
490: c9 a9 00 08 lfd f13,8(r9) ; /
494: 3d 20 00 00 lis r9,0 ; \ prep arg 9 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
498: c9 89 00 10 lfd f12,16(r9) ; /
49c: 38 60 00 00 li r3,0 ; arg 0
4a0: 38 80 00 01 li r4,1 ; arg 1
4a4: 38 a0 00 02 li r5,2 ; arg 2
4a8: 38 c0 00 03 li r6,3 ; arg 3
4ac: 38 e0 00 04 li r7,4 ; arg 4
4b0: fc 20 00 90 fmr f1,f0 ; arg 5
4b4: fc 40 68 90 fmr f2,f13 ; arg 6
4b8: 39 00 00 07 li r8,7 ; arg 7
4bc: 39 20 00 08 li r9,8 ; arg 8
4c0: fc 60 60 90 fmr f3,f12 ; arg 9
4c4: 4c c6 32 42 crset 4*cr1+eq ; set CR bit for ellipsis call
4c8: 48 00 00 01 bl 4c8 <main+0x58> ; call and put return address -> lr
4cc: 38 00 00 00 li r0,0 ; return value (pointlessly) via gpr0 ...
4d0: 7c 03 03 78 mr r3,r0 ; ... to gpr3
4d4: 81 61 00 00 lwz r11,0(r1) ; |
4d8: 80 0b 00 04 lwz r0,4(r11) ; |
4dc: 7c 08 03 a6 mtlr r0 ; |
4e0: 83 eb ff fc lwz r31,-4(r11) ; | epilog
4e4: 7d 61 5b 78 mr r1,r11 ; |
4e8: 4e 80 00 20 blr ; |
; ---------- structs by value ---------->
;
; struct A { int i, j; long long l; };
;
; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
; {
; }
;
; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h)
; {
; /* use some local data */
; char l[100] = { 'L' };
; leaf_call(b, c, d, e, f, g, h);
; }
;
; int main()
; {
; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
; return 0;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <leaf_call>:
0: 94 21 ff d0 stwu r1,-48(r1)
4: 93 e1 00 2c stw r31,44(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 9f 00 0c stw r4,12(r31)
14: 90 bf 00 10 stw r5,16(r31)
18: 90 df 00 14 stw r6,20(r31)
1c: 91 1f 00 18 stw r8,24(r31)
20: 91 3f 00 1c stw r9,28(r31)
24: 81 61 00 00 lwz r11,0(r1)
28: 83 eb ff fc lwz r31,-4(r11)
2c: 7d 61 5b 78 mr r1,r11
30: 4e 80 00 20 blr
00000034 <nonleaf_call>:
34: 94 21 ff 40 stwu r1,-192(r1)
38: 7c 08 02 a6 mflr r0
3c: 93 a1 00 b4 stw r29,180(r1)
40: 93 e1 00 bc stw r31,188(r1)
44: 90 01 00 c4 stw r0,196(r1)
48: 7c 3f 0b 78 mr r31,r1
4c: 90 7f 00 78 stw r3,120(r31)
50: 90 9f 00 7c stw r4,124(r31)
54: 90 bf 00 80 stw r5,128(r31)
58: 90 df 00 84 stw r6,132(r31)
5c: 90 ff 00 88 stw r7,136(r31)
60: 7d 1d 43 78 mr r29,r8
64: 91 3f 00 8c stw r9,140(r31)
68: 91 5f 00 90 stw r10,144(r31)
6c: 38 1f 00 08 addi r0,r31,8
70: 39 20 00 64 li r9,100
74: 7c 03 03 78 mr r3,r0
78: 38 80 00 00 li r4,0
7c: 7d 25 4b 78 mr r5,r9
80: 48 00 00 01 bl 80 <nonleaf_call+0x4c>
84: 38 00 00 4c li r0,76
88: 98 1f 00 08 stb r0,8(r31)
8c: 80 1d 00 00 lwz r0,0(r29)
90: 81 3d 00 04 lwz r9,4(r29)
94: 81 7d 00 08 lwz r11,8(r29)
98: 81 5d 00 0c lwz r10,12(r29)
9c: 90 1f 00 a0 stw r0,160(r31)
a0: 91 3f 00 a4 stw r9,164(r31)
a4: 91 7f 00 a8 stw r11,168(r31)
a8: 91 5f 00 ac stw r10,172(r31)
ac: 38 1f 00 a0 addi r0,r31,160
b0: 80 7f 00 7c lwz r3,124(r31)
b4: 80 9f 00 80 lwz r4,128(r31)
b8: 80 bf 00 84 lwz r5,132(r31)
bc: 80 df 00 88 lwz r6,136(r31)
c0: 7c 07 03 78 mr r7,r0
c4: 81 1f 00 8c lwz r8,140(r31)
c8: 81 3f 00 90 lwz r9,144(r31)
cc: 48 00 00 01 bl cc <nonleaf_call+0x98>
d0: 81 61 00 00 lwz r11,0(r1)
d4: 80 0b 00 04 lwz r0,4(r11)
d8: 7c 08 03 a6 mtlr r0
dc: 83 ab ff f4 lwz r29,-12(r11)
e0: 83 eb ff fc lwz r31,-4(r11)
e4: 7d 61 5b 78 mr r1,r11
e8: 4e 80 00 20 blr
000000ec <main>:
ec: 94 21 ff c0 stwu r1,-64(r1) ;
f0: 7c 08 02 a6 mflr r0 ;
f4: 93 e1 00 3c stw r31,60(r1) ;
f8: 90 01 00 44 stw r0,68(r1) ;
fc: 7c 3f 0b 78 mr r31,r1 ;
100: 3d 20 00 00 lis r9,0 ;
104: 39 29 00 00 addi r9,r9,0 ;
108: 80 09 00 00 lwz r0,0(r9) ;
10c: 81 69 00 04 lwz r11,4(r9) ;
110: 81 49 00 08 lwz r10,8(r9) ;
114: 81 29 00 0c lwz r9,12(r9) ;
118: 90 1f 00 08 stw r0,8(r31) ;
11c: 91 7f 00 0c stw r11,12(r31) ;
120: 91 5f 00 10 stw r10,16(r31) ;
124: 91 3f 00 14 stw r9,20(r31) ;
128: 80 1f 00 08 lwz r0,8(r31) ;
12c: 81 3f 00 0c lwz r9,12(r31) ;
130: 81 7f 00 10 lwz r11,16(r31) ;
134: 81 5f 00 14 lwz r10,20(r31) ;
138: 90 1f 00 20 stw r0,32(r31) ;
13c: 91 3f 00 24 stw r9,36(r31) ;
140: 91 7f 00 28 stw r11,40(r31) ;
144: 91 5f 00 2c stw r10,44(r31) ;
148: 38 1f 00 20 addi r0,r31,32 ;
14c: 38 60 00 00 li r3,0 ; arg 0
150: 38 80 00 01 li r4,1 ; arg 1
154: 38 a0 00 02 li r5,2 ; arg 2
158: 38 c0 00 03 li r6,3 ; arg 3
15c: 38 e0 00 04 li r7,4 ; arg 4
160: 7c 08 03 78 mr r8,r0 ; arg 5 (struct, passed as pointer to local copy)
164: 39 20 00 08 li r9,8 ; arg 6
168: 39 40 00 09 li r10,9 ; arg 7
16c: 48 00 00 01 bl 16c <main+0x80> ;
170: 38 00 00 00 li r0,0 ;
174: 7c 03 03 78 mr r3,r0 ;
178: 81 61 00 00 lwz r11,0(r1) ;
17c: 80 0b 00 04 lwz r0,4(r11) ;
180: 7c 08 03 a6 mtlr r0 ;
184: 83 eb ff fc lwz r31,-4(r11) ;
188: 7d 61 5b 78 mr r1,r11 ;
18c: 4e 80 00 20 blr ;
; ---------- structs by value, complex example (multiple structs) ---------->
;
; struct A { int i, j; float f; };
; struct B { double d; long long l; };
;
; void leaf_call(int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
; {
; }
;
; void nonleaf_call(int a, int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
; {
; /* use some local data */
; char l[100] = { 'L' };
; leaf_call(b, c, d, e, f, g, h, i, j);
; }
;
; int main()
; {
; nonleaf_call(0, 1, (struct A){2, 3, 4.f}, (struct B){5., 6ll}, 7, 8, (struct A){9, 10, 11.f}, (struct B){12., 13ll}, 14, 15);
; return 0;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <leaf_call>:
0: 94 21 ff e0 stwu r1,-32(r1)
4: 93 e1 00 1c stw r31,28(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 90 df 00 0c stw r6,12(r31)
14: 90 ff 00 10 stw r7,16(r31)
18: 91 5f 00 14 stw r10,20(r31)
1c: 81 61 00 00 lwz r11,0(r1)
20: 83 eb ff fc lwz r31,-4(r11)
24: 7d 61 5b 78 mr r1,r11
28: 4e 80 00 20 blr
0000002c <nonleaf_call>:
2c: 94 21 ff 00 stwu r1,-256(r1)
30: 7c 08 02 a6 mflr r0
34: 93 41 00 e8 stw r26,232(r1)
38: 93 61 00 ec stw r27,236(r1)
3c: 93 81 00 f0 stw r28,240(r1)
40: 93 a1 00 f4 stw r29,244(r1)
44: 93 e1 00 fc stw r31,252(r1)
48: 90 01 01 04 stw r0,260(r1)
4c: 7c 3f 0b 78 mr r31,r1
50: 90 7f 00 80 stw r3,128(r31)
54: 90 9f 00 84 stw r4,132(r31)
58: 7c bd 2b 78 mr r29,r5
5c: 7c dc 33 78 mr r28,r6
60: 90 ff 00 88 stw r7,136(r31)
64: 91 1f 00 8c stw r8,140(r31)
68: 7d 3b 4b 78 mr r27,r9
6c: 7d 5a 53 78 mr r26,r10
70: 38 1f 00 10 addi r0,r31,16
74: 39 20 00 64 li r9,100
78: 7c 03 03 78 mr r3,r0
7c: 38 80 00 00 li r4,0
80: 7d 25 4b 78 mr r5,r9
84: 48 00 00 01 bl 84 <nonleaf_call+0x58>
88: 38 00 00 4c li r0,76
8c: 98 1f 00 10 stb r0,16(r31)
90: 80 1d 00 00 lwz r0,0(r29)
94: 81 3d 00 04 lwz r9,4(r29)
98: 81 7d 00 08 lwz r11,8(r29)
9c: 90 1f 00 98 stw r0,152(r31)
a0: 91 3f 00 9c stw r9,156(r31)
a4: 91 7f 00 a0 stw r11,160(r31)
a8: 80 1c 00 00 lwz r0,0(r28)
ac: 81 3c 00 04 lwz r9,4(r28)
b0: 81 7c 00 08 lwz r11,8(r28)
b4: 81 5c 00 0c lwz r10,12(r28)
b8: 90 1f 00 a8 stw r0,168(r31)
bc: 91 3f 00 ac stw r9,172(r31)
c0: 91 7f 00 b0 stw r11,176(r31)
c4: 91 5f 00 b4 stw r10,180(r31)
c8: 80 1b 00 00 lwz r0,0(r27)
cc: 81 3b 00 04 lwz r9,4(r27)
d0: 81 7b 00 08 lwz r11,8(r27)
d4: 90 1f 00 b8 stw r0,184(r31)
d8: 91 3f 00 bc stw r9,188(r31)
dc: 91 7f 00 c0 stw r11,192(r31)
e0: 80 1a 00 00 lwz r0,0(r26)
e4: 81 3a 00 04 lwz r9,4(r26)
e8: 81 7a 00 08 lwz r11,8(r26)
ec: 81 5a 00 0c lwz r10,12(r26)
f0: 90 1f 00 c8 stw r0,200(r31)
f4: 91 3f 00 cc stw r9,204(r31)
f8: 91 7f 00 d0 stw r11,208(r31)
fc: 91 5f 00 d4 stw r10,212(r31)
100: 39 3f 00 98 addi r9,r31,152
104: 39 7f 00 a8 addi r11,r31,168
108: 39 5f 00 b8 addi r10,r31,184
10c: 3b bf 00 c8 addi r29,r31,200
110: 80 1f 01 0c lwz r0,268(r31)
114: 90 01 00 08 stw r0,8(r1)
118: 80 7f 00 84 lwz r3,132(r31)
11c: 7d 24 4b 78 mr r4,r9
120: 7d 65 5b 78 mr r5,r11
124: 80 df 00 88 lwz r6,136(r31)
128: 80 ff 00 8c lwz r7,140(r31)
12c: 7d 48 53 78 mr r8,r10
130: 7f a9 eb 78 mr r9,r29
134: 81 5f 01 08 lwz r10,264(r31)
138: 48 00 00 01 bl 138 <nonleaf_call+0x10c>
13c: 81 61 00 00 lwz r11,0(r1)
140: 80 0b 00 04 lwz r0,4(r11)
144: 7c 08 03 a6 mtlr r0
148: 83 4b ff e8 lwz r26,-24(r11)
14c: 83 6b ff ec lwz r27,-20(r11)
150: 83 8b ff f0 lwz r28,-16(r11)
154: 83 ab ff f4 lwz r29,-12(r11)
158: 83 eb ff fc lwz r31,-4(r11)
15c: 7d 61 5b 78 mr r1,r11
160: 4e 80 00 20 blr
00000164 <main>:
164: 94 21 ff 50 stwu r1,-176(r1)
168: 7c 08 02 a6 mflr r0
16c: 93 a1 00 a4 stw r29,164(r1)
170: 93 e1 00 ac stw r31,172(r1)
174: 90 01 00 b4 stw r0,180(r1)
178: 7c 3f 0b 78 mr r31,r1
17c: 3d 20 00 00 lis r9,0
180: 39 29 00 30 addi r9,r9,48
184: 80 09 00 00 lwz r0,0(r9)
188: 81 69 00 04 lwz r11,4(r9)
18c: 81 29 00 08 lwz r9,8(r9)
190: 90 1f 00 40 stw r0,64(r31)
194: 91 7f 00 44 stw r11,68(r31)
198: 91 3f 00 48 stw r9,72(r31)
19c: 3d 20 00 00 lis r9,0
1a0: 39 29 00 20 addi r9,r9,32
1a4: 80 09 00 00 lwz r0,0(r9)
1a8: 81 69 00 04 lwz r11,4(r9)
1ac: 81 49 00 08 lwz r10,8(r9)
1b0: 81 29 00 0c lwz r9,12(r9)
1b4: 90 1f 00 30 stw r0,48(r31)
1b8: 91 7f 00 34 stw r11,52(r31)
1bc: 91 5f 00 38 stw r10,56(r31)
1c0: 91 3f 00 3c stw r9,60(r31)
1c4: 3d 20 00 00 lis r9,0
1c8: 39 29 00 10 addi r9,r9,16
1cc: 80 09 00 00 lwz r0,0(r9)
1d0: 81 69 00 04 lwz r11,4(r9)
1d4: 81 29 00 08 lwz r9,8(r9)
1d8: 90 1f 00 20 stw r0,32(r31)
1dc: 91 7f 00 24 stw r11,36(r31)
1e0: 91 3f 00 28 stw r9,40(r31)
1e4: 3d 20 00 00 lis r9,0
1e8: 39 29 00 00 addi r9,r9,0
1ec: 80 09 00 00 lwz r0,0(r9)
1f0: 81 69 00 04 lwz r11,4(r9)
1f4: 81 49 00 08 lwz r10,8(r9)
1f8: 81 29 00 0c lwz r9,12(r9)
1fc: 90 1f 00 10 stw r0,16(r31)
200: 91 7f 00 14 stw r11,20(r31)
204: 91 5f 00 18 stw r10,24(r31)
208: 91 3f 00 1c stw r9,28(r31)
20c: 80 1f 00 40 lwz r0,64(r31)
210: 81 3f 00 44 lwz r9,68(r31)
214: 81 7f 00 48 lwz r11,72(r31)
218: 90 1f 00 58 stw r0,88(r31)
21c: 91 3f 00 5c stw r9,92(r31)
220: 91 7f 00 60 stw r11,96(r31)
224: 80 1f 00 30 lwz r0,48(r31)
228: 81 3f 00 34 lwz r9,52(r31)
22c: 81 7f 00 38 lwz r11,56(r31)
230: 81 5f 00 3c lwz r10,60(r31)
234: 90 1f 00 68 stw r0,104(r31)
238: 91 3f 00 6c stw r9,108(r31)
23c: 91 7f 00 70 stw r11,112(r31)
240: 91 5f 00 74 stw r10,116(r31)
244: 80 1f 00 20 lwz r0,32(r31)
248: 81 3f 00 24 lwz r9,36(r31)
24c: 81 7f 00 28 lwz r11,40(r31)
250: 90 1f 00 78 stw r0,120(r31)
254: 91 3f 00 7c stw r9,124(r31)
258: 91 7f 00 80 stw r11,128(r31)
25c: 80 1f 00 10 lwz r0,16(r31)
260: 81 3f 00 14 lwz r9,20(r31)
264: 81 7f 00 18 lwz r11,24(r31)
268: 81 5f 00 1c lwz r10,28(r31)
26c: 90 1f 00 88 stw r0,136(r31)
270: 91 3f 00 8c stw r9,140(r31)
274: 91 7f 00 90 stw r11,144(r31)
278: 91 5f 00 94 stw r10,148(r31)
27c: 39 3f 00 58 addi r9,r31,88
280: 39 7f 00 68 addi r11,r31,104
284: 39 5f 00 78 addi r10,r31,120
288: 3b bf 00 88 addi r29,r31,136
28c: 38 00 00 0e li r0,14
290: 90 01 00 08 stw r0,8(r1)
294: 38 00 00 0f li r0,15
298: 90 01 00 0c stw r0,12(r1)
29c: 38 60 00 00 li r3,0
2a0: 38 80 00 01 li r4,1
2a4: 7d 25 4b 78 mr r5,r9
2a8: 7d 66 5b 78 mr r6,r11
2ac: 38 e0 00 07 li r7,7
2b0: 39 00 00 08 li r8,8
2b4: 7d 49 53 78 mr r9,r10
2b8: 7f aa eb 78 mr r10,r29
2bc: 48 00 00 01 bl 2bc <main+0x158>
2c0: 38 00 00 00 li r0,0
2c4: 7c 03 03 78 mr r3,r0
2c8: 81 61 00 00 lwz r11,0(r1)
2cc: 80 0b 00 04 lwz r0,4(r11)
2d0: 7c 08 03 a6 mtlr r0
2d4: 83 ab ff f4 lwz r29,-12(r11)
2d8: 83 eb ff fc lwz r31,-4(r11)
2dc: 7d 61 5b 78 mr r1,r11
2e0: 4e 80 00 20 blr
; ---------- returning qwords ---------->
;
; long long f()
; {
; return 7171LL;
; }
;
; int main()
; {
; return (int)f();
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
00000000 <f>:
0: 94 21 ff f0 stwu r1,-16(r1)
4: 93 e1 00 0c stw r31,12(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 39 20 00 00 li r9,0
10: 39 40 1c 03 li r10,7171
14: 7d 23 4b 78 mr r3,r9
18: 7d 44 53 78 mr r4,r10
1c: 81 61 00 00 lwz r11,0(r1)
20: 83 eb ff fc lwz r31,-4(r11)
24: 7d 61 5b 78 mr r1,r11
28: 4e 80 00 20 blr
0000002c <main>:
2c: 94 21 ff f0 stwu r1,-16(r1)
30: 7c 08 02 a6 mflr r0
34: 93 e1 00 0c stw r31,12(r1)
38: 90 01 00 14 stw r0,20(r1)
3c: 7c 3f 0b 78 mr r31,r1
40: 48 00 00 01 bl 40 <main+0x14>
44: 7c 8a 23 78 mr r10,r4
48: 7c 69 1b 78 mr r9,r3
4c: 7d 40 53 78 mr r0,r10
50: 7c 03 03 78 mr r3,r0
54: 81 61 00 00 lwz r11,0(r1)
58: 80 0b 00 04 lwz r0,4(r11)
5c: 7c 08 03 a6 mtlr r0
60: 83 eb ff fc lwz r31,-4(r11)
64: 7d 61 5b 78 mr r1,r11
68: 4e 80 00 20 blr
; ---------- returning structs by value ---------->
;
; struct Small { char x; };
; struct Big { long long i; long j; };
;
; struct Small f0()
; {
; struct Small s = { 132 };
; return s;
; }
;
; struct Big f1()
; {
; struct Big b = { 7171LL, 232 };
; return b;
; }
;
; int main()
; {
; struct Small s = f0();
; struct Big b = f1();
; return b.j + s.x;
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2 (demonstrates LSB specifics about aggr return values)
00000000 <f0>:
0: 94 21 ff e0 stwu r1,-32(r1) ;
4: 93 e1 00 1c stw r31,28(r1) ;
8: 7c 3f 0b 78 mr r31,r1 ;
c: 7c 69 1b 78 mr r9,r3 ;
10: 38 00 ff 84 li r0,-124 ;
14: 98 1f 00 08 stb r0,8(r31) ;
18: 88 1f 00 08 lbz r0,8(r31) ;
1c: 98 09 00 00 stb r0,0(r9) ;
20: 7d 23 4b 78 mr r3,r9 ;
24: 81 61 00 00 lwz r11,0(r1) ;
28: 83 eb ff fc lwz r31,-4(r11) ;
2c: 7d 61 5b 78 mr r1,r11 ;
30: 4e 80 00 20 blr ;
00000034 <f1>:
34: 94 21 ff e0 stwu r1,-32(r1) ;
38: 93 e1 00 1c stw r31,28(r1) ;
3c: 7c 3f 0b 78 mr r31,r1 ;
40: 7c 6b 1b 78 mr r11,r3 ;
44: 3d 20 00 00 lis r9,0 ;
48: 39 29 00 00 addi r9,r9,0 ;
4c: 80 09 00 00 lwz r0,0(r9) ;
50: 81 49 00 04 lwz r10,4(r9) ;
54: 81 09 00 08 lwz r8,8(r9) ;
58: 81 29 00 0c lwz r9,12(r9) ;
5c: 90 1f 00 08 stw r0,8(r31) ;
60: 91 5f 00 0c stw r10,12(r31) ;
64: 91 1f 00 10 stw r8,16(r31) ;
68: 91 3f 00 14 stw r9,20(r31) ;
6c: 80 1f 00 08 lwz r0,8(r31) ;
70: 81 3f 00 0c lwz r9,12(r31) ;
74: 81 5f 00 10 lwz r10,16(r31) ;
78: 81 1f 00 14 lwz r8,20(r31) ;
7c: 90 0b 00 00 stw r0,0(r11) ;
80: 91 2b 00 04 stw r9,4(r11) ;
84: 91 4b 00 08 stw r10,8(r11) ;
88: 91 0b 00 0c stw r8,12(r11) ;
8c: 7d 63 5b 78 mr r3,r11 ;
90: 81 61 00 00 lwz r11,0(r1) ;
94: 83 eb ff fc lwz r31,-4(r11) ;
98: 7d 61 5b 78 mr r1,r11 ;
9c: 4e 80 00 20 blr ;
000000a0 <main>:
a0: 94 21 ff c0 stwu r1,-64(r1) ; | open frame and store sp at top of stack
a4: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
a8: 93 e1 00 3c stw r31,60(r1) ; | prolog store gpr31
ac: 90 01 00 44 stw r0,68(r1) ; | store lr
b0: 7c 3f 0b 78 mr r31,r1 ; / sp -> gpr31, latter used for some fixed addressing below
b4: 38 1f 00 28 addi r0,r31,40 ; \
b8: 7c 03 03 78 mr r3,r0 ; | space to retval -> gpr3 (hidden arg)
bc: 4c c6 31 82 crclr 4*cr1+eq ; :
c0: 48 00 00 01 bl c0 <main+0x20> ; call f0()
c4: 88 1f 00 28 lbz r0,40(r31) ;
c8: 98 1f 00 08 stb r0,8(r31) ;
cc: 38 1f 00 10 addi r0,r31,16 ; |
d0: 7c 03 03 78 mr r3,r0 ; | space to retval -> gpr3 (hidden arg)
d4: 4c c6 31 82 crclr 4*cr1+eq ; :
d8: 48 00 00 01 bl d8 <main+0x38> ; call f1()
dc: 81 3f 00 18 lwz r9,24(r31) ;
e0: 88 1f 00 08 lbz r0,8(r31) ;
e4: 54 00 06 3e clrlwi r0,r0,24 ;
e8: 7c 09 02 14 add r0,r9,r0 ;
ec: 7c 03 03 78 mr r3,r0 ;
f0: 81 61 00 00 lwz r11,0(r1) ; |
f4: 80 0b 00 04 lwz r0,4(r11) ; |
f8: 7c 08 03 a6 mtlr r0 ; |
fc: 83 eb ff fc lwz r31,-4(r11) ; | epilog
100: 7d 61 5b 78 mr r1,r11 ; |
104: 4e 80 00 20 blr ; |
; output from netbsd-4.0.1-macppc w/ gcc 4.1.2 (demonstrates default (non-LSB) aggr return values)
018007a0 <f0>:
18007a0: 94 21 ff d0 stwu r1,-48(r1)
18007a4: 93 e1 00 2c stw r31,44(r1)
18007a8: 7c 3f 0b 78 mr r31,r1
18007ac: 38 00 ff 84 li r0,-124
18007b0: 98 1f 00 08 stb r0,8(r31)
18007b4: 88 1f 00 08 lbz r0,8(r31)
18007b8: 7c 03 03 78 mr r3,r0
18007bc: 81 61 00 00 lwz r11,0(r1)
18007c0: 83 eb ff fc lwz r31,-4(r11)
18007c4: 7d 61 5b 78 mr r1,r11
18007c8: 4e 80 00 20 blr
018007cc <f1>:
18007cc: 94 21 ff d0 stwu r1,-48(r1)
18007d0: 93 e1 00 2c stw r31,44(r1)
18007d4: 7c 3f 0b 78 mr r31,r1
18007d8: 7c 6b 1b 78 mr r11,r3
18007dc: 3d 20 01 80 lis r9,384
18007e0: 39 29 09 80 addi r9,r9,2432
18007e4: 80 09 00 00 lwz r0,0(r9)
18007e8: 81 49 00 04 lwz r10,4(r9)
18007ec: 81 09 00 08 lwz r8,8(r9)
18007f0: 81 29 00 0c lwz r9,12(r9)
18007f4: 90 1f 00 08 stw r0,8(r31)
18007f8: 91 5f 00 0c stw r10,12(r31)
18007fc: 91 1f 00 10 stw r8,16(r31)
1800800: 91 3f 00 14 stw r9,20(r31)
1800804: 80 1f 00 08 lwz r0,8(r31)
1800808: 81 3f 00 0c lwz r9,12(r31)
180080c: 81 5f 00 10 lwz r10,16(r31)
1800810: 81 1f 00 14 lwz r8,20(r31)
1800814: 90 0b 00 00 stw r0,0(r11)
1800818: 91 2b 00 04 stw r9,4(r11)
180081c: 91 4b 00 08 stw r10,8(r11)
1800820: 91 0b 00 0c stw r8,12(r11)
1800824: 7d 63 5b 78 mr r3,r11
1800828: 81 61 00 00 lwz r11,0(r1)
180082c: 83 eb ff fc lwz r31,-4(r11)
1800830: 7d 61 5b 78 mr r1,r11
1800834: 4e 80 00 20 blr
01800838 <main>:
1800838: 94 21 ff c0 stwu r1,-64(r1) ; | open frame and store sp at top of stack
180083c: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
1800840: 93 e1 00 3c stw r31,60(r1) ; | prolog store gpr31
1800844: 90 01 00 44 stw r0,68(r1) ; | store lr
1800848: 7c 3f 0b 78 mr r31,r1 ; | sp -> gpr31, latter used for some fixed addressing below
180084c: 4b ff ff 55 bl 18007a0 <f0> ; call f0()
1800850: 7c 60 1b 78 mr r0,r3 ; | NOTE: ret val is returned via gpr3
1800854: 98 1f 00 08 stb r0,8(r31) ; / ret val
1800858: 38 1f 00 10 addi r0,r31,16 ; \
180085c: 7c 03 03 78 mr r3,r0 ; | space to retval -> gpr3 (hidden arg)
1800860: 4c c6 31 82 crclr 4*cr1+eq ; :
1800864: 4b ff ff 69 bl 18007cc <f1> ; call f0()
1800868: 81 3f 00 18 lwz r9,24(r31) ;
180086c: 88 1f 00 08 lbz r0,8(r31) ;
1800870: 54 00 06 3e clrlwi r0,r0,24 ;
1800874: 7c 09 02 14 add r0,r9,r0 ;
1800878: 7c 03 03 78 mr r3,r0 ;
180087c: 81 61 00 00 lwz r11,0(r1) ;
1800880: 80 0b 00 04 lwz r0,4(r11) ;
1800884: 7c 08 03 a6 mtlr r0 ;
1800888: 83 eb ff fc lwz r31,-4(r11) ;
180088c: 7d 61 5b 78 mr r1,r11 ;
1800890: 4e 80 00 20 blr ;
1800894: 00 01 81 48 .long 0x18148 ;
; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
;
; struct Trivial { int a; };
; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
;
; extern "C" {
;
; void f1(struct Trivial s) { }
; void f2(struct NonTrivial s) { }
;
; void f()
; {
; struct Trivial t;
; struct NonTrivial n;
; int a=1;
; a += 123;
; f1(t);
; a -= 123;
; f2(n);
; a -= 12;
; }
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
100003e0 <f1>:
100003e0: 94 21 ff f0 stwu r1,-16(r1)
100003e4: 93 e1 00 0c stw r31,12(r1)
100003e8: 7c 3f 0b 78 mr r31,r1
100003ec: 81 61 00 00 lwz r11,0(r1)
100003f0: 83 eb ff fc lwz r31,-4(r11)
100003f4: 7d 61 5b 78 mr r1,r11
100003f8: 4e 80 00 20 blr
100003fc <f2>:
100003fc: 94 21 ff e0 stwu r1,-32(r1)
10000400: 93 e1 00 1c stw r31,28(r1)
10000404: 7c 3f 0b 78 mr r31,r1
10000408: 90 7f 00 08 stw r3,8(r31)
1000040c: 81 61 00 00 lwz r11,0(r1)
10000410: 83 eb ff fc lwz r31,-4(r11)
10000414: 7d 61 5b 78 mr r1,r11
10000418: 4e 80 00 20 blr
1000041c <f>:
1000041c: 94 21 ff d0 stwu r1,-48(r1) ;
10000420: 7c 08 02 a6 mflr r0 ;
10000424: 93 e1 00 2c stw r31,44(r1) ;
10000428: 90 01 00 34 stw r0,52(r1) ;
1000042c: 7c 3f 0b 78 mr r31,r1 ;
10000430: 38 1f 00 14 addi r0,r31,20 ;
10000434: 7c 03 03 78 mr r3,r0 ;
10000438: 48 00 00 a1 bl 100004d8 <_ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor
1000043c: 38 00 00 01 li r0,1 ;
10000440: 90 1f 00 08 stw r0,8(r31) ;
10000444: 81 3f 00 08 lwz r9,8(r31) ;
10000448: 38 09 00 7b addi r0,r9,123 ;
1000044c: 90 1f 00 08 stw r0,8(r31) ;
10000450: 80 1f 00 10 lwz r0,16(r31) ;
10000454: 90 1f 00 18 stw r0,24(r31) ;
10000458: 38 1f 00 18 addi r0,r31,24 ;
1000045c: 7c 03 03 78 mr r3,r0 ;
10000460: 4b ff ff 81 bl 100003e0 <f1> ; call f1(struct Trivial)
10000464: 81 3f 00 08 lwz r9,8(r31) ;
10000468: 38 09 ff 85 addi r0,r9,-123 ;
1000046c: 90 1f 00 08 stw r0,8(r31) ;
10000470: 38 1f 00 0c addi r0,r31,12 ;
10000474: 39 3f 00 14 addi r9,r31,20 ;
10000478: 7c 03 03 78 mr r3,r0 ; | ptr to dest of copy of n
1000047c: 7d 24 4b 78 mr r4,r9 ; | copy n ptr to n
10000480: 48 00 00 85 bl 10000504 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
10000484: 38 1f 00 0c addi r0,r31,12 ; \
10000488: 7c 03 03 78 mr r3,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
1000048c: 4b ff ff 71 bl 100003fc <f2> ; call f2(struct NonTrivial)
10000490: 81 3f 00 08 lwz r9,8(r31) ;
10000494: 38 09 ff f4 addi r0,r9,-12 ;
10000498: 90 1f 00 08 stw r0,8(r31) ;
1000049c: 81 61 00 00 lwz r11,0(r1) ;
100004a0: 80 0b 00 04 lwz r0,4(r11) ;
100004a4: 7c 08 03 a6 mtlr r0 ;
100004a8: 83 eb ff fc lwz r31,-4(r11) ;
100004ac: 7d 61 5b 78 mr r1,r11 ;
100004b0: 4e 80 00 20 blr ;
; ... snip, removed code of ctor and copy ctor ...
; ---------- C++ trivial and non-trivial aggrs as return values ---------->
;
; struct Trivial { int a; };
; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
;
; extern "C" {
; struct Trivial f1() { return Trivial(); }
; }
;
; struct NonTrivial f2() { return NonTrivial(); }
;
; extern "C" {
; void f()
; {
; int a=1;
; a += 123;
; struct Trivial t = f1();
; a -= 123;
; struct NonTrivial n = f2();
; a -= 12;
; }
; }
; output from debian-4.1.1-21-ppc w/ gcc 4.1.2 (demonstrates LSB specifics about aggr return values)
100003e0 <f1>:
100003e0: 94 21 ff f0 stwu r1,-16(r1)
100003e4: 93 e1 00 0c stw r31,12(r1)
100003e8: 7c 3f 0b 78 mr r31,r1
100003ec: 7c 69 1b 78 mr r9,r3
100003f0: 38 00 00 00 li r0,0
100003f4: 90 09 00 00 stw r0,0(r9)
100003f8: 7d 23 4b 78 mr r3,r9
100003fc: 81 61 00 00 lwz r11,0(r1)
10000400: 83 eb ff fc lwz r31,-4(r11)
10000404: 7d 61 5b 78 mr r1,r11
10000408: 4e 80 00 20 blr
1000040c <_Z2f2v>:
1000040c: 94 21 ff e0 stwu r1,-32(r1)
10000410: 7c 08 02 a6 mflr r0
10000414: 93 a1 00 14 stw r29,20(r1)
10000418: 93 e1 00 1c stw r31,28(r1)
1000041c: 90 01 00 24 stw r0,36(r1)
10000420: 7c 3f 0b 78 mr r31,r1
10000424: 7c 7d 1b 78 mr r29,r3
10000428: 7f a0 eb 78 mr r0,r29
1000042c: 7c 03 03 78 mr r3,r0
10000430: 48 00 00 d5 bl 10000504 <_ZN10NonTrivialC1Ev>
10000434: 7f a3 eb 78 mr r3,r29
10000438: 81 61 00 00 lwz r11,0(r1)
1000043c: 80 0b 00 04 lwz r0,4(r11)
10000440: 7c 08 03 a6 mtlr r0
10000444: 83 ab ff f4 lwz r29,-12(r11)
10000448: 83 eb ff fc lwz r31,-4(r11)
1000044c: 7d 61 5b 78 mr r1,r11
10000450: 4e 80 00 20 blr
10000454 <f>:
10000454: 94 21 ff d0 stwu r1,-48(r1) ; | open frame and store sp at top of stack
10000458: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
1000045c: 93 e1 00 2c stw r31,44(r1) ; | prolog store gpr31
10000460: 90 01 00 34 stw r0,52(r1) ; | store lr
10000464: 7c 3f 0b 78 mr r31,r1 ; / sp -> gpr31, latter used for some fixed addressing below
10000468: 38 00 00 01 li r0,1 ; \ a = 1
1000046c: 90 1f 00 08 stw r0,8(r31) ; /
10000470: 81 3f 00 08 lwz r9,8(r31) ; \
10000474: 38 09 00 7b addi r0,r9,123 ; | a += 123
10000478: 90 1f 00 08 stw r0,8(r31) ; /
1000047c: 38 1f 00 18 addi r0,r31,24 ; \
10000480: 7c 03 03 78 mr r3,r0 ; | space to retval -> gpr3 (hidden arg); NOTE: this follows the LSB definition
10000484: 4b ff ff 5d bl 100003e0 <f1> ; call f1()
10000488: 80 1f 00 18 lwz r0,24(r31) ;
1000048c: 90 1f 00 0c stw r0,12(r31) ;
10000490: 81 3f 00 08 lwz r9,8(r31) ;
10000494: 38 09 ff 85 addi r0,r9,-123 ;
10000498: 90 1f 00 08 stw r0,8(r31) ;
1000049c: 38 1f 00 10 addi r0,r31,16 ; |
100004a0: 7c 03 03 78 mr r3,r0 ; | hidden first arg (ptr to space to hold NonTrivial retval), via ptr as non-trivial
100004a4: 4b ff ff 69 bl 1000040c <_Z2f2v> ; call f2()
100004a8: 81 3f 00 08 lwz r9,8(r31) ;
100004ac: 38 09 ff f4 addi r0,r9,-12 ;
100004b0: 90 1f 00 08 stw r0,8(r31) ;
100004b4: 81 61 00 00 lwz r11,0(r1) ;
100004b8: 80 0b 00 04 lwz r0,4(r11) ;
100004bc: 7c 08 03 a6 mtlr r0 ;
100004c0: 83 eb ff fc lwz r31,-4(r11) ;
100004c4: 7d 61 5b 78 mr r1,r11 ;
100004c8: 4e 80 00 20 blr ;
; output from netbsd-4.0.1-macppc w/ gcc 4.1.2 (demonstrates default (non-LSB) aggr return values)
01800840 <f1>:
1800840: 94 21 ff e0 stwu r1,-32(r1)
1800844: 93 e1 00 1c stw r31,28(r1)
1800848: 7c 3f 0b 78 mr r31,r1
180084c: 38 00 00 00 li r0,0
1800850: 7c 03 03 78 mr r3,r0
1800854: 81 61 00 00 lwz r11,0(r1)
1800858: 83 eb ff fc lwz r31,-4(r11)
180085c: 7d 61 5b 78 mr r1,r11
1800860: 4e 80 00 20 blr
01800864 <_Z2f2v>:
1800864: 94 21 ff e0 stwu r1,-32(r1)
1800868: 7c 08 02 a6 mflr r0
180086c: 93 a1 00 14 stw r29,20(r1)
1800870: 93 e1 00 1c stw r31,28(r1)
1800874: 90 01 00 24 stw r0,36(r1)
1800878: 7c 3f 0b 78 mr r31,r1
180087c: 7c 7d 1b 78 mr r29,r3
1800880: 7f a0 eb 78 mr r0,r29
1800884: 7c 03 03 78 mr r3,r0
1800888: 48 00 00 cd bl 1800954 <_ZN10NonTrivialC1Ev>
180088c: 7f a3 eb 78 mr r3,r29
1800890: 81 61 00 00 lwz r11,0(r1)
1800894: 80 0b 00 04 lwz r0,4(r11)
1800898: 7c 08 03 a6 mtlr r0
180089c: 83 ab ff f4 lwz r29,-12(r11)
18008a0: 83 eb ff fc lwz r31,-4(r11)
18008a4: 7d 61 5b 78 mr r1,r11
18008a8: 4e 80 00 20 blr
018008ac <f>:
18008ac: 94 21 ff d0 stwu r1,-48(r1) ;
18008b0: 7c 08 02 a6 mflr r0 ;
18008b4: 93 e1 00 2c stw r31,44(r1) ;
18008b8: 90 01 00 34 stw r0,52(r1) ;
18008bc: 7c 3f 0b 78 mr r31,r1 ;
18008c0: 38 00 00 01 li r0,1 ;
18008c4: 90 1f 00 08 stw r0,8(r31) ;
18008c8: 81 3f 00 08 lwz r9,8(r31) ;
18008cc: 38 09 00 7b addi r0,r9,123 ;
18008d0: 90 1f 00 08 stw r0,8(r31) ; NOTE: no hidden param in contrast to LSB version of callconv
18008d4: 4b ff ff 6d bl 1800840 <f1> ; call f1()
18008d8: 7c 60 1b 78 mr r0,r3 ; | NOTE: ret val is returned via gpr3
18008dc: 90 1f 00 0c stw r0,12(r31) ; / ret val
18008e0: 81 3f 00 08 lwz r9,8(r31) ;
18008e4: 38 09 ff 85 addi r0,r9,-123 ;
18008e8: 90 1f 00 08 stw r0,8(r31) ;
18008ec: 38 1f 00 10 addi r0,r31,16 ; |
18008f0: 7c 03 03 78 mr r3,r0 ; | hidden first arg (ptr to space to hold NonTrivial retval), via ptr as non-trivial
18008f4: 4b ff ff 71 bl 1800864 <_Z2f2v> ; call f2()
18008f8: 81 3f 00 08 lwz r9,8(r31) ;
18008fc: 38 09 ff f4 addi r0,r9,-12 ;
1800900: 90 1f 00 08 stw r0,8(r31) ;
1800904: 81 61 00 00 lwz r11,0(r1) ;
1800908: 80 0b 00 04 lwz r0,4(r11) ;
180090c: 7c 08 03 a6 mtlr r0 ;
1800910: 83 eb ff fc lwz r31,-4(r11) ;
1800914: 7d 61 5b 78 mr r1,r11 ;
1800918: 4e 80 00 20 blr ;
; vim: ft=asm68k