xref: /llvm-project/llvm/test/tools/llvm-ml/indirect_branch.asm (revision 8a1b5f26808429a157835a8011e6b58fe3361e0f)
1; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s --check-prefixes=CHECK-64,CHECK
2; RUN: llvm-ml -m32 -filetype=s %s /Fo - | FileCheck %s --check-prefixes=CHECK-32,CHECK
3
4ifdef rax
5  extern fn_ref_extern : qword
6else
7  extern fn_ref_extern : dword
8endif
9
10extern fn_proc_extern : proc
11extern fn_ref_extern_word : word
12
13.data
14
15ifdef rax
16  fn_ref qword 1
17else
18  fn_ref dword 1
19endif
20
21fn_ref_word word 2
22fn PROC
23
24BranchTargetStruc struc
25  member0 dword ?
26  ifdef rax
27    member1 dword ?
28  endif
29BranchTargetStruc ends
30
31
32ifdef rax
33  fn_ref_struc BranchTargetStruc {3, 3}
34else
35  fn_ref_struc BranchTargetStruc {3}
36endif
37
38.code
39
40t0:
41call fn_ref
42jmp fn_ref
43; CHECK-LABEL: t0:
44; CHECK-64: call qword ptr [rip + fn_ref]
45; CHECK-64: jmp qword ptr [rip + fn_ref]
46; CHECK-32: call dword ptr [fn_ref]
47; CHECK-32: jmp dword ptr [fn_ref]
48
49t1:
50call [fn_ref]
51jmp [fn_ref]
52; CHECK-LABEL: t1:
53; CHECK-64: call qword ptr [rip + fn_ref]
54; CHECK-64: jmp qword ptr [rip + fn_ref]
55; CHECK-32: call dword ptr [fn_ref]
56; CHECK-32: jmp dword ptr [fn_ref]
57
58ifdef rax
59  t2:
60  call qword ptr [fn_ref]
61  jmp qword ptr [fn_ref]
62  ; CHECK-64-LABEL: t2:
63  ; CHECK-64: call qword ptr [rip + fn_ref]
64  ; CHECK-64: jmp qword ptr [rip + fn_ref]
65else
66  t2:
67  call dword ptr [fn_ref]
68  jmp dword ptr [fn_ref]
69  ; CHECK-32-LABEL: t2:
70  ; CHECK-32: call dword ptr [fn_ref]
71  ; CHECK-32: jmp dword ptr [fn_ref]
72
73  t3:
74  call fn_ref_word
75  jmp fn_ref_word
76  ; CHECK-32-LABEL: t3:
77  ; CHECK-32: call word ptr [fn_ref_word]
78  ; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
79
80  t4:
81  call [fn_ref_word]
82  jmp [fn_ref_word]
83  ; CHECK-32-LABEL: t4:
84  ; CHECK-32: call word ptr [fn_ref_word]
85  ; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
86
87  t5:
88  call word ptr [fn_ref_word]
89  jmp word ptr [fn_ref_word]
90  ; CHECK-32-LABEL: t5:
91  ; CHECK-32: call word ptr [fn_ref_word]
92  ; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
93endif
94
95t6:
96call t6
97jmp t6
98; CHECK-LABEL: t6:
99; CHECK: call t6
100; CHECK-NEXT: jmp t6
101
102t7:
103call [t7]
104jmp [t7]
105; CHECK-LABEL: t7:
106; CHECK: call t7
107; CHECK-NEXT: jmp t7
108
109ifdef rax
110  t8:
111  call qword ptr [t8]
112  jmp qword ptr [t8]
113  ; CHECK-64-LABEL: t8:
114  ; CHECK-64: call qword ptr [rip + t8]
115  ; CHECK-64-NEXT: jmp qword ptr [rip + t8]
116else
117  t8:
118  call dword ptr [t8]
119  jmp dword ptr [t8]
120  ; CHECK-32-LABEL: t8:
121  ; CHECK-32: call dword ptr [t8]
122  ; CHECK-32-NEXT: jmp dword ptr [t8]
123endif
124
125t9:
126call fn
127jmp fn
128; CHECK-LABEL: t9:
129; CHECK: call fn
130; CHECK-NEXT: jmp fn
131
132t10:
133call [fn]
134jmp [fn]
135; CHECK-LABEL: t10:
136; CHECK: call fn
137; CHECK-NEXT: jmp fn
138
139ifdef rax
140  t11:
141  call qword ptr [fn]
142  jmp qword ptr [fn]
143  ; CHECK-64-LABEL: t11:
144  ; CHECK-64: call qword ptr [rip + fn]
145  ; CHECK-64-NEXT: jmp qword ptr [rip + fn]
146else
147  t11:
148  call dword ptr [fn]
149  jmp dword ptr [fn]
150  ; CHECK-32-LABEL: t11:
151  ; CHECK-32: call dword ptr [fn]
152  ; CHECK-32-NEXT: jmp dword ptr [fn]
153endif
154
155t12:
156call fn_ref_struc
157jmp fn_ref_struc
158; CHECK-LABEL: t12:
159; CHECK-64: call qword ptr [rip + fn_ref_struc]
160; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
161; CHECK-32: call dword ptr [fn_ref_struc]
162; CHECK-32: jmp dword ptr [fn_ref_struc]
163
164t13:
165call [fn_ref_struc]
166jmp [fn_ref_struc]
167; CHECK-LABEL: t13:
168; CHECK-64: call qword ptr [rip + fn_ref_struc]
169; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
170; CHECK-32: call dword ptr [fn_ref_struc]
171; CHECK-32: jmp dword ptr [fn_ref_struc]
172
173ifdef rax
174  t14:
175  call qword ptr [fn_ref_struc]
176  jmp qword ptr [fn_ref_struc]
177  ; CHECK-64-LABEL: t14:
178  ; CHECK-64: call qword ptr [rip + fn_ref_struc]
179  ; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
180else
181  t14:
182  call dword ptr [fn_ref_struc]
183  jmp dword ptr [fn_ref_struc]
184  ; CHECK-32-LABEL: t14:
185  ; CHECK-32: call dword ptr [fn_ref_struc]
186  ; CHECK-32: jmp dword ptr [fn_ref_struc]
187endif
188
189t15:
190je t15
191; CHECK-LABEL: t15:
192; CHECK: je t15
193
194t16:
195je [t16];
196; CHECK-LABEL: t16:
197; CHECK: je t16
198
199t17:
200call fn_ref_extern
201jmp fn_ref_extern
202; CHECK-LABEL: t17:
203; CHECK-64: call qword ptr [rip + fn_ref_extern]
204; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
205; CHECK-32: call dword ptr [fn_ref_extern]
206; CHECK-32: jmp dword ptr [fn_ref_extern]
207
208t18:
209call [fn_ref_extern]
210jmp [fn_ref_extern]
211; CHECK-LABEL: t18:
212; CHECK-64: call qword ptr [rip + fn_ref_extern]
213; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
214; CHECK-32: call dword ptr [fn_ref_extern]
215; CHECK-32: jmp dword ptr [fn_ref_extern]
216
217ifdef rax
218  t19:
219  call qword ptr [fn_ref_extern]
220  jmp qword ptr [fn_ref_extern]
221  ; CHECK-64-LABEL: t19:
222  ; CHECK-64: call qword ptr [rip + fn_ref_extern]
223  ; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
224else
225  t19:
226  call dword ptr [fn_ref_extern]
227  jmp dword ptr [fn_ref_extern]
228  ; CHECK-32-LABEL: t19:
229  ; CHECK-32: call dword ptr [fn_ref_extern]
230  ; CHECK-32: jmp dword ptr [fn_ref_extern]
231
232  t20:
233  call fn_ref_extern_word
234  jmp fn_ref_extern_word
235  ; CHECK-32-LABEL: t20:
236  ; CHECK-32: call word ptr [fn_ref_extern_word]
237  ; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
238
239  t21:
240  call [fn_ref_extern_word]
241  jmp [fn_ref_extern_word]
242  ; CHECK-32-LABEL: t21:
243  ; CHECK-32: call word ptr [fn_ref_extern_word]
244  ; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
245
246  t22:
247  call word ptr [fn_ref_extern_word]
248  jmp word ptr [fn_ref_extern_word]
249  ; CHECK-32-LABEL: t22:
250  ; CHECK-32: call word ptr [fn_ref_extern_word]
251  ; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
252endif
253
254t23:
255call fn_proc_extern
256jmp fn_proc_extern
257; CHECK-LABEL: t23:
258; CHECK: call fn_proc_extern
259
260t24:
261call [fn_proc_extern]
262jmp [fn_proc_extern]
263; CHECK-LABEL: t24:
264; CHECK: call fn_proc_extern
265
266t25:
267; CHECK-LABEL: t25:
268ifdef rax
269  call qword ptr [fn_ref_extern]
270  jmp qword ptr [fn_ref_extern]
271  ; CHECK-64: call qword ptr [rip + fn_ref_extern]
272  ; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
273else
274  call dword ptr [fn_ref_extern]
275  jmp dword ptr [fn_ref_extern]
276  ; CHECK-32: call dword ptr [fn_ref_extern]
277  ; CHECK-32: jmp dword ptr [fn_ref_extern]
278endif
279
280end
281