xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/ms-inline-asm.c (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // REQUIRES: x86-64-registered-target
2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
3*f4a2713aSLionel Sambuc 
4*f4a2713aSLionel Sambuc void t1() {
5*f4a2713aSLionel Sambuc // CHECK: @t1
6*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
7*f4a2713aSLionel Sambuc // CHECK: ret void
8*f4a2713aSLionel Sambuc   __asm {}
9*f4a2713aSLionel Sambuc }
10*f4a2713aSLionel Sambuc 
11*f4a2713aSLionel Sambuc void t2() {
12*f4a2713aSLionel Sambuc // CHECK: @t2
13*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
14*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
15*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
16*f4a2713aSLionel Sambuc // CHECK: ret void
17*f4a2713aSLionel Sambuc   __asm nop
18*f4a2713aSLionel Sambuc   __asm nop
19*f4a2713aSLionel Sambuc   __asm nop
20*f4a2713aSLionel Sambuc }
21*f4a2713aSLionel Sambuc 
22*f4a2713aSLionel Sambuc void t3() {
23*f4a2713aSLionel Sambuc // CHECK: @t3
24*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
25*f4a2713aSLionel Sambuc // CHECK: ret void
26*f4a2713aSLionel Sambuc   __asm nop __asm nop __asm nop
27*f4a2713aSLionel Sambuc }
28*f4a2713aSLionel Sambuc 
29*f4a2713aSLionel Sambuc void t4(void) {
30*f4a2713aSLionel Sambuc // CHECK: @t4
31*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"()
32*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"()
33*f4a2713aSLionel Sambuc // CHECK: ret void
34*f4a2713aSLionel Sambuc   __asm mov ebx, eax
35*f4a2713aSLionel Sambuc   __asm mov ecx, ebx
36*f4a2713aSLionel Sambuc }
37*f4a2713aSLionel Sambuc 
38*f4a2713aSLionel Sambuc void t5(void) {
39*f4a2713aSLionel Sambuc // CHECK: @t5
40*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
41*f4a2713aSLionel Sambuc // CHECK: ret void
42*f4a2713aSLionel Sambuc   __asm mov ebx, eax __asm mov ecx, ebx
43*f4a2713aSLionel Sambuc }
44*f4a2713aSLionel Sambuc 
45*f4a2713aSLionel Sambuc void t6(void) {
46*f4a2713aSLionel Sambuc   __asm int 0x2c
47*f4a2713aSLionel Sambuc // CHECK: t6
48*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
49*f4a2713aSLionel Sambuc }
50*f4a2713aSLionel Sambuc 
51*f4a2713aSLionel Sambuc void t7() {
52*f4a2713aSLionel Sambuc   __asm {
53*f4a2713aSLionel Sambuc     int 0x2c ; } asm comments are fun! }{
54*f4a2713aSLionel Sambuc   }
55*f4a2713aSLionel Sambuc   __asm {}
56*f4a2713aSLionel Sambuc // CHECK: t7
57*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
58*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
59*f4a2713aSLionel Sambuc }
60*f4a2713aSLionel Sambuc 
61*f4a2713aSLionel Sambuc int t8() {
62*f4a2713aSLionel Sambuc   __asm int 4 ; } comments for single-line asm
63*f4a2713aSLionel Sambuc   __asm {}
64*f4a2713aSLionel Sambuc   __asm int 4
65*f4a2713aSLionel Sambuc   return 10;
66*f4a2713aSLionel Sambuc // CHECK: t8
67*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
68*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
69*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
70*f4a2713aSLionel Sambuc // CHECK: ret i32 10
71*f4a2713aSLionel Sambuc }
72*f4a2713aSLionel Sambuc 
73*f4a2713aSLionel Sambuc void t9() {
74*f4a2713aSLionel Sambuc   __asm {
75*f4a2713aSLionel Sambuc     push ebx
76*f4a2713aSLionel Sambuc     mov ebx, 0x07
77*f4a2713aSLionel Sambuc     pop ebx
78*f4a2713aSLionel Sambuc   }
79*f4a2713aSLionel Sambuc // CHECK: t9
80*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"()
81*f4a2713aSLionel Sambuc }
82*f4a2713aSLionel Sambuc 
83*f4a2713aSLionel Sambuc unsigned t10(void) {
84*f4a2713aSLionel Sambuc   unsigned i = 1, j;
85*f4a2713aSLionel Sambuc   __asm {
86*f4a2713aSLionel Sambuc     mov eax, i
87*f4a2713aSLionel Sambuc     mov j, eax
88*f4a2713aSLionel Sambuc   }
89*f4a2713aSLionel Sambuc   return j;
90*f4a2713aSLionel Sambuc // CHECK: t10
91*f4a2713aSLionel Sambuc // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
92*f4a2713aSLionel Sambuc // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
93*f4a2713aSLionel Sambuc // CHECK: store i32 1, i32* [[I]], align 4
94*f4a2713aSLionel Sambuc // 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* %{{.*}})
95*f4a2713aSLionel Sambuc // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
96*f4a2713aSLionel Sambuc // CHECK: ret i32 [[RET]]
97*f4a2713aSLionel Sambuc }
98*f4a2713aSLionel Sambuc 
99*f4a2713aSLionel Sambuc void t11(void) {
100*f4a2713aSLionel Sambuc   __asm mov eax, 1
101*f4a2713aSLionel Sambuc // CHECK: t11
102*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
103*f4a2713aSLionel Sambuc }
104*f4a2713aSLionel Sambuc 
105*f4a2713aSLionel Sambuc unsigned t12(void) {
106*f4a2713aSLionel Sambuc   unsigned i = 1, j, l = 1, m;
107*f4a2713aSLionel Sambuc   __asm {
108*f4a2713aSLionel Sambuc     mov eax, i
109*f4a2713aSLionel Sambuc     mov j, eax
110*f4a2713aSLionel Sambuc     mov eax, l
111*f4a2713aSLionel Sambuc     mov m, eax
112*f4a2713aSLionel Sambuc   }
113*f4a2713aSLionel Sambuc   return j + m;
114*f4a2713aSLionel Sambuc // CHECK: t12
115*f4a2713aSLionel Sambuc // 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* %{{.*}})
116*f4a2713aSLionel Sambuc }
117*f4a2713aSLionel Sambuc 
118*f4a2713aSLionel Sambuc void t13() {
119*f4a2713aSLionel Sambuc   char i = 1;
120*f4a2713aSLionel Sambuc   short j = 2;
121*f4a2713aSLionel Sambuc   __asm movzx eax, i
122*f4a2713aSLionel Sambuc   __asm movzx eax, j
123*f4a2713aSLionel Sambuc // CHECK: t13
124*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}})
125*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}})
126*f4a2713aSLionel Sambuc }
127*f4a2713aSLionel Sambuc 
128*f4a2713aSLionel Sambuc void t14() {
129*f4a2713aSLionel Sambuc   unsigned i = 1, j = 2;
130*f4a2713aSLionel Sambuc   __asm {
131*f4a2713aSLionel Sambuc     .if 1
132*f4a2713aSLionel Sambuc     mov eax, i
133*f4a2713aSLionel Sambuc     .else
134*f4a2713aSLionel Sambuc     mov ebx, j
135*f4a2713aSLionel Sambuc     .endif
136*f4a2713aSLionel Sambuc   }
137*f4a2713aSLionel Sambuc // CHECK: t14
138*f4a2713aSLionel 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* %{{.*}})
139*f4a2713aSLionel Sambuc }
140*f4a2713aSLionel Sambuc 
141*f4a2713aSLionel Sambuc int gvar = 10;
142*f4a2713aSLionel Sambuc void t15() {
143*f4a2713aSLionel Sambuc   int lvar = 10;
144*f4a2713aSLionel Sambuc   __asm mov eax, lvar        ; eax = 10
145*f4a2713aSLionel Sambuc   __asm mov eax, offset lvar ; eax = address of lvar
146*f4a2713aSLionel Sambuc   __asm mov eax, offset gvar ; eax = address of gvar
147*f4a2713aSLionel Sambuc // CHECK: t15
148*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
149*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
150*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}})
151*f4a2713aSLionel Sambuc }
152*f4a2713aSLionel Sambuc 
153*f4a2713aSLionel Sambuc void t16() {
154*f4a2713aSLionel Sambuc   int var = 10;
155*f4a2713aSLionel Sambuc   __asm mov [eax], offset var
156*f4a2713aSLionel Sambuc // CHECK: t16
157*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
158*f4a2713aSLionel Sambuc }
159*f4a2713aSLionel Sambuc 
160*f4a2713aSLionel Sambuc void t17() {
161*f4a2713aSLionel Sambuc   __asm _emit 0x4A
162*f4a2713aSLionel Sambuc   __asm _emit 0x43
163*f4a2713aSLionel Sambuc   __asm _emit 0x4B
164*f4a2713aSLionel Sambuc   __asm _EMIT 0x4B
165*f4a2713aSLionel Sambuc // CHECK: t17
166*f4a2713aSLionel Sambuc // CHECK:  call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"()
167*f4a2713aSLionel Sambuc // CHECK:  call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"()
168*f4a2713aSLionel Sambuc // CHECK:  call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
169*f4a2713aSLionel Sambuc // CHECK:  call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
170*f4a2713aSLionel Sambuc }
171*f4a2713aSLionel Sambuc 
172*f4a2713aSLionel Sambuc void t20() {
173*f4a2713aSLionel Sambuc   char bar;
174*f4a2713aSLionel Sambuc   int foo;
175*f4a2713aSLionel Sambuc   char _bar[2];
176*f4a2713aSLionel Sambuc   int _foo[4];
177*f4a2713aSLionel Sambuc 
178*f4a2713aSLionel Sambuc   __asm mov eax, LENGTH foo
179*f4a2713aSLionel Sambuc   __asm mov eax, LENGTH bar
180*f4a2713aSLionel Sambuc   __asm mov eax, LENGTH _foo
181*f4a2713aSLionel Sambuc   __asm mov eax, LENGTH _bar
182*f4a2713aSLionel Sambuc // CHECK: t20
183*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
184*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
185*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
186*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
187*f4a2713aSLionel Sambuc 
188*f4a2713aSLionel Sambuc   __asm mov eax, TYPE foo
189*f4a2713aSLionel Sambuc   __asm mov eax, TYPE bar
190*f4a2713aSLionel Sambuc   __asm mov eax, TYPE _foo
191*f4a2713aSLionel Sambuc   __asm mov eax, TYPE _bar
192*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
193*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
194*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
195*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
196*f4a2713aSLionel Sambuc 
197*f4a2713aSLionel Sambuc   __asm mov eax, SIZE foo
198*f4a2713aSLionel Sambuc   __asm mov eax, SIZE bar
199*f4a2713aSLionel Sambuc   __asm mov eax, SIZE _foo
200*f4a2713aSLionel Sambuc   __asm mov eax, SIZE _bar
201*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
202*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
203*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"()
204*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
205*f4a2713aSLionel Sambuc }
206*f4a2713aSLionel Sambuc 
207*f4a2713aSLionel Sambuc void t21() {
208*f4a2713aSLionel Sambuc   __asm {
209*f4a2713aSLionel Sambuc     __asm push ebx
210*f4a2713aSLionel Sambuc     __asm mov ebx, 0x07
211*f4a2713aSLionel Sambuc     __asm pop ebx
212*f4a2713aSLionel Sambuc   }
213*f4a2713aSLionel Sambuc // CHECK: t21
214*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"()
215*f4a2713aSLionel Sambuc }
216*f4a2713aSLionel Sambuc 
217*f4a2713aSLionel Sambuc extern void t22_helper(int x);
218*f4a2713aSLionel Sambuc void t22() {
219*f4a2713aSLionel Sambuc   int x = 0;
220*f4a2713aSLionel Sambuc   __asm {
221*f4a2713aSLionel Sambuc     __asm push ebx
222*f4a2713aSLionel Sambuc     __asm mov ebx, esp
223*f4a2713aSLionel Sambuc   }
224*f4a2713aSLionel Sambuc   t22_helper(x);
225*f4a2713aSLionel Sambuc   __asm {
226*f4a2713aSLionel Sambuc     __asm mov esp, ebx
227*f4a2713aSLionel Sambuc     __asm pop ebx
228*f4a2713aSLionel Sambuc   }
229*f4a2713aSLionel Sambuc // CHECK: t22
230*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{dirflag},~{fpsr},~{flags}"()
231*f4a2713aSLionel Sambuc // CHECK: call void @t22_helper
232*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
233*f4a2713aSLionel Sambuc }
234*f4a2713aSLionel Sambuc 
235*f4a2713aSLionel Sambuc void t23() {
236*f4a2713aSLionel Sambuc   __asm {
237*f4a2713aSLionel Sambuc   the_label:
238*f4a2713aSLionel Sambuc   }
239*f4a2713aSLionel Sambuc // CHECK: t23
240*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"()
241*f4a2713aSLionel Sambuc }
242*f4a2713aSLionel Sambuc 
243*f4a2713aSLionel Sambuc void t24_helper(void) {}
244*f4a2713aSLionel Sambuc void t24() {
245*f4a2713aSLionel Sambuc   __asm call t24_helper
246*f4a2713aSLionel Sambuc // CHECK: t24
247*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper)
248*f4a2713aSLionel Sambuc }
249*f4a2713aSLionel Sambuc 
250*f4a2713aSLionel Sambuc void t25() {
251*f4a2713aSLionel Sambuc   __asm mov eax, 0ffffffffh
252*f4a2713aSLionel Sambuc   __asm mov eax, 0fh
253*f4a2713aSLionel Sambuc   __asm mov eax, 0a2h
254*f4a2713aSLionel Sambuc   __asm mov eax, 0xa2h
255*f4a2713aSLionel Sambuc   __asm mov eax, 0xa2
256*f4a2713aSLionel Sambuc // CHECK: t25
257*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967295", "~{eax},~{dirflag},~{fpsr},~{flags}"()
258*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$15", "~{eax},~{dirflag},~{fpsr},~{flags}"()
259*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$162", "~{eax},~{dirflag},~{fpsr},~{flags}"()
260*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"()
261*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
262*f4a2713aSLionel Sambuc }
263*f4a2713aSLionel Sambuc 
264*f4a2713aSLionel Sambuc void t26() {
265*f4a2713aSLionel Sambuc   __asm pushad
266*f4a2713aSLionel Sambuc   __asm mov eax, 0
267*f4a2713aSLionel Sambuc   __asm __emit 0fh
268*f4a2713aSLionel Sambuc   __asm __emit 0a2h
269*f4a2713aSLionel Sambuc   __asm __EMIT 0a2h
270*f4a2713aSLionel Sambuc   __asm popad
271*f4a2713aSLionel Sambuc // CHECK: t26
272*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"()
273*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"()
274*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"()
275*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
276*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
277*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"()
278*f4a2713aSLionel Sambuc }
279*f4a2713aSLionel Sambuc 
280*f4a2713aSLionel Sambuc void t27() {
281*f4a2713aSLionel Sambuc   __asm mov eax, fs:[0h]
282*f4a2713aSLionel Sambuc // CHECK: t27
283*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
284*f4a2713aSLionel Sambuc }
285*f4a2713aSLionel Sambuc 
286*f4a2713aSLionel Sambuc void t28() {
287*f4a2713aSLionel Sambuc   __asm align 8
288*f4a2713aSLionel Sambuc   __asm align 16;
289*f4a2713aSLionel Sambuc   __asm align 128;
290*f4a2713aSLionel Sambuc   __asm ALIGN 256;
291*f4a2713aSLionel Sambuc // CHECK: t28
292*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"()
293*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"()
294*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"()
295*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"()
296*f4a2713aSLionel Sambuc }
297*f4a2713aSLionel Sambuc 
298*f4a2713aSLionel Sambuc void t29() {
299*f4a2713aSLionel Sambuc   int arr[2] = {0, 0};
300*f4a2713aSLionel Sambuc   int olen = 0, osize = 0, otype = 0;
301*f4a2713aSLionel Sambuc   __asm mov olen, LENGTH arr
302*f4a2713aSLionel Sambuc   __asm mov osize, SIZE arr
303*f4a2713aSLionel Sambuc   __asm mov otype, TYPE arr
304*f4a2713aSLionel Sambuc // CHECK: t29
305*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
306*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
307*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
308*f4a2713aSLionel Sambuc }
309*f4a2713aSLionel Sambuc 
310*f4a2713aSLionel Sambuc int results[2] = {13, 37};
311*f4a2713aSLionel Sambuc int *t30()
312*f4a2713aSLionel Sambuc {
313*f4a2713aSLionel Sambuc   int *res;
314*f4a2713aSLionel Sambuc   __asm lea edi, results
315*f4a2713aSLionel Sambuc   __asm mov res, edi
316*f4a2713aSLionel Sambuc   return res;
317*f4a2713aSLionel Sambuc // CHECK: t30
318*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}})
319*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}})
320*f4a2713aSLionel Sambuc }
321*f4a2713aSLionel Sambuc 
322*f4a2713aSLionel Sambuc void t31() {
323*f4a2713aSLionel Sambuc   __asm pushad
324*f4a2713aSLionel Sambuc   __asm popad
325*f4a2713aSLionel Sambuc // CHECK: t31
326*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"()
327*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"()
328*f4a2713aSLionel Sambuc }
329*f4a2713aSLionel Sambuc 
330*f4a2713aSLionel Sambuc void t32() {
331*f4a2713aSLionel Sambuc   int i;
332*f4a2713aSLionel Sambuc   __asm mov eax, i
333*f4a2713aSLionel Sambuc   __asm mov eax, dword ptr i
334*f4a2713aSLionel Sambuc   __asm mov ax, word ptr i
335*f4a2713aSLionel Sambuc   __asm mov al, byte ptr i
336*f4a2713aSLionel Sambuc // CHECK: t32
337*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
338*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
339*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
340*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
341*f4a2713aSLionel Sambuc }
342*f4a2713aSLionel Sambuc 
343*f4a2713aSLionel Sambuc void t33() {
344*f4a2713aSLionel Sambuc   int i;
345*f4a2713aSLionel Sambuc   __asm mov eax, [i]
346*f4a2713aSLionel Sambuc   __asm mov eax, dword ptr [i]
347*f4a2713aSLionel Sambuc   __asm mov ax, word ptr [i]
348*f4a2713aSLionel Sambuc   __asm mov al, byte ptr [i]
349*f4a2713aSLionel Sambuc // CHECK: t33
350*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
351*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
352*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
353*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
354*f4a2713aSLionel Sambuc }
355*f4a2713aSLionel Sambuc 
356*f4a2713aSLionel Sambuc void t34() {
357*f4a2713aSLionel Sambuc   __asm prefetchnta 64[eax]
358*f4a2713aSLionel Sambuc   __asm mov eax, dword ptr 4[eax]
359*f4a2713aSLionel Sambuc // CHECK: t34
360*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "prefetchnta $$64[eax]", "~{dirflag},~{fpsr},~{flags}"()
361*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4[eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
362*f4a2713aSLionel Sambuc }
363*f4a2713aSLionel Sambuc 
364*f4a2713aSLionel Sambuc void t35() {
365*f4a2713aSLionel Sambuc   __asm prefetchnta [eax + (200*64)]
366*f4a2713aSLionel Sambuc   __asm mov eax, dword ptr [eax + (200*64)]
367*f4a2713aSLionel Sambuc // CHECK: t35
368*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "prefetchnta [eax + ($$200*$$64)]", "~{dirflag},~{fpsr},~{flags}"()
369*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax + ($$200*$$64)]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
370*f4a2713aSLionel Sambuc }
371*f4a2713aSLionel Sambuc 
372*f4a2713aSLionel Sambuc void t36() {
373*f4a2713aSLionel Sambuc   int arr[4];
374*f4a2713aSLionel Sambuc   __asm mov eax, 4[arr]
375*f4a2713aSLionel Sambuc   __asm mov eax, 4[arr + 4]
376*f4a2713aSLionel Sambuc   __asm mov eax, 8[arr + 4 + 32*2 - 4]
377*f4a2713aSLionel Sambuc   __asm mov eax, 12[4 + arr]
378*f4a2713aSLionel Sambuc   __asm mov eax, 4[4 + arr + 4]
379*f4a2713aSLionel Sambuc   __asm mov eax, 4[64 + arr + (2*32)]
380*f4a2713aSLionel Sambuc   __asm mov eax, 4[64 + arr - 2*32]
381*f4a2713aSLionel Sambuc   __asm mov eax, [arr + 4]
382*f4a2713aSLionel Sambuc   __asm mov eax, [arr + 4 + 32*2 - 4]
383*f4a2713aSLionel Sambuc   __asm mov eax, [4 + arr]
384*f4a2713aSLionel Sambuc   __asm mov eax, [4 + arr + 4]
385*f4a2713aSLionel Sambuc   __asm mov eax, [64 + arr + (2*32)]
386*f4a2713aSLionel Sambuc   __asm mov eax, [64 + arr - 2*32]
387*f4a2713aSLionel Sambuc // CHECK: t36
388*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
389*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
390*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
391*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
392*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
393*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
394*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
395*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
396*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
397*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
398*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
399*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
400*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
401*f4a2713aSLionel Sambuc }
402*f4a2713aSLionel Sambuc 
403*f4a2713aSLionel Sambuc void t37() {
404*f4a2713aSLionel Sambuc   __asm mov eax, 4 + 8
405*f4a2713aSLionel Sambuc   __asm mov eax, 4 + 8 * 16
406*f4a2713aSLionel Sambuc   __asm mov eax, -4 + 8 * 16
407*f4a2713aSLionel Sambuc   __asm mov eax, (4 + 4) * 16
408*f4a2713aSLionel Sambuc   __asm mov eax, 4 + 8 * -16
409*f4a2713aSLionel Sambuc   __asm mov eax, 4 + 16 / -8
410*f4a2713aSLionel Sambuc   __asm mov eax, (16 + 16) / -8
411*f4a2713aSLionel Sambuc // CHECK: t37
412*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$12", "~{eax},~{dirflag},~{fpsr},~{flags}"()
413*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$132", "~{eax},~{dirflag},~{fpsr},~{flags}"()
414*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$124", "~{eax},~{dirflag},~{fpsr},~{flags}"()
415*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$128", "~{eax},~{dirflag},~{fpsr},~{flags}"()
416*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967172", "~{eax},~{dirflag},~{fpsr},~{flags}"()
417*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
418*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967292", "~{eax},~{dirflag},~{fpsr},~{flags}"()
419*f4a2713aSLionel Sambuc }
420*f4a2713aSLionel Sambuc 
421*f4a2713aSLionel Sambuc void t38() {
422*f4a2713aSLionel Sambuc   int arr[4];
423*f4a2713aSLionel Sambuc   __asm mov eax, 4+4[arr]
424*f4a2713aSLionel Sambuc   __asm mov eax, (4+4)[arr + 4]
425*f4a2713aSLionel Sambuc   __asm mov eax, 8*2[arr + 4 + 32*2 - 4]
426*f4a2713aSLionel Sambuc   __asm mov eax, 12+20[4 + arr]
427*f4a2713aSLionel Sambuc   __asm mov eax, 4*16+4[4 + arr + 4]
428*f4a2713aSLionel Sambuc   __asm mov eax, 4*4[64 + arr + (2*32)]
429*f4a2713aSLionel Sambuc   __asm mov eax, 4*(4-2)[64 + arr - 2*32]
430*f4a2713aSLionel Sambuc   __asm mov eax, 32*(4-2)[arr - 2*32]
431*f4a2713aSLionel Sambuc // CHECK: t38
432*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
433*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
434*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
435*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
436*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
437*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
438*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
439*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
440*f4a2713aSLionel Sambuc }
441