blob: 2c67106941420a72ac9aa1cad83bbcb410dd9612 [file] [log] [blame]
NAKAMURA Takumi0acd8a72013-12-04 03:41:33 +00001// REQUIRES: x86-registered-target
Rafael Espindolaff7cea82013-09-04 04:12:25 +00002// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
Chad Rosier14e0bb52012-10-19 20:38:09 +00003
Chad Rosier83916492012-08-08 20:37:31 +00004void t1() {
5// CHECK: @t1
Chad Rosier459d3ee2013-03-27 21:54:09 +00006// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier83916492012-08-08 20:37:31 +00007// CHECK: ret void
8 __asm {}
9}
Chad Rosier65a8e0b2012-08-13 20:32:07 +000010
11void t2() {
12// CHECK: @t2
Chad Rosier459d3ee2013-03-27 21:54:09 +000013// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
14// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
15// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier65a8e0b2012-08-13 20:32:07 +000016// CHECK: ret void
17 __asm nop
18 __asm nop
19 __asm nop
20}
21
22void t3() {
23// CHECK: @t3
Chad Rosier459d3ee2013-03-27 21:54:09 +000024// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier65a8e0b2012-08-13 20:32:07 +000025// CHECK: ret void
26 __asm nop __asm nop __asm nop
27}
28
29void t4(void) {
30// CHECK: @t4
Chad Rosier459d3ee2013-03-27 21:54:09 +000031// CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"()
32// CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier65a8e0b2012-08-13 20:32:07 +000033// CHECK: ret void
34 __asm mov ebx, eax
35 __asm mov ecx, ebx
36}
37
38void t5(void) {
39// CHECK: @t5
Chad Rosier459d3ee2013-03-27 21:54:09 +000040// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier65a8e0b2012-08-13 20:32:07 +000041// CHECK: ret void
42 __asm mov ebx, eax __asm mov ecx, ebx
43}
Chad Rosiera078a5e2012-08-14 23:48:41 +000044
45void t6(void) {
46 __asm int 0x2c
47// CHECK: t6
Chad Rosier459d3ee2013-03-27 21:54:09 +000048// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosiera078a5e2012-08-14 23:48:41 +000049}
50
Chad Rosierb84cc6c2012-08-21 17:01:26 +000051void t7() {
Chad Rosiera078a5e2012-08-14 23:48:41 +000052 __asm {
53 int 0x2c ; } asm comments are fun! }{
54 }
Ehsan Akhgari0f89fac2014-07-06 05:26:54 +000055 __asm {
56 {
57 int 0x2c ; } asm comments are fun! }{
58 }
59 }
Chad Rosiera078a5e2012-08-14 23:48:41 +000060 __asm {}
Chad Rosierb84cc6c2012-08-21 17:01:26 +000061// CHECK: t7
Chad Rosier459d3ee2013-03-27 21:54:09 +000062// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
63// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosiera078a5e2012-08-14 23:48:41 +000064}
Chad Rosier77682992012-10-02 20:55:30 +000065
Chad Rosierb84cc6c2012-08-21 17:01:26 +000066int t8() {
Chad Rosier4a0054f2012-10-15 19:56:10 +000067 __asm int 4 ; } comments for single-line asm
Chad Rosiera078a5e2012-08-14 23:48:41 +000068 __asm {}
69 __asm int 4
70 return 10;
Chad Rosierb84cc6c2012-08-21 17:01:26 +000071// CHECK: t8
Chad Rosier459d3ee2013-03-27 21:54:09 +000072// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
73// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
74// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosiera078a5e2012-08-14 23:48:41 +000075// CHECK: ret i32 10
76}
Chad Rosier77682992012-10-02 20:55:30 +000077
Chad Rosierb84cc6c2012-08-21 17:01:26 +000078void t9() {
Chad Rosiera078a5e2012-08-14 23:48:41 +000079 __asm {
80 push ebx
Ehsan Akhgari0f89fac2014-07-06 05:26:54 +000081 { mov ebx, 0x07 }
82 __asm { pop ebx }
Chad Rosiera078a5e2012-08-14 23:48:41 +000083 }
Chad Rosierb84cc6c2012-08-21 17:01:26 +000084// CHECK: t9
Reid Kleckner5dc20b12013-12-10 18:27:51 +000085// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiera078a5e2012-08-14 23:48:41 +000086}
Chad Rosier592b90a2012-08-16 17:10:59 +000087
Chad Rosierb84cc6c2012-08-21 17:01:26 +000088unsigned t10(void) {
Chad Rosier592b90a2012-08-16 17:10:59 +000089 unsigned i = 1, j;
90 __asm {
91 mov eax, i
92 mov j, eax
93 }
94 return j;
Chad Rosierb84cc6c2012-08-21 17:01:26 +000095// CHECK: t10
Chad Rosier592b90a2012-08-16 17:10:59 +000096// CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
97// CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
98// CHECK: store i32 1, i32* [[I]], align 4
Chad Rosier459d3ee2013-03-27 21:54:09 +000099// 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* %{{.*}})
Chad Rosier592b90a2012-08-16 17:10:59 +0000100// CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
101// CHECK: ret i32 [[RET]]
102}
Chad Rosier3d4b98b2012-08-16 22:25:38 +0000103
Chad Rosierb84cc6c2012-08-21 17:01:26 +0000104void t11(void) {
Chad Rosierbd7fdad2012-09-11 00:51:28 +0000105 __asm mov eax, 1
Chad Rosier941faac2012-10-12 21:37:00 +0000106// CHECK: t11
Chad Rosier459d3ee2013-03-27 21:54:09 +0000107// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosierbd7fdad2012-09-11 00:51:28 +0000108}
Chad Rosier57cd91f2012-09-12 18:14:25 +0000109
Chad Rosier941faac2012-10-12 21:37:00 +0000110unsigned t12(void) {
Chad Rosierb261a502012-09-13 00:06:55 +0000111 unsigned i = 1, j, l = 1, m;
112 __asm {
113 mov eax, i
114 mov j, eax
115 mov eax, l
116 mov m, eax
117 }
118 return j + m;
Chad Rosier941faac2012-10-12 21:37:00 +0000119// CHECK: t12
Chad Rosier459d3ee2013-03-27 21:54:09 +0000120// 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* %{{.*}})
Chad Rosier81bf0e82012-10-19 20:57:37 +0000121}
122
123void t13() {
124 char i = 1;
125 short j = 2;
126 __asm movzx eax, i
127 __asm movzx eax, j
128// CHECK: t13
Chad Rosier459d3ee2013-03-27 21:54:09 +0000129// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}})
130// CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}})
Chad Rosierb261a502012-09-13 00:06:55 +0000131}
Chad Rosier4e11eec2012-10-19 23:16:17 +0000132
133void t14() {
134 unsigned i = 1, j = 2;
135 __asm {
136 .if 1
Ehsan Akhgari0f89fac2014-07-06 05:26:54 +0000137 { mov eax, i }
Chad Rosier4e11eec2012-10-19 23:16:17 +0000138 .else
139 mov ebx, j
140 .endif
141 }
142// CHECK: t14
Chad Rosier459d3ee2013-03-27 21:54:09 +0000143// 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* %{{.*}})
Chad Rosier4e11eec2012-10-19 23:16:17 +0000144}
Chad Rosierf7000f82012-10-22 19:43:17 +0000145
Chad Rosierd35ae732013-01-08 23:51:48 +0000146int gvar = 10;
Chad Rosierf7000f82012-10-22 19:43:17 +0000147void t15() {
Chad Rosierd35ae732013-01-08 23:51:48 +0000148 int lvar = 10;
149 __asm mov eax, lvar ; eax = 10
150 __asm mov eax, offset lvar ; eax = address of lvar
151 __asm mov eax, offset gvar ; eax = address of gvar
Chad Rosierf7000f82012-10-22 19:43:17 +0000152// CHECK: t15
Chad Rosier459d3ee2013-03-27 21:54:09 +0000153// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
154// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
155// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}})
Chad Rosierf7000f82012-10-22 19:43:17 +0000156}
Chad Rosier42146d92012-10-24 17:23:06 +0000157
158void t16() {
159 int var = 10;
160 __asm mov [eax], offset var
161// CHECK: t16
Chad Rosier459d3ee2013-03-27 21:54:09 +0000162// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier42146d92012-10-24 17:23:06 +0000163}
Chad Rosier340c1ca2012-10-24 17:48:01 +0000164
165void t17() {
166 __asm _emit 0x4A
167 __asm _emit 0x43
168 __asm _emit 0x4B
Chad Rosier3ea602c2013-02-12 21:34:14 +0000169 __asm _EMIT 0x4B
Chad Rosier340c1ca2012-10-24 17:48:01 +0000170// CHECK: t17
Chad Rosier459d3ee2013-03-27 21:54:09 +0000171// CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"()
172// CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"()
173// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
174// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier340c1ca2012-10-24 17:48:01 +0000175}
Chad Rosier602d09d2012-10-24 22:22:12 +0000176
Chad Rosier0473d542012-10-26 18:04:45 +0000177void t20() {
Chad Rosiere343bc82013-01-17 19:22:48 +0000178 char bar;
Chad Rosier0473d542012-10-26 18:04:45 +0000179 int foo;
Chad Rosiere343bc82013-01-17 19:22:48 +0000180 char _bar[2];
181 int _foo[4];
182
183 __asm mov eax, LENGTH foo
184 __asm mov eax, LENGTH bar
185 __asm mov eax, LENGTH _foo
186 __asm mov eax, LENGTH _bar
Chad Rosier0473d542012-10-26 18:04:45 +0000187// CHECK: t20
Chad Rosier459d3ee2013-03-27 21:54:09 +0000188// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
189// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
190// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
191// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere343bc82013-01-17 19:22:48 +0000192
193 __asm mov eax, TYPE foo
194 __asm mov eax, TYPE bar
195 __asm mov eax, TYPE _foo
196 __asm mov eax, TYPE _bar
Chad Rosier459d3ee2013-03-27 21:54:09 +0000197// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
198// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
199// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
200// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere343bc82013-01-17 19:22:48 +0000201
202 __asm mov eax, SIZE foo
203 __asm mov eax, SIZE bar
204 __asm mov eax, SIZE _foo
205 __asm mov eax, SIZE _bar
Chad Rosier459d3ee2013-03-27 21:54:09 +0000206// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
207// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
208// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"()
209// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier0473d542012-10-26 18:04:45 +0000210}
Chad Rosiered928152012-12-05 19:52:05 +0000211
Chad Rosiered928152012-12-05 19:52:05 +0000212void t21() {
213 __asm {
214 __asm push ebx
215 __asm mov ebx, 0x07
216 __asm pop ebx
217 }
218// CHECK: t21
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000219// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiered928152012-12-05 19:52:05 +0000220}
221
222extern void t22_helper(int x);
223void t22() {
224 int x = 0;
225 __asm {
226 __asm push ebx
227 __asm mov ebx, esp
228 }
229 t22_helper(x);
230 __asm {
231 __asm mov esp, ebx
232 __asm pop ebx
233 }
234// CHECK: t22
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000235// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiered928152012-12-05 19:52:05 +0000236// CHECK: call void @t22_helper
Chad Rosier459d3ee2013-03-27 21:54:09 +0000237// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiered928152012-12-05 19:52:05 +0000238}
Chad Rosier8f980ef2013-01-07 20:34:40 +0000239
240void t23() {
241 __asm {
242 the_label:
243 }
244// CHECK: t23
Chad Rosier459d3ee2013-03-27 21:54:09 +0000245// CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier8f980ef2013-01-07 20:34:40 +0000246}
Chad Rosier97b58952013-01-10 22:11:28 +0000247
248void t24_helper(void) {}
249void t24() {
250 __asm call t24_helper
251// CHECK: t24
Chad Rosier459d3ee2013-03-27 21:54:09 +0000252// CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper)
Chad Rosier97b58952013-01-10 22:11:28 +0000253}
Chad Rosiere90add42013-02-12 18:45:21 +0000254
255void t25() {
256 __asm mov eax, 0ffffffffh
257 __asm mov eax, 0fh
258 __asm mov eax, 0a2h
259 __asm mov eax, 0xa2h
260 __asm mov eax, 0xa2
261// CHECK: t25
Chad Rosiereb294532013-04-17 00:12:09 +0000262// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967295", "~{eax},~{dirflag},~{fpsr},~{flags}"()
263// CHECK: call void asm sideeffect inteldialect "mov eax, $$15", "~{eax},~{dirflag},~{fpsr},~{flags}"()
264// CHECK: call void asm sideeffect inteldialect "mov eax, $$162", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier459d3ee2013-03-27 21:54:09 +0000265// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"()
266// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere90add42013-02-12 18:45:21 +0000267}
268
269void t26() {
270 __asm pushad
271 __asm mov eax, 0
272 __asm __emit 0fh
273 __asm __emit 0a2h
Chad Rosier3ea602c2013-02-12 21:34:14 +0000274 __asm __EMIT 0a2h
Chad Rosiere90add42013-02-12 18:45:21 +0000275 __asm popad
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000276// FIXME: These all need to be merged into the same asm blob.
Chad Rosiere90add42013-02-12 18:45:21 +0000277// CHECK: t26
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000278// CHECK: call void asm sideeffect inteldialect "pushad", "~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier459d3ee2013-03-27 21:54:09 +0000279// CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"()
280// CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"()
281// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
282// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000283// CHECK: call void asm sideeffect inteldialect "popad", "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere90add42013-02-12 18:45:21 +0000284}
285
286void t27() {
287 __asm mov eax, fs:[0h]
288// CHECK: t27
Chad Rosier26949f12013-04-05 16:29:17 +0000289// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere90add42013-02-12 18:45:21 +0000290}
Chad Rosier3ea602c2013-02-12 21:34:14 +0000291
292void t28() {
293 __asm align 8
294 __asm align 16;
295 __asm align 128;
296 __asm ALIGN 256;
297// CHECK: t28
Chad Rosier459d3ee2013-03-27 21:54:09 +0000298// CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"()
299// CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"()
300// CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"()
301// CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier3ea602c2013-02-12 21:34:14 +0000302}
Chad Rosier8356d092013-02-13 01:06:08 +0000303
304void t29() {
305 int arr[2] = {0, 0};
306 int olen = 0, osize = 0, otype = 0;
307 __asm mov olen, LENGTH arr
308 __asm mov osize, SIZE arr
309 __asm mov otype, TYPE arr
310// CHECK: t29
Chad Rosier459d3ee2013-03-27 21:54:09 +0000311// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
312// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
313// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier8356d092013-02-13 01:06:08 +0000314}
Chad Rosier5bdd8ed2013-02-13 21:34:54 +0000315
316int results[2] = {13, 37};
317int *t30()
318{
319 int *res;
320 __asm lea edi, results
321 __asm mov res, edi
322 return res;
323// CHECK: t30
Chad Rosier459d3ee2013-03-27 21:54:09 +0000324// CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}})
325// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}})
Chad Rosier5bdd8ed2013-02-13 21:34:54 +0000326}
Bill Wendlinge1c4a1b2013-02-22 09:10:20 +0000327
Chad Rosier1ef5d512013-02-25 19:13:23 +0000328void t31() {
329 __asm pushad
330 __asm popad
331// CHECK: t31
Reid Kleckner5dc20b12013-12-10 18:27:51 +0000332// CHECK: call void asm sideeffect inteldialect "pushad", "~{esp},~{dirflag},~{fpsr},~{flags}"()
333// CHECK: call void asm sideeffect inteldialect "popad", "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier1ef5d512013-02-25 19:13:23 +0000334}
335
Chad Rosier47abcf82013-03-18 23:32:33 +0000336void t32() {
337 int i;
338 __asm mov eax, i
339 __asm mov eax, dword ptr i
340 __asm mov ax, word ptr i
341 __asm mov al, byte ptr i
342// CHECK: t32
Chad Rosier459d3ee2013-03-27 21:54:09 +0000343// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
344// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
345// CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
346// CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier47abcf82013-03-18 23:32:33 +0000347}
348
Chad Rosier993bd122013-03-19 21:12:57 +0000349void t33() {
350 int i;
351 __asm mov eax, [i]
352 __asm mov eax, dword ptr [i]
353 __asm mov ax, word ptr [i]
354 __asm mov al, byte ptr [i]
355// CHECK: t33
Chad Rosier459d3ee2013-03-27 21:54:09 +0000356// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
357// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
358// CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
359// CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier993bd122013-03-19 21:12:57 +0000360}
361
Chad Rosiera0ef4042013-03-27 21:50:39 +0000362void t34() {
363 __asm prefetchnta 64[eax]
364 __asm mov eax, dword ptr 4[eax]
365// CHECK: t34
366// CHECK: call void asm sideeffect inteldialect "prefetchnta $$64[eax]", "~{dirflag},~{fpsr},~{flags}"()
367// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4[eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
368}
Chad Rosier26949f12013-04-05 16:29:17 +0000369
370void t35() {
371 __asm prefetchnta [eax + (200*64)]
372 __asm mov eax, dword ptr [eax + (200*64)]
373// CHECK: t35
374// CHECK: call void asm sideeffect inteldialect "prefetchnta [eax + ($$200*$$64)]", "~{dirflag},~{fpsr},~{flags}"()
375// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax + ($$200*$$64)]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
376}
Chad Rosier6bec4f92013-04-08 17:44:05 +0000377
378void t36() {
379 int arr[4];
380 __asm mov eax, 4[arr]
Chad Rosier7181ed32013-04-12 19:52:07 +0000381 __asm mov eax, 4[arr + 4]
382 __asm mov eax, 8[arr + 4 + 32*2 - 4]
383 __asm mov eax, 12[4 + arr]
384 __asm mov eax, 4[4 + arr + 4]
385 __asm mov eax, 4[64 + arr + (2*32)]
386 __asm mov eax, 4[64 + arr - 2*32]
Chad Rosiere6956c32013-04-10 16:33:34 +0000387 __asm mov eax, [arr + 4]
Chad Rosier4a3b1602013-04-12 18:54:40 +0000388 __asm mov eax, [arr + 4 + 32*2 - 4]
Chad Rosiere6956c32013-04-10 16:33:34 +0000389 __asm mov eax, [4 + arr]
390 __asm mov eax, [4 + arr + 4]
Chad Rosierf8bcfbd2013-04-12 18:22:08 +0000391 __asm mov eax, [64 + arr + (2*32)]
392 __asm mov eax, [64 + arr - 2*32]
Chad Rosier6bec4f92013-04-08 17:44:05 +0000393// CHECK: t36
Chad Rosierf8bcfbd2013-04-12 18:22:08 +0000394// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier7181ed32013-04-12 19:52:07 +0000395// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
396// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
397// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
398// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
399// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
400// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier4a3b1602013-04-12 18:54:40 +0000401// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
402// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosierf8bcfbd2013-04-12 18:22:08 +0000403// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
404// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
405// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
406// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier6bec4f92013-04-08 17:44:05 +0000407}
Chad Rosiereb294532013-04-17 00:12:09 +0000408
409void t37() {
410 __asm mov eax, 4 + 8
411 __asm mov eax, 4 + 8 * 16
412 __asm mov eax, -4 + 8 * 16
413 __asm mov eax, (4 + 4) * 16
Chad Rosierefd87c82013-04-17 21:02:39 +0000414 __asm mov eax, 4 + 8 * -16
415 __asm mov eax, 4 + 16 / -8
416 __asm mov eax, (16 + 16) / -8
Ehsan Akhgari3e0dd892014-07-05 15:04:06 +0000417 __asm mov eax, ~15
Chad Rosiereb294532013-04-17 00:12:09 +0000418// CHECK: t37
419// CHECK: call void asm sideeffect inteldialect "mov eax, $$12", "~{eax},~{dirflag},~{fpsr},~{flags}"()
420// CHECK: call void asm sideeffect inteldialect "mov eax, $$132", "~{eax},~{dirflag},~{fpsr},~{flags}"()
421// CHECK: call void asm sideeffect inteldialect "mov eax, $$124", "~{eax},~{dirflag},~{fpsr},~{flags}"()
422// CHECK: call void asm sideeffect inteldialect "mov eax, $$128", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosierefd87c82013-04-17 21:02:39 +0000423// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967172", "~{eax},~{dirflag},~{fpsr},~{flags}"()
424// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
425// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967292", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Ehsan Akhgari3e0dd892014-07-05 15:04:06 +0000426// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967280", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiereb294532013-04-17 00:12:09 +0000427}
428
429void t38() {
430 int arr[4];
431 __asm mov eax, 4+4[arr]
432 __asm mov eax, (4+4)[arr + 4]
433 __asm mov eax, 8*2[arr + 4 + 32*2 - 4]
434 __asm mov eax, 12+20[4 + arr]
435 __asm mov eax, 4*16+4[4 + arr + 4]
436 __asm mov eax, 4*4[64 + arr + (2*32)]
437 __asm mov eax, 4*(4-2)[64 + arr - 2*32]
438 __asm mov eax, 32*(4-2)[arr - 2*32]
Chad Rosier27480002013-04-18 23:12:05 +0000439// CHECK: t38
Chad Rosiereb294532013-04-17 00:12:09 +0000440// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
441// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
442// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
443// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
444// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
445// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
446// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
447// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
448}
Reid Kleckner020acd82014-01-28 02:09:28 +0000449
450void cpuid() {
451 __asm cpuid
452// CHECK-LABEL: define void @cpuid
453// CHECK: call void asm sideeffect inteldialect "cpuid", "~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()
454}
Reid Kleckner8d4a16e2014-03-06 19:19:36 +0000455
456typedef struct {
457 int a;
458 int b;
459} A;
460
461void t39() {
462 __asm mov eax, [eax].A.b
463 __asm mov eax, [eax] A.b
464 __asm mov eax, fs:[0] A.b
465 // CHECK-LABEL: define void @t39
466 // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
467 // CHECK: call void asm sideeffect inteldialect "mov eax, [eax] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
468 // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
469}
Reid Kleckner185940a2014-03-27 00:00:03 +0000470
471void t40(float a) {
472 int i;
473 __asm fld a
474 __asm fistp i
475 // CHECK-LABEL: define void @t40
476 // CHECK: call void asm sideeffect inteldialect "fld dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(float* {{.*}})
477 // CHECK: call void asm sideeffect inteldialect "fistp dword ptr $0", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* {{.*}})
478}
Nico Weber9a088472014-07-17 20:25:36 +0000479
480void t41(unsigned short a) {
481 __asm mov cs, a;
482 __asm mov ds, a;
483 __asm mov es, a;
484 __asm mov fs, a;
485 __asm mov gs, a;
486 __asm mov ss, a;
NAKAMURA Takumi0c5f4ed2014-07-17 22:51:49 +0000487 // CHECK-LABEL: define void @t41(i16 zeroext %a)
488 // CHECK: [[T41_A_ADDR:%.+]] = alloca i16
489 // CHECK: store i16 %a, i16* [[T41_A_ADDR]]
490 // CHECK: call void asm sideeffect inteldialect "mov cs, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
491 // CHECK: call void asm sideeffect inteldialect "mov ds, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
492 // CHECK: call void asm sideeffect inteldialect "mov es, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
493 // CHECK: call void asm sideeffect inteldialect "mov fs, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
494 // CHECK: call void asm sideeffect inteldialect "mov gs, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
495 // CHECK: call void asm sideeffect inteldialect "mov ss, word ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(i16* [[T41_A_ADDR]])
Nico Weber9a088472014-07-17 20:25:36 +0000496}