1*67e74705SXin Li // REQUIRES: x86-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
3*67e74705SXin Li
t1()4*67e74705SXin Li void t1() {
5*67e74705SXin Li // CHECK: @t1
6*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
7*67e74705SXin Li // CHECK: ret void
8*67e74705SXin Li __asm {}
9*67e74705SXin Li }
10*67e74705SXin Li
t2()11*67e74705SXin Li void t2() {
12*67e74705SXin Li // CHECK: @t2
13*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
14*67e74705SXin Li // CHECK: ret void
15*67e74705SXin Li __asm nop
16*67e74705SXin Li __asm nop
17*67e74705SXin Li __asm nop
18*67e74705SXin Li }
19*67e74705SXin Li
t3()20*67e74705SXin Li void t3() {
21*67e74705SXin Li // CHECK: @t3
22*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
23*67e74705SXin Li // CHECK: ret void
24*67e74705SXin Li __asm nop __asm nop __asm nop
25*67e74705SXin Li }
26*67e74705SXin Li
t4(void)27*67e74705SXin Li void t4(void) {
28*67e74705SXin Li // CHECK: @t4
29*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
30*67e74705SXin Li // CHECK: ret void
31*67e74705SXin Li __asm mov ebx, eax
32*67e74705SXin Li __asm mov ecx, ebx
33*67e74705SXin Li }
34*67e74705SXin Li
t5(void)35*67e74705SXin Li void t5(void) {
36*67e74705SXin Li // CHECK: @t5
37*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
38*67e74705SXin Li // CHECK: ret void
39*67e74705SXin Li __asm mov ebx, eax __asm mov ecx, ebx
40*67e74705SXin Li }
41*67e74705SXin Li
t6(void)42*67e74705SXin Li void t6(void) {
43*67e74705SXin Li __asm int 0x2c
44*67e74705SXin Li // CHECK: t6
45*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
46*67e74705SXin Li }
47*67e74705SXin Li
t7()48*67e74705SXin Li void t7() {
49*67e74705SXin Li __asm {
50*67e74705SXin Li int 0x2c ; } asm comments are fun! }{
51*67e74705SXin Li }
52*67e74705SXin Li __asm {
53*67e74705SXin Li {
54*67e74705SXin Li int 0x2c ; } asm comments are fun! }{
55*67e74705SXin Li }
56*67e74705SXin Li }
57*67e74705SXin Li __asm {}
58*67e74705SXin Li // CHECK: t7
59*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
60*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
61*67e74705SXin Li }
62*67e74705SXin Li
63*67e74705SXin Li int t8() {
64*67e74705SXin Li __asm int 4 ; } comments for single-line asm
65*67e74705SXin Li __asm {}
66*67e74705SXin Li __asm { int 5}
67*67e74705SXin Li __asm int 6
68*67e74705SXin Li __asm int 7
69*67e74705SXin Li __asm {
70*67e74705SXin Li int 8
71*67e74705SXin Li }
72*67e74705SXin Li return 10;
73*67e74705SXin Li // CHECK: t8
74*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "int $$4", "={eax},~{dirflag},~{fpsr},~{flags}"()
75*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "", "={eax},~{dirflag},~{fpsr},~{flags}"()
76*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "int $$5", "={eax},~{dirflag},~{fpsr},~{flags}"()
77*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "int $$6\0A\09int $$7", "={eax},~{dirflag},~{fpsr},~{flags}"()
78*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "int $$8", "={eax},~{dirflag},~{fpsr},~{flags}"()
79*67e74705SXin Li // CHECK: ret i32 10
80*67e74705SXin Li }
81*67e74705SXin Li
82*67e74705SXin Li void t9() {
83*67e74705SXin Li __asm {
84*67e74705SXin Li push ebx
85*67e74705SXin Li { mov ebx, 0x07 }
86*67e74705SXin Li __asm { pop ebx }
87*67e74705SXin Li }
88*67e74705SXin Li // CHECK: t9
89*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx\0A\09", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
90*67e74705SXin Li }
91*67e74705SXin Li
92*67e74705SXin Li unsigned t10(void) {
93*67e74705SXin Li unsigned i = 1, j;
94*67e74705SXin Li __asm {
95*67e74705SXin Li mov eax, i
96*67e74705SXin Li mov j, eax
97*67e74705SXin Li }
98*67e74705SXin Li return j;
99*67e74705SXin Li // CHECK: t10
100*67e74705SXin Li // CHECK: [[r:%[a-zA-Z0-9]+]] = alloca i32, align 4
101*67e74705SXin Li // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
102*67e74705SXin Li // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
103*67e74705SXin Li // CHECK: store i32 1, i32* [[I]], align 4
104*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax", "=*m,={eax},*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}})
105*67e74705SXin Li // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32, i32* [[J]], align 4
106*67e74705SXin Li // CHECK: ret i32 [[RET]]
107*67e74705SXin Li }
108*67e74705SXin Li
109*67e74705SXin Li void t11(void) {
110*67e74705SXin Li __asm mov eax, 1
111*67e74705SXin Li // CHECK: t11
112*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
113*67e74705SXin Li }
114*67e74705SXin Li
115*67e74705SXin Li unsigned t12(void) {
116*67e74705SXin Li unsigned i = 1, j, l = 1, m;
117*67e74705SXin Li __asm {
118*67e74705SXin Li mov eax, i
119*67e74705SXin Li mov j, eax
120*67e74705SXin Li mov eax, l
121*67e74705SXin Li mov m, eax
122*67e74705SXin Li }
123*67e74705SXin Li return j + m;
124*67e74705SXin Li // CHECK: t12
125*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $3\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $4\0A\09mov dword ptr $1, eax", "=*m,=*m,={eax},*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
126*67e74705SXin Li }
127*67e74705SXin Li
128*67e74705SXin Li void t13() {
129*67e74705SXin Li char i = 1;
130*67e74705SXin Li short j = 2;
131*67e74705SXin Li __asm movzx eax, i
132*67e74705SXin Li __asm movzx eax, j
133*67e74705SXin Li // CHECK: t13
134*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0\0A\09movzx eax, word ptr $1", "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}i, i16* %{{.*}}j)
135*67e74705SXin Li }
136*67e74705SXin Li
137*67e74705SXin Li void t14() {
138*67e74705SXin Li unsigned i = 1, j = 2;
139*67e74705SXin Li __asm {
140*67e74705SXin Li .if 1
141*67e74705SXin Li { mov eax, i }
142*67e74705SXin Li .else
143*67e74705SXin Li mov ebx, j
144*67e74705SXin Li .endif
145*67e74705SXin Li }
146*67e74705SXin Li // CHECK: t14
147*67e74705SXin Li // 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* %{{.*}})
148*67e74705SXin Li }
149*67e74705SXin Li
150*67e74705SXin Li int gvar = 10;
151*67e74705SXin Li void t15() {
152*67e74705SXin Li // CHECK: t15
153*67e74705SXin Li int lvar = 10;
154*67e74705SXin Li __asm mov eax, lvar ; eax = 10
155*67e74705SXin Li // CHECK: mov eax, dword ptr $0
156*67e74705SXin Li __asm mov eax, offset lvar ; eax = address of lvar
157*67e74705SXin Li // CHECK: mov eax, $1
158*67e74705SXin Li __asm mov eax, offset gvar ; eax = address of gvar
159*67e74705SXin Li // CHECK: mov eax, $2
160*67e74705SXin Li // CHECK: "*m,r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* @{{.*}})
161*67e74705SXin Li }
162*67e74705SXin Li
163*67e74705SXin Li void t16() {
164*67e74705SXin Li int var = 10;
165*67e74705SXin Li __asm mov [eax], offset var
166*67e74705SXin Li // CHECK: t16
167*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
168*67e74705SXin Li }
169*67e74705SXin Li
170*67e74705SXin Li void t17() {
171*67e74705SXin Li // CHECK: t17
172*67e74705SXin Li __asm _emit 0x4A
173*67e74705SXin Li // CHECK: .byte 0x4A
174*67e74705SXin Li __asm _emit 0x43
175*67e74705SXin Li // CHECK: .byte 0x43
176*67e74705SXin Li __asm _emit 0x4B
177*67e74705SXin Li // CHECK: .byte 0x4B
178*67e74705SXin Li __asm _EMIT 0x4B
179*67e74705SXin Li // CHECK: .byte 0x4B
180*67e74705SXin Li // CHECK: "~{dirflag},~{fpsr},~{flags}"()
181*67e74705SXin Li }
182*67e74705SXin Li
183*67e74705SXin Li void t20() {
184*67e74705SXin Li // CHECK: t20
185*67e74705SXin Li char bar;
186*67e74705SXin Li int foo;
187*67e74705SXin Li char _bar[2];
188*67e74705SXin Li int _foo[4];
189*67e74705SXin Li
190*67e74705SXin Li __asm mov eax, LENGTH foo
191*67e74705SXin Li // CHECK: mov eax, $$1
192*67e74705SXin Li __asm mov eax, LENGTH bar
193*67e74705SXin Li // CHECK: mov eax, $$1
194*67e74705SXin Li __asm mov eax, LENGTH _foo
195*67e74705SXin Li // CHECK: mov eax, $$4
196*67e74705SXin Li __asm mov eax, LENGTH _bar
197*67e74705SXin Li // CHECK: mov eax, $$2
198*67e74705SXin Li
199*67e74705SXin Li __asm mov eax, TYPE foo
200*67e74705SXin Li // CHECK: mov eax, $$4
201*67e74705SXin Li __asm mov eax, TYPE bar
202*67e74705SXin Li // CHECK: mov eax, $$1
203*67e74705SXin Li __asm mov eax, TYPE _foo
204*67e74705SXin Li // CHECK: mov eax, $$4
205*67e74705SXin Li __asm mov eax, TYPE _bar
206*67e74705SXin Li // CHECK: mov eax, $$1
207*67e74705SXin Li
208*67e74705SXin Li __asm mov eax, SIZE foo
209*67e74705SXin Li // CHECK: mov eax, $$4
210*67e74705SXin Li __asm mov eax, SIZE bar
211*67e74705SXin Li // CHECK: mov eax, $$1
212*67e74705SXin Li __asm mov eax, SIZE _foo
213*67e74705SXin Li // CHECK: mov eax, $$16
214*67e74705SXin Li __asm mov eax, SIZE _bar
215*67e74705SXin Li // CHECK: mov eax, $$2
216*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
217*67e74705SXin Li }
218*67e74705SXin Li
219*67e74705SXin Li void t21() {
220*67e74705SXin Li __asm {
221*67e74705SXin Li __asm push ebx
222*67e74705SXin Li __asm mov ebx, 0x07
223*67e74705SXin Li __asm pop ebx
224*67e74705SXin Li }
225*67e74705SXin Li // CHECK: t21
226*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
227*67e74705SXin Li }
228*67e74705SXin Li
229*67e74705SXin Li extern void t22_helper(int x);
230*67e74705SXin Li void t22() {
231*67e74705SXin Li int x = 0;
232*67e74705SXin Li __asm {
233*67e74705SXin Li __asm push ebx
234*67e74705SXin Li __asm mov ebx, esp
235*67e74705SXin Li }
236*67e74705SXin Li t22_helper(x);
237*67e74705SXin Li __asm {
238*67e74705SXin Li __asm mov esp, ebx
239*67e74705SXin Li __asm pop ebx
240*67e74705SXin Li }
241*67e74705SXin Li // CHECK: t22
242*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
243*67e74705SXin Li // CHECK: call void @t22_helper
244*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
245*67e74705SXin Li }
246*67e74705SXin Li
247*67e74705SXin Li void t23() {
248*67e74705SXin Li __asm {
249*67e74705SXin Li the_label:
250*67e74705SXin Li }
251*67e74705SXin Li // CHECK: t23
252*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.0__the_label:", "~{dirflag},~{fpsr},~{flags}"()
253*67e74705SXin Li }
254*67e74705SXin Li
255*67e74705SXin Li void t24_helper(void) {}
256*67e74705SXin Li void t24() {
257*67e74705SXin Li __asm call t24_helper
258*67e74705SXin Li // CHECK: t24
259*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "call dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper)
260*67e74705SXin Li }
261*67e74705SXin Li
262*67e74705SXin Li void t25() {
263*67e74705SXin Li // CHECK: t25
264*67e74705SXin Li __asm mov eax, 0ffffffffh
265*67e74705SXin Li // CHECK: mov eax, $$4294967295
266*67e74705SXin Li __asm mov eax, 0fh
267*67e74705SXin Li // CHECK: mov eax, $$15
268*67e74705SXin Li __asm mov eax, 0a2h
269*67e74705SXin Li // CHECK: mov eax, $$162
270*67e74705SXin Li __asm mov eax, 0xa2h
271*67e74705SXin Li // CHECK: mov eax, $$0xa2h
272*67e74705SXin Li __asm mov eax, 0xa2
273*67e74705SXin Li // CHECK: mov eax, $$0xa2
274*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
275*67e74705SXin Li }
276*67e74705SXin Li
277*67e74705SXin Li void t26() {
278*67e74705SXin Li // CHECK: t26
279*67e74705SXin Li __asm pushad
280*67e74705SXin Li // CHECK: pushad
281*67e74705SXin Li __asm mov eax, 0
282*67e74705SXin Li // CHECK: mov eax, $$0
283*67e74705SXin Li __asm __emit 0fh
284*67e74705SXin Li // CHECK: .byte 0fh
285*67e74705SXin Li __asm __emit 0a2h
286*67e74705SXin Li // CHECK: .byte 0a2h
287*67e74705SXin Li __asm __EMIT 0a2h
288*67e74705SXin Li // CHECK: .byte 0a2h
289*67e74705SXin Li __asm popad
290*67e74705SXin Li // CHECK: popad
291*67e74705SXin Li // CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
292*67e74705SXin Li }
293*67e74705SXin Li
294*67e74705SXin Li void t27() {
295*67e74705SXin Li __asm mov eax, fs:[0h]
296*67e74705SXin Li // CHECK: t27
297*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
298*67e74705SXin Li }
299*67e74705SXin Li
300*67e74705SXin Li void t28() {
301*67e74705SXin Li // CHECK: t28
302*67e74705SXin Li __asm align 8
303*67e74705SXin Li // CHECK: .align 3
304*67e74705SXin Li __asm align 16;
305*67e74705SXin Li // CHECK: .align 4
306*67e74705SXin Li __asm align 128;
307*67e74705SXin Li // CHECK: .align 7
308*67e74705SXin Li __asm ALIGN 256;
309*67e74705SXin Li // CHECK: .align 8
310*67e74705SXin Li // CHECK: "~{dirflag},~{fpsr},~{flags}"()
311*67e74705SXin Li }
312*67e74705SXin Li
313*67e74705SXin Li void t29() {
314*67e74705SXin Li // CHECK: t29
315*67e74705SXin Li int arr[2] = {0, 0};
316*67e74705SXin Li int olen = 0, osize = 0, otype = 0;
317*67e74705SXin Li __asm mov olen, LENGTH arr
318*67e74705SXin Li // CHECK: mov dword ptr $0, $$2
319*67e74705SXin Li __asm mov osize, SIZE arr
320*67e74705SXin Li // CHECK: mov dword ptr $1, $$8
321*67e74705SXin Li __asm mov otype, TYPE arr
322*67e74705SXin Li // CHECK: mov dword ptr $2, $$4
323*67e74705SXin Li // CHECK: "=*m,=*m,=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
324*67e74705SXin Li }
325*67e74705SXin Li
326*67e74705SXin Li int results[2] = {13, 37};
327*67e74705SXin Li int *t30()
328*67e74705SXin Li // CHECK: t30
329*67e74705SXin Li {
330*67e74705SXin Li int *res;
331*67e74705SXin Li __asm lea edi, results
332*67e74705SXin Li // CHECK: lea edi, dword ptr $2
333*67e74705SXin Li __asm mov res, edi
334*67e74705SXin Li // CHECK: mov dword ptr $0, edi
335*67e74705SXin Li return res;
336*67e74705SXin Li // CHECK: "=*m,={eax},*m,~{edi},~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}, [2 x i32]* @{{.*}})
337*67e74705SXin Li }
338*67e74705SXin Li
339*67e74705SXin Li void t31() {
340*67e74705SXin Li // CHECK: t31
341*67e74705SXin Li __asm pushad
342*67e74705SXin Li // CHECK: pushad
343*67e74705SXin Li __asm popad
344*67e74705SXin Li // CHECK: popad
345*67e74705SXin Li // CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
346*67e74705SXin Li }
347*67e74705SXin Li
348*67e74705SXin Li void t32() {
349*67e74705SXin Li // CHECK: t32
350*67e74705SXin Li int i;
351*67e74705SXin Li __asm mov eax, i
352*67e74705SXin Li // CHECK: mov eax, dword ptr $0
353*67e74705SXin Li __asm mov eax, dword ptr i
354*67e74705SXin Li // CHECK: mov eax, dword ptr $1
355*67e74705SXin Li __asm mov ax, word ptr i
356*67e74705SXin Li // CHECK: mov ax, word ptr $2
357*67e74705SXin Li __asm mov al, byte ptr i
358*67e74705SXin Li // CHECK: mov al, byte ptr $3
359*67e74705SXin Li // CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
360*67e74705SXin Li }
361*67e74705SXin Li
362*67e74705SXin Li void t33() {
363*67e74705SXin Li // CHECK: t33
364*67e74705SXin Li int i;
365*67e74705SXin Li __asm mov eax, [i]
366*67e74705SXin Li // CHECK: mov eax, dword ptr $0
367*67e74705SXin Li __asm mov eax, dword ptr [i]
368*67e74705SXin Li // CHECK: mov eax, dword ptr $1
369*67e74705SXin Li __asm mov ax, word ptr [i]
370*67e74705SXin Li // CHECK: mov ax, word ptr $2
371*67e74705SXin Li __asm mov al, byte ptr [i]
372*67e74705SXin Li // CHECK: mov al, byte ptr $3
373*67e74705SXin Li // CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
374*67e74705SXin Li }
375*67e74705SXin Li
376*67e74705SXin Li void t34() {
377*67e74705SXin Li // CHECK: t34
378*67e74705SXin Li __asm prefetchnta 64[eax]
379*67e74705SXin Li // CHECK: prefetchnta $$64[eax]
380*67e74705SXin Li __asm mov eax, dword ptr 4[eax]
381*67e74705SXin Li // CHECK: mov eax, dword ptr $$4[eax]
382*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
383*67e74705SXin Li }
384*67e74705SXin Li
385*67e74705SXin Li void t35() {
386*67e74705SXin Li // CHECK: t35
387*67e74705SXin Li __asm prefetchnta [eax + (200*64)]
388*67e74705SXin Li // CHECK: prefetchnta [eax + ($$200*$$64)]
389*67e74705SXin Li __asm mov eax, dword ptr [eax + (200*64)]
390*67e74705SXin Li // CHECK: mov eax, dword ptr [eax + ($$200*$$64)]
391*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
392*67e74705SXin Li }
393*67e74705SXin Li
394*67e74705SXin Li void t36() {
395*67e74705SXin Li // CHECK: t36
396*67e74705SXin Li int arr[4];
397*67e74705SXin Li // Work around PR20368: These should be single line blocks
398*67e74705SXin Li __asm { mov eax, 4[arr] }
399*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
400*67e74705SXin Li __asm { mov eax, 4[arr + 4] }
401*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
402*67e74705SXin Li __asm { mov eax, 8[arr + 4 + 32*2 - 4] }
403*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
404*67e74705SXin Li __asm { mov eax, 12[4 + arr] }
405*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
406*67e74705SXin Li __asm { mov eax, 4[4 + arr + 4] }
407*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
408*67e74705SXin Li __asm { mov eax, 4[64 + arr + (2*32)] }
409*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
410*67e74705SXin Li __asm { mov eax, 4[64 + arr - 2*32] }
411*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
412*67e74705SXin Li __asm { mov eax, [arr + 4] }
413*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
414*67e74705SXin Li __asm { mov eax, [arr + 4 + 32*2 - 4] }
415*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
416*67e74705SXin Li __asm { mov eax, [4 + arr] }
417*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
418*67e74705SXin Li __asm { mov eax, [4 + arr + 4] }
419*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
420*67e74705SXin Li __asm { mov eax, [64 + arr + (2*32)] }
421*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
422*67e74705SXin Li __asm { mov eax, [64 + arr - 2*32] }
423*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
424*67e74705SXin Li }
425*67e74705SXin Li
426*67e74705SXin Li void t37() {
427*67e74705SXin Li // CHECK: t37
428*67e74705SXin Li __asm mov eax, 4 + 8
429*67e74705SXin Li // CHECK: mov eax, $$12
430*67e74705SXin Li __asm mov eax, 4 + 8 * 16
431*67e74705SXin Li // CHECK: mov eax, $$132
432*67e74705SXin Li __asm mov eax, -4 + 8 * 16
433*67e74705SXin Li // CHECK: mov eax, $$124
434*67e74705SXin Li __asm mov eax, (4 + 4) * 16
435*67e74705SXin Li // CHECK: mov eax, $$128
436*67e74705SXin Li __asm mov eax, 4 + 8 * -16
437*67e74705SXin Li // CHECK: mov eax, $$4294967172
438*67e74705SXin Li __asm mov eax, 4 + 16 / -8
439*67e74705SXin Li // CHECK: mov eax, $$2
440*67e74705SXin Li __asm mov eax, (16 + 16) / -8
441*67e74705SXin Li // CHECK: mov eax, $$4294967292
442*67e74705SXin Li __asm mov eax, ~15
443*67e74705SXin Li // CHECK: mov eax, $$4294967280
444*67e74705SXin Li __asm mov eax, 6 ^ 3
445*67e74705SXin Li // CHECK: mov eax, $$5
446*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
447*67e74705SXin Li }
448*67e74705SXin Li
449*67e74705SXin Li void t38() {
450*67e74705SXin Li // CHECK: t38
451*67e74705SXin Li int arr[4];
452*67e74705SXin Li // Work around PR20368: These should be single line blocks
453*67e74705SXin Li __asm { mov eax, 4+4[arr] }
454*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
455*67e74705SXin Li __asm { mov eax, (4+4)[arr + 4] }
456*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
457*67e74705SXin Li __asm { mov eax, 8*2[arr + 4 + 32*2 - 4] }
458*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
459*67e74705SXin Li __asm { mov eax, 12+20[4 + arr] }
460*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
461*67e74705SXin Li __asm { mov eax, 4*16+4[4 + arr + 4] }
462*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
463*67e74705SXin Li __asm { mov eax, 4*4[64 + arr + (2*32)] }
464*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
465*67e74705SXin Li __asm { mov eax, 4*(4-2)[64 + arr - 2*32] }
466*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
467*67e74705SXin Li __asm { mov eax, 32*(4-2)[arr - 2*32] }
468*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
469*67e74705SXin Li }
470*67e74705SXin Li
471*67e74705SXin Li void cpuid() {
472*67e74705SXin Li __asm cpuid
473*67e74705SXin Li // CHECK-LABEL: define void @cpuid
474*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "cpuid", "~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()
475*67e74705SXin Li }
476*67e74705SXin Li
477*67e74705SXin Li typedef struct {
478*67e74705SXin Li int a;
479*67e74705SXin Li int b;
480*67e74705SXin Li } A;
481*67e74705SXin Li
482*67e74705SXin Li typedef struct {
483*67e74705SXin Li int b1;
484*67e74705SXin Li A b2;
485*67e74705SXin Li } B;
486*67e74705SXin Li
487*67e74705SXin Li typedef struct {
488*67e74705SXin Li int c1;
489*67e74705SXin Li A c2;
490*67e74705SXin Li int c3;
491*67e74705SXin Li B c4;
492*67e74705SXin Li } C;
493*67e74705SXin Li
494*67e74705SXin Li void t39() {
495*67e74705SXin Li // CHECK-LABEL: define void @t39
496*67e74705SXin Li __asm mov eax, [eax].A.b
497*67e74705SXin Li // CHECK: mov eax, [eax].4
498*67e74705SXin Li __asm mov eax, [eax] A.b
499*67e74705SXin Li // CHECK: mov eax, [eax] .4
500*67e74705SXin Li __asm mov eax, fs:[0] A.b
501*67e74705SXin Li // CHECK: mov eax, fs:[$$0] .4
502*67e74705SXin Li __asm mov eax, [eax].B.b2.a
503*67e74705SXin Li // CHECK: mov eax, [eax].4
504*67e74705SXin Li __asm mov eax, [eax] B.b2.b
505*67e74705SXin Li // CHECK: mov eax, [eax] .8
506*67e74705SXin Li __asm mov eax, fs:[0] C.c2.b
507*67e74705SXin Li // CHECK: mov eax, fs:[$$0] .8
508*67e74705SXin Li __asm mov eax, [eax]C.c4.b2.b
509*67e74705SXin Li // CHECK: mov eax, [eax].24
510*67e74705SXin Li // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
511*67e74705SXin Li }
512*67e74705SXin Li
513*67e74705SXin Li void t40(float a) {
514*67e74705SXin Li // CHECK-LABEL: define void @t40
515*67e74705SXin Li int i;
516*67e74705SXin Li __asm fld a
517*67e74705SXin Li // CHECK: fld dword ptr $1
518*67e74705SXin Li __asm fistp i
519*67e74705SXin Li // CHECK: fistp dword ptr $0
520*67e74705SXin Li // CHECK: "=*m,*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, float* %{{.*}})
521*67e74705SXin Li }
522*67e74705SXin Li
523*67e74705SXin Li void t41(unsigned short a) {
524*67e74705SXin Li // CHECK-LABEL: define void @t41(i16 zeroext %a)
525*67e74705SXin Li __asm mov cs, a;
526*67e74705SXin Li // CHECK: mov cs, word ptr $0
527*67e74705SXin Li __asm mov ds, a;
528*67e74705SXin Li // CHECK: mov ds, word ptr $1
529*67e74705SXin Li __asm mov es, a;
530*67e74705SXin Li // CHECK: mov es, word ptr $2
531*67e74705SXin Li __asm mov fs, a;
532*67e74705SXin Li // CHECK: mov fs, word ptr $3
533*67e74705SXin Li __asm mov gs, a;
534*67e74705SXin Li // CHECK: mov gs, word ptr $4
535*67e74705SXin Li __asm mov ss, a;
536*67e74705SXin Li // CHECK: mov ss, word ptr $5
537*67e74705SXin Li // CHECK: "*m,*m,*m,*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}})
538*67e74705SXin Li }
539*67e74705SXin Li
540*67e74705SXin Li void t42() {
541*67e74705SXin Li // CHECK-LABEL: define void @t42
542*67e74705SXin Li int flags;
543*67e74705SXin Li __asm mov flags, eax
544*67e74705SXin Li // CHECK: mov dword ptr $0, eax
545*67e74705SXin Li // CHECK: "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %flags)
546*67e74705SXin Li }
547*67e74705SXin Li
548*67e74705SXin Li void t43() {
549*67e74705SXin Li // CHECK-LABEL: define void @t43
550*67e74705SXin Li C strct;
551*67e74705SXin Li // Work around PR20368: These should be single line blocks
552*67e74705SXin Li __asm { mov eax, 4[strct.c1] }
553*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
554*67e74705SXin Li __asm { mov eax, 4[strct.c3 + 4] }
555*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
556*67e74705SXin Li __asm { mov eax, 8[strct.c2.a + 4 + 32*2 - 4] }
557*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
558*67e74705SXin Li __asm { mov eax, 12[4 + strct.c2.b] }
559*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
560*67e74705SXin Li __asm { mov eax, 4[4 + strct.c4.b2.b + 4] }
561*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
562*67e74705SXin Li __asm { mov eax, 4[64 + strct.c1 + (2*32)] }
563*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
564*67e74705SXin Li __asm { mov eax, 4[64 + strct.c2.a - 2*32] }
565*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
566*67e74705SXin Li __asm { mov eax, [strct.c4.b1 + 4] }
567*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
568*67e74705SXin Li __asm { mov eax, [strct.c4.b2.a + 4 + 32*2 - 4] }
569*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
570*67e74705SXin Li __asm { mov eax, [4 + strct.c1] }
571*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
572*67e74705SXin Li __asm { mov eax, [4 + strct.c2.b + 4] }
573*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
574*67e74705SXin Li __asm { mov eax, [64 + strct.c3 + (2*32)] }
575*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
576*67e74705SXin Li __asm { mov eax, [64 + strct.c4.b2.b - 2*32] }
577*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
578*67e74705SXin Li }
579*67e74705SXin Li
580*67e74705SXin Li void call_clobber() {
581*67e74705SXin Li __asm call t41
582*67e74705SXin Li // CHECK-LABEL: define void @call_clobber
583*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "call dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(void (i16)* @t41)
584*67e74705SXin Li }
585*67e74705SXin Li
586*67e74705SXin Li void xgetbv() {
587*67e74705SXin Li __asm xgetbv
588*67e74705SXin Li }
589*67e74705SXin Li // CHECK-LABEL: define void @xgetbv()
590*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "xgetbv", "~{eax},~{edx},~{dirflag},~{fpsr},~{flags}"()
591*67e74705SXin Li
592*67e74705SXin Li void label1() {
593*67e74705SXin Li __asm {
594*67e74705SXin Li label:
595*67e74705SXin Li jmp label
596*67e74705SXin Li }
597*67e74705SXin Li // CHECK-LABEL: define void @label1()
598*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.1__label:\0A\09jmp {{.*}}__MSASMLABEL_.1__label", "~{dirflag},~{fpsr},~{flags}"() [[ATTR1:#[0-9]+]]
599*67e74705SXin Li }
600*67e74705SXin Li
601*67e74705SXin Li void label2() {
602*67e74705SXin Li __asm {
603*67e74705SXin Li jmp label
604*67e74705SXin Li label:
605*67e74705SXin Li }
606*67e74705SXin Li // CHECK-LABEL: define void @label2
607*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.2__label\0A\09{{.*}}__MSASMLABEL_.2__label:", "~{dirflag},~{fpsr},~{flags}"()
608*67e74705SXin Li }
609*67e74705SXin Li
610*67e74705SXin Li void label3() {
611*67e74705SXin Li __asm {
612*67e74705SXin Li label:
613*67e74705SXin Li mov eax, label
614*67e74705SXin Li }
615*67e74705SXin Li // CHECK-LABEL: define void @label3
616*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.3__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.3__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()
617*67e74705SXin Li }
618*67e74705SXin Li
619*67e74705SXin Li void label4() {
620*67e74705SXin Li __asm {
621*67e74705SXin Li label:
622*67e74705SXin Li mov eax, [label]
623*67e74705SXin Li }
624*67e74705SXin Li // CHECK-LABEL: define void @label4
625*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.4__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.4__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()
626*67e74705SXin Li }
627*67e74705SXin Li
628*67e74705SXin Li void label5() {
629*67e74705SXin Li __asm {
630*67e74705SXin Li jmp dollar_label$
631*67e74705SXin Li dollar_label$:
632*67e74705SXin Li }
633*67e74705SXin Li // CHECK-LABEL: define void @label5
634*67e74705SXin Li // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.5__dollar_label$$\0A\09{{.*}}__MSASMLABEL_.5__dollar_label$$:", "~{dirflag},~{fpsr},~{flags}"()
635*67e74705SXin Li }
636*67e74705SXin Li
637*67e74705SXin Li typedef union _LARGE_INTEGER {
638*67e74705SXin Li struct {
639*67e74705SXin Li unsigned int LowPart;
640*67e74705SXin Li unsigned int HighPart;
641*67e74705SXin Li };
642*67e74705SXin Li struct {
643*67e74705SXin Li unsigned int LowPart;
644*67e74705SXin Li unsigned int HighPart;
645*67e74705SXin Li } u;
646*67e74705SXin Li unsigned long long QuadPart;
647*67e74705SXin Li } LARGE_INTEGER, *PLARGE_INTEGER;
648*67e74705SXin Li
649*67e74705SXin Li int test_indirect_field(LARGE_INTEGER LargeInteger) {
650*67e74705SXin Li __asm mov eax, LargeInteger.LowPart
651*67e74705SXin Li }
652*67e74705SXin Li // CHECK-LABEL: define i32 @test_indirect_field(
653*67e74705SXin Li // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $1",
654*67e74705SXin Li
655*67e74705SXin Li // MS ASM containing labels must not be duplicated (PR23715).
656*67e74705SXin Li // CHECK: attributes [[ATTR1]] = { {{.*}}noduplicate{{.*}} }
657