1// TODO These arrays should be generated automatically or have instructions for re-creation.
2static constexpr uint8_t expected_asm_kThumb2[] = {
3    0x2D, 0xE9, 0xE0, 0x4D, 0x2D, 0xED, 0x10, 0x8A, 0x89, 0xB0, 0x00, 0x90,
4    0x21, 0x91, 0x8D, 0xED, 0x22, 0x0A, 0x23, 0x92, 0x24, 0x93, 0x88, 0xB0,
5    0x08, 0xB0, 0x09, 0xB0, 0xBD, 0xEC, 0x10, 0x8A, 0xBD, 0xE8, 0xE0, 0x4D,
6    0xD9, 0xF8, 0x30, 0x80, 0x70, 0x47,
7};
8static constexpr uint8_t expected_cfi_kThumb2[] = {
9    0x44, 0x0E, 0x1C, 0x85, 0x07, 0x86, 0x06, 0x87, 0x05, 0x88, 0x04, 0x8A,
10    0x03, 0x8B, 0x02, 0x8E, 0x01, 0x44, 0x0E, 0x5C, 0x05, 0x50, 0x17, 0x05,
11    0x51, 0x16, 0x05, 0x52, 0x15, 0x05, 0x53, 0x14, 0x05, 0x54, 0x13, 0x05,
12    0x55, 0x12, 0x05, 0x56, 0x11, 0x05, 0x57, 0x10, 0x05, 0x58, 0x0F, 0x05,
13    0x59, 0x0E, 0x05, 0x5A, 0x0D, 0x05, 0x5B, 0x0C, 0x05, 0x5C, 0x0B, 0x05,
14    0x5D, 0x0A, 0x05, 0x5E, 0x09, 0x05, 0x5F, 0x08, 0x42, 0x0E, 0x80, 0x01,
15    0x4E, 0x0E, 0xA0, 0x01, 0x42, 0x0E, 0x80, 0x01, 0x0A, 0x42, 0x0E, 0x5C,
16    0x44, 0x0E, 0x1C, 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0x06, 0x53, 0x06,
17    0x54, 0x06, 0x55, 0x06, 0x56, 0x06, 0x57, 0x06, 0x58, 0x06, 0x59, 0x06,
18    0x5A, 0x06, 0x5B, 0x06, 0x5C, 0x06, 0x5D, 0x06, 0x5E, 0x06, 0x5F, 0x4A,
19    0x0B, 0x0E, 0x80, 0x01,
20};
21// 0x00000000: push {r5,r6,r7,r8,r10,r11,lr}
22// 0x00000004: .cfi_def_cfa_offset: 28
23// 0x00000004: .cfi_offset: r5 at cfa-28
24// 0x00000004: .cfi_offset: r6 at cfa-24
25// 0x00000004: .cfi_offset: r7 at cfa-20
26// 0x00000004: .cfi_offset: r8 at cfa-16
27// 0x00000004: .cfi_offset: r10 at cfa-12
28// 0x00000004: .cfi_offset: r11 at cfa-8
29// 0x00000004: .cfi_offset: r14 at cfa-4
30// 0x00000004: vpush {s16-s31}
31// 0x00000008: .cfi_def_cfa_offset: 92
32// 0x00000008: .cfi_offset_extended: r80 at cfa-92
33// 0x00000008: .cfi_offset_extended: r81 at cfa-88
34// 0x00000008: .cfi_offset_extended: r82 at cfa-84
35// 0x00000008: .cfi_offset_extended: r83 at cfa-80
36// 0x00000008: .cfi_offset_extended: r84 at cfa-76
37// 0x00000008: .cfi_offset_extended: r85 at cfa-72
38// 0x00000008: .cfi_offset_extended: r86 at cfa-68
39// 0x00000008: .cfi_offset_extended: r87 at cfa-64
40// 0x00000008: .cfi_offset_extended: r88 at cfa-60
41// 0x00000008: .cfi_offset_extended: r89 at cfa-56
42// 0x00000008: .cfi_offset_extended: r90 at cfa-52
43// 0x00000008: .cfi_offset_extended: r91 at cfa-48
44// 0x00000008: .cfi_offset_extended: r92 at cfa-44
45// 0x00000008: .cfi_offset_extended: r93 at cfa-40
46// 0x00000008: .cfi_offset_extended: r94 at cfa-36
47// 0x00000008: .cfi_offset_extended: r95 at cfa-32
48// 0x00000008: sub sp, #36
49// 0x0000000a: .cfi_def_cfa_offset: 128
50// 0x0000000a: str r0, [sp]
51// 0x0000000c: str r1, [sp, #132]
52// 0x0000000e: vstr s0, [sp, #136]
53// 0x00000012: str r2, [sp, #140]
54// 0x00000014: str r3, [sp, #144]
55// 0x00000016: sub sp, #32
56// 0x00000018: .cfi_def_cfa_offset: 160
57// 0x00000018: add sp, #32
58// 0x0000001a: .cfi_def_cfa_offset: 128
59// 0x0000001a: .cfi_remember_state
60// 0x0000001a: add sp, #36
61// 0x0000001c: .cfi_def_cfa_offset: 92
62// 0x0000001c: vpop {s16-s31}
63// 0x00000020: .cfi_def_cfa_offset: 28
64// 0x00000020: .cfi_restore_extended: r80
65// 0x00000020: .cfi_restore_extended: r81
66// 0x00000020: .cfi_restore_extended: r82
67// 0x00000020: .cfi_restore_extended: r83
68// 0x00000020: .cfi_restore_extended: r84
69// 0x00000020: .cfi_restore_extended: r85
70// 0x00000020: .cfi_restore_extended: r86
71// 0x00000020: .cfi_restore_extended: r87
72// 0x00000020: .cfi_restore_extended: r88
73// 0x00000020: .cfi_restore_extended: r89
74// 0x00000020: .cfi_restore_extended: r90
75// 0x00000020: .cfi_restore_extended: r91
76// 0x00000020: .cfi_restore_extended: r92
77// 0x00000020: .cfi_restore_extended: r93
78// 0x00000020: .cfi_restore_extended: r94
79// 0x00000020: .cfi_restore_extended: r95
80// 0x00000020: pop {r5,r6,r7,r8,r10,r11,lr}
81// 0x00000024: ldr r8, [tr, #48] ; is_gc_marking
82// 0x00000028: bx lr
83// 0x0000002a: .cfi_restore_state
84// 0x0000002a: .cfi_def_cfa_offset: 128
85
86static constexpr uint8_t expected_asm_kArm64[] = {
87    0xFF, 0x03, 0x03, 0xD1, 0xF3, 0x53, 0x06, 0xA9, 0xF5, 0x5B, 0x07, 0xA9,
88    0xF7, 0x63, 0x08, 0xA9, 0xF9, 0x6B, 0x09, 0xA9, 0xFB, 0x73, 0x0A, 0xA9,
89    0xFD, 0x7B, 0x0B, 0xA9, 0xE8, 0x27, 0x02, 0x6D, 0xEA, 0x2F, 0x03, 0x6D,
90    0xEC, 0x37, 0x04, 0x6D, 0xEE, 0x3F, 0x05, 0x6D, 0xE0, 0x03, 0x00, 0xF9,
91    0xE1, 0xCB, 0x00, 0xB9, 0xE0, 0xCF, 0x00, 0xBD, 0xE2, 0xD3, 0x00, 0xB9,
92    0xE3, 0xD7, 0x00, 0xB9, 0xFF, 0x83, 0x00, 0xD1, 0xFF, 0x83, 0x00, 0x91,
93    0xF3, 0x53, 0x46, 0xA9, 0xF5, 0x5B, 0x47, 0xA9, 0xF7, 0x63, 0x48, 0xA9,
94    0xF9, 0x6B, 0x49, 0xA9, 0xFB, 0x73, 0x4A, 0xA9, 0xFD, 0x7B, 0x4B, 0xA9,
95    0xE8, 0x27, 0x42, 0x6D, 0xEA, 0x2F, 0x43, 0x6D, 0xEC, 0x37, 0x44, 0x6D,
96    0xEE, 0x3F, 0x45, 0x6D, 0x74, 0x32, 0x40, 0xB9, 0xFF, 0x03, 0x03, 0x91,
97    0xC0, 0x03, 0x5F, 0xD6,
98};
99static constexpr uint8_t expected_cfi_kArm64[] = {
100    0x44, 0x0E, 0xC0, 0x01, 0x44, 0x93, 0x18, 0x94, 0x16, 0x44, 0x95, 0x14,
101    0x96, 0x12, 0x44, 0x97, 0x10, 0x98, 0x0E, 0x44, 0x99, 0x0C, 0x9A, 0x0A,
102    0x44, 0x9B, 0x08, 0x9C, 0x06, 0x44, 0x9D, 0x04, 0x9E, 0x02, 0x44, 0x05,
103    0x48, 0x28, 0x05, 0x49, 0x26, 0x44, 0x05, 0x4A, 0x24, 0x05, 0x4B, 0x22,
104    0x44, 0x05, 0x4C, 0x20, 0x05, 0x4D, 0x1E, 0x44, 0x05, 0x4E, 0x1C, 0x05,
105    0x4F, 0x1A, 0x58, 0x0E, 0xE0, 0x01, 0x44, 0x0E, 0xC0, 0x01, 0x0A, 0x44,
106    0xD3, 0xD4, 0x44, 0xD5, 0xD6, 0x44, 0xD7, 0xD8, 0x44, 0xD9, 0xDA, 0x44,
107    0xDB, 0xDC, 0x44, 0xDD, 0xDE, 0x44, 0x06, 0x48, 0x06, 0x49, 0x44, 0x06,
108    0x4A, 0x06, 0x4B, 0x44, 0x06, 0x4C, 0x06, 0x4D, 0x44, 0x06, 0x4E, 0x06,
109    0x4F, 0x48, 0x0E, 0x00, 0x44, 0x0B, 0x0E, 0xC0, 0x01,
110};
111// 0x00000000: sub sp, sp, #0xc0 (192)
112// 0x00000004: .cfi_def_cfa_offset: 192
113// 0x00000004: stp tr, x20, [sp, #96]
114// 0x00000008: .cfi_offset: r19 at cfa-96
115// 0x00000008: .cfi_offset: r20 at cfa-88
116// 0x00000008: stp x21, x22, [sp, #112]
117// 0x0000000c: .cfi_offset: r21 at cfa-80
118// 0x0000000c: .cfi_offset: r22 at cfa-72
119// 0x0000000c: stp x23, x24, [sp, #128]
120// 0x00000010: .cfi_offset: r23 at cfa-64
121// 0x00000010: .cfi_offset: r24 at cfa-56
122// 0x00000010: stp x25, x26, [sp, #144]
123// 0x00000014: .cfi_offset: r25 at cfa-48
124// 0x00000014: .cfi_offset: r26 at cfa-40
125// 0x00000014: stp x27, x28, [sp, #160]
126// 0x00000018: .cfi_offset: r27 at cfa-32
127// 0x00000018: .cfi_offset: r28 at cfa-24
128// 0x00000018: stp x29, lr, [sp, #176]
129// 0x0000001c: .cfi_offset: r29 at cfa-16
130// 0x0000001c: .cfi_offset: r30 at cfa-8
131// 0x0000001c: stp d8, d9, [sp, #32]
132// 0x00000020: .cfi_offset_extended: r72 at cfa-160
133// 0x00000020: .cfi_offset_extended: r73 at cfa-152
134// 0x00000020: stp d10, d11, [sp, #48]
135// 0x00000024: .cfi_offset_extended: r74 at cfa-144
136// 0x00000024: .cfi_offset_extended: r75 at cfa-136
137// 0x00000024: stp d12, d13, [sp, #64]
138// 0x00000028: .cfi_offset_extended: r76 at cfa-128
139// 0x00000028: .cfi_offset_extended: r77 at cfa-120
140// 0x00000028: stp d14, d15, [sp, #80]
141// 0x0000002c: .cfi_offset_extended: r78 at cfa-112
142// 0x0000002c: .cfi_offset_extended: r79 at cfa-104
143// 0x0000002c: str x0, [sp]
144// 0x00000030: str w1, [sp, #200]
145// 0x00000034: str s0, [sp, #204]
146// 0x00000038: str w2, [sp, #208]
147// 0x0000003c: str w3, [sp, #212]
148// 0x00000040: sub sp, sp, #0x20 (32)
149// 0x00000044: .cfi_def_cfa_offset: 224
150// 0x00000044: add sp, sp, #0x20 (32)
151// 0x00000048: .cfi_def_cfa_offset: 192
152// 0x00000048: .cfi_remember_state
153// 0x00000048: ldp tr, x20, [sp, #96]
154// 0x0000004c: .cfi_restore: r19
155// 0x0000004c: .cfi_restore: r20
156// 0x0000004c: ldp x21, x22, [sp, #112]
157// 0x00000050: .cfi_restore: r21
158// 0x00000050: .cfi_restore: r22
159// 0x00000050: ldp x23, x24, [sp, #128]
160// 0x00000054: .cfi_restore: r23
161// 0x00000054: .cfi_restore: r24
162// 0x00000054: ldp x25, x26, [sp, #144]
163// 0x00000058: .cfi_restore: r25
164// 0x00000058: .cfi_restore: r26
165// 0x00000058: ldp x27, x28, [sp, #160]
166// 0x0000005c: .cfi_restore: r27
167// 0x0000005c: .cfi_restore: r28
168// 0x0000005c: ldp x29, lr, [sp, #176]
169// 0x00000060: .cfi_restore: r29
170// 0x00000060: .cfi_restore: r30
171// 0x00000060: ldp d8, d9, [sp, #32]
172// 0x00000064: .cfi_restore_extended: r72
173// 0x00000064: .cfi_restore_extended: r73
174// 0x00000064: ldp d10, d11, [sp, #48]
175// 0x00000068: .cfi_restore_extended: r74
176// 0x00000068: .cfi_restore_extended: r75
177// 0x00000068: ldp d12, d13, [sp, #64]
178// 0x0000006c: .cfi_restore_extended: r76
179// 0x0000006c: .cfi_restore_extended: r77
180// 0x0000006c: ldp d14, d15, [sp, #80]
181// 0x00000070: .cfi_restore_extended: r78
182// 0x00000070: .cfi_restore_extended: r79
183// 0x00000070: ldr w20, [tr, #50] ; is_gc_marking
184// 0x00000074: add sp, sp, #0xc0 (192)
185// 0x00000078: .cfi_def_cfa_offset: 0
186// 0x00000078: ret
187// 0x0000007c: .cfi_restore_state
188// 0x0000007c: .cfi_def_cfa_offset: 192
189
190static constexpr uint8_t expected_asm_kX86[] = {
191    0x57, 0x56, 0x55, 0x83, 0xC4, 0xE4, 0x50, 0x89, 0x4C, 0x24, 0x34, 0xF3,
192    0x0F, 0x11, 0x44, 0x24, 0x38, 0x89, 0x54, 0x24, 0x3C, 0x89, 0x5C, 0x24,
193    0x40, 0x83, 0xC4, 0xE0, 0x83, 0xC4, 0x20, 0x83, 0xC4, 0x20, 0x5D, 0x5E,
194    0x5F, 0xC3,
195};
196static constexpr uint8_t expected_cfi_kX86[] = {
197    0x41, 0x0E, 0x08, 0x87, 0x02, 0x41, 0x0E, 0x0C, 0x86, 0x03, 0x41, 0x0E,
198    0x10, 0x85, 0x04, 0x43, 0x0E, 0x2C, 0x41, 0x0E, 0x30, 0x55, 0x0E, 0x50,
199    0x43, 0x0E, 0x30, 0x0A, 0x43, 0x0E, 0x10, 0x41, 0x0E, 0x0C, 0xC5, 0x41,
200    0x0E, 0x08, 0xC6, 0x41, 0x0E, 0x04, 0xC7, 0x41, 0x0B, 0x0E, 0x30,
201};
202// 0x00000000: push edi
203// 0x00000001: .cfi_def_cfa_offset: 8
204// 0x00000001: .cfi_offset: r7 at cfa-8
205// 0x00000001: push esi
206// 0x00000002: .cfi_def_cfa_offset: 12
207// 0x00000002: .cfi_offset: r6 at cfa-12
208// 0x00000002: push ebp
209// 0x00000003: .cfi_def_cfa_offset: 16
210// 0x00000003: .cfi_offset: r5 at cfa-16
211// 0x00000003: add esp, -28
212// 0x00000006: .cfi_def_cfa_offset: 44
213// 0x00000006: push eax
214// 0x00000007: .cfi_def_cfa_offset: 48
215// 0x00000007: mov [esp + 52], ecx
216// 0x0000000b: movss [esp + 56], xmm0
217// 0x00000011: mov [esp + 60], edx
218// 0x00000015: mov [esp + 64], ebx
219// 0x00000019: add esp, -32
220// 0x0000001c: .cfi_def_cfa_offset: 80
221// 0x0000001c: add esp, 32
222// 0x0000001f: .cfi_def_cfa_offset: 48
223// 0x0000001f: .cfi_remember_state
224// 0x0000001f: add esp, 32
225// 0x00000022: .cfi_def_cfa_offset: 16
226// 0x00000022: pop ebp
227// 0x00000023: .cfi_def_cfa_offset: 12
228// 0x00000023: .cfi_restore: r5
229// 0x00000023: pop esi
230// 0x00000024: .cfi_def_cfa_offset: 8
231// 0x00000024: .cfi_restore: r6
232// 0x00000024: pop edi
233// 0x00000025: .cfi_def_cfa_offset: 4
234// 0x00000025: .cfi_restore: r7
235// 0x00000025: ret
236// 0x00000026: .cfi_restore_state
237// 0x00000026: .cfi_def_cfa_offset: 48
238
239static constexpr uint8_t expected_asm_kX86_64[] = {
240    0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x55, 0x53, 0x48, 0x83,
241    0xEC, 0x48, 0xF2, 0x44, 0x0F, 0x11, 0x7C, 0x24, 0x40, 0xF2, 0x44, 0x0F,
242    0x11, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, 0x11, 0x6C, 0x24, 0x30, 0xF2,
243    0x44, 0x0F, 0x11, 0x64, 0x24, 0x28, 0x48, 0x89, 0x3C, 0x24, 0x89, 0xB4,
244    0x24, 0x88, 0x00, 0x00, 0x00, 0xF3, 0x0F, 0x11, 0x84, 0x24, 0x8C, 0x00,
245    0x00, 0x00, 0x89, 0x94, 0x24, 0x90, 0x00, 0x00, 0x00, 0x89, 0x8C, 0x24,
246    0x94, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0xE0, 0x48, 0x83, 0xC4, 0x20,
247    0xF2, 0x44, 0x0F, 0x10, 0x64, 0x24, 0x28, 0xF2, 0x44, 0x0F, 0x10, 0x6C,
248    0x24, 0x30, 0xF2, 0x44, 0x0F, 0x10, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F,
249    0x10, 0x7C, 0x24, 0x40, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x41, 0x5C,
250    0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3,
251};
252static constexpr uint8_t expected_cfi_kX86_64[] = {
253    0x42, 0x0E, 0x10, 0x8F, 0x04, 0x42, 0x0E, 0x18, 0x8E, 0x06, 0x42, 0x0E,
254    0x20, 0x8D, 0x08, 0x42, 0x0E, 0x28, 0x8C, 0x0A, 0x41, 0x0E, 0x30, 0x86,
255    0x0C, 0x41, 0x0E, 0x38, 0x83, 0x0E, 0x44, 0x0E, 0x80, 0x01, 0x47, 0xA0,
256    0x10, 0x47, 0x9F, 0x12, 0x47, 0x9E, 0x14, 0x47, 0x9D, 0x16, 0x66, 0x0E,
257    0xA0, 0x01, 0x44, 0x0E, 0x80, 0x01, 0x0A, 0x47, 0xDD, 0x47, 0xDE, 0x47,
258    0xDF, 0x47, 0xE0, 0x44, 0x0E, 0x38, 0x41, 0x0E, 0x30, 0xC3, 0x41, 0x0E,
259    0x28, 0xC6, 0x42, 0x0E, 0x20, 0xCC, 0x42, 0x0E, 0x18, 0xCD, 0x42, 0x0E,
260    0x10, 0xCE, 0x42, 0x0E, 0x08, 0xCF, 0x41, 0x0B, 0x0E, 0x80, 0x01,
261};
262// 0x00000000: push r15
263// 0x00000002: .cfi_def_cfa_offset: 16
264// 0x00000002: .cfi_offset: r15 at cfa-16
265// 0x00000002: push r14
266// 0x00000004: .cfi_def_cfa_offset: 24
267// 0x00000004: .cfi_offset: r14 at cfa-24
268// 0x00000004: push r13
269// 0x00000006: .cfi_def_cfa_offset: 32
270// 0x00000006: .cfi_offset: r13 at cfa-32
271// 0x00000006: push r12
272// 0x00000008: .cfi_def_cfa_offset: 40
273// 0x00000008: .cfi_offset: r12 at cfa-40
274// 0x00000008: push rbp
275// 0x00000009: .cfi_def_cfa_offset: 48
276// 0x00000009: .cfi_offset: r6 at cfa-48
277// 0x00000009: push rbx
278// 0x0000000a: .cfi_def_cfa_offset: 56
279// 0x0000000a: .cfi_offset: r3 at cfa-56
280// 0x0000000a: subq rsp, 72
281// 0x0000000e: .cfi_def_cfa_offset: 128
282// 0x0000000e: movsd [rsp + 64], xmm15
283// 0x00000015: .cfi_offset: r32 at cfa-64
284// 0x00000015: movsd [rsp + 56], xmm14
285// 0x0000001c: .cfi_offset: r31 at cfa-72
286// 0x0000001c: movsd [rsp + 48], xmm13
287// 0x00000023: .cfi_offset: r30 at cfa-80
288// 0x00000023: movsd [rsp + 40], xmm12
289// 0x0000002a: .cfi_offset: r29 at cfa-88
290// 0x0000002a: movq [rsp], rdi
291// 0x0000002e: mov [rsp + 136], esi
292// 0x00000035: movss [rsp + 140], xmm0
293// 0x0000003e: mov [rsp + 144], edx
294// 0x00000045: mov [rsp + 148], ecx
295// 0x0000004c: addq rsp, -32
296// 0x00000050: .cfi_def_cfa_offset: 160
297// 0x00000050: addq rsp, 32
298// 0x00000054: .cfi_def_cfa_offset: 128
299// 0x00000054: .cfi_remember_state
300// 0x00000054: movsd xmm12, [rsp + 40]
301// 0x0000005b: .cfi_restore: r29
302// 0x0000005b: movsd xmm13, [rsp + 48]
303// 0x00000062: .cfi_restore: r30
304// 0x00000062: movsd xmm14, [rsp + 56]
305// 0x00000069: .cfi_restore: r31
306// 0x00000069: movsd xmm15, [rsp + 64]
307// 0x00000070: .cfi_restore: r32
308// 0x00000070: addq rsp, 72
309// 0x00000074: .cfi_def_cfa_offset: 56
310// 0x00000074: pop rbx
311// 0x00000075: .cfi_def_cfa_offset: 48
312// 0x00000075: .cfi_restore: r3
313// 0x00000075: pop rbp
314// 0x00000076: .cfi_def_cfa_offset: 40
315// 0x00000076: .cfi_restore: r6
316// 0x00000076: pop r12
317// 0x00000078: .cfi_def_cfa_offset: 32
318// 0x00000078: .cfi_restore: r12
319// 0x00000078: pop r13
320// 0x0000007a: .cfi_def_cfa_offset: 24
321// 0x0000007a: .cfi_restore: r13
322// 0x0000007a: pop r14
323// 0x0000007c: .cfi_def_cfa_offset: 16
324// 0x0000007c: .cfi_restore: r14
325// 0x0000007c: pop r15
326// 0x0000007e: .cfi_def_cfa_offset: 8
327// 0x0000007e: .cfi_restore: r15
328// 0x0000007e: ret
329// 0x0000007f: .cfi_restore_state
330// 0x0000007f: .cfi_def_cfa_offset: 128
331
332