blob: 2283a50987d547fd1883a4320ff603ddd912eb17 [file] [log] [blame]
NAKAMURA Takumicc59e912012-09-27 14:55:08 +00001// REQUIRES: x86-64-registered-target
Chad Rosierb2e21572013-01-22 19:38:32 +00002// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -O0 -fasm-blocks -emit-llvm -o - | FileCheck %s
Chad Rosier25bc47e2012-10-19 20:38:09 +00003
Chad Rosierb64f3102012-08-08 20:37:31 +00004void t1() {
5// CHECK: @t1
Chad Rosierfcf75a32012-09-05 19:01:07 +00006// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierb64f3102012-08-08 20:37:31 +00007// CHECK: ret void
8 __asm {}
9}
Chad Rosier265f5382012-08-13 20:32:07 +000010
11void t2() {
12// CHECK: @t2
Chad Rosierfcf75a32012-09-05 19:01:07 +000013// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
14// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
15// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier265f5382012-08-13 20:32:07 +000016// CHECK: ret void
17 __asm nop
18 __asm nop
19 __asm nop
20}
21
22void t3() {
23// CHECK: @t3
Chad Rosier4de97162012-09-11 00:51:28 +000024// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier265f5382012-08-13 20:32:07 +000025// CHECK: ret void
26 __asm nop __asm nop __asm nop
27}
28
29void t4(void) {
30// CHECK: @t4
Chad Rosierfcf75a32012-09-05 19:01:07 +000031// CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
32// CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier265f5382012-08-13 20:32:07 +000033// CHECK: ret void
34 __asm mov ebx, eax
35 __asm mov ecx, ebx
36}
37
38void t5(void) {
39// CHECK: @t5
Chad Rosier4de97162012-09-11 00:51:28 +000040// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier265f5382012-08-13 20:32:07 +000041// CHECK: ret void
42 __asm mov ebx, eax __asm mov ecx, ebx
43}
Chad Rosier27ef16b2012-08-14 23:48:41 +000044
45void t6(void) {
46 __asm int 0x2c
47// CHECK: t6
Chad Rosier4de97162012-09-11 00:51:28 +000048// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier27ef16b2012-08-14 23:48:41 +000049}
50
Chad Rosier7fcde172012-08-21 17:01:26 +000051void t7() {
Chad Rosier27ef16b2012-08-14 23:48:41 +000052 __asm {
53 int 0x2c ; } asm comments are fun! }{
54 }
55 __asm {}
Chad Rosier7fcde172012-08-21 17:01:26 +000056// CHECK: t7
Chad Rosier4de97162012-09-11 00:51:28 +000057// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierfcf75a32012-09-05 19:01:07 +000058// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier27ef16b2012-08-14 23:48:41 +000059}
Chad Rosierac9289d2012-10-02 20:55:30 +000060
Chad Rosier7fcde172012-08-21 17:01:26 +000061int t8() {
Chad Rosierd9b56ed2012-10-15 19:56:10 +000062 __asm int 4 ; } comments for single-line asm
Chad Rosier27ef16b2012-08-14 23:48:41 +000063 __asm {}
64 __asm int 4
65 return 10;
Chad Rosier7fcde172012-08-21 17:01:26 +000066// CHECK: t8
Chad Rosierd9b56ed2012-10-15 19:56:10 +000067// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierfcf75a32012-09-05 19:01:07 +000068// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier4de97162012-09-11 00:51:28 +000069// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier27ef16b2012-08-14 23:48:41 +000070// CHECK: ret i32 10
71}
Chad Rosierac9289d2012-10-02 20:55:30 +000072
Chad Rosier7fcde172012-08-21 17:01:26 +000073void t9() {
Chad Rosier27ef16b2012-08-14 23:48:41 +000074 __asm {
75 push ebx
76 mov ebx, 0x07
77 pop ebx
78 }
Chad Rosier7fcde172012-08-21 17:01:26 +000079// CHECK: t9
Chad Rosier4de97162012-09-11 00:51:28 +000080// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier27ef16b2012-08-14 23:48:41 +000081}
Chad Rosierf64c1182012-08-16 17:10:59 +000082
Chad Rosier7fcde172012-08-21 17:01:26 +000083unsigned t10(void) {
Chad Rosierf64c1182012-08-16 17:10:59 +000084 unsigned i = 1, j;
85 __asm {
86 mov eax, i
87 mov j, eax
88 }
89 return j;
Chad Rosier7fcde172012-08-21 17:01:26 +000090// CHECK: t10
Chad Rosierf64c1182012-08-16 17:10:59 +000091// CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
92// CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
93// CHECK: store i32 1, i32* [[I]], align 4
Chad Rosier362b18c2012-10-19 20:57:37 +000094// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) nounwind
Chad Rosierf64c1182012-08-16 17:10:59 +000095// CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
96// CHECK: ret i32 [[RET]]
97}
Chad Rosier700ce642012-08-16 22:25:38 +000098
Chad Rosier7fcde172012-08-21 17:01:26 +000099void t11(void) {
Chad Rosier4de97162012-09-11 00:51:28 +0000100 __asm mov eax, 1
Chad Rosierfba3fb92012-10-12 21:37:00 +0000101// CHECK: t11
Chad Rosier4de97162012-09-11 00:51:28 +0000102// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
103}
Chad Rosier7f9678b2012-09-12 18:14:25 +0000104
Chad Rosierfba3fb92012-10-12 21:37:00 +0000105unsigned t12(void) {
Chad Rosierb55e6022012-09-13 00:06:55 +0000106 unsigned i = 1, j, l = 1, m;
107 __asm {
108 mov eax, i
109 mov j, eax
110 mov eax, l
111 mov m, eax
112 }
113 return j + m;
Chad Rosierfba3fb92012-10-12 21:37:00 +0000114// CHECK: t12
Chad Rosier362b18c2012-10-19 20:57:37 +0000115// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $3\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) nounwind
116}
117
118void t13() {
119 char i = 1;
120 short j = 2;
121 __asm movzx eax, i
122 __asm movzx eax, j
123// CHECK: t13
124// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}) nounwind
125// CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}}) nounwind
Chad Rosierb55e6022012-09-13 00:06:55 +0000126}
Chad Rosierb0850b32012-10-19 23:16:17 +0000127
128void t14() {
129 unsigned i = 1, j = 2;
130 __asm {
131 .if 1
132 mov eax, i
133 .else
134 mov ebx, j
135 .endif
136 }
137// CHECK: t14
Eli Friedman293e2eb2012-10-22 20:50:45 +0000138// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
Chad Rosierb0850b32012-10-19 23:16:17 +0000139}
Chad Rosier5a12aca2012-10-22 19:43:17 +0000140
Chad Rosier6949ab12013-01-08 23:51:48 +0000141int gvar = 10;
Chad Rosier5a12aca2012-10-22 19:43:17 +0000142void t15() {
Chad Rosier6949ab12013-01-08 23:51:48 +0000143 int lvar = 10;
144 __asm mov eax, lvar ; eax = 10
145 __asm mov eax, offset lvar ; eax = address of lvar
146 __asm mov eax, offset gvar ; eax = address of gvar
Chad Rosier5a12aca2012-10-22 19:43:17 +0000147// CHECK: t15
148// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
Chad Rosier4d5dd7c2012-10-23 17:44:40 +0000149// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
Chad Rosier6949ab12013-01-08 23:51:48 +0000150// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}}) nounwind
Chad Rosier5a12aca2012-10-22 19:43:17 +0000151}
Chad Rosier42242552012-10-24 17:23:06 +0000152
153void t16() {
154 int var = 10;
155 __asm mov [eax], offset var
156// CHECK: t16
157// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
158}
Chad Rosier1bed9b72012-10-24 17:48:01 +0000159
160void t17() {
161 __asm _emit 0x4A
162 __asm _emit 0x43
163 __asm _emit 0x4B
Chad Rosier7243b0f2013-02-12 21:34:14 +0000164 __asm _EMIT 0x4B
Chad Rosier1bed9b72012-10-24 17:48:01 +0000165// CHECK: t17
166// CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"() nounwind
167// CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"() nounwind
168// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier7243b0f2013-02-12 21:34:14 +0000169// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier1bed9b72012-10-24 17:48:01 +0000170}
Chad Rosierf7427272012-10-24 22:22:12 +0000171
172struct t18_type { int a, b; };
173
174int t18() {
175 struct t18_type foo;
176 foo.a = 1;
177 foo.b = 2;
178 __asm {
179 lea ebx, foo
180 mov eax, [ebx].0
181 mov [ebx].4, ecx
182 }
183 return foo.b;
184// CHECK: t18
185// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
186}
Chad Rosierd2e7d202012-10-25 21:52:03 +0000187
188int t19() {
189 struct t18_type foo;
190 foo.a = 1;
191 foo.b = 2;
192 __asm {
193 lea ebx, foo
194 mov eax, [ebx].foo.a
195 mov [ebx].foo.b, ecx
196 }
197 return foo.b;
198// CHECK: t19
199// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
200}
Chad Rosierda5c3b72012-10-26 18:04:45 +0000201
202void t20() {
Chad Rosier205ecf02013-01-17 19:22:48 +0000203 char bar;
Chad Rosierda5c3b72012-10-26 18:04:45 +0000204 int foo;
Chad Rosier205ecf02013-01-17 19:22:48 +0000205 char _bar[2];
206 int _foo[4];
207
208 __asm mov eax, LENGTH foo
209 __asm mov eax, LENGTH bar
210 __asm mov eax, LENGTH _foo
211 __asm mov eax, LENGTH _bar
Chad Rosierda5c3b72012-10-26 18:04:45 +0000212// CHECK: t20
Chad Rosier205ecf02013-01-17 19:22:48 +0000213// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
214// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierda5c3b72012-10-26 18:04:45 +0000215// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier205ecf02013-01-17 19:22:48 +0000216// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
217
218 __asm mov eax, TYPE foo
219 __asm mov eax, TYPE bar
220 __asm mov eax, TYPE _foo
221 __asm mov eax, TYPE _bar
222// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
223// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
224// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
225// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
226
227 __asm mov eax, SIZE foo
228 __asm mov eax, SIZE bar
229 __asm mov eax, SIZE _foo
230 __asm mov eax, SIZE _bar
231// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
232// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
233// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
234// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierda5c3b72012-10-26 18:04:45 +0000235}
Chad Rosiere0c01962012-12-05 19:52:05 +0000236
Chad Rosiere0c01962012-12-05 19:52:05 +0000237void t21() {
238 __asm {
239 __asm push ebx
240 __asm mov ebx, 0x07
241 __asm pop ebx
242 }
243// CHECK: t21
244// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
245}
246
247extern void t22_helper(int x);
248void t22() {
249 int x = 0;
250 __asm {
251 __asm push ebx
252 __asm mov ebx, esp
253 }
254 t22_helper(x);
255 __asm {
256 __asm mov esp, ebx
257 __asm pop ebx
258 }
259// CHECK: t22
260// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
261// CHECK: call void @t22_helper
262// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() nounwind
263}
Chad Rosier7520fca2013-01-07 20:34:40 +0000264
265void t23() {
266 __asm {
267 the_label:
268 }
269// CHECK: t23
270// CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"() nounwind
271}
Chad Rosier3731a412013-01-10 22:11:28 +0000272
273void t24_helper(void) {}
274void t24() {
275 __asm call t24_helper
276// CHECK: t24
277// CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper) nounwind
278}
Chad Rosier8e70b002013-02-12 18:45:21 +0000279
280void t25() {
281 __asm mov eax, 0ffffffffh
282 __asm mov eax, 0fh
283 __asm mov eax, 0a2h
284 __asm mov eax, 0xa2h
285 __asm mov eax, 0xa2
286// CHECK: t25
287// CHECK: call void asm sideeffect inteldialect "mov eax, $$0ffffffffh", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
288// CHECK: call void asm sideeffect inteldialect "mov eax, $$0fh", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
289// CHECK: call void asm sideeffect inteldialect "mov eax, $$0a2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
290// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
291// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
292}
293
294void t26() {
295 __asm pushad
296 __asm mov eax, 0
297 __asm __emit 0fh
298 __asm __emit 0a2h
Chad Rosier7243b0f2013-02-12 21:34:14 +0000299 __asm __EMIT 0a2h
Chad Rosier8e70b002013-02-12 18:45:21 +0000300 __asm popad
301// CHECK: t26
302// CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"() nounwind
303// CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierbe8e36c2013-02-12 19:42:57 +0000304// CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"() nounwind
305// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier7243b0f2013-02-12 21:34:14 +0000306// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier8e70b002013-02-12 18:45:21 +0000307// CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"() nounwind
308}
309
310void t27() {
311 __asm mov eax, fs:[0h]
312// CHECK: t27
Chad Rosier9c504e92013-02-12 19:15:05 +0000313// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier8e70b002013-02-12 18:45:21 +0000314}
Chad Rosier7243b0f2013-02-12 21:34:14 +0000315
316void t28() {
317 __asm align 8
318 __asm align 16;
319 __asm align 128;
320 __asm ALIGN 256;
321// CHECK: t28
322// CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"() nounwind
323// CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"() nounwind
324// CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"() nounwind
325// CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"() nounwind
326}
Chad Rosier74992c42013-02-13 01:06:08 +0000327
328void t29() {
329 int arr[2] = {0, 0};
330 int olen = 0, osize = 0, otype = 0;
331 __asm mov olen, LENGTH arr
332 __asm mov osize, SIZE arr
333 __asm mov otype, TYPE arr
334// CHECK: t29
335// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
336// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
337// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
338}
Chad Rosierd8d7f5f2013-02-13 21:34:54 +0000339
340int results[2] = {13, 37};
341int *t30()
342{
343 int *res;
344 __asm lea edi, results
345 __asm mov res, edi
346 return res;
347// CHECK: t30
348// CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}}) nounwind
349// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}) nounwind
350}