annotate doc/disas_examples/ppc64.elfabi.disas @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents 74c056b597b7
children ead041d93e36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
327
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
1 ; #include <stdlib.h>
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
2 ;
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
3 ; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
4 ; {
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
5 ; }
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
6 ;
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
7 ; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
8 ; {
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
9 ; /* use some local data */
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
10 ; *(char*)alloca(220) = 'L';
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
11 ; leaf_call(b, c, d, e, f, g, h);
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
12 ; }
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
13 ;
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
14 ; int main()
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
15 ; {
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
16 ; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
17 ; return 0;
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
18 ; }
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
19
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
20
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
21
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
22 ; output from freebsd-11.0-ppc64 w/ gcc 4.2.1
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
23
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
24 0000000000000000 <.leaf_call>:
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
25 0: fb e1 ff f8 std r31,-8(r1)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
26 4: f8 21 ff c1 stdu r1,-64(r1)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
27 8: 7c 3f 0b 78 mr r31,r1
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
28 c: 7c 60 1b 78 mr r0,r3
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
29 10: 7c 8b 23 78 mr r11,r4
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
30 14: 7c aa 2b 78 mr r10,r5
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
31 18: 90 1f 00 70 stw r0,112(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
32 1c: 91 7f 00 78 stw r11,120(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
33 20: 91 5f 00 80 stw r10,128(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
34 24: 90 df 00 88 stw r6,136(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
35 28: 90 ff 00 90 stw r7,144(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
36 2c: 91 1f 00 98 stw r8,152(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
37 30: 91 3f 00 a0 stw r9,160(r31)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
38 34: e8 21 00 00 ld r1,0(r1)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
39 38: eb e1 ff f8 ld r31,-8(r1)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
40 3c: 4e 80 00 20 blr
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
41 ...
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
42 48: 80 01 00 01 lwz r0,1(r1)
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
43
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
44 000000000000004c <.nonleaf_call>:
331
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
45 4c: 7c 08 02 a6 mflr r0 ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
46 50: fb e1 ff f8 std r31,-8(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
47 54: f8 01 00 10 std r0,16(r1) ; | prolog
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
48 58: f8 21 ff 71 stdu r1,-144(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
49 5c: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
50 60: 7c 60 1b 78 mr r0,r3 ; in arg 0 -> gpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
51 64: 7c 8b 23 78 mr r11,r4 ; in arg 1 -> gpr11
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
52 68: 90 1f 00 c0 stw r0,192(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
53 6c: 91 7f 00 c8 stw r11,200(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
54 70: 90 bf 00 d0 stw r5,208(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
55 74: 90 df 00 d8 stw r6,216(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
56 78: 90 ff 00 e0 stw r7,224(r31) ; | all in args -> spill area in prev frame (jump over own frame (144) + linkage area of prev frame (48) = 192)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
57 7c: 91 1f 00 e8 stw r8,232(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
58 80: 91 3f 00 f0 stw r9,240(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
59 84: 91 5f 00 f8 stw r10,248(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
60 88: e8 01 00 00 ld r0,0(r1) ; fetch back-chain ptr (parent frame's sp) from stack of top by prolog -> gpr0, and ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
61 8c: f8 01 ff 11 stdu r0,-240(r1) ; ... update it further up the stack for alloca(220) - with padding to guarantee alignment
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
62 90: 39 21 00 70 addi r9,r1,112 ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
63 94: f9 3f 00 70 std r9,112(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
64 98: e9 3f 00 70 ld r9,112(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
65 9c: 38 09 00 0f addi r0,r9,15 ; | start of alloca()'d memory -> gpr9, by ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
66 a0: 78 00 e1 02 rldicl r0,r0,60,4 ; | ... using gpr0 as helper to align to 16b, leaving at least 112b at top of stack
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
67 a4: 78 00 26 e4 rldicr r0,r0,4,59 ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
68 a8: f8 1f 00 70 std r0,112(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
69 ac: e9 3f 00 70 ld r9,112(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
70 b0: 38 00 00 4c li r0,76 ; 'L' -> gpr0, and ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
71 b4: 98 09 00 00 stb r0,0(r9) ; ... store in local area (of alloca()'d space)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
72 b8: 80 1f 00 c8 lwz r0,200(r31) ; prep arg 0 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
73 bc: 7c 08 07 b4 extsw r8,r0 ; ... -> gpr8 (w/ sign extension b/c int param in 64bit reg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
74 c0: 80 1f 00 d0 lwz r0,208(r31) ; prep arg 1 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
75 c4: 7c 07 07 b4 extsw r7,r0 ; ... -> gpr7
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
76 c8: 80 1f 00 d8 lwz r0,216(r31) ; prep arg 2 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
77 cc: 7c 06 07 b4 extsw r6,r0 ; ... -> gpr6
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
78 d0: 80 1f 00 e0 lwz r0,224(r31) ; prep arg 3 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
79 d4: 7c 09 07 b4 extsw r9,r0 ; ... -> gpr9
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
80 d8: 80 1f 00 e8 lwz r0,232(r31) ; prep arg 4 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
81 dc: 7c 0b 07 b4 extsw r11,r0 ; ... -> gpr11
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
82 e0: 80 1f 00 f0 lwz r0,240(r31) ; prep arg 5 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
83 e4: 7c 0a 07 b4 extsw r10,r0 ; ... -> gpr10
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
84 e8: 80 1f 00 f8 lwz r0,248(r31) ; prep arg 6 (from prev frame's spill area), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
85 ec: 7c 00 07 b4 extsw r0,r0 ; ... -> gpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
86 f0: 7d 03 43 78 mr r3,r8 ; arg 0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
87 f4: 7c e4 3b 78 mr r4,r7 ; arg 1
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
88 f8: 7c c5 33 78 mr r5,r6 ; arg 2
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
89 fc: 7d 26 4b 78 mr r6,r9 ; arg 3
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
90 100: 7d 67 5b 78 mr r7,r11 ; arg 4
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
91 104: 7d 48 53 78 mr r8,r10 ; arg 5
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
92 108: 7c 09 03 78 mr r9,r0 ; arg 6
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
93 10c: 48 00 00 01 bl 10c <.nonleaf_call+0xc0> ; call and put return address -> lr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
94 110: e8 21 00 00 ld r1,0(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
95 114: e8 01 00 10 ld r0,16(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
96 118: 7c 08 03 a6 mtlr r0 ; | epilog
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
97 11c: eb e1 ff f8 ld r31,-8(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
98 120: 4e 80 00 20 blr ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
99 124: 00 00 00 00 .long 0x0 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
100 128: 00 00 00 01 .long 0x1 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
101 12c: 80 01 00 01 lwz r0,1(r1) ; unsure@@@. data?
327
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
102
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
103 0000000000000130 <.main>:
331
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
104 130: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
105 134: fb e1 ff f8 std r31,-8(r1) ; | preseve gpr31 (as used in func as helper addr)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
106 138: f8 01 00 10 std r0,16(r1) ; | prolog store lr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
107 13c: f8 21 ff 81 stdu r1,-128(r1) ; | open frame
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
108 140: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
109 144: 38 60 00 00 li r3,0 ; arg 0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
110 148: 38 80 00 01 li r4,1 ; arg 1
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
111 14c: 38 a0 00 02 li r5,2 ; arg 2
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
112 150: 38 c0 00 03 li r6,3 ; arg 3
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
113 154: 38 e0 00 04 li r7,4 ; arg 4
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
114 158: 39 00 00 05 li r8,5 ; arg 5
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
115 15c: 39 20 00 06 li r9,6 ; arg 6
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
116 160: 39 40 00 07 li r10,7 ; arg 7
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
117 164: 48 00 00 01 bl 164 <.main+0x34> ; call and put return address -> lr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
118 168: 38 00 00 00 li r0,0 ; return value ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
119 16c: 7c 03 03 78 mr r3,r0 ; ... in gpr3
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
120 170: e8 21 00 00 ld r1,0(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
121 174: e8 01 00 10 ld r0,16(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
122 178: 7c 08 03 a6 mtlr r0 ; | epilog
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
123 17c: eb e1 ff f8 ld r31,-8(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
124 180: 4e 80 00 20 blr ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
125 184: 00 00 00 00 .long 0x0 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
126 188: 00 00 00 01 .long 0x1 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
127 18c: 80 01 00 01 lwz r0,1(r1) ; unsure@@@. data?
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
128
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
129
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
130
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
131 ; ------------- ints and floats, var args, struct return value (meaning implicit first param), more than 8 params (11, with implicit return value ptr) ----------->
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
132
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
133 ; #include <stdlib.h>
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
134 ; #include <stdarg.h>
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
135 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
136 ; void leaf_call(int b, float c, int d, float e, int f, float g, float h, int i, float j)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
137 ; {
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
138 ; }
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
139 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
140 ; struct aggr { int x; int y; int z; };
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
141 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
142 ; struct aggr nonleaf_call(int a, int b, float c, int d, float e, int f, ...)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
143 ; {
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
144 ; va_list v;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
145 ; int i;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
146 ; float g, h, j;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
147 ; struct aggr st = { b, d, f };
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
148 ; va_start(v, f);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
149 ; g = va_arg(v, float);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
150 ; h = va_arg(v, float);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
151 ; i = va_arg(v, int);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
152 ; h = va_arg(v, float);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
153 ; /* use some local data */
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
154 ; *(char*)alloca(220) = 'L';
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
155 ; leaf_call(b, c, d, e, f, g, h, i, j);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
156 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
157 ; return st;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
158 ; }
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
159 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
160 ; int main()
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
161 ; {
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
162 ; struct aggr st = nonleaf_call(0, 1, 2.f, 3, 4.f, 5, 6.f, 7.f, 8, 9.f);
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
163 ; return 0;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
164 ; }
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
165
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
166
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
167
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
168 ; output from freebsd-11.0-ppc64 w/ gcc 4.2.1
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
169
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
170 0000000000000000 <.leaf_call>:
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
171 0: fb e1 ff f8 std r31,-8(r1)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
172 4: f8 21 ff c1 stdu r1,-64(r1)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
173 8: 7c 3f 0b 78 mr r31,r1
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
174 c: 7c 69 1b 78 mr r9,r3
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
175 10: d0 3f 00 78 stfs f1,120(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
176 14: 7c ab 2b 78 mr r11,r5
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
177 18: d0 5f 00 88 stfs f2,136(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
178 1c: 7c e8 3b 78 mr r8,r7
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
179 20: d0 7f 00 98 stfs f3,152(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
180 24: d0 9f 00 a0 stfs f4,160(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
181 28: 7d 40 53 78 mr r0,r10
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
182 2c: d0 bf 00 b0 stfs f5,176(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
183 30: 91 3f 00 70 stw r9,112(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
184 34: 91 7f 00 80 stw r11,128(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
185 38: 91 1f 00 90 stw r8,144(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
186 3c: 90 1f 00 a8 stw r0,168(r31)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
187 40: e8 21 00 00 ld r1,0(r1)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
188 44: eb e1 ff f8 ld r31,-8(r1)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
189 48: 4e 80 00 20 blr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
190 ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
191 54: 80 01 00 01 lwz r0,1(r1)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
192
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
193 0000000000000058 <.nonleaf_call>:
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
194 58: fb e1 ff f8 std r31,-8(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
195 5c: f8 21 ff 91 stdu r1,-112(r1) ; | prolog
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
196 60: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
197 64: 7c 8b 23 78 mr r11,r4 ; in arg 1 (first explicit arg, b/c of struct return value ptr being arg0) -> r11
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
198 68: 7c a8 2b 78 mr r8,r5 ; in arg 2 -> r8 (free reg, was skipped for float param)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
199 6c: d0 3f 00 b8 stfs f1,184(r31) ; | in arg 3 (float) -> prev frame's spill area: 184 = 112 (frame) + 48 (prev frame's linkage area) + 8 (arg 0 = return value ptr) + 16 (first two explicit args)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
200 70: d0 5f 00 c8 stfs f2,200(r31) ; | in arg 5 (float) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
201 74: f9 5f 00 d8 std r10,216(r31) ; | in arg 7 (float, also held in gpr reg b/c vararg) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
202 78: 7d 20 4b 78 mr r0,r9 ; | spilling in arg 6 in gpr0 (spilled below)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
203 7c: 91 7f 00 a8 stw r11,168(r31) ; | in arg 1 (int) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
204 80: 91 1f 00 b0 stw r8,176(r31) ; | in arg 2 (int) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
205 84: 90 ff 00 c0 stw r7,192(r31) ; | in arg 4 (int) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
206 88: 90 1f 00 d0 stw r0,208(r31) ; / in arg 6 (int) -> prev frame's spill area
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
207 8c: 80 1f 00 b0 lwz r0,176(r31) ; \
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
208 90: 90 1f 00 48 stw r0,72(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
209 94: 80 1f 00 c0 lwz r0,192(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
210 98: 90 1f 00 4c stw r0,76(r31) ; | filling struct with 3 int input args
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
211 9c: 80 1f 00 d0 lwz r0,208(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
212 a0: 90 1f 00 50 stw r0,80(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
213 a4: 38 1f 00 d8 addi r0,r31,216 ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
214 a8: f8 1f 00 40 std r0,64(r31) ; .
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
215 ac: 7f e0 00 08 trap ; .
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
216 ... ; .
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
217 b8: 80 01 00 01 lwz r0,1(r1) ;
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
218
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
219 00000000000000bc <.main>:
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
220 bc: 7c 08 02 a6 mflr r0 ; | lr -> gpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
221 c0: fb e1 ff f8 std r31,-8(r1) ; | preseve gpr31 (as used in func as helper addr)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
222 c4: f8 01 00 10 std r0,16(r1) ; | prolog store lr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
223 c8: f8 21 ff 41 stdu r1,-192(r1) ; | open frame
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
224 cc: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
225 d0: 39 61 00 30 addi r11,r1,48 ; ptr to param area -> r11
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
226 d4: e9 22 00 00 ld r9,0(r2) ; prep arg 3 (=explicit arg 2, b/c of implicit return value pointer), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
227 d8: c1 a9 00 00 lfs f13,0(r9) ; ... load from static data -> f13
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
228 dc: e9 22 00 08 ld r9,8(r2) ; prep arg 5, ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
229 e0: c1 89 00 00 lfs f12,0(r9) ; ... load from static data -> f12
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
230 e4: e9 22 00 10 ld r9,16(r2) ; prep arg 7, ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
231 e8: c8 09 00 00 lfd f0,0(r9) ; ... load from static data -> f0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
232 ec: d8 1f 00 a0 stfd f0,160(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
233 f0: e8 1f 00 a0 ld r0,160(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
234 f4: 7c 09 03 78 mr r9,r0 ; | also hold it in f11 (temporarily, before copying to fpr3 below)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
235 f8: 7d 2a 4b 78 mr r10,r9 ; | and gpr10 (instead of skipping that int reg, for straightforward spilling)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
236 fc: f8 1f 00 a0 std r0,160(r31) ; | (uses temp space to copy between fpr and gpr regs)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
237 100: c8 1f 00 a0 lfd f0,160(r31) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
238 104: fd 60 00 90 fmr f11,f0 ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
239 108: e9 22 00 18 ld r9,24(r2) ; prep arg 8, ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
240 10c: c8 09 00 00 lfd f0,0(r9) ; ... load from static data -> fpr0, and ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
241 110: d8 0b 00 40 stfd f0,64(r11) ; ... "pushed" onto stack (in param area past spill area) and ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
242 114: c9 4b 00 40 lfd f10,64(r11) ; ... also held in f10 (prep, see where it's used below)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
243 118: 38 00 00 08 li r0,8 ; arg 9, ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
244 11c: f8 0b 00 48 std r0,72(r11) ; ... "pushed" onto stack
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
245 120: e9 22 00 20 ld r9,32(r2) ; arg 10 (float, promoted to double), ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
246 124: c8 09 00 00 lfd f0,0(r9) ; ... load from static data -> fpr0, and ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
247 128: d8 0b 00 50 stfd f0,80(r11) ; ... "pushed" onto stack
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
248 12c: c8 0b 00 50 lfd f0,80(r11) ; ... also held in f0 (prep, see where it's used below), in theory pointless reload of arg10 -> fpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
249 130: 38 1f 00 90 addi r0,r31,144 ; ptr to return value struct in local space -> gpr0
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
250 134: 7c 03 03 78 mr r3,r0 ; arg 0 (this is the pointer to the struct return value)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
251 138: 38 80 00 00 li r4,0 ; arg 1
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
252 13c: 38 a0 00 01 li r5,1 ; arg 2
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
253 140: fc 20 68 90 fmr f1,f13 ; arg 3 (float, in 1st double reg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
254 144: 38 e0 00 03 li r7,3 ; arg 4 (skipping gpr6 b/c of float arg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
255 148: fc 40 60 90 fmr f2,f12 ; arg 5 (float, in 2nd double reg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
256 14c: 39 20 00 05 li r9,5 ; arg 6 (skipping gpr8 b/c of float arg, vararg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
257 150: fc 60 58 90 fmr f3,f11 ; arg 7 (float, in 3rd double reg, promoted to double anyways b/c vararg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
258 154: fc 80 50 90 fmr f4,f10 ; arg 8 (float, in 4th double reg, promoted to double anyways b/c vararg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
259 158: fc a0 00 90 fmr f5,f0 ; arg 10 (float, in 5th double reg, promoted to double anyways b/c vararg)
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
260 15c: 48 00 00 01 bl 15c <.main+0xa0> ; call and put return address -> lr
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
261 160: 38 00 00 00 li r0,0 ; return value ...
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
262 164: 7c 03 03 78 mr r3,r0 ; ... in gpr3
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
263 168: e8 21 00 00 ld r1,0(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
264 16c: e8 01 00 10 ld r0,16(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
265 170: 7c 08 03 a6 mtlr r0 ; | epilog
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
266 174: eb e1 ff f8 ld r31,-8(r1) ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
267 178: 4e 80 00 20 blr ; |
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
268 17c: 00 00 00 00 .long 0x0 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
269 180: 00 00 00 01 .long 0x1 ; data
74c056b597b7 - disassembly example annotations
Tassilo Philipp
parents: 327
diff changeset
270 184: 80 01 00 01 lwz r0,1(r1) ; unsure@@@. data?
327
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
271
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
272 ; vim: ft=asm
c0390dc85a07 - doc: added disassembly examples for many platforms and calling conventions, for reference
Tassilo Philipp
parents:
diff changeset
273