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