; #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(220) = '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 freebsd-13.0_r348764-arm64 w/ clang 8.0.0
leaf_call:
0: ff 83 00 d1 sub sp, sp, #32
4: e0 1f 00 b9 str w0, [sp, #28]
8: e1 1b 00 b9 str w1, [sp, #24]
c: e2 17 00 b9 str w2, [sp, #20]
10: e3 13 00 b9 str w3, [sp, #16]
14: e4 0f 00 b9 str w4, [sp, #12]
18: e5 0b 00 b9 str w5, [sp, #8]
1c: e6 07 00 b9 str w6, [sp, #4]
20: ff 83 00 91 add sp, sp, #32
24: c0 03 5f d6 ret
nonleaf_call:
28: ff 83 04 d1 sub sp, sp, #288 ; | includes alloca()'d static space, already
2c: fc 83 00 f9 str x28, [sp, #256] ; | (unsure why r28 is preserved @@@)
30: fd 7b 11 a9 stp x29, x30, [sp, #272] ; | prolog
34: fd 43 04 91 add x29, sp, #272 ; | adjust/set frame pointer (since sp was modified first)
38: 88 09 80 52 mov w8, #76 ; 'L' -> w8
3c: a0 c3 1e b8 stur w0, [x29, #-20] ; in arg 0 -> local area (as temp store)
40: a1 83 1e b8 stur w1, [x29, #-24] ; in arg 1 -> local area (as temp store)
44: a2 43 1e b8 stur w2, [x29, #-28] ; in arg 2 -> local area (as temp store)
48: a3 03 1e b8 stur w3, [x29, #-32] ; in arg 3 -> local area (as temp store)
4c: a4 c3 1d b8 stur w4, [x29, #-36] ; in arg 4 -> local area (as temp store)
50: a5 83 1d b8 stur w5, [x29, #-40] ; in arg 5 -> local area (as temp store)
54: a6 43 1d b8 stur w6, [x29, #-44] ; in arg 6 -> local area (as temp store)
58: a7 03 1d b8 stur w7, [x29, #-48] ; in arg 7 -> local area (as temp store)
5c: e8 03 00 39 strb w8, [sp] ; place 'L' on top of stack (at alloca()'d addr)
60: a0 83 5e b8 ldur w0, [x29, #-24] ; arg 0
64: a1 43 5e b8 ldur w1, [x29, #-28] ; arg 1
68: a2 03 5e b8 ldur w2, [x29, #-32] ; arg 2
6c: a3 c3 5d b8 ldur w3, [x29, #-36] ; arg 3
70: a4 83 5d b8 ldur w4, [x29, #-40] ; arg 4
74: a5 43 5d b8 ldur w5, [x29, #-44] ; arg 5
78: a6 03 5d b8 ldur w6, [x29, #-48] ; arg 6
7c: e1 ff ff 97 bl #-124 ; return address -> r30/lr, and call
80: fd 7b 51 a9 ldp x29, x30, [sp, #272] ; |
84: fc 83 40 f9 ldr x28, [sp, #256] ; |
88: ff 83 04 91 add sp, sp, #288 ; | epilog
8c: c0 03 5f d6 ret ; |
main:
90: ff 83 00 d1 sub sp, sp, #32 ; |
94: fd 7b 01 a9 stp x29, x30, [sp, #16] ; | prolog
98: fd 43 00 91 add x29, sp, #16 ; |
9c: 08 00 80 52 mov w8, #0 ; clearing r8 (indirect result location pointer)
a0: e1 03 00 32 orr w1, wzr, #0x1 ; arg 1
a4: e2 03 1f 32 orr w2, wzr, #0x2 ; arg 2
a8: e3 07 00 32 orr w3, wzr, #0x3 ; arg 3
ac: e4 03 1e 32 orr w4, wzr, #0x4 ; arg 4
b0: a5 00 80 52 mov w5, #5 ; arg 5
b4: e6 07 1f 32 orr w6, wzr, #0x6 ; arg 6
b8: e7 0b 00 32 orr w7, wzr, #0x7 ; arg 7
bc: bf c3 1f b8 stur wzr, [x29, #-4] ; unsure... store a zero in local area@@@
c0: e0 03 08 2a mov w0, w8 ; arg 0 (= 0 set in w8, above)
c4: e8 0b 00 b9 str w8, [sp, #8] ; temp storing 0 in local area
c8: d8 ff ff 97 bl #-160 ; return address -> r30/lr, and call
cc: e0 0b 40 b9 ldr w0, [sp, #8] ; return value (unsure why not just using immediate @@@)
d0: fd 7b 41 a9 ldp x29, x30, [sp, #16] ; |
d4: ff 83 00 91 add sp, sp, #32 ; | epilog
d8: c0 03 5f d6 ret ; |
; ---------- same with more args so stack is also used ---------->
; #include <stdlib.h>
;
; void leaf_call(int b, int c, int d, int e, int f, int g, int h, int i, int j)
; {
; }
;
; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
; {
; /* 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, 6, 7, 8, 9);
; return 0;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff c3 00 d1 sub sp, sp, #48
4: e8 33 40 b9 ldr w8, [sp, #48]
8: e0 2f 00 b9 str w0, [sp, #44]
c: e1 2b 00 b9 str w1, [sp, #40]
10: e2 27 00 b9 str w2, [sp, #36]
14: e3 23 00 b9 str w3, [sp, #32]
18: e4 1f 00 b9 str w4, [sp, #28]
1c: e5 1b 00 b9 str w5, [sp, #24]
20: e6 17 00 b9 str w6, [sp, #20]
24: e7 13 00 b9 str w7, [sp, #16]
28: e8 0f 00 b9 str w8, [sp, #12]
2c: ff c3 00 91 add sp, sp, #48
30: c0 03 5f d6 ret
0000000000000034 nonleaf_call:
34: ff 03 05 d1 sub sp, sp, #320 ; | includes alloca()'d static space, already
38: fc 93 00 f9 str x28, [sp, #288] ; | (unsure why r28 is preserved @@@)
3c: fd 7b 13 a9 stp x29, x30, [sp, #304] ; | prolog
40: fd c3 04 91 add x29, sp, #304 ; / adjust/set frame pointer (since sp was modified first)
44: a8 13 40 b9 ldr w8, [x29, #16] ; \
48: a9 1b 40 b9 ldr w9, [x29, #24] ; | in args 8,9 from prev frame's param area -> regs, no we have args 0-9 all in r0-r9
4c: 8a 09 80 52 mov w10, #76 ; 'L' -> w10
50: a0 c3 1e b8 stur w0, [x29, #-20] ; |
54: a1 83 1e b8 stur w1, [x29, #-24] ; |
58: a2 43 1e b8 stur w2, [x29, #-28] ; |
5c: a3 03 1e b8 stur w3, [x29, #-32] ; |
60: a4 c3 1d b8 stur w4, [x29, #-36] ; | ... in args 0,1,2,3,4,5,6,7,8,9 -> temp space in local area ...
64: a5 83 1d b8 stur w5, [x29, #-40] ; |
68: a6 43 1d b8 stur w6, [x29, #-44] ; |
6c: a7 03 1d b8 stur w7, [x29, #-48] ; |
70: a8 c3 1c b8 stur w8, [x29, #-52] ; |
74: a9 83 1c b8 stur w9, [x29, #-56] ; |
78: ea 43 00 39 strb w10, [sp, #16] ; 'L' -> local area (alloca()'d memory)
7c: a0 83 5e b8 ldur w0, [x29, #-24] ; arg 0
80: a1 43 5e b8 ldur w1, [x29, #-28] ; arg 1
84: a2 03 5e b8 ldur w2, [x29, #-32] ; arg 2
88: a3 c3 5d b8 ldur w3, [x29, #-36] ; arg 3
8c: a4 83 5d b8 ldur w4, [x29, #-40] ; arg 4
90: a5 43 5d b8 ldur w5, [x29, #-44] ; arg 5
94: a6 03 5d b8 ldur w6, [x29, #-48] ; arg 6
98: a7 c3 5c b8 ldur w7, [x29, #-52] ; arg 7
9c: a8 83 5c b8 ldur w8, [x29, #-56] ; arg 8 -> w8, and ...
a0: eb 03 00 91 mov x11, sp ; ... with help of x11 (why?) ...
a4: 68 01 00 b9 str w8, [x11] ; ... "pushed" onto to of stack
a8: d6 ff ff 97 bl #-168 <leaf_call> ; return address -> r30/lr, and call
ac: fd 7b 53 a9 ldp x29, x30, [sp, #304] ; |
b0: fc 93 40 f9 ldr x28, [sp, #288] ; |
b4: ff 03 05 91 add sp, sp, #320 ; | epilog
b8: c0 03 5f d6 ret ; |
00000000000000bc main:
bc: ff c3 00 d1 sub sp, sp, #48 ; |
c0: fd 7b 02 a9 stp x29, x30, [sp, #32] ; | prolog
c4: fd 83 00 91 add x29, sp, #32 ; |
c8: 08 00 80 52 mov w8, #0 ; clearing r8 (indirect result location pointer)
cc: e1 03 00 32 orr w1, wzr, #0x1 ; arg 1
d0: e2 03 1f 32 orr w2, wzr, #0x2 ; arg 2
d4: e3 07 00 32 orr w3, wzr, #0x3 ; arg 3
d8: e4 03 1e 32 orr w4, wzr, #0x4 ; arg 4
dc: a5 00 80 52 mov w5, #5 ; arg 5
e0: e6 07 1f 32 orr w6, wzr, #0x6 ; arg 6
e4: e7 0b 00 32 orr w7, wzr, #0x7 ; arg 7
e8: e9 03 1d 32 orr w9, wzr, #0x8 ; arg 8 -> r9
ec: 2a 01 80 52 mov w10, #9 ; arg 9 -> r10
f0: bf c3 1f b8 stur wzr, [x29, #-4] ; unsure... store a zero in local area@@@
f4: e0 03 08 2a mov w0, w8 ; arg 0 (= 0 set in w8, above)
f8: eb 03 00 91 mov x11, sp ; use sp in x11 (why?), to ...
fc: 69 01 00 b9 str w9, [x11] ; ... place arg 8 on top of stack
100: eb 03 00 91 mov x11, sp ; use sp in x11 (why?), to ... (set again, pointlessly)
104: 6a 09 00 b9 str w10, [x11, #8] ; ... place arg 9 on stack (next to arg 8)
108: a8 83 1f b8 stur w8, [x29, #-8] ; temp storing 0 in local area @@@ why?
10c: ca ff ff 97 bl #-216 <nonleaf_call> ; return address -> r30/lr, and call
110: a0 83 5f b8 ldur w0, [x29, #-8] ; |
114: fd 7b 42 a9 ldp x29, x30, [sp, #32] ; |
118: ff c3 00 91 add sp, sp, #48 ; | epilog
11c: c0 03 5f d6 ret ; |
; ---------- for spilling ---------->
; #include <stdlib.h>
; #include <stdarg.h>
;
; void leaf_call(int b, int c, int d, int e, int f, int g, int h, int i, int j)
; {
; }
;
; void nonleaf_call(int a, ...)
; {
; int b,c,d,e,f,g,h,i,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 = va_arg(ap, int);
; g = va_arg(ap, int);
; h = va_arg(ap, int);
; i = va_arg(ap, int);
; j = va_arg(ap, int);
;
; /* 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, 6, 7, 8, 9);
; return 0;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff c3 00 d1 sub sp, sp, #48
4: e8 33 40 b9 ldr w8, [sp, #48]
8: e0 2f 00 b9 str w0, [sp, #44]
c: e1 2b 00 b9 str w1, [sp, #40]
10: e2 27 00 b9 str w2, [sp, #36]
14: e3 23 00 b9 str w3, [sp, #32]
18: e4 1f 00 b9 str w4, [sp, #28]
1c: e5 1b 00 b9 str w5, [sp, #24]
20: e6 17 00 b9 str w6, [sp, #20]
24: e7 13 00 b9 str w7, [sp, #16]
28: e8 0f 00 b9 str w8, [sp, #12]
2c: ff c3 00 91 add sp, sp, #48
30: c0 03 5f d6 ret
0000000000000034 nonleaf_call:
34: fc 4f be a9 stp x28, x19, [sp, #-32]! ; |
38: fd 7b 01 a9 stp x29, x30, [sp, #16] ; |
3c: fd 43 00 91 add x29, sp, #16 ; | prolog
40: ff 83 07 d1 sub sp, sp, #480 ; |
44: f3 03 00 91 mov x19, sp
48: 67 56 80 3d str q7, [x19, #336] ; |
4c: 66 52 80 3d str q6, [x19, #320] ; |
50: 65 4e 80 3d str q5, [x19, #304] ; |
54: 64 4a 80 3d str q4, [x19, #288] ; |
58: 63 46 80 3d str q3, [x19, #272] ; | spill all flot regs (on top of spilled integers, below
5c: 62 42 80 3d str q2, [x19, #256] ; |
60: 61 3e 80 3d str q1, [x19, #240] ; |
64: 60 3a 80 3d str q0, [x19, #224] ; /
68: a7 03 1a f8 stur x7, [x29, #-96] ; \
6c: a6 83 19 f8 stur x6, [x29, #-104] ; |
70: a5 03 19 f8 stur x5, [x29, #-112] ; |
74: a4 83 18 f8 stur x4, [x29, #-120] ; | spill integer args (adjacent to prev frame's param area)
78: a3 03 18 f8 stur x3, [x29, #-128] ; | note: only needed ones are spilled
7c: a2 83 17 f8 stur x2, [x29, #-136] ; |
80: a1 03 17 f8 stur x1, [x29, #-144] ; |
84: a0 c3 1e b8 stur w0, [x29, #-20]
88: e0 63 19 32 orr w0, wzr, #0xffffff80
8c: a0 43 1c b8 stur w0, [x29, #-60]
90: e0 06 80 12 mov w0, #-56
94: a0 03 1c b8 stur w0, [x29, #-64]
98: 61 82 03 91 add x1, x19, #224
9c: 21 00 02 91 add x1, x1, #128
a0: a1 83 1b f8 stur x1, [x29, #-72]
a4: a1 43 02 d1 sub x1, x29, #144
a8: 21 e0 00 91 add x1, x1, #56
ac: a1 03 1b f8 stur x1, [x29, #-80]
b0: a1 43 00 91 add x1, x29, #16
b4: a1 83 1a f8 stur x1, [x29, #-88]
b8: a1 63 01 d1 sub x1, x29, #88
bc: 21 60 00 91 add x1, x1, #24
c0: a0 03 5c b8 ldur w0, [x29, #-64]
c4: e8 03 00 2a mov w8, w0
c8: 61 6e 00 f9 str x1, [x19, #216]
cc: 68 d6 00 b9 str w8, [x19, #212]
d0: e0 01 f8 36 tbz w0, #31, #60 <nonleaf_call+0xd8>
d4: 01 00 00 14 b #4 <nonleaf_call+0xa4>
d8: 68 d6 40 b9 ldr w8, [x19, #212]
dc: 09 21 00 11 add w9, w8, #8
e0: 6a 6e 40 f9 ldr x10, [x19, #216]
e4: 49 01 00 b9 str w9, [x10]
e8: 29 01 00 71 subs w9, w9, #0
ec: 69 d2 00 b9 str w9, [x19, #208]
f0: ec 00 00 54 b.gt #28 <nonleaf_call+0xd8>
f4: 01 00 00 14 b #4 <nonleaf_call+0xc4>
f8: a8 03 5b f8 ldur x8, [x29, #-80]
fc: 69 d6 40 b9 ldr w9, [x19, #212]
100: 08 c1 29 8b add x8, x8, w9, sxtw
104: 68 66 00 f9 str x8, [x19, #200]
108: 06 00 00 14 b #24 <nonleaf_call+0xec>
10c: a8 83 5a f8 ldur x8, [x29, #-88]
110: 09 21 00 91 add x9, x8, #8
114: a9 83 1a f8 stur x9, [x29, #-88]
118: 68 66 00 f9 str x8, [x19, #200]
11c: 01 00 00 14 b #4 <nonleaf_call+0xec>
120: 68 66 40 f9 ldr x8, [x19, #200]
124: 09 01 40 b9 ldr w9, [x8]
128: a9 83 1e b8 stur w9, [x29, #-24]
12c: a8 63 01 d1 sub x8, x29, #88
130: 08 61 00 91 add x8, x8, #24
134: a9 03 5c b8 ldur w9, [x29, #-64]
138: ea 03 09 2a mov w10, w9
13c: 68 62 00 f9 str x8, [x19, #192]
140: 6a be 00 b9 str w10, [x19, #188]
144: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x14c>
148: 01 00 00 14 b #4 <nonleaf_call+0x118>
14c: 68 be 40 b9 ldr w8, [x19, #188]
150: 09 21 00 11 add w9, w8, #8
154: 6a 62 40 f9 ldr x10, [x19, #192]
158: 49 01 00 b9 str w9, [x10]
15c: 29 01 00 71 subs w9, w9, #0
160: 69 ba 00 b9 str w9, [x19, #184]
164: ec 00 00 54 b.gt #28 <nonleaf_call+0x14c>
168: 01 00 00 14 b #4 <nonleaf_call+0x138>
16c: a8 03 5b f8 ldur x8, [x29, #-80]
170: 69 be 40 b9 ldr w9, [x19, #188]
174: 08 c1 29 8b add x8, x8, w9, sxtw
178: 68 5a 00 f9 str x8, [x19, #176]
17c: 06 00 00 14 b #24 <nonleaf_call+0x160>
180: a8 83 5a f8 ldur x8, [x29, #-88]
184: 09 21 00 91 add x9, x8, #8
188: a9 83 1a f8 stur x9, [x29, #-88]
18c: 68 5a 00 f9 str x8, [x19, #176]
190: 01 00 00 14 b #4 <nonleaf_call+0x160>
194: 68 5a 40 f9 ldr x8, [x19, #176]
198: 09 01 40 b9 ldr w9, [x8]
19c: a9 43 1e b8 stur w9, [x29, #-28]
1a0: a8 63 01 d1 sub x8, x29, #88
1a4: 08 61 00 91 add x8, x8, #24
1a8: a9 03 5c b8 ldur w9, [x29, #-64]
1ac: ea 03 09 2a mov w10, w9
1b0: 68 56 00 f9 str x8, [x19, #168]
1b4: 6a a6 00 b9 str w10, [x19, #164]
1b8: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x1c0>
1bc: 01 00 00 14 b #4 <nonleaf_call+0x18c>
1c0: 68 a6 40 b9 ldr w8, [x19, #164]
1c4: 09 21 00 11 add w9, w8, #8
1c8: 6a 56 40 f9 ldr x10, [x19, #168]
1cc: 49 01 00 b9 str w9, [x10]
1d0: 29 01 00 71 subs w9, w9, #0
1d4: 69 a2 00 b9 str w9, [x19, #160]
1d8: ec 00 00 54 b.gt #28 <nonleaf_call+0x1c0>
1dc: 01 00 00 14 b #4 <nonleaf_call+0x1ac>
1e0: a8 03 5b f8 ldur x8, [x29, #-80]
1e4: 69 a6 40 b9 ldr w9, [x19, #164]
1e8: 08 c1 29 8b add x8, x8, w9, sxtw
1ec: 68 4e 00 f9 str x8, [x19, #152]
1f0: 06 00 00 14 b #24 <nonleaf_call+0x1d4>
1f4: a8 83 5a f8 ldur x8, [x29, #-88]
1f8: 09 21 00 91 add x9, x8, #8
1fc: a9 83 1a f8 stur x9, [x29, #-88]
200: 68 4e 00 f9 str x8, [x19, #152]
204: 01 00 00 14 b #4 <nonleaf_call+0x1d4>
208: 68 4e 40 f9 ldr x8, [x19, #152]
20c: 09 01 40 b9 ldr w9, [x8]
210: a9 03 1e b8 stur w9, [x29, #-32]
214: a8 63 01 d1 sub x8, x29, #88
218: 08 61 00 91 add x8, x8, #24
21c: a9 03 5c b8 ldur w9, [x29, #-64]
220: ea 03 09 2a mov w10, w9
224: 68 4a 00 f9 str x8, [x19, #144]
228: 6a 8e 00 b9 str w10, [x19, #140]
22c: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x234>
230: 01 00 00 14 b #4 <nonleaf_call+0x200>
234: 68 8e 40 b9 ldr w8, [x19, #140]
238: 09 21 00 11 add w9, w8, #8
23c: 6a 4a 40 f9 ldr x10, [x19, #144]
240: 49 01 00 b9 str w9, [x10]
244: 29 01 00 71 subs w9, w9, #0
248: 69 8a 00 b9 str w9, [x19, #136]
24c: ec 00 00 54 b.gt #28 <nonleaf_call+0x234>
250: 01 00 00 14 b #4 <nonleaf_call+0x220>
254: a8 03 5b f8 ldur x8, [x29, #-80]
258: 69 8e 40 b9 ldr w9, [x19, #140]
25c: 08 c1 29 8b add x8, x8, w9, sxtw
260: 68 42 00 f9 str x8, [x19, #128]
264: 06 00 00 14 b #24 <nonleaf_call+0x248>
268: a8 83 5a f8 ldur x8, [x29, #-88]
26c: 09 21 00 91 add x9, x8, #8
270: a9 83 1a f8 stur x9, [x29, #-88]
274: 68 42 00 f9 str x8, [x19, #128]
278: 01 00 00 14 b #4 <nonleaf_call+0x248>
27c: 68 42 40 f9 ldr x8, [x19, #128]
280: 09 01 40 b9 ldr w9, [x8]
284: a9 c3 1d b8 stur w9, [x29, #-36]
288: a8 63 01 d1 sub x8, x29, #88
28c: 08 61 00 91 add x8, x8, #24
290: a9 03 5c b8 ldur w9, [x29, #-64]
294: ea 03 09 2a mov w10, w9
298: 68 3e 00 f9 str x8, [x19, #120]
29c: 6a 76 00 b9 str w10, [x19, #116]
2a0: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x2a8>
2a4: 01 00 00 14 b #4 <nonleaf_call+0x274>
2a8: 68 76 40 b9 ldr w8, [x19, #116]
2ac: 09 21 00 11 add w9, w8, #8
2b0: 6a 3e 40 f9 ldr x10, [x19, #120]
2b4: 49 01 00 b9 str w9, [x10]
2b8: 29 01 00 71 subs w9, w9, #0
2bc: 69 72 00 b9 str w9, [x19, #112]
2c0: ec 00 00 54 b.gt #28 <nonleaf_call+0x2a8>
2c4: 01 00 00 14 b #4 <nonleaf_call+0x294>
2c8: a8 03 5b f8 ldur x8, [x29, #-80]
2cc: 69 76 40 b9 ldr w9, [x19, #116]
2d0: 08 c1 29 8b add x8, x8, w9, sxtw
2d4: 68 36 00 f9 str x8, [x19, #104]
2d8: 06 00 00 14 b #24 <nonleaf_call+0x2bc>
2dc: a8 83 5a f8 ldur x8, [x29, #-88]
2e0: 09 21 00 91 add x9, x8, #8
2e4: a9 83 1a f8 stur x9, [x29, #-88]
2e8: 68 36 00 f9 str x8, [x19, #104]
2ec: 01 00 00 14 b #4 <nonleaf_call+0x2bc>
2f0: 68 36 40 f9 ldr x8, [x19, #104]
2f4: 09 01 40 b9 ldr w9, [x8]
2f8: a9 83 1d b8 stur w9, [x29, #-40]
2fc: a8 63 01 d1 sub x8, x29, #88
300: 08 61 00 91 add x8, x8, #24
304: a9 03 5c b8 ldur w9, [x29, #-64]
308: ea 03 09 2a mov w10, w9
30c: 68 32 00 f9 str x8, [x19, #96]
310: 6a 5e 00 b9 str w10, [x19, #92]
314: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x31c>
318: 01 00 00 14 b #4 <nonleaf_call+0x2e8>
31c: 68 5e 40 b9 ldr w8, [x19, #92]
320: 09 21 00 11 add w9, w8, #8
324: 6a 32 40 f9 ldr x10, [x19, #96]
328: 49 01 00 b9 str w9, [x10]
32c: 29 01 00 71 subs w9, w9, #0
330: 69 5a 00 b9 str w9, [x19, #88]
334: ec 00 00 54 b.gt #28 <nonleaf_call+0x31c>
338: 01 00 00 14 b #4 <nonleaf_call+0x308>
33c: a8 03 5b f8 ldur x8, [x29, #-80]
340: 69 5e 40 b9 ldr w9, [x19, #92]
344: 08 c1 29 8b add x8, x8, w9, sxtw
348: 68 2a 00 f9 str x8, [x19, #80]
34c: 06 00 00 14 b #24 <nonleaf_call+0x330>
350: a8 83 5a f8 ldur x8, [x29, #-88]
354: 09 21 00 91 add x9, x8, #8
358: a9 83 1a f8 stur x9, [x29, #-88]
35c: 68 2a 00 f9 str x8, [x19, #80]
360: 01 00 00 14 b #4 <nonleaf_call+0x330>
364: 68 2a 40 f9 ldr x8, [x19, #80]
368: 09 01 40 b9 ldr w9, [x8]
36c: a9 43 1d b8 stur w9, [x29, #-44]
370: a8 63 01 d1 sub x8, x29, #88
374: 08 61 00 91 add x8, x8, #24
378: a9 03 5c b8 ldur w9, [x29, #-64]
37c: ea 03 09 2a mov w10, w9
380: 68 26 00 f9 str x8, [x19, #72]
384: 6a 46 00 b9 str w10, [x19, #68]
388: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x390>
38c: 01 00 00 14 b #4 <nonleaf_call+0x35c>
390: 68 46 40 b9 ldr w8, [x19, #68]
394: 09 21 00 11 add w9, w8, #8
398: 6a 26 40 f9 ldr x10, [x19, #72]
39c: 49 01 00 b9 str w9, [x10]
3a0: 29 01 00 71 subs w9, w9, #0
3a4: 69 42 00 b9 str w9, [x19, #64]
3a8: ec 00 00 54 b.gt #28 <nonleaf_call+0x390>
3ac: 01 00 00 14 b #4 <nonleaf_call+0x37c>
3b0: a8 03 5b f8 ldur x8, [x29, #-80]
3b4: 69 46 40 b9 ldr w9, [x19, #68]
3b8: 08 c1 29 8b add x8, x8, w9, sxtw
3bc: 68 1e 00 f9 str x8, [x19, #56]
3c0: 06 00 00 14 b #24 <nonleaf_call+0x3a4>
3c4: a8 83 5a f8 ldur x8, [x29, #-88]
3c8: 09 21 00 91 add x9, x8, #8
3cc: a9 83 1a f8 stur x9, [x29, #-88]
3d0: 68 1e 00 f9 str x8, [x19, #56]
3d4: 01 00 00 14 b #4 <nonleaf_call+0x3a4>
3d8: 68 1e 40 f9 ldr x8, [x19, #56]
3dc: 09 01 40 b9 ldr w9, [x8]
3e0: a9 03 1d b8 stur w9, [x29, #-48]
3e4: a8 63 01 d1 sub x8, x29, #88
3e8: 08 61 00 91 add x8, x8, #24
3ec: a9 03 5c b8 ldur w9, [x29, #-64]
3f0: ea 03 09 2a mov w10, w9
3f4: 68 1a 00 f9 str x8, [x19, #48]
3f8: 6a 2e 00 b9 str w10, [x19, #44]
3fc: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x404>
400: 01 00 00 14 b #4 <nonleaf_call+0x3d0>
404: 68 2e 40 b9 ldr w8, [x19, #44]
408: 09 21 00 11 add w9, w8, #8
40c: 6a 1a 40 f9 ldr x10, [x19, #48]
410: 49 01 00 b9 str w9, [x10]
414: 29 01 00 71 subs w9, w9, #0
418: 69 2a 00 b9 str w9, [x19, #40]
41c: ec 00 00 54 b.gt #28 <nonleaf_call+0x404>
420: 01 00 00 14 b #4 <nonleaf_call+0x3f0>
424: a8 03 5b f8 ldur x8, [x29, #-80]
428: 69 2e 40 b9 ldr w9, [x19, #44]
42c: 08 c1 29 8b add x8, x8, w9, sxtw
430: 68 12 00 f9 str x8, [x19, #32]
434: 06 00 00 14 b #24 <nonleaf_call+0x418>
438: a8 83 5a f8 ldur x8, [x29, #-88]
43c: 09 21 00 91 add x9, x8, #8
440: a9 83 1a f8 stur x9, [x29, #-88]
444: 68 12 00 f9 str x8, [x19, #32]
448: 01 00 00 14 b #4 <nonleaf_call+0x418>
44c: 68 12 40 f9 ldr x8, [x19, #32]
450: 09 01 40 b9 ldr w9, [x8]
454: a9 c3 1c b8 stur w9, [x29, #-52]
458: a8 63 01 d1 sub x8, x29, #88
45c: 08 61 00 91 add x8, x8, #24
460: a9 03 5c b8 ldur w9, [x29, #-64]
464: ea 03 09 2a mov w10, w9
468: 68 0e 00 f9 str x8, [x19, #24]
46c: 6a 16 00 b9 str w10, [x19, #20]
470: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x478>
474: 01 00 00 14 b #4 <nonleaf_call+0x444>
478: 68 16 40 b9 ldr w8, [x19, #20]
47c: 09 21 00 11 add w9, w8, #8
480: 6a 0e 40 f9 ldr x10, [x19, #24]
484: 49 01 00 b9 str w9, [x10]
488: 29 01 00 71 subs w9, w9, #0
48c: 69 12 00 b9 str w9, [x19, #16]
490: ec 00 00 54 b.gt #28 <nonleaf_call+0x478>
494: 01 00 00 14 b #4 <nonleaf_call+0x464>
498: a8 03 5b f8 ldur x8, [x29, #-80]
49c: 69 16 40 b9 ldr w9, [x19, #20]
4a0: 08 c1 29 8b add x8, x8, w9, sxtw
4a4: 68 06 00 f9 str x8, [x19, #8]
4a8: 06 00 00 14 b #24 <nonleaf_call+0x48c>
4ac: a8 83 5a f8 ldur x8, [x29, #-88]
4b0: 09 21 00 91 add x9, x8, #8
4b4: a9 83 1a f8 stur x9, [x29, #-88]
4b8: 68 06 00 f9 str x8, [x19, #8]
4bc: 01 00 00 14 b #4 <nonleaf_call+0x48c>
4c0: 68 06 40 f9 ldr x8, [x19, #8]
4c4: 09 01 40 b9 ldr w9, [x8]
4c8: a9 83 1c b8 stur w9, [x29, #-56]
4cc: e8 03 00 91 mov x8, sp
4d0: 0a 81 03 f1 subs x10, x8, #224
4d4: 5f 01 00 91 mov sp, x10
4d8: 89 09 80 52 mov w9, #76
4dc: 09 01 12 38 sturb w9, [x8, #-224]
4e0: a0 83 5e b8 ldur w0, [x29, #-24]
4e4: a1 43 5e b8 ldur w1, [x29, #-28]
4e8: a2 03 5e b8 ldur w2, [x29, #-32]
4ec: a3 c3 5d b8 ldur w3, [x29, #-36]
4f0: a4 83 5d b8 ldur w4, [x29, #-40]
4f4: a5 43 5d b8 ldur w5, [x29, #-44]
4f8: a6 03 5d b8 ldur w6, [x29, #-48]
4fc: a7 c3 5c b8 ldur w7, [x29, #-52]
500: a9 83 5c b8 ldur w9, [x29, #-56]
504: ff 43 00 d1 sub sp, sp, #16
508: e8 03 00 91 mov x8, sp
50c: 09 01 00 b9 str w9, [x8]
510: bc fe ff 97 bl #-1296 <leaf_call>
514: ff 43 00 91 add sp, sp, #16
518: bf 43 00 d1 sub sp, x29, #16
51c: fd 7b 41 a9 ldp x29, x30, [sp, #16]
520: fc 4f c2 a8 ldp x28, x19, [sp], #32
524: c0 03 5f d6 ret
0000000000000528 main:
528: ff c3 00 d1 sub sp, sp, #48
52c: fd 7b 02 a9 stp x29, x30, [sp, #32]
530: fd 83 00 91 add x29, sp, #32
534: 08 00 80 52 mov w8, #0
538: e1 03 00 32 orr w1, wzr, #0x1
53c: e2 03 1f 32 orr w2, wzr, #0x2
540: e3 07 00 32 orr w3, wzr, #0x3
544: e4 03 1e 32 orr w4, wzr, #0x4
548: a5 00 80 52 mov w5, #5
54c: e6 07 1f 32 orr w6, wzr, #0x6
550: e7 0b 00 32 orr w7, wzr, #0x7
554: e9 03 1d 32 orr w9, wzr, #0x8
558: 2a 01 80 52 mov w10, #9
55c: bf c3 1f b8 stur wzr, [x29, #-4]
560: e0 03 08 2a mov w0, w8
564: eb 03 00 91 mov x11, sp
568: 69 01 00 b9 str w9, [x11]
56c: eb 03 00 91 mov x11, sp
570: 6a 09 00 b9 str w10, [x11, #8]
574: a8 83 1f b8 stur w8, [x29, #-8]
578: af fe ff 97 bl #-1348 <nonleaf_call>
57c: a0 83 5f b8 ldur w0, [x29, #-8]
580: fd 7b 42 a9 ldp x29, x30, [sp, #32]
584: ff c3 00 91 add sp, sp, #48
588: c0 03 5f d6 ret
; ---------- for spilling with a float ---------->
; #include <stdlib.h>
; #include <stdarg.h>
;
; void leaf_call(int b, int c, int d, int e, float f, int g, int h, int i, int j)
; {
; }
;
; void nonleaf_call(int a, ...)
; {
; int b,c,d,e,g,h,i,j;
; float f;
; 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 = va_arg(ap, float);
; g = va_arg(ap, int);
; h = va_arg(ap, int);
; i = va_arg(ap, int);
; j = va_arg(ap, int);
;
; /* 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, 7, 8, 9);
; return 0;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff c3 00 d1 sub sp, sp, #48
4: e0 2f 00 b9 str w0, [sp, #44]
8: e1 2b 00 b9 str w1, [sp, #40]
c: e2 27 00 b9 str w2, [sp, #36]
10: e3 23 00 b9 str w3, [sp, #32]
14: e0 1f 00 bd str s0, [sp, #28]
18: e4 1b 00 b9 str w4, [sp, #24]
1c: e5 17 00 b9 str w5, [sp, #20]
20: e6 13 00 b9 str w6, [sp, #16]
24: e7 0f 00 b9 str w7, [sp, #12]
28: ff c3 00 91 add sp, sp, #48
2c: c0 03 5f d6 ret
0000000000000030 nonleaf_call:
30: fc 4f be a9 stp x28, x19, [sp, #-32]!
34: fd 7b 01 a9 stp x29, x30, [sp, #16]
38: fd 43 00 91 add x29, sp, #16
3c: ff 83 07 d1 sub sp, sp, #480
40: f3 03 00 91 mov x19, sp
44: 67 56 80 3d str q7, [x19, #336]
48: 66 52 80 3d str q6, [x19, #320]
4c: 65 4e 80 3d str q5, [x19, #304]
50: 64 4a 80 3d str q4, [x19, #288]
54: 63 46 80 3d str q3, [x19, #272]
58: 62 42 80 3d str q2, [x19, #256]
5c: 61 3e 80 3d str q1, [x19, #240]
60: 60 3a 80 3d str q0, [x19, #224]
64: a7 03 1a f8 stur x7, [x29, #-96]
68: a6 83 19 f8 stur x6, [x29, #-104]
6c: a5 03 19 f8 stur x5, [x29, #-112]
70: a4 83 18 f8 stur x4, [x29, #-120]
74: a3 03 18 f8 stur x3, [x29, #-128]
78: a2 83 17 f8 stur x2, [x29, #-136]
7c: a1 03 17 f8 stur x1, [x29, #-144]
80: a0 c3 1e b8 stur w0, [x29, #-20]
84: e0 63 19 32 orr w0, wzr, #0xffffff80
88: a0 43 1c b8 stur w0, [x29, #-60]
8c: e0 06 80 12 mov w0, #-56
90: a0 03 1c b8 stur w0, [x29, #-64]
94: 61 82 03 91 add x1, x19, #224
98: 21 00 02 91 add x1, x1, #128
9c: a1 83 1b f8 stur x1, [x29, #-72]
a0: a1 43 02 d1 sub x1, x29, #144
a4: 21 e0 00 91 add x1, x1, #56
a8: a1 03 1b f8 stur x1, [x29, #-80]
ac: a1 43 00 91 add x1, x29, #16
b0: a1 83 1a f8 stur x1, [x29, #-88]
b4: a1 63 01 d1 sub x1, x29, #88
b8: 21 60 00 91 add x1, x1, #24
bc: a0 03 5c b8 ldur w0, [x29, #-64]
c0: e8 03 00 2a mov w8, w0
c4: 61 6e 00 f9 str x1, [x19, #216]
c8: 68 d6 00 b9 str w8, [x19, #212]
cc: e0 01 f8 36 tbz w0, #31, #60 <nonleaf_call+0xd8>
d0: 01 00 00 14 b #4 <nonleaf_call+0xa4>
d4: 68 d6 40 b9 ldr w8, [x19, #212]
d8: 09 21 00 11 add w9, w8, #8
dc: 6a 6e 40 f9 ldr x10, [x19, #216]
e0: 49 01 00 b9 str w9, [x10]
e4: 29 01 00 71 subs w9, w9, #0
e8: 69 d2 00 b9 str w9, [x19, #208]
ec: ec 00 00 54 b.gt #28 <nonleaf_call+0xd8>
f0: 01 00 00 14 b #4 <nonleaf_call+0xc4>
f4: a8 03 5b f8 ldur x8, [x29, #-80]
f8: 69 d6 40 b9 ldr w9, [x19, #212]
fc: 08 c1 29 8b add x8, x8, w9, sxtw
100: 68 66 00 f9 str x8, [x19, #200]
104: 06 00 00 14 b #24 <nonleaf_call+0xec>
108: a8 83 5a f8 ldur x8, [x29, #-88]
10c: 09 21 00 91 add x9, x8, #8
110: a9 83 1a f8 stur x9, [x29, #-88]
114: 68 66 00 f9 str x8, [x19, #200]
118: 01 00 00 14 b #4 <nonleaf_call+0xec>
11c: 68 66 40 f9 ldr x8, [x19, #200]
120: 09 01 40 b9 ldr w9, [x8]
124: a9 83 1e b8 stur w9, [x29, #-24]
128: a8 63 01 d1 sub x8, x29, #88
12c: 08 61 00 91 add x8, x8, #24
130: a9 03 5c b8 ldur w9, [x29, #-64]
134: ea 03 09 2a mov w10, w9
138: 68 62 00 f9 str x8, [x19, #192]
13c: 6a be 00 b9 str w10, [x19, #188]
140: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x14c>
144: 01 00 00 14 b #4 <nonleaf_call+0x118>
148: 68 be 40 b9 ldr w8, [x19, #188]
14c: 09 21 00 11 add w9, w8, #8
150: 6a 62 40 f9 ldr x10, [x19, #192]
154: 49 01 00 b9 str w9, [x10]
158: 29 01 00 71 subs w9, w9, #0
15c: 69 ba 00 b9 str w9, [x19, #184]
160: ec 00 00 54 b.gt #28 <nonleaf_call+0x14c>
164: 01 00 00 14 b #4 <nonleaf_call+0x138>
168: a8 03 5b f8 ldur x8, [x29, #-80]
16c: 69 be 40 b9 ldr w9, [x19, #188]
170: 08 c1 29 8b add x8, x8, w9, sxtw
174: 68 5a 00 f9 str x8, [x19, #176]
178: 06 00 00 14 b #24 <nonleaf_call+0x160>
17c: a8 83 5a f8 ldur x8, [x29, #-88]
180: 09 21 00 91 add x9, x8, #8
184: a9 83 1a f8 stur x9, [x29, #-88]
188: 68 5a 00 f9 str x8, [x19, #176]
18c: 01 00 00 14 b #4 <nonleaf_call+0x160>
190: 68 5a 40 f9 ldr x8, [x19, #176]
194: 09 01 40 b9 ldr w9, [x8]
198: a9 43 1e b8 stur w9, [x29, #-28]
19c: a8 63 01 d1 sub x8, x29, #88
1a0: 08 61 00 91 add x8, x8, #24
1a4: a9 03 5c b8 ldur w9, [x29, #-64]
1a8: ea 03 09 2a mov w10, w9
1ac: 68 56 00 f9 str x8, [x19, #168]
1b0: 6a a6 00 b9 str w10, [x19, #164]
1b4: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x1c0>
1b8: 01 00 00 14 b #4 <nonleaf_call+0x18c>
1bc: 68 a6 40 b9 ldr w8, [x19, #164]
1c0: 09 21 00 11 add w9, w8, #8
1c4: 6a 56 40 f9 ldr x10, [x19, #168]
1c8: 49 01 00 b9 str w9, [x10]
1cc: 29 01 00 71 subs w9, w9, #0
1d0: 69 a2 00 b9 str w9, [x19, #160]
1d4: ec 00 00 54 b.gt #28 <nonleaf_call+0x1c0>
1d8: 01 00 00 14 b #4 <nonleaf_call+0x1ac>
1dc: a8 03 5b f8 ldur x8, [x29, #-80]
1e0: 69 a6 40 b9 ldr w9, [x19, #164]
1e4: 08 c1 29 8b add x8, x8, w9, sxtw
1e8: 68 4e 00 f9 str x8, [x19, #152]
1ec: 06 00 00 14 b #24 <nonleaf_call+0x1d4>
1f0: a8 83 5a f8 ldur x8, [x29, #-88]
1f4: 09 21 00 91 add x9, x8, #8
1f8: a9 83 1a f8 stur x9, [x29, #-88]
1fc: 68 4e 00 f9 str x8, [x19, #152]
200: 01 00 00 14 b #4 <nonleaf_call+0x1d4>
204: 68 4e 40 f9 ldr x8, [x19, #152]
208: 09 01 40 b9 ldr w9, [x8]
20c: a9 03 1e b8 stur w9, [x29, #-32]
210: a8 63 01 d1 sub x8, x29, #88
214: 08 61 00 91 add x8, x8, #24
218: a9 03 5c b8 ldur w9, [x29, #-64]
21c: ea 03 09 2a mov w10, w9
220: 68 4a 00 f9 str x8, [x19, #144]
224: 6a 8e 00 b9 str w10, [x19, #140]
228: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x234>
22c: 01 00 00 14 b #4 <nonleaf_call+0x200>
230: 68 8e 40 b9 ldr w8, [x19, #140]
234: 09 21 00 11 add w9, w8, #8
238: 6a 4a 40 f9 ldr x10, [x19, #144]
23c: 49 01 00 b9 str w9, [x10]
240: 29 01 00 71 subs w9, w9, #0
244: 69 8a 00 b9 str w9, [x19, #136]
248: ec 00 00 54 b.gt #28 <nonleaf_call+0x234>
24c: 01 00 00 14 b #4 <nonleaf_call+0x220>
250: a8 03 5b f8 ldur x8, [x29, #-80]
254: 69 8e 40 b9 ldr w9, [x19, #140]
258: 08 c1 29 8b add x8, x8, w9, sxtw
25c: 68 42 00 f9 str x8, [x19, #128]
260: 06 00 00 14 b #24 <nonleaf_call+0x248>
264: a8 83 5a f8 ldur x8, [x29, #-88]
268: 09 21 00 91 add x9, x8, #8
26c: a9 83 1a f8 stur x9, [x29, #-88]
270: 68 42 00 f9 str x8, [x19, #128]
274: 01 00 00 14 b #4 <nonleaf_call+0x248>
278: 68 42 40 f9 ldr x8, [x19, #128]
27c: 09 01 40 b9 ldr w9, [x8]
280: a9 c3 1d b8 stur w9, [x29, #-36]
284: a8 63 01 d1 sub x8, x29, #88
288: 08 71 00 91 add x8, x8, #28
28c: a9 43 5c b8 ldur w9, [x29, #-60]
290: ea 03 09 2a mov w10, w9
294: 68 3e 00 f9 str x8, [x19, #120]
298: 6a 76 00 b9 str w10, [x19, #116]
29c: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x2a8>
2a0: 01 00 00 14 b #4 <nonleaf_call+0x274>
2a4: 68 76 40 b9 ldr w8, [x19, #116]
2a8: 09 41 00 11 add w9, w8, #16
2ac: 6a 3e 40 f9 ldr x10, [x19, #120]
2b0: 49 01 00 b9 str w9, [x10]
2b4: 29 01 00 71 subs w9, w9, #0
2b8: 69 72 00 b9 str w9, [x19, #112]
2bc: ec 00 00 54 b.gt #28 <nonleaf_call+0x2a8>
2c0: 01 00 00 14 b #4 <nonleaf_call+0x294>
2c4: a8 83 5b f8 ldur x8, [x29, #-72]
2c8: 69 76 40 b9 ldr w9, [x19, #116]
2cc: 08 c1 29 8b add x8, x8, w9, sxtw
2d0: 68 36 00 f9 str x8, [x19, #104]
2d4: 06 00 00 14 b #24 <nonleaf_call+0x2bc>
2d8: a8 83 5a f8 ldur x8, [x29, #-88]
2dc: 09 21 00 91 add x9, x8, #8
2e0: a9 83 1a f8 stur x9, [x29, #-88]
2e4: 68 36 00 f9 str x8, [x19, #104]
2e8: 01 00 00 14 b #4 <nonleaf_call+0x2bc>
2ec: 68 36 40 f9 ldr x8, [x19, #104]
2f0: 00 01 40 bd ldr s0, [x8]
2f4: a0 83 1c bc stur s0, [x29, #-56]
2f8: a8 63 01 d1 sub x8, x29, #88
2fc: 08 61 00 91 add x8, x8, #24
300: a9 03 5c b8 ldur w9, [x29, #-64]
304: ea 03 09 2a mov w10, w9
308: 68 32 00 f9 str x8, [x19, #96]
30c: 6a 5e 00 b9 str w10, [x19, #92]
310: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x31c>
314: 01 00 00 14 b #4 <nonleaf_call+0x2e8>
318: 68 5e 40 b9 ldr w8, [x19, #92]
31c: 09 21 00 11 add w9, w8, #8
320: 6a 32 40 f9 ldr x10, [x19, #96]
324: 49 01 00 b9 str w9, [x10]
328: 29 01 00 71 subs w9, w9, #0
32c: 69 5a 00 b9 str w9, [x19, #88]
330: ec 00 00 54 b.gt #28 <nonleaf_call+0x31c>
334: 01 00 00 14 b #4 <nonleaf_call+0x308>
338: a8 03 5b f8 ldur x8, [x29, #-80]
33c: 69 5e 40 b9 ldr w9, [x19, #92]
340: 08 c1 29 8b add x8, x8, w9, sxtw
344: 68 2a 00 f9 str x8, [x19, #80]
348: 06 00 00 14 b #24 <nonleaf_call+0x330>
34c: a8 83 5a f8 ldur x8, [x29, #-88]
350: 09 21 00 91 add x9, x8, #8
354: a9 83 1a f8 stur x9, [x29, #-88]
358: 68 2a 00 f9 str x8, [x19, #80]
35c: 01 00 00 14 b #4 <nonleaf_call+0x330>
360: 68 2a 40 f9 ldr x8, [x19, #80]
364: 09 01 40 b9 ldr w9, [x8]
368: a9 83 1d b8 stur w9, [x29, #-40]
36c: a8 63 01 d1 sub x8, x29, #88
370: 08 61 00 91 add x8, x8, #24
374: a9 03 5c b8 ldur w9, [x29, #-64]
378: ea 03 09 2a mov w10, w9
37c: 68 26 00 f9 str x8, [x19, #72]
380: 6a 46 00 b9 str w10, [x19, #68]
384: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x390>
388: 01 00 00 14 b #4 <nonleaf_call+0x35c>
38c: 68 46 40 b9 ldr w8, [x19, #68]
390: 09 21 00 11 add w9, w8, #8
394: 6a 26 40 f9 ldr x10, [x19, #72]
398: 49 01 00 b9 str w9, [x10]
39c: 29 01 00 71 subs w9, w9, #0
3a0: 69 42 00 b9 str w9, [x19, #64]
3a4: ec 00 00 54 b.gt #28 <nonleaf_call+0x390>
3a8: 01 00 00 14 b #4 <nonleaf_call+0x37c>
3ac: a8 03 5b f8 ldur x8, [x29, #-80]
3b0: 69 46 40 b9 ldr w9, [x19, #68]
3b4: 08 c1 29 8b add x8, x8, w9, sxtw
3b8: 68 1e 00 f9 str x8, [x19, #56]
3bc: 06 00 00 14 b #24 <nonleaf_call+0x3a4>
3c0: a8 83 5a f8 ldur x8, [x29, #-88]
3c4: 09 21 00 91 add x9, x8, #8
3c8: a9 83 1a f8 stur x9, [x29, #-88]
3cc: 68 1e 00 f9 str x8, [x19, #56]
3d0: 01 00 00 14 b #4 <nonleaf_call+0x3a4>
3d4: 68 1e 40 f9 ldr x8, [x19, #56]
3d8: 09 01 40 b9 ldr w9, [x8]
3dc: a9 43 1d b8 stur w9, [x29, #-44]
3e0: a8 63 01 d1 sub x8, x29, #88
3e4: 08 61 00 91 add x8, x8, #24
3e8: a9 03 5c b8 ldur w9, [x29, #-64]
3ec: ea 03 09 2a mov w10, w9
3f0: 68 1a 00 f9 str x8, [x19, #48]
3f4: 6a 2e 00 b9 str w10, [x19, #44]
3f8: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x404>
3fc: 01 00 00 14 b #4 <nonleaf_call+0x3d0>
400: 68 2e 40 b9 ldr w8, [x19, #44]
404: 09 21 00 11 add w9, w8, #8
408: 6a 1a 40 f9 ldr x10, [x19, #48]
40c: 49 01 00 b9 str w9, [x10]
410: 29 01 00 71 subs w9, w9, #0
414: 69 2a 00 b9 str w9, [x19, #40]
418: ec 00 00 54 b.gt #28 <nonleaf_call+0x404>
41c: 01 00 00 14 b #4 <nonleaf_call+0x3f0>
420: a8 03 5b f8 ldur x8, [x29, #-80]
424: 69 2e 40 b9 ldr w9, [x19, #44]
428: 08 c1 29 8b add x8, x8, w9, sxtw
42c: 68 12 00 f9 str x8, [x19, #32]
430: 06 00 00 14 b #24 <nonleaf_call+0x418>
434: a8 83 5a f8 ldur x8, [x29, #-88]
438: 09 21 00 91 add x9, x8, #8
43c: a9 83 1a f8 stur x9, [x29, #-88]
440: 68 12 00 f9 str x8, [x19, #32]
444: 01 00 00 14 b #4 <nonleaf_call+0x418>
448: 68 12 40 f9 ldr x8, [x19, #32]
44c: 09 01 40 b9 ldr w9, [x8]
450: a9 03 1d b8 stur w9, [x29, #-48]
454: a8 63 01 d1 sub x8, x29, #88
458: 08 61 00 91 add x8, x8, #24
45c: a9 03 5c b8 ldur w9, [x29, #-64]
460: ea 03 09 2a mov w10, w9
464: 68 0e 00 f9 str x8, [x19, #24]
468: 6a 16 00 b9 str w10, [x19, #20]
46c: e9 01 f8 36 tbz w9, #31, #60 <nonleaf_call+0x478>
470: 01 00 00 14 b #4 <nonleaf_call+0x444>
474: 68 16 40 b9 ldr w8, [x19, #20]
478: 09 21 00 11 add w9, w8, #8
47c: 6a 0e 40 f9 ldr x10, [x19, #24]
480: 49 01 00 b9 str w9, [x10]
484: 29 01 00 71 subs w9, w9, #0
488: 69 12 00 b9 str w9, [x19, #16]
48c: ec 00 00 54 b.gt #28 <nonleaf_call+0x478>
490: 01 00 00 14 b #4 <nonleaf_call+0x464>
494: a8 03 5b f8 ldur x8, [x29, #-80]
498: 69 16 40 b9 ldr w9, [x19, #20]
49c: 08 c1 29 8b add x8, x8, w9, sxtw
4a0: 68 06 00 f9 str x8, [x19, #8]
4a4: 06 00 00 14 b #24 <nonleaf_call+0x48c>
4a8: a8 83 5a f8 ldur x8, [x29, #-88]
4ac: 09 21 00 91 add x9, x8, #8
4b0: a9 83 1a f8 stur x9, [x29, #-88]
4b4: 68 06 00 f9 str x8, [x19, #8]
4b8: 01 00 00 14 b #4 <nonleaf_call+0x48c>
4bc: 68 06 40 f9 ldr x8, [x19, #8]
4c0: 09 01 40 b9 ldr w9, [x8]
4c4: a9 c3 1c b8 stur w9, [x29, #-52]
4c8: e8 03 00 91 mov x8, sp
4cc: 0a 81 03 f1 subs x10, x8, #224
4d0: 5f 01 00 91 mov sp, x10
4d4: 89 09 80 52 mov w9, #76
4d8: 09 01 12 38 sturb w9, [x8, #-224]
4dc: a0 83 5e b8 ldur w0, [x29, #-24]
4e0: a1 43 5e b8 ldur w1, [x29, #-28]
4e4: a2 03 5e b8 ldur w2, [x29, #-32]
4e8: a3 c3 5d b8 ldur w3, [x29, #-36]
4ec: a0 83 5c bc ldur s0, [x29, #-56]
4f0: a4 83 5d b8 ldur w4, [x29, #-40]
4f4: a5 43 5d b8 ldur w5, [x29, #-44]
4f8: a6 03 5d b8 ldur w6, [x29, #-48]
4fc: a7 c3 5c b8 ldur w7, [x29, #-52]
500: c0 fe ff 97 bl #-1280 <leaf_call>
504: bf 43 00 d1 sub sp, x29, #16
508: fd 7b 41 a9 ldp x29, x30, [sp, #16]
50c: fc 4f c2 a8 ldp x28, x19, [sp], #32
510: c0 03 5f d6 ret
0000000000000514 main:
514: ff 83 00 d1 sub sp, sp, #32
518: fd 7b 01 a9 stp x29, x30, [sp, #16]
51c: fd 43 00 91 add x29, sp, #16
520: 08 00 80 52 mov w8, #0
524: e1 03 00 32 orr w1, wzr, #0x1
528: e2 03 1f 32 orr w2, wzr, #0x2
52c: e3 07 00 32 orr w3, wzr, #0x3
530: e4 03 1e 32 orr w4, wzr, #0x4
534: 89 02 e8 d2 mov x9, #4617315517961601024
538: 20 01 67 9e fmov d0, x9
53c: e5 07 1f 32 orr w5, wzr, #0x6
540: e6 0b 00 32 orr w6, wzr, #0x7
544: e7 03 1d 32 orr w7, wzr, #0x8
548: 2a 01 80 52 mov w10, #9
54c: bf c3 1f b8 stur wzr, [x29, #-4]
550: e0 03 08 2a mov w0, w8
554: e9 03 00 91 mov x9, sp
558: 2a 01 00 b9 str w10, [x9]
55c: e8 0b 00 b9 str w8, [sp, #8]
560: b4 fe ff 97 bl #-1328 <nonleaf_call>
564: e0 0b 40 b9 ldr w0, [sp, #8]
568: fd 7b 41 a9 ldp x29, x30, [sp, #16]
56c: ff 83 00 91 add sp, sp, #32
570: c0 03 5f d6 ret
; ---------- 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 freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff c3 00 d1 sub sp, sp, #48
4: e4 13 00 f9 str x4, [sp, #32]
8: e5 17 00 f9 str x5, [sp, #40]
c: e0 1f 00 b9 str w0, [sp, #28]
10: e1 1b 00 b9 str w1, [sp, #24]
14: e2 17 00 b9 str w2, [sp, #20]
18: e3 13 00 b9 str w3, [sp, #16]
1c: e6 0f 00 b9 str w6, [sp, #12]
20: e7 0b 00 b9 str w7, [sp, #8]
24: ff c3 00 91 add sp, sp, #48
28: c0 03 5f d6 ret
000000000000002c nonleaf_call:
2c: ff c3 02 d1 sub sp, sp, #176
30: fd 7b 0a a9 stp x29, x30, [sp, #160]
34: fd 83 02 91 add x29, sp, #160
38: a8 13 40 b9 ldr w8, [x29, #16]
3c: 09 00 80 52 mov w9, #0
40: 8a 0c 80 d2 mov x10, #100
44: 8b 09 80 52 mov w11, #76
48: ec 43 00 91 add x12, sp, #16
4c: a5 03 1f f8 stur x5, [x29, #-16]
50: a6 83 1f f8 stur x6, [x29, #-8]
54: a0 c3 1e b8 stur w0, [x29, #-20]
58: a1 83 1e b8 stur w1, [x29, #-24]
5c: a2 43 1e b8 stur w2, [x29, #-28]
60: a3 03 1e b8 stur w3, [x29, #-32]
64: a4 c3 1d b8 stur w4, [x29, #-36]
68: a7 83 1d b8 stur w7, [x29, #-40]
6c: a8 43 1d b8 stur w8, [x29, #-44]
70: e0 03 0c aa mov x0, x12
74: e1 03 09 2a mov w1, w9
78: e2 03 0a aa mov x2, x10
7c: eb 0f 00 b9 str w11, [sp, #12]
80: ec 03 00 f9 str x12, [sp]
84: 00 00 00 94 bl #0 <nonleaf_call+0x58>
88: e8 0f 40 b9 ldr w8, [sp, #12]
8c: ea 03 40 f9 ldr x10, [sp]
90: 48 01 00 39 strb w8, [x10]
94: a0 83 5e b8 ldur w0, [x29, #-24]
98: a1 43 5e b8 ldur w1, [x29, #-28]
9c: a2 03 5e b8 ldur w2, [x29, #-32]
a0: a3 c3 5d b8 ldur w3, [x29, #-36]
a4: a6 83 5d b8 ldur w6, [x29, #-40]
a8: a7 43 5d b8 ldur w7, [x29, #-44]
ac: ac 03 5f f8 ldur x12, [x29, #-16]
b0: a5 83 5f f8 ldur x5, [x29, #-8]
b4: e4 03 0c aa mov x4, x12
b8: d2 ff ff 97 bl #-184 <leaf_call>
bc: fd 7b 4a a9 ldp x29, x30, [sp, #160]
c0: ff c3 02 91 add sp, sp, #176
c4: c0 03 5f d6 ret
00000000000000c8 main:
c8: ff 03 01 d1 sub sp, sp, #64 ; |
cc: fd 7b 03 a9 stp x29, x30, [sp, #48] ; | prolog
d0: fd c3 00 91 add x29, sp, #48 ; |
d4: 08 00 80 52 mov w8, #0 ; prep arg 0
d8: a9 00 80 52 mov w9, #5 ; | i
dc: ea 07 1f 32 orr w10, wzr, #0x6 ; | prep local struct A's data j
e0: eb 0b 40 b2 orr x11, xzr, #0x7 ; | l
e4: e1 03 00 32 orr w1, wzr, #0x1 ; arg 1
e8: e2 03 1f 32 orr w2, wzr, #0x2 ; arg 2
ec: e3 07 00 32 orr w3, wzr, #0x3 ; arg 3
f0: e4 03 1e 32 orr w4, wzr, #0x4 ; arg 4
f4: e7 03 1d 32 orr w7, wzr, #0x8 ; arg 6
f8: 2c 01 80 52 mov w12, #9 ; prep arg 7
fc: ed 63 00 91 add x13, sp, #24 ; used for indirection below, a bit pointless
100: bf c3 1f b8 stur wzr, [x29, #-4] ; zero 4 bytes in local area @@@ unsure why
104: a9 01 00 b9 str w9, [x13] ; |
108: ea 1f 00 b9 str w10, [sp, #28] ; | write struct A to local area
10c: eb 13 00 f9 str x11, [sp, #32] ; |
110: eb 0f 40 f9 ldr x11, [sp, #24] ; 1st dword of struct A -> x11
114: ed 13 40 f9 ldr x13, [sp, #32] ; 2nd dword of struct A -> x13
118: e0 03 08 2a mov w0, w8 ; arg 0
11c: e5 03 0b aa mov x5, x11 ; |
120: e6 03 0d aa mov x6, x13 ; / arg 5 (struct A), passed in regs as 2 dwords
124: eb 03 00 91 mov x11, sp ; \
128: 6c 01 00 b9 str w12, [x11] ; | arg 7, pushed onto stack
12c: e8 17 00 b9 str w8, [sp, #20] ; prep return value, temp store on stack local area
130: bf ff ff 97 bl #-260 <nonleaf_call> ; return address -> r30/lr, and call
134: e0 17 40 b9 ldr w0, [sp, #20] ; return value (unsure why not just using immediate @@@)
138: fd 7b 43 a9 ldp x29, x30, [sp, #48] ; |
13c: ff 03 01 91 add sp, sp, #64 ; | epilog
140: c0 03 5f d6 ret ; |
; output from godbolt compiler explorer w/ msvc 19.14
|leaf_call| PROC
|$LN3|
sub sp,sp,#0x30
str w0,[sp]
str w1,[sp,#4]
str w2,[sp,#8]
str w3,[sp,#0xC]
str x4,[sp,#0x18]
str x5,[sp,#0x20]
str w6,[sp,#0x10]
str w7,[sp,#0x14]
add sp,sp,#0x30
ret
ENDP ; |leaf_call|
|nonleaf_call| PROC
|$LN3|
stp fp,lr,[sp,#-0x10]!
mov fp,sp
bl __security_push_cookie
sub sp,sp,#0x90
str w0,[sp,#0x14]
str w1,[sp,#0x10]
str w2,[sp,#0xC]
str w3,[sp,#8]
str w4,[sp,#4]
str x5,[sp,#0x18]
str x6,[sp,#0x20]
str w7,[sp]
mov w8,#0x4C
strb w8,[sp,#0x28]
add x9,sp,#0x29
mov x8,#0
stp x8,x8,[x9]
stp x8,x8,[x9,#0x10]
stp x8,x8,[x9,#0x20]
stp x8,x8,[x9,#0x30]
stp x8,x8,[x9,#0x40]
stp x8,x8,[x9,#0x50]
strh w8,[x9,#0x60]
strb w8,[x9,#0x62]
ldr w7,[sp,#0xB0]
ldr w6,[sp]
ldr x5,[sp,#0x20]
ldr x4,[sp,#0x18]
ldr w3,[sp,#4]
ldr w2,[sp,#8]
ldr w1,[sp,#0xC]
ldr w0,[sp,#0x10]
bl leaf_call
add sp,sp,#0x90
bl __security_pop_cookie
ldp fp,lr,[sp],#0x10
ret
ENDP ; |nonleaf_call|
|main| PROC
|$LN3|
stp fp,lr,[sp,#-0x10]! ; |
mov fp,sp ; |
bl __security_push_cookie ; | prolog
sub sp,sp,#0x20 ; /
mov w8,#5 ; \
str w8,[sp,#0x10] ; | i
mov w8,#6 ; |
str w8,[sp,#0x14] ; | write struct A to local area j
mov x8,#7 ; |
str x8,[sp,#0x18] ; / l
mov w8,#9 ; \
str w8,[sp] ; | arg 7, pushed onto stack
mov w7,#8 ; arg 6
ldr x6,[sp,#0x18] ; | l
ldr x5,[sp,#0x10] ; | arg 5 (struct A), passed in regs as 2 dwords i, j
mov w4,#4 ; arg 4
mov w3,#3 ; arg 3
mov w2,#2 ; arg 2
mov w1,#1 ; arg 1
mov w0,#0 ; arg 0
bl nonleaf_call ; return address -> r30/lr, and call
mov w0,#0 ; return value
add sp,sp,#0x20 ; |
bl __security_pop_cookie ; | epilog
ldp fp,lr,[sp],#0x10 ; |
ret ; |
ENDP ; |main|
; ---------- 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 freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff 83 03 d1 sub sp, sp, #224
4: fe 6b 00 f9 str x30, [sp, #208]
8: e8 73 40 f9 ldr x8, [sp, #224]
c: e9 77 40 f9 ldr x9, [sp, #232]
10: ea 7b 40 f9 ldr x10, [sp, #240]
14: eb 7f 40 f9 ldr x11, [sp, #248]
18: ec 03 41 b9 ldr w12, [sp, #256]
1c: ed 0b 41 b9 ldr w13, [sp, #264]
20: ee 07 7e b2 orr x14, xzr, #0xc
24: ef 13 03 91 add x15, sp, #196
28: f0 c3 02 91 add x16, sp, #176
2c: f1 53 02 91 add x17, sp, #148
30: f2 03 02 91 add x18, sp, #128
34: e1 5b 00 f9 str x1, [sp, #176]
38: e2 5f 00 f9 str x2, [sp, #184]
3c: e0 5b 00 b9 str w0, [sp, #88]
40: e0 03 0f aa mov x0, x15
44: e1 03 10 aa mov x1, x16
48: e2 03 0e aa mov x2, x14
4c: e5 57 00 b9 str w5, [sp, #84]
50: e6 53 00 b9 str w6, [sp, #80]
54: e8 27 00 f9 str x8, [sp, #72]
58: e9 23 00 f9 str x9, [sp, #64]
5c: ea 1f 00 f9 str x10, [sp, #56]
60: eb 1b 00 f9 str x11, [sp, #48]
64: ec 2f 00 b9 str w12, [sp, #44]
68: ed 2b 00 b9 str w13, [sp, #40]
6c: e3 13 00 f9 str x3, [sp, #32]
70: e4 0f 00 f9 str x4, [sp, #24]
74: ee 0b 00 f9 str x14, [sp, #16]
78: f1 07 00 f9 str x17, [sp, #8]
7c: f2 03 00 f9 str x18, [sp]
80: 00 00 00 94 bl #0 <leaf_call+0x80>
84: e8 13 40 f9 ldr x8, [sp, #32]
88: e8 53 00 f9 str x8, [sp, #160]
8c: e9 0f 40 f9 ldr x9, [sp, #24]
90: e9 57 00 f9 str x9, [sp, #168]
94: ea 27 40 f9 ldr x10, [sp, #72]
98: ea 43 00 f9 str x10, [sp, #128]
9c: eb 23 40 f9 ldr x11, [sp, #64]
a0: eb 47 00 f9 str x11, [sp, #136]
a4: e0 07 40 f9 ldr x0, [sp, #8]
a8: e1 03 40 f9 ldr x1, [sp]
ac: e2 0b 40 f9 ldr x2, [sp, #16]
b0: 00 00 00 94 bl #0 <leaf_call+0xb0>
b4: e8 1f 40 f9 ldr x8, [sp, #56]
b8: e8 3b 00 f9 str x8, [sp, #112]
bc: e9 1b 40 f9 ldr x9, [sp, #48]
c0: e9 3f 00 f9 str x9, [sp, #120]
c4: ec 5b 40 b9 ldr w12, [sp, #88]
c8: ec 6f 00 b9 str w12, [sp, #108]
cc: ed 57 40 b9 ldr w13, [sp, #84]
d0: ed 6b 00 b9 str w13, [sp, #104]
d4: e5 53 40 b9 ldr w5, [sp, #80]
d8: e5 67 00 b9 str w5, [sp, #100]
dc: e6 2f 40 b9 ldr w6, [sp, #44]
e0: e6 63 00 b9 str w6, [sp, #96]
e4: e7 2b 40 b9 ldr w7, [sp, #40]
e8: e7 5f 00 b9 str w7, [sp, #92]
ec: fe 6b 40 f9 ldr x30, [sp, #208]
f0: ff 83 03 91 add sp, sp, #224
f4: c0 03 5f d6 ret
00000000000000f8 nonleaf_call:
f8: fc 67 bb a9 stp x28, x25, [sp, #-80]!
fc: f8 5f 01 a9 stp x24, x23, [sp, #16]
100: f6 57 02 a9 stp x22, x21, [sp, #32]
104: f4 4f 03 a9 stp x20, x19, [sp, #48]
108: fd 7b 04 a9 stp x29, x30, [sp, #64]
10c: fd 03 01 91 add x29, sp, #64
110: ff 43 08 d1 sub sp, sp, #528
114: a8 0b 40 f9 ldr x8, [x29, #16]
118: a9 0f 40 f9 ldr x9, [x29, #24]
11c: aa 13 40 f9 ldr x10, [x29, #32]
120: ab 17 40 f9 ldr x11, [x29, #40]
124: ac 33 40 b9 ldr w12, [x29, #48]
128: ad 3b 40 b9 ldr w13, [x29, #56]
12c: ee 07 7e b2 orr x14, xzr, #0xc
130: 0f 00 80 52 mov w15, #0
134: 90 0c 80 d2 mov x16, #100
138: 91 09 80 52 mov w17, #76
13c: b2 33 01 d1 sub x18, x29, #76
140: b3 83 01 d1 sub x19, x29, #96
144: b4 f3 01 d1 sub x20, x29, #124
148: b5 43 02 d1 sub x21, x29, #144
14c: f6 d3 04 91 add x22, sp, #308
150: f7 83 04 91 add x23, sp, #288
154: f8 43 04 91 add x24, sp, #272
158: a2 03 1a f8 stur x2, [x29, #-96]
15c: a3 83 1a f8 stur x3, [x29, #-88]
160: e0 0f 01 b9 str w0, [sp, #268]
164: e0 03 12 aa mov x0, x18
168: e1 0b 01 b9 str w1, [sp, #264]
16c: e1 03 13 aa mov x1, x19
170: e2 03 0e aa mov x2, x14
174: e6 07 01 b9 str w6, [sp, #260]
178: e7 03 01 b9 str w7, [sp, #256]
17c: e8 7f 00 f9 str x8, [sp, #248]
180: e9 7b 00 f9 str x9, [sp, #240]
184: ea 77 00 f9 str x10, [sp, #232]
188: eb 73 00 f9 str x11, [sp, #224]
18c: ec df 00 b9 str w12, [sp, #220]
190: ed db 00 b9 str w13, [sp, #216]
194: e4 6b 00 f9 str x4, [sp, #208]
198: e5 67 00 f9 str x5, [sp, #200]
19c: ee 63 00 f9 str x14, [sp, #192]
1a0: ef bf 00 b9 str w15, [sp, #188]
1a4: f0 5b 00 f9 str x16, [sp, #176]
1a8: f1 af 00 b9 str w17, [sp, #172]
1ac: f2 53 00 f9 str x18, [sp, #160]
1b0: f4 4f 00 f9 str x20, [sp, #152]
1b4: f5 4b 00 f9 str x21, [sp, #144]
1b8: f6 47 00 f9 str x22, [sp, #136]
1bc: f7 43 00 f9 str x23, [sp, #128]
1c0: f8 3f 00 f9 str x24, [sp, #120]
1c4: 00 00 00 94 bl #0 <nonleaf_call+0xcc>
1c8: e8 6b 40 f9 ldr x8, [sp, #208]
1cc: a8 03 19 f8 stur x8, [x29, #-112]
1d0: e9 67 40 f9 ldr x9, [sp, #200]
1d4: a9 83 19 f8 stur x9, [x29, #-104]
1d8: ea 7f 40 f9 ldr x10, [sp, #248]
1dc: aa 03 17 f8 stur x10, [x29, #-144]
1e0: eb 7b 40 f9 ldr x11, [sp, #240]
1e4: ab 83 17 f8 stur x11, [x29, #-136]
1e8: e0 4f 40 f9 ldr x0, [sp, #152]
1ec: e1 4b 40 f9 ldr x1, [sp, #144]
1f0: e2 63 40 f9 ldr x2, [sp, #192]
1f4: 00 00 00 94 bl #0 <nonleaf_call+0xfc>
1f8: e8 77 40 f9 ldr x8, [sp, #232]
1fc: a8 03 16 f8 stur x8, [x29, #-160]
200: e9 73 40 f9 ldr x9, [sp, #224]
204: a9 83 16 f8 stur x9, [x29, #-152]
208: ec 0f 41 b9 ldr w12, [sp, #268]
20c: ac c3 15 b8 stur w12, [x29, #-164]
210: ed 0b 41 b9 ldr w13, [sp, #264]
214: ad 83 15 b8 stur w13, [x29, #-168]
218: ef 07 41 b9 ldr w15, [sp, #260]
21c: af 43 15 b8 stur w15, [x29, #-172]
220: f1 03 41 b9 ldr w17, [sp, #256]
224: b1 03 15 b8 stur w17, [x29, #-176]
228: e6 df 40 b9 ldr w6, [sp, #220]
22c: a6 c3 14 b8 stur w6, [x29, #-180]
230: e7 db 40 b9 ldr w7, [sp, #216]
234: a7 83 14 b8 stur w7, [x29, #-184]
238: e0 47 40 f9 ldr x0, [sp, #136]
23c: f9 bf 40 b9 ldr w25, [sp, #188]
240: e1 03 19 2a mov w1, w25
244: e2 5b 40 f9 ldr x2, [sp, #176]
248: 00 00 00 94 bl #0 <nonleaf_call+0x150>
24c: ec af 40 b9 ldr w12, [sp, #172]
250: e8 47 40 f9 ldr x8, [sp, #136]
254: 0c 01 00 39 strb w12, [x8]
258: a0 83 55 b8 ldur w0, [x29, #-168]
25c: a5 43 55 b8 ldur w5, [x29, #-172]
260: a6 03 55 b8 ldur w6, [x29, #-176]
264: ad c3 54 b8 ldur w13, [x29, #-180]
268: af 83 54 b8 ldur w15, [x29, #-184]
26c: e9 43 40 f9 ldr x9, [sp, #128]
270: e0 77 00 b9 str w0, [sp, #116]
274: e0 03 09 aa mov x0, x9
278: e1 53 40 f9 ldr x1, [sp, #160]
27c: e2 63 40 f9 ldr x2, [sp, #192]
280: e5 73 00 b9 str w5, [sp, #112]
284: e6 6f 00 b9 str w6, [sp, #108]
288: ed 6b 00 b9 str w13, [sp, #104]
28c: ef 67 00 b9 str w15, [sp, #100]
290: 00 00 00 94 bl #0 <nonleaf_call+0x198>
294: e8 93 40 f9 ldr x8, [sp, #288]
298: e9 97 40 f9 ldr x9, [sp, #296]
29c: aa 03 59 f8 ldur x10, [x29, #-112]
2a0: ab 83 59 f8 ldur x11, [x29, #-104]
2a4: e0 3f 40 f9 ldr x0, [sp, #120]
2a8: e1 4f 40 f9 ldr x1, [sp, #152]
2ac: e2 63 40 f9 ldr x2, [sp, #192]
2b0: e8 2f 00 f9 str x8, [sp, #88]
2b4: e9 2b 00 f9 str x9, [sp, #80]
2b8: ea 27 00 f9 str x10, [sp, #72]
2bc: eb 23 00 f9 str x11, [sp, #64]
2c0: 00 00 00 94 bl #0 <nonleaf_call+0x1c8>
2c4: e8 8b 40 f9 ldr x8, [sp, #272]
2c8: e9 8f 40 f9 ldr x9, [sp, #280]
2cc: aa 03 56 f8 ldur x10, [x29, #-160]
2d0: ab 83 56 f8 ldur x11, [x29, #-152]
2d4: ee 2f 40 f9 ldr x14, [sp, #88]
2d8: f0 2b 40 f9 ldr x16, [sp, #80]
2dc: f2 27 40 f9 ldr x18, [sp, #72]
2e0: e0 23 40 f9 ldr x0, [sp, #64]
2e4: ec 77 40 b9 ldr w12, [sp, #116]
2e8: e0 1f 00 f9 str x0, [sp, #56]
2ec: e0 03 0c 2a mov w0, w12
2f0: e1 03 0e aa mov x1, x14
2f4: e2 03 10 aa mov x2, x16
2f8: e3 03 12 aa mov x3, x18
2fc: e4 1f 40 f9 ldr x4, [sp, #56]
300: e5 73 40 b9 ldr w5, [sp, #112]
304: e6 6f 40 b9 ldr w6, [sp, #108]
308: ee 03 00 91 mov x14, sp
30c: c8 01 00 f9 str x8, [x14]
310: e8 03 00 91 mov x8, sp
314: 09 05 00 f9 str x9, [x8, #8]
318: e8 03 00 91 mov x8, sp
31c: 0a 09 00 f9 str x10, [x8, #16]
320: e8 03 00 91 mov x8, sp
324: 0b 0d 00 f9 str x11, [x8, #24]
328: e8 03 00 91 mov x8, sp
32c: ed 6b 40 b9 ldr w13, [sp, #104]
330: 0d 21 00 b9 str w13, [x8, #32]
334: e8 03 00 91 mov x8, sp
338: ef 67 40 b9 ldr w15, [sp, #100]
33c: 0f 29 00 b9 str w15, [x8, #40]
340: 30 ff ff 97 bl #-832 <leaf_call>
344: ff 43 08 91 add sp, sp, #528
348: fd 7b 44 a9 ldp x29, x30, [sp, #64]
34c: f4 4f 43 a9 ldp x20, x19, [sp, #48]
350: f6 57 42 a9 ldp x22, x21, [sp, #32]
354: f8 5f 41 a9 ldp x24, x23, [sp, #16]
358: fc 67 c5 a8 ldp x28, x25, [sp], #80
35c: c0 03 5f d6 ret
0000000000000360 main:
360: ff c3 04 d1 sub sp, sp, #304
364: fc 4f 11 a9 stp x28, x19, [sp, #272]
368: fd 7b 12 a9 stp x29, x30, [sp, #288]
36c: fd 83 04 91 add x29, sp, #288
370: 08 00 80 52 mov w8, #0
374: e9 03 1f 32 orr w9, wzr, #0x2
378: ea 07 00 32 orr w10, wzr, #0x3
37c: 0b 10 a8 52 mov w11, #1082130432
380: 60 01 27 1e fmov s0, w11
384: 8c 02 e8 d2 mov x12, #4617315517961601024
388: 81 01 67 9e fmov d1, x12
38c: ec 07 7f b2 orr x12, xzr, #0x6
390: 2b 01 80 52 mov w11, #9
394: 4d 01 80 52 mov w13, #10
398: 0e 26 a8 52 mov w14, #1093664768
39c: c2 01 27 1e fmov s2, w14
3a0: 0f 05 e8 d2 mov x15, #4622945017495814144
3a4: e3 01 67 9e fmov d3, x15
3a8: af 01 80 d2 mov x15, #13
3ac: f0 07 7e b2 orr x16, xzr, #0xc
3b0: e1 03 00 32 orr w1, wzr, #0x1
3b4: e6 0b 00 32 orr w6, wzr, #0x7
3b8: e7 03 1d 32 orr w7, wzr, #0x8
3bc: ee 0b 1f 32 orr w14, wzr, #0xe
3c0: f1 0f 00 32 orr w17, wzr, #0xf
3c4: b2 83 00 d1 sub x18, x29, #32
3c8: a0 c3 00 d1 sub x0, x29, #48
3cc: a2 f3 00 d1 sub x2, x29, #60
3d0: a3 43 01 d1 sub x3, x29, #80
3d4: a4 83 01 d1 sub x4, x29, #96
3d8: a5 c3 01 d1 sub x5, x29, #112
3dc: bf c3 1e b8 stur wzr, [x29, #-20]
3e0: 49 02 00 b9 str w9, [x18]
3e4: aa 43 1e b8 stur w10, [x29, #-28]
3e8: a0 83 1e bc stur s0, [x29, #-24]
3ec: 01 00 00 fd str d1, [x0]
3f0: ac 83 1d f8 stur x12, [x29, #-40]
3f4: 4b 00 00 b9 str w11, [x2]
3f8: ad 83 1c b8 stur w13, [x29, #-56]
3fc: a2 c3 1c bc stur s2, [x29, #-52]
400: 63 00 00 fd str d3, [x3]
404: af 83 1b f8 stur x15, [x29, #-72]
408: e0 03 04 aa mov x0, x4
40c: a1 c3 18 b8 stur w1, [x29, #-116]
410: e1 03 12 aa mov x1, x18
414: a2 03 18 f8 stur x2, [x29, #-128]
418: e2 03 10 aa mov x2, x16
41c: a8 c3 17 b8 stur w8, [x29, #-132]
420: f0 4b 00 f9 str x16, [sp, #144]
424: e6 8f 00 b9 str w6, [sp, #140]
428: e7 8b 00 b9 str w7, [sp, #136]
42c: ee 87 00 b9 str w14, [sp, #132]
430: f1 83 00 b9 str w17, [sp, #128]
434: e5 3f 00 f9 str x5, [sp, #120]
438: 00 00 00 94 bl #0 <main+0xd8>
43c: ac 03 5a f8 ldur x12, [x29, #-96]
440: af 83 5a f8 ldur x15, [x29, #-88]
444: b0 03 5d f8 ldur x16, [x29, #-48]
448: b2 83 5d f8 ldur x18, [x29, #-40]
44c: e0 3f 40 f9 ldr x0, [sp, #120]
450: a1 03 58 f8 ldur x1, [x29, #-128]
454: e2 4b 40 f9 ldr x2, [sp, #144]
458: ec 3b 00 f9 str x12, [sp, #112]
45c: ef 37 00 f9 str x15, [sp, #104]
460: f0 33 00 f9 str x16, [sp, #96]
464: f2 2f 00 f9 str x18, [sp, #88]
468: 00 00 00 94 bl #0 <main+0x108>
46c: ac 03 59 f8 ldur x12, [x29, #-112]
470: af 83 59 f8 ldur x15, [x29, #-104]
474: b0 03 5b f8 ldur x16, [x29, #-80]
478: b2 83 5b f8 ldur x18, [x29, #-72]
47c: e0 3b 40 f9 ldr x0, [sp, #112]
480: e1 37 40 f9 ldr x1, [sp, #104]
484: e2 33 40 f9 ldr x2, [sp, #96]
488: e3 2f 40 f9 ldr x3, [sp, #88]
48c: a8 c3 57 b8 ldur w8, [x29, #-132]
490: e0 2b 00 f9 str x0, [sp, #80]
494: e0 03 08 2a mov w0, w8
498: a9 c3 58 b8 ldur w9, [x29, #-116]
49c: e1 27 00 f9 str x1, [sp, #72]
4a0: e1 03 09 2a mov w1, w9
4a4: e4 2b 40 f9 ldr x4, [sp, #80]
4a8: e2 23 00 f9 str x2, [sp, #64]
4ac: e2 03 04 aa mov x2, x4
4b0: e5 27 40 f9 ldr x5, [sp, #72]
4b4: e3 1f 00 f9 str x3, [sp, #56]
4b8: e3 03 05 aa mov x3, x5
4bc: e4 23 40 f9 ldr x4, [sp, #64]
4c0: e5 1f 40 f9 ldr x5, [sp, #56]
4c4: e6 8f 40 b9 ldr w6, [sp, #140]
4c8: e7 8b 40 b9 ldr w7, [sp, #136]
4cc: f3 03 00 91 mov x19, sp
4d0: 6c 02 00 f9 str x12, [x19]
4d4: ec 03 00 91 mov x12, sp
4d8: 8f 05 00 f9 str x15, [x12, #8]
4dc: ec 03 00 91 mov x12, sp
4e0: 90 09 00 f9 str x16, [x12, #16]
4e4: ec 03 00 91 mov x12, sp
4e8: 92 0d 00 f9 str x18, [x12, #24]
4ec: ec 03 00 91 mov x12, sp
4f0: ea 87 40 b9 ldr w10, [sp, #132]
4f4: 8a 21 00 b9 str w10, [x12, #32]
4f8: ec 03 00 91 mov x12, sp
4fc: eb 83 40 b9 ldr w11, [sp, #128]
500: 8b 29 00 b9 str w11, [x12, #40]
504: fd fe ff 97 bl #-1036 <nonleaf_call>
508: a0 c3 57 b8 ldur w0, [x29, #-132]
50c: fd 7b 52 a9 ldp x29, x30, [sp, #288]
510: fc 4f 51 a9 ldp x28, x19, [sp, #272]
514: ff c3 04 91 add sp, sp, #304
518: c0 03 5f d6 ret
; ---------- returning long long ---------->
;
; long long f()
; {
; return 7171LL;
; }
;
; int main()
; {
; return (int)f();
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 f:
0: 60 80 83 d2 mov x0, #7171
4: c0 03 5f d6 ret
0000000000000008 main:
8: ff 83 00 d1 sub sp, sp, #32
c: fd 7b 01 a9 stp x29, x30, [sp, #16]
10: fd 43 00 91 add x29, sp, #16
14: bf c3 1f b8 stur wzr, [x29, #-4]
18: fa ff ff 97 bl #-24 <f>
1c: e8 03 00 2a mov w8, w0
20: e0 03 08 2a mov w0, w8
24: fd 7b 41 a9 ldp x29, x30, [sp, #16]
28: ff 83 00 91 add sp, sp, #32
2c: c0 03 5f d6 ret
; ---------- passing structs with only fp parts ---------->
;
; struct A { float a; };
; struct B { float a, b; };
; struct C { float a, b, c; };
; struct D { double a; };
; struct E { double a, b; };
; struct F { double a, b, c; };
;
; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f)
; {
; }
;
; int main()
; {
; leaf_call((struct A){1.f}, (struct B){2.f,3.f}, (struct C){4.f,5.f,6.f}, (struct D){1.}, (struct E){2.,3.}, (struct F){4.,5.,6.});
; return 0;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff 43 01 d1 sub sp, sp, #80
4: e7 33 40 fd ldr d7, [sp, #96]
8: f0 37 40 fd ldr d16, [sp, #104]
c: f1 3b 40 fd ldr d17, [sp, #112]
10: f2 2b 40 fd ldr d18, [sp, #80]
14: f3 2f 40 fd ldr d19, [sp, #88]
18: e0 4b 00 bd str s0, [sp, #72]
1c: e2 47 00 bd str s2, [sp, #68]
20: e1 43 00 bd str s1, [sp, #64]
24: e5 3b 00 bd str s5, [sp, #56]
28: e4 37 00 bd str s4, [sp, #52]
2c: e3 33 00 bd str s3, [sp, #48]
30: e6 17 00 fd str d6, [sp, #40]
34: f3 13 00 fd str d19, [sp, #32]
38: f2 0f 00 fd str d18, [sp, #24]
3c: f1 0b 00 fd str d17, [sp, #16]
40: f0 07 00 fd str d16, [sp, #8]
44: e7 03 00 fd str d7, [sp]
48: ff 43 01 91 add sp, sp, #80
4c: c0 03 5f d6 ret
0000000000000050 main:
50: ff 43 02 d1 sub sp, sp, #144 ; |
54: fd 7b 08 a9 stp x29, x30, [sp, #128] ; | prolog
58: fd 03 02 91 add x29, sp, #128 ; /
5c: e8 03 1f 2a mov w8, wzr ; \ | |
60: a8 c3 1f b8 stur w8, [x29, #-4] ; | | | zero 4 bytes in local area @@@ struct padding?
64: e9 1b 09 32 orr w9, wzr, #0x3f800000 ; | struct A 1.f |
68: a9 83 1f b8 stur w9, [x29, #-8] ; / |
6c: e9 03 02 32 orr w9, wzr, #0x40000000 ; \ 2.f |
70: a9 03 1f b8 stur w9, [x29, #-16] ; | |
74: 09 08 a8 52 mov w9, #1077936128 ; | struct B 3.f |
78: a9 43 1f b8 stur w9, [x29, #-12] ; / |
7c: 09 10 a8 52 mov w9, #1082130432 ; \ 4.f |
80: a9 03 1e b8 stur w9, [x29, #-32] ; | |
84: 09 14 a8 52 mov w9, #1084227584 ; | 5.f |
88: a9 43 1e b8 stur w9, [x29, #-28] ; | struct C | write local struct data
8c: 09 18 a8 52 mov w9, #1086324736 ; | 6.f |
90: a9 83 1e b8 stur w9, [x29, #-24] ; / |
94: ea 27 4c b2 orr x10, xzr, #0x3ff0000000000000 ; \ 1.0 |
98: aa 83 1d f8 stur x10, [x29, #-40] ; / struct D |
9c: ea 03 42 b2 orr x10, xzr, #0x4000000000000000 ; \ 2.0 |
a0: aa 83 1c f8 stur x10, [x29, #-56] ; | |
a4: 0a 01 e8 d2 mov x10, #4613937818241073152 ; | struct E 3.0 |
a8: aa 03 1d f8 stur x10, [x29, #-48] ; / |
ac: 0a 02 e8 d2 mov x10, #4616189618054758400 ; \ 4.0 |
b0: ea 1b 00 f9 str x10, [sp, #48] ; | |
b4: 8a 02 e8 d2 mov x10, #4617315517961601024 ; | struct F 5.0 |
b8: ea 1f 00 f9 str x10, [sp, #56] ; | |
bc: 0a 03 e8 d2 mov x10, #4618441417868443648 ; | 6.0 |
c0: ea 23 00 f9 str x10, [sp, #64] ; / |
c4: a0 83 5f bc ldur s0, [x29, #-8] ; arg 0 (struct A), via reg
c8: a2 43 5f bc ldur s2, [x29, #-12] ; |
cc: a1 03 5f bc ldur s1, [x29, #-16] ; / arg 1 (struct B), via reg
d0: a5 83 5e bc ldur s5, [x29, #-24] ; \
d4: a4 43 5e bc ldur s4, [x29, #-28] ; | arg 2 (struct C), via reg
d8: a3 03 5e bc ldur s3, [x29, #-32] ; /
dc: a6 83 5d fc ldur d6, [x29, #-40] ; arg 3 (struct D)
e0: a7 83 5c fc ldur d7, [x29, #-56] ; |
e4: b0 03 5d fc ldur d16, [x29, #-48] ; / prep arg 4 (struct E), note d7 is *not* used to pass, but just a scratch reg
e8: f1 1b 40 fd ldr d17, [sp, #48] ; \
ec: f2 1f 40 fd ldr d18, [sp, #56] ; | prep arg 5 (struct F)
f0: f3 23 40 fd ldr d19, [sp, #64] ; /
f4: ea 03 00 91 mov x10, sp ; sp in x10, for below indirections (a bit pointless)
f8: 53 11 00 fd str d19, [x10, #32] ; \
fc: 52 0d 00 fd str d18, [x10, #24] ; | arg 5 (struct F), via stack
100: 51 09 00 fd str d17, [x10, #16] ; /
104: 50 05 00 fd str d16, [x10, #8] ; \ arg 4 (struct E), via stack (not split across regs and stack)
108: 47 01 00 fd str d7, [x10] ; |
10c: e8 2f 00 b9 str w8, [sp, #44] ; prep return value, temp store on stack local area
110: bc ff ff 97 bl #-272 <leaf_call> ; return address -> r30/lr, and call
114: e0 2f 40 b9 ldr w0, [sp, #44] ; return value (unsure why not just using immediate @@@)
118: fd 7b 48 a9 ldp x29, x30, [sp, #128] ; |
11c: ff 43 02 91 add sp, sp, #144 ; | epilog
120: c0 03 5f d6 ret ; |
; output from godbolt compiler explorer w/ msvc 19.14
|leaf_call| PROC
|$LN3|
sub sp,sp,#0x30
str s0,[sp]
str s1,[sp,#8]
str s2,[sp,#0xC]
str s3,[sp,#0x18]
str s4,[sp,#0x1C]
str s5,[sp,#0x20]
str d6,[sp,#0x10]
add sp,sp,#0x30
ret
ENDP ; |leaf_call|
|main| PROC
|$LN3|
stp fp,lr,[sp,#-0x60]! ; |
mov fp,sp ; | prolog
sub sp,sp,#0x30 ; /
fmov s16,#1 ; \ struct A 1.f |
str s16,[sp,#0x40] ; / |
fmov s16,#2 ; \ 2.f |
str s16,[sp,#0x48] ; | |
fmov s16,#3 ; | struct B 3.f |
str s16,[sp,#0x4C] ; / |
fmov s16,#4 ; \ 4.f |
str s16,[sp,#0x58] ; | |
fmov s16,#5 ; | 5.f |
str s16,[sp,#0x5C] ; | struct C |
fmov s16,#6 ; | 6.f |
str s16,[sp,#0x60] ; / | write local struct data
fmov d16,#1 ; \ 1.0 |
str d16,[sp,#0x50] ; / struct D |
fmov d16,#2 ; \ 2.0 |
str d16,[sp,#0x68] ; | |
fmov d16,#3 ; | struct E 3.0 |
str d16,[sp,#0x70] ; / |
fmov d16,#4 ; \ 4.0 |
str d16,[sp,#0x78] ; | |
fmov d16,#5 ; | struct F 5.0 |
str d16,[sp,#0x80] ; | |
fmov d16,#6 ; | 6.0 |
str d16,[sp,#0x88] ; / |
mov x10,sp ; write ptr (top of stack)
add x8,sp,#0x68 ; read ptr (beg of struct E)
ldp x9,x8,[x8] ; \
stp x9,x8,[x10] ; / arg 4 (struct E), via stack (not split across regs and stack)
add x11,sp,#0x10 ; write ptr (top of stack + 16)
add x10,sp,#0x78 ; read ptr (beg of struct F)
ldp x9,x8,[x10] ; \
stp x9,x8,[x11] ; | arg 5 (struct F), via stack
ldr x8,[x10,#0x10] ; |
str x8,[x11,#0x10] ; /
ldr d6,[sp,#0x50] ; arg 3 (struct D), via reg
ldr s5,[sp,#0x60] ; \
ldr s4,[sp,#0x5C] ; | arg 2 (struct C), via reg
ldr s3,[sp,#0x58] ; /
ldr s2,[sp,#0x4C] ; \
ldr s1,[sp,#0x48] ; / arg 1 (struct B), via reg
ldr s0,[sp,#0x40] ; arg 0 (struct A), via reg
bl leaf_call ; return address -> r30/lr, and call
mov w0,#0 ; return value
add sp,sp,#0x30 ; |
ldp fp,lr,[sp],#0x60 ; | epilog
ret ; |
ENDP ; |main|
; ---------- returning structs by value ---------->
;
; struct Small { char x; };
; struct Big { long long i,j,k,l; long m; }; /* bigger than 16b */
;
; struct Small f0()
; {
; struct Small s = { 132 };
; return s;
; }
;
; struct Big f1()
; {
; struct Big b = { 7171LL, 99LL, -99LL, -3102LL, 32 };
; return b;
; }
;
; int main()
; {
; struct Small s = f0();
; struct Big b = f1();
; return b.j + b.k + b.m + s.x;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 f0:
0: ff 83 00 d1 sub sp, sp, #32 ; |
4: fe 0b 00 f9 str x30, [sp, #16] ; | prolog
8: 08 00 00 90 adrp x8, #0 ; compute addr to storage map (probably to #132)
c: 08 01 00 91 add x8, x8, #0 ; addr offset (pointless)
10: e2 03 40 b2 orr x2, xzr, #0x1 ; @@@ unsure, #1 -> x2
14: e9 3f 00 91 add x9, sp, #15 ; addr to #132 -> x9 @@@?
18: e0 03 09 aa mov x0, x9 ; @@@ unsure
1c: e1 03 08 aa mov x1, x8 ; @@@ unsure
20: e9 03 00 f9 str x9, [sp] ; store addr to #132 to top of stack
24: 00 00 00 94 bl #0 <f0+0x24> ; @@@unsure
28: e8 03 40 f9 ldr x8, [sp] ; *sp -> x8
2c: 0a 01 40 39 ldrb w10, [x8] ; *x8 -> w10
30: e9 03 0a 2a mov w9, w10 ; w10 -> w9
34: 20 1d 40 d3 ubfx x0, x9, #0, #8 ; return value ("Unsigned Bit Field Extract", copy 8 bits from x9's LSBits starting at bit 0 to x0, and zero extend; = struct in reg)
38: fe 0b 40 f9 ldr x30, [sp, #16] ; |
3c: ff 83 00 91 add sp, sp, #32 ; | epilog
40: c0 03 5f d6 ret ; |
0000000000000044 f1:
44: ff 03 01 d1 sub sp, sp, #64 ; |
48: fe 1b 00 f9 str x30, [sp, #48] ; | prolog
4c: 09 00 80 52 mov w9, #0 ; @@@ unsure
50: 02 05 80 d2 mov x2, #40 ; @@@ unsure
54: 6a 80 83 d2 mov x10, #7171 ; | i
58: 6b 0c 80 d2 mov x11, #99 ; | j
5c: 4c 0c 80 92 mov x12, #-99 ; | prep local struct Big's data k
60: ad 83 81 92 mov x13, #-3102 ; | l
64: ee 03 7b b2 orr x14, xzr, #0x20 ; | m
68: e0 03 08 aa mov x0, x8 ; retval: ptr to retval -> x0
6c: e1 03 09 2a mov w1, w9 ; @@@ unsure
70: e8 17 00 f9 str x8, [sp, #40] ; ptr to retval -> local area as temp copy
74: ea 13 00 f9 str x10, [sp, #32] ; | i
78: eb 0f 00 f9 str x11, [sp, #24] ; | j
7c: ec 0b 00 f9 str x12, [sp, #16] ; | write struct A to local area k @@@ but in reverse?
80: ed 07 00 f9 str x13, [sp, #8] ; | l
84: ee 03 00 f9 str x14, [sp] ; | m
88: 00 00 00 94 bl #0 <f1+0x44> ; @@@ unsure
8c: e8 13 40 f9 ldr x8, [sp, #32] ; | i -> x8
90: ea 17 40 f9 ldr x10, [sp, #40] ; | ptr to retval -> x10, for below indirections
94: 48 01 00 f9 str x8, [x10] ; | i
98: eb 0f 40 f9 ldr x11, [sp, #24] ; | | j
9c: 4b 05 00 f9 str x11, [x10, #8] ; | /
a0: ec 0b 40 f9 ldr x12, [sp, #16] ; | write retval data \ k
a4: 4c 09 00 f9 str x12, [x10, #16] ; | /
a8: ed 07 40 f9 ldr x13, [sp, #8] ; | \ l
ac: 4d 0d 00 f9 str x13, [x10, #24] ; | /
b0: ee 03 40 f9 ldr x14, [sp] ; | \ m
b4: 4e 11 00 f9 str x14, [x10, #32] ; / /
b8: fe 1b 40 f9 ldr x30, [sp, #48] ; \
bc: ff 03 01 91 add sp, sp, #64 ; | epilog
c0: c0 03 5f d6 ret ; |
00000000000000c4 main:
c4: ff 43 01 d1 sub sp, sp, #80 ;
c8: fd 7b 04 a9 stp x29, x30, [sp, #64] ;
cc: fd 03 01 91 add x29, sp, #64 ;
d0: a8 17 00 d1 sub x8, x29, #5 ;
d4: e9 43 00 91 add x9, sp, #16 ;
d8: bf c3 1f b8 stur wzr, [x29, #-4] ;
dc: e8 07 00 f9 str x8, [sp, #8] ;
e0: e9 03 00 f9 str x9, [sp] ;
e4: c7 ff ff 97 bl #-228 <f0> ; return address -> r30/lr, and call
e8: ea 03 00 2a mov w10, w0 ; retval via w0, as small struct
ec: e8 07 40 f9 ldr x8, [sp, #8] ;
f0: 0a 01 00 39 strb w10, [x8] ;
f4: e8 03 40 f9 ldr x8, [sp] ; ptr to retval struct, as sizeof(struct Big) > 16
f8: d3 ff ff 97 bl #-180 <f1> ; return address -> r30/lr, and call
fc: e8 0f 40 f9 ldr x8, [sp, #24] ;
100: e9 13 40 f9 ldr x9, [sp, #32] ;
104: 08 01 09 8b add x8, x8, x9 ;
108: e9 1b 40 f9 ldr x9, [sp, #48] ;
10c: 08 01 09 8b add x8, x8, x9 ;
110: e9 07 40 f9 ldr x9, [sp, #8] ;
114: 2a 01 40 39 ldrb w10, [x9] ;
118: e0 03 0a 2a mov w0, w10 ;
11c: 00 1c 40 d3 ubfx x0, x0, #0, #8 ;
120: 08 01 00 8b add x8, x8, x0 ;
124: ea 03 08 2a mov w10, w8 ;
128: e0 03 0a 2a mov w0, w10 ;
12c: fd 7b 44 a9 ldp x29, x30, [sp, #64] ;
130: ff 43 01 91 add sp, sp, #80 ;
134: c0 03 5f d6 ret ;
; output from godbolt compiler explorer w/ msvc 19.14
|f0| PROC
|$LN3|
sub sp,sp,#0x10 ;
mov w8,#-0x7C ; (signed) #132
strb w8,[sp] ; stored in local area
ldrb w0,[sp] ; return value (entire struct in reg)
add sp,sp,#0x10 ;
ret ;
ENDP ; |f0|
|f1| PROC
|$LN3|
stp fp,lr,[sp,#-0x10]! ;
mov fp,sp ;
bl __security_push_cookie ;
sub sp,sp,#0x30 ;
str x8,[sp] ; ptr to retval -> local area as temp copy
mov x9,#0x1C03 ;
str x9,[sp,#8] ;
mov x8,#0x63 ;
str x8,[sp,#0x10] ;
mov x8,#-0x63 ;
str x8,[sp,#0x18] ;
mov x8,#-0xC1E ;
str x8,[sp,#0x20] ;
mov w8,#0x20 ;
str w8,[sp,#0x28] ;
ldr x11,[sp] ; ptr to retval -> x11, for below indirections
add x10,sp,#8 ; read ptr
ldp x9,x8,[x10] ; | | i, j
stp x9,x8,[x11] ; | /
ldp x9,x8,[x10,#0x10] ; | cp struct data to retval \ k, l
stp x9,x8,[x11,#0x10] ; | /
ldr x8,[x10,#0x20] ; | \
str x8,[x11,#0x20] ; | | m
add sp,sp,#0x30 ;
bl __security_pop_cookie ;
ldp fp,lr,[sp],#0x10 ;
ret ;
ENDP ; |f1|
|main| PROC
|$LN3|
stp fp,lr,[sp,#-0x10]! ;
mov fp,sp ;
bl __security_push_cookie ;
sub sp,sp,#0x80 ;
bl f0 ; return address -> r30/lr, and call
strb w0,[sp] ;
add x9,sp,#1 ;
mov x8,sp ;
ldrsb w8,[x8] ;
strb w8,[x9] ;
add x8,sp,#0x10 ; ptr to retval struct, as sizeof(struct Big) > 16
bl f1 ; return address -> r30/lr, and call
add x8,sp,#0x10 ;
str x8,[sp,#8] ;
add x11,sp,#0x38 ;
ldr x10,[sp,#8] ;
ldp x9,x8,[x10] ;
stp x9,x8,[x11] ;
ldp x9,x8,[x10,#0x10] ;
stp x9,x8,[x11,#0x10] ;
ldr x8,[x10,#0x20] ;
str x8,[x11,#0x20] ;
add x11,sp,#0x60 ;
add x10,sp,#0x38 ;
ldp x9,x8,[x10] ;
stp x9,x8,[x11] ;
ldp x9,x8,[x10,#0x10] ;
stp x9,x8,[x11,#0x10] ;
ldr x8,[x10,#0x20] ;
str x8,[x11,#0x20] ;
ldr x9,[sp,#0x68] ;
ldr x8,[sp,#0x70] ;
add x9,x9,x8 ;
ldr w8,[sp,#0x80] ;
sxtw x8,w8 ;
add x9,x9,x8 ;
ldrsb w8,[sp,#1] ;
mov w8,w8 ;
sxtw x8,w8 ;
add x8,x9,x8 ;
mov w0,w8 ;
mov w0,w0 ;
add sp,sp,#0x80 ;
bl __security_pop_cookie ;
ldp fp,lr,[sp],#0x10 ;
ret ;
ENDP ; |main|
; ---------- single-field structs by values (and small array fields) ---------->
;
; struct C { char c; };
; struct S { short s; };
; struct I { int i; };
; struct F { float f; };
; struct D { double d; };
;
; struct C2 { char c[2]; };
; struct C3 { char c[3]; };
;
; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g)
; {
; }
;
; int main()
; {
; leaf_call((struct C2){{0,1}}, (struct C){2}, (struct S){3}, (struct I){4}, (struct F){5.f}, (struct D){6.}, (struct C3){{7,8,9}});
; return 0;
; }
; output from freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000000000 leaf_call:
0: ff 03 03 d1 sub sp, sp, #192
4: fe 5b 00 f9 str x30, [sp, #176]
8: e8 03 7f b2 orr x8, xzr, #0x2
c: e9 07 40 b2 orr x9, xzr, #0x3
10: ea bb 02 91 add x10, sp, #174
14: eb 83 02 91 add x11, sp, #160
18: ec 7f 02 91 add x12, sp, #159
1c: ed 73 02 91 add x13, sp, #156
20: ee 63 02 91 add x14, sp, #152
24: ef 53 02 91 add x15, sp, #148
28: f0 23 02 91 add x16, sp, #136
2c: f1 17 02 91 add x17, sp, #133
30: f2 e3 01 91 add x18, sp, #120
34: e0 53 00 f9 str x0, [sp, #160]
38: e0 03 0a aa mov x0, x10
3c: e1 3b 00 f9 str x1, [sp, #112]
40: e1 03 0b aa mov x1, x11
44: e2 37 00 f9 str x2, [sp, #104]
48: e2 03 08 aa mov x2, x8
4c: e3 33 00 f9 str x3, [sp, #96]
50: e0 5f 00 bd str s0, [sp, #92]
54: e1 2b 00 fd str d1, [sp, #80]
58: e4 27 00 f9 str x4, [sp, #72]
5c: e9 23 00 f9 str x9, [sp, #64]
60: ec 1f 00 f9 str x12, [sp, #56]
64: ed 1b 00 f9 str x13, [sp, #48]
68: ee 17 00 f9 str x14, [sp, #40]
6c: ef 13 00 f9 str x15, [sp, #32]
70: f0 0f 00 f9 str x16, [sp, #24]
74: f1 0b 00 f9 str x17, [sp, #16]
78: f2 07 00 f9 str x18, [sp, #8]
7c: 00 00 00 94 bl #0 <leaf_call+0x7c>
80: e8 3b 40 f9 ldr x8, [sp, #112]
84: e5 03 08 2a mov w5, w8
88: e9 1f 40 f9 ldr x9, [sp, #56]
8c: 25 01 00 39 strb w5, [x9]
90: ea 37 40 f9 ldr x10, [sp, #104]
94: e5 03 0a 2a mov w5, w10
98: eb 1b 40 f9 ldr x11, [sp, #48]
9c: 65 01 00 79 strh w5, [x11]
a0: ec 33 40 f9 ldr x12, [sp, #96]
a4: e5 03 0c 2a mov w5, w12
a8: ed 17 40 f9 ldr x13, [sp, #40]
ac: a5 01 00 b9 str w5, [x13]
b0: e0 5f 40 bd ldr s0, [sp, #92]
b4: ee 13 40 f9 ldr x14, [sp, #32]
b8: c0 01 00 bd str s0, [x14]
bc: e1 2b 40 fd ldr d1, [sp, #80]
c0: ef 0f 40 f9 ldr x15, [sp, #24]
c4: e1 01 00 fd str d1, [x15]
c8: f0 0b 40 f9 ldr x16, [sp, #16]
cc: f1 27 40 f9 ldr x17, [sp, #72]
d0: f1 3f 00 f9 str x17, [sp, #120]
d4: e0 03 10 aa mov x0, x16
d8: e1 07 40 f9 ldr x1, [sp, #8]
dc: e2 23 40 f9 ldr x2, [sp, #64]
e0: 00 00 00 94 bl #0 <leaf_call+0xe0>
e4: fe 5b 40 f9 ldr x30, [sp, #176]
e8: ff 03 03 91 add sp, sp, #192
ec: c0 03 5f d6 ret
00000000000000f0 main:
f0: ff 83 03 d1 sub sp, sp, #224
f4: f5 5b 00 f9 str x21, [sp, #176]
f8: f4 4f 0c a9 stp x20, x19, [sp, #192]
fc: fd 7b 0d a9 stp x29, x30, [sp, #208]
100: fd 43 03 91 add x29, sp, #208
104: 00 00 80 52 mov w0, #0
108: 08 00 80 52 mov w8, #0
10c: e9 03 40 b2 orr x9, xzr, #0x1
110: ea 03 00 32 orr w10, wzr, #0x1
114: eb 03 1f 32 orr w11, wzr, #0x2
118: ec 07 00 32 orr w12, wzr, #0x3
11c: ed 03 1e 32 orr w13, wzr, #0x4
120: 0e 14 a8 52 mov w14, #1084227584
124: c0 01 27 1e fmov s0, w14
128: 0f 03 e8 d2 mov x15, #4618441417868443648
12c: e1 01 67 9e fmov d1, x15
130: ee 0b 00 32 orr w14, wzr, #0x7
134: f0 03 1d 32 orr w16, wzr, #0x8
138: 31 01 80 52 mov w17, #9
13c: e2 03 7f b2 orr x2, xzr, #0x2
140: ef 07 40 b2 orr x15, xzr, #0x3
144: b2 9b 00 d1 sub x18, x29, #38
148: a1 9f 00 d1 sub x1, x29, #39
14c: a3 ab 00 d1 sub x3, x29, #42
150: a4 c3 00 d1 sub x4, x29, #48
154: a5 d3 00 d1 sub x5, x29, #52
158: a6 03 01 d1 sub x6, x29, #64
15c: a7 0f 01 d1 sub x7, x29, #67
160: b3 43 01 d1 sub x19, x29, #80
164: b4 63 01 d1 sub x20, x29, #88
168: bf c3 1d b8 stur wzr, [x29, #-36]
16c: f5 03 12 aa mov x21, x18
170: a8 02 00 39 strb w8, [x21]
174: aa 06 00 39 strb w10, [x21, #1]
178: 2b 00 00 39 strb w11, [x1]
17c: 6c 00 00 79 strh w12, [x3]
180: 8d 00 00 b9 str w13, [x4]
184: a0 00 00 bd str s0, [x5]
188: c1 00 00 fd str d1, [x6]
18c: f5 03 07 aa mov x21, x7
190: ae 02 00 39 strb w14, [x21]
194: a9 02 09 8b add x9, x21, x9
198: b0 06 00 39 strb w16, [x21, #1]
19c: 31 05 00 39 strb w17, [x9, #1]
1a0: a0 43 1a b8 stur w0, [x29, #-92]
1a4: e0 03 13 aa mov x0, x19
1a8: e1 37 00 f9 str x1, [sp, #104]
1ac: e1 03 12 aa mov x1, x18
1b0: ef 33 00 f9 str x15, [sp, #96]
1b4: e3 2f 00 f9 str x3, [sp, #88]
1b8: e4 2b 00 f9 str x4, [sp, #80]
1bc: e5 27 00 f9 str x5, [sp, #72]
1c0: e6 23 00 f9 str x6, [sp, #64]
1c4: e7 1f 00 f9 str x7, [sp, #56]
1c8: f4 1b 00 f9 str x20, [sp, #48]
1cc: 00 00 00 94 bl #0 <main+0xdc>
1d0: a0 03 5b f8 ldur x0, [x29, #-80]
1d4: e9 37 40 f9 ldr x9, [sp, #104]
1d8: 28 01 40 39 ldrb w8, [x9]
1dc: ef 03 08 2a mov w15, w8
1e0: e1 1d 40 d3 ubfx x1, x15, #0, #8
1e4: ef 2f 40 f9 ldr x15, [sp, #88]
1e8: e8 01 40 79 ldrh w8, [x15]
1ec: f2 03 08 2a mov w18, w8
1f0: 42 3e 40 d3 ubfx x2, x18, #0, #16
1f4: f2 2b 40 f9 ldr x18, [sp, #80]
1f8: 48 02 40 b9 ldr w8, [x18]
1fc: e3 03 08 2a mov w3, w8
200: 63 7c 40 d3 ubfx x3, x3, #0, #32
204: e4 27 40 f9 ldr x4, [sp, #72]
208: 80 00 40 bd ldr s0, [x4]
20c: e5 23 40 f9 ldr x5, [sp, #64]
210: a1 00 40 fd ldr d1, [x5]
214: e6 1f 40 f9 ldr x6, [sp, #56]
218: e7 1b 40 f9 ldr x7, [sp, #48]
21c: e0 17 00 f9 str x0, [sp, #40]
220: e0 03 07 aa mov x0, x7
224: e1 13 00 f9 str x1, [sp, #32]
228: e1 03 06 aa mov x1, x6
22c: e6 33 40 f9 ldr x6, [sp, #96]
230: e2 0f 00 f9 str x2, [sp, #24]
234: e2 03 06 aa mov x2, x6
238: e3 0b 00 f9 str x3, [sp, #16]
23c: e0 0f 00 bd str s0, [sp, #12]
240: e1 03 00 fd str d1, [sp]
244: 00 00 00 94 bl #0 <main+0x154>
248: a4 83 5a f8 ldur x4, [x29, #-88]
24c: e0 17 40 f9 ldr x0, [sp, #40]
250: e1 13 40 f9 ldr x1, [sp, #32]
254: e2 0f 40 f9 ldr x2, [sp, #24]
258: e3 0b 40 f9 ldr x3, [sp, #16]
25c: e0 0f 40 bd ldr s0, [sp, #12]
260: e1 03 40 fd ldr d1, [sp]
264: 67 ff ff 97 bl #-612 <leaf_call>
268: a0 43 5a b8 ldur w0, [x29, #-92]
26c: fd 7b 4d a9 ldp x29, x30, [sp, #208]
270: f4 4f 4c a9 ldp x20, x19, [sp, #192]
274: f5 5b 40 f9 ldr x21, [sp, #176]
278: ff 83 03 91 add sp, sp, #224
27c: c0 03 5f d6 ret
; ---------- 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 freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000210250 f1:
210250: ff 43 00 d1 sub sp, sp, #16
210254: e8 33 00 91 add x8, sp, #12
210258: e9 03 00 2a mov w9, w0
21025c: 09 01 00 b9 str w9, [x8]
210260: ff 43 00 91 add sp, sp, #16
210264: c0 03 5f d6 ret
0000000000210268 f2:
210268: c0 03 5f d6 ret
000000000021026c f:
21026c: ff 43 01 d1 sub sp, sp, #80 ;
210270: fd 7b 04 a9 stp x29, x30, [sp, #64] ;
210274: fd 03 01 91 add x29, sp, #64 ;
210278: e8 03 00 32 orr w8, wzr, #0x1 ;
21027c: e2 03 7e b2 orr x2, xzr, #0x4 ;
210280: a1 13 00 d1 sub x1, x29, #4 ;
210284: a9 23 00 d1 sub x9, x29, #8 ;
210288: aa 43 00 d1 sub x10, x29, #16 ;
21028c: ab 53 00 d1 sub x11, x29, #20 ;
210290: e0 03 09 aa mov x0, x9 ;
210294: a8 83 1e b8 stur w8, [x29, #-24] ;
210298: e2 13 00 f9 str x2, [sp, #32] ;
21029c: e1 0f 00 f9 str x1, [sp, #24] ;
2102a0: e9 0b 00 f9 str x9, [sp, #16] ;
2102a4: ea 07 00 f9 str x10, [sp, #8] ;
2102a8: eb 03 00 f9 str x11, [sp] ;
2102ac: 1f 00 00 94 bl #124 <_ZN10NonTrivialC2Ev> ;
2102b0: a8 83 5e b8 ldur w8, [x29, #-24] ;
2102b4: a8 43 1f b8 stur w8, [x29, #-12] ;
2102b8: ac 43 5f b8 ldur w12, [x29, #-12] ;
2102bc: 8c ed 01 11 add w12, w12, #123 ;
2102c0: ac 43 1f b8 stur w12, [x29, #-12] ;
2102c4: e0 07 40 f9 ldr x0, [sp, #8] ;
2102c8: e1 0f 40 f9 ldr x1, [sp, #24] ;
2102cc: e2 13 40 f9 ldr x2, [sp, #32] ;
2102d0: 50 00 00 94 bl #320 <memcpy@plt> ;
2102d4: e9 07 40 f9 ldr x9, [sp, #8] ;
2102d8: 28 01 40 b9 ldr w8, [x9] ;
2102dc: ea 03 08 2a mov w10, w8 ;
2102e0: 40 7d 40 d3 ubfx x0, x10, #0, #32 ;
2102e4: db ff ff 97 bl #-148 <f1> ;
2102e8: a8 43 5f b8 ldur w8, [x29, #-12] ;
2102ec: 08 ed 01 71 subs w8, w8, #123 ;
2102f0: a8 43 1f b8 stur w8, [x29, #-12] ;
2102f4: e0 03 40 f9 ldr x0, [sp] ; | ptr to dest of copy of n
2102f8: e1 0b 40 f9 ldr x1, [sp, #16] ; | copy n ptr to n
2102fc: 11 00 00 94 bl #68 <_ZN10NonTrivialC2ERKS_> ; | NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
210300: e0 03 40 f9 ldr x0, [sp] ; f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
210304: d9 ff ff 97 bl #-156 <f2> ; call f2(struct NonTrivial)
210308: a8 43 5f b8 ldur w8, [x29, #-12] ;
21030c: 08 31 00 71 subs w8, w8, #12 ;
210310: a8 43 1f b8 stur w8, [x29, #-12] ;
210314: fd 7b 44 a9 ldp x29, x30, [sp, #64] ;
210318: ff 43 01 91 add sp, sp, #80 ;
21031c: c0 03 5f d6 ret ;
; ... 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 freebsd-13.0_r348764-arm64 w/ clang 8.0.0
0000000000210250 f1:
210250: ff 83 00 d1 sub sp, sp, #32
210254: fe 0b 00 f9 str x30, [sp, #16]
210258: 08 00 80 52 mov w8, #0
21025c: e2 03 7e b2 orr x2, xzr, #0x4
210260: e9 33 00 91 add x9, sp, #12
210264: e0 03 09 aa mov x0, x9
210268: e1 03 08 2a mov w1, w8
21026c: e9 03 00 f9 str x9, [sp]
210270: 64 00 00 94 bl #400 <memset@plt>
210274: e9 03 40 f9 ldr x9, [sp]
210278: 28 01 40 b9 ldr w8, [x9]
21027c: e0 03 08 2a mov w0, w8
210280: 00 7c 40 d3 ubfx x0, x0, #0, #32
210284: fe 0b 40 f9 ldr x30, [sp, #16]
210288: ff 83 00 91 add sp, sp, #32
21028c: c0 03 5f d6 ret
0000000000210290 _Z2f2v:
210290: fd 7b bf a9 stp x29, x30, [sp, #-16]!
210294: fd 03 00 91 mov x29, sp
210298: e0 03 08 aa mov x0, x8 ; ptr to retval space -> x0
21029c: 29 00 00 94 bl #164 <_ZN10NonTrivialC2Ev>
2102a0: fd 7b c1 a8 ldp x29, x30, [sp], #16
2102a4: c0 03 5f d6 ret
00000000002102a8 f:
2102a8: ff c3 00 d1 sub sp, sp, #48 ;
2102ac: fd 7b 02 a9 stp x29, x30, [sp, #32] ;
2102b0: fd 83 00 91 add x29, sp, #32 ;
2102b4: e8 03 00 32 orr w8, wzr, #0x1 ;
2102b8: a9 23 00 d1 sub x9, x29, #8 ;
2102bc: aa 33 00 d1 sub x10, x29, #12 ;
2102c0: a8 c3 1f b8 stur w8, [x29, #-4] ;
2102c4: a8 c3 5f b8 ldur w8, [x29, #-4] ;
2102c8: 08 ed 01 11 add w8, w8, #123 ;
2102cc: a8 c3 1f b8 stur w8, [x29, #-4] ;
2102d0: e9 07 00 f9 str x9, [sp, #8] ;
2102d4: ea 03 00 f9 str x10, [sp] ;
2102d8: de ff ff 97 bl #-136 <f1> ; call f1()
2102dc: e8 03 00 2a mov w8, w0 ; retval via w0, as small struct
2102e0: e9 07 40 f9 ldr x9, [sp, #8] ;
2102e4: 28 01 00 b9 str w8, [x9] ;
2102e8: a8 c3 5f b8 ldur w8, [x29, #-4] ;
2102ec: 08 ed 01 71 subs w8, w8, #123 ;
2102f0: a8 c3 1f b8 stur w8, [x29, #-4] ;
2102f4: e8 03 40 f9 ldr x8, [sp] ; ptr to retval struct via dedicated reg x8, as non-trivial aggr
2102f8: e6 ff ff 97 bl #-104 <_Z2f2v> ; call f2()
2102fc: ab c3 5f b8 ldur w11, [x29, #-4] ;
210300: 6b 31 00 71 subs w11, w11, #12 ;
210304: ab c3 1f b8 stur w11, [x29, #-4] ;
210308: fd 7b 42 a9 ldp x29, x30, [sp, #32] ;
21030c: ff c3 00 91 add sp, sp, #48 ;
210310: c0 03 5f d6 ret ;
; vim: ft=asm68k