blob: 6395e428ed6a5fcd3659bdb7e5d4cdf662c335eb [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// REQUIRES: x86-registered-target
Rafael Espindolaa3f55b02013-09-04 04:12:25 +00002// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
Chad Rosier25bc47e2012-10-19 20:38:09 +00003
Chad Rosierb64f3102012-08-08 20:37:31 +00004void t1() {
5// CHECK: @t1
Chad Rosier87d2a372013-03-27 21:54:09 +00006// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosierb64f3102012-08-08 20:37:31 +00007// CHECK: ret void
8 __asm {}
9}
Chad Rosier265f5382012-08-13 20:32:07 +000010
11void t2() {
12// CHECK: @t2
Chad Rosier87d2a372013-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 Rosier265f5382012-08-13 20:32:07 +000016// CHECK: ret void
17 __asm nop
18 __asm nop
19 __asm nop
20}
21
22void t3() {
23// CHECK: @t3
Chad Rosier87d2a372013-03-27 21:54:09 +000024// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier265f5382012-08-13 20:32:07 +000025// CHECK: ret void
26 __asm nop __asm nop __asm nop
27}
28
29void t4(void) {
30// CHECK: @t4
Chad Rosier87d2a372013-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 Rosier265f5382012-08-13 20:32:07 +000033// CHECK: ret void
34 __asm mov ebx, eax
35 __asm mov ecx, ebx
36}
37
38void t5(void) {
39// CHECK: @t5
Chad Rosier87d2a372013-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 Rosier265f5382012-08-13 20:32:07 +000041// CHECK: ret void
42 __asm mov ebx, eax __asm mov ecx, ebx
43}
Chad Rosier27ef16b2012-08-14 23:48:41 +000044
45void t6(void) {
46 __asm int 0x2c
47// CHECK: t6
Chad Rosier87d2a372013-03-27 21:54:09 +000048// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier27ef16b2012-08-14 23:48:41 +000049}
50
Chad Rosier7fcde172012-08-21 17:01:26 +000051void t7() {
Chad Rosier27ef16b2012-08-14 23:48:41 +000052 __asm {
53 int 0x2c ; } asm comments are fun! }{
54 }
55 __asm {}
Chad Rosier7fcde172012-08-21 17:01:26 +000056// CHECK: t7
Chad Rosier87d2a372013-03-27 21:54:09 +000057// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
58// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier27ef16b2012-08-14 23:48:41 +000059}
Chad Rosierac9289d2012-10-02 20:55:30 +000060
Chad Rosier7fcde172012-08-21 17:01:26 +000061int t8() {
Chad Rosierd9b56ed2012-10-15 19:56:10 +000062 __asm int 4 ; } comments for single-line asm
Chad Rosier27ef16b2012-08-14 23:48:41 +000063 __asm {}
64 __asm int 4
65 return 10;
Chad Rosier7fcde172012-08-21 17:01:26 +000066// CHECK: t8
Chad Rosier87d2a372013-03-27 21:54:09 +000067// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
68// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
69// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier27ef16b2012-08-14 23:48:41 +000070// CHECK: ret i32 10
71}
Chad Rosierac9289d2012-10-02 20:55:30 +000072
Chad Rosier7fcde172012-08-21 17:01:26 +000073void t9() {
Chad Rosier27ef16b2012-08-14 23:48:41 +000074 __asm {
75 push ebx
76 mov ebx, 0x07
77 pop ebx
78 }
Chad Rosier7fcde172012-08-21 17:01:26 +000079// CHECK: t9
Stephen Hines651f13c2014-04-23 16:59:28 -070080// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier27ef16b2012-08-14 23:48:41 +000081}
Chad Rosierf64c1182012-08-16 17:10:59 +000082
Chad Rosier7fcde172012-08-21 17:01:26 +000083unsigned t10(void) {
Chad Rosierf64c1182012-08-16 17:10:59 +000084 unsigned i = 1, j;
85 __asm {
86 mov eax, i
87 mov j, eax
88 }
89 return j;
Chad Rosier7fcde172012-08-21 17:01:26 +000090// CHECK: t10
Chad Rosierf64c1182012-08-16 17:10:59 +000091// CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
92// CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
93// CHECK: store i32 1, i32* [[I]], align 4
Chad Rosier87d2a372013-03-27 21:54:09 +000094// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}})
Chad Rosierf64c1182012-08-16 17:10:59 +000095// CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
96// CHECK: ret i32 [[RET]]
97}
Chad Rosier700ce642012-08-16 22:25:38 +000098
Chad Rosier7fcde172012-08-21 17:01:26 +000099void t11(void) {
Chad Rosier4de97162012-09-11 00:51:28 +0000100 __asm mov eax, 1
Chad Rosierfba3fb92012-10-12 21:37:00 +0000101// CHECK: t11
Chad Rosier87d2a372013-03-27 21:54:09 +0000102// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier4de97162012-09-11 00:51:28 +0000103}
Chad Rosier7f9678b2012-09-12 18:14:25 +0000104
Chad Rosierfba3fb92012-10-12 21:37:00 +0000105unsigned t12(void) {
Chad Rosierb55e6022012-09-13 00:06:55 +0000106 unsigned i = 1, j, l = 1, m;
107 __asm {
108 mov eax, i
109 mov j, eax
110 mov eax, l
111 mov m, eax
112 }
113 return j + m;
Chad Rosierfba3fb92012-10-12 21:37:00 +0000114// CHECK: t12
Chad Rosier87d2a372013-03-27 21:54:09 +0000115// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $3\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
Chad Rosier362b18c2012-10-19 20:57:37 +0000116}
117
118void t13() {
119 char i = 1;
120 short j = 2;
121 __asm movzx eax, i
122 __asm movzx eax, j
123// CHECK: t13
Chad Rosier87d2a372013-03-27 21:54:09 +0000124// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}})
125// CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}})
Chad Rosierb55e6022012-09-13 00:06:55 +0000126}
Chad Rosierb0850b32012-10-19 23:16:17 +0000127
128void t14() {
129 unsigned i = 1, j = 2;
130 __asm {
131 .if 1
132 mov eax, i
133 .else
134 mov ebx, j
135 .endif
136 }
137// CHECK: t14
Chad Rosier87d2a372013-03-27 21:54:09 +0000138// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosierb0850b32012-10-19 23:16:17 +0000139}
Chad Rosier5a12aca2012-10-22 19:43:17 +0000140
Chad Rosier6949ab12013-01-08 23:51:48 +0000141int gvar = 10;
Chad Rosier5a12aca2012-10-22 19:43:17 +0000142void t15() {
Chad Rosier6949ab12013-01-08 23:51:48 +0000143 int lvar = 10;
144 __asm mov eax, lvar ; eax = 10
145 __asm mov eax, offset lvar ; eax = address of lvar
146 __asm mov eax, offset gvar ; eax = address of gvar
Chad Rosier5a12aca2012-10-22 19:43:17 +0000147// CHECK: t15
Chad Rosier87d2a372013-03-27 21:54:09 +0000148// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
149// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
150// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}})
Chad Rosier5a12aca2012-10-22 19:43:17 +0000151}
Chad Rosier42242552012-10-24 17:23:06 +0000152
153void t16() {
154 int var = 10;
155 __asm mov [eax], offset var
156// CHECK: t16
Chad Rosier87d2a372013-03-27 21:54:09 +0000157// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier42242552012-10-24 17:23:06 +0000158}
Chad Rosier1bed9b72012-10-24 17:48:01 +0000159
160void t17() {
161 __asm _emit 0x4A
162 __asm _emit 0x43
163 __asm _emit 0x4B
Chad Rosier7243b0f2013-02-12 21:34:14 +0000164 __asm _EMIT 0x4B
Chad Rosier1bed9b72012-10-24 17:48:01 +0000165// CHECK: t17
Chad Rosier87d2a372013-03-27 21:54:09 +0000166// CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"()
167// CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"()
168// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
169// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier1bed9b72012-10-24 17:48:01 +0000170}
Chad Rosierf7427272012-10-24 22:22:12 +0000171
Chad Rosierda5c3b72012-10-26 18:04:45 +0000172void t20() {
Chad Rosier205ecf02013-01-17 19:22:48 +0000173 char bar;
Chad Rosierda5c3b72012-10-26 18:04:45 +0000174 int foo;
Chad Rosier205ecf02013-01-17 19:22:48 +0000175 char _bar[2];
176 int _foo[4];
177
178 __asm mov eax, LENGTH foo
179 __asm mov eax, LENGTH bar
180 __asm mov eax, LENGTH _foo
181 __asm mov eax, LENGTH _bar
Chad Rosierda5c3b72012-10-26 18:04:45 +0000182// CHECK: t20
Chad Rosier87d2a372013-03-27 21:54:09 +0000183// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
184// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
185// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
186// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier205ecf02013-01-17 19:22:48 +0000187
188 __asm mov eax, TYPE foo
189 __asm mov eax, TYPE bar
190 __asm mov eax, TYPE _foo
191 __asm mov eax, TYPE _bar
Chad Rosier87d2a372013-03-27 21:54:09 +0000192// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
193// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
194// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
195// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier205ecf02013-01-17 19:22:48 +0000196
197 __asm mov eax, SIZE foo
198 __asm mov eax, SIZE bar
199 __asm mov eax, SIZE _foo
200 __asm mov eax, SIZE _bar
Chad Rosier87d2a372013-03-27 21:54:09 +0000201// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
202// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
203// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"()
204// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosierda5c3b72012-10-26 18:04:45 +0000205}
Chad Rosiere0c01962012-12-05 19:52:05 +0000206
Chad Rosiere0c01962012-12-05 19:52:05 +0000207void t21() {
208 __asm {
209 __asm push ebx
210 __asm mov ebx, 0x07
211 __asm pop ebx
212 }
213// CHECK: t21
Stephen Hines651f13c2014-04-23 16:59:28 -0700214// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere0c01962012-12-05 19:52:05 +0000215}
216
217extern void t22_helper(int x);
218void t22() {
219 int x = 0;
220 __asm {
221 __asm push ebx
222 __asm mov ebx, esp
223 }
224 t22_helper(x);
225 __asm {
226 __asm mov esp, ebx
227 __asm pop ebx
228 }
229// CHECK: t22
Stephen Hines651f13c2014-04-23 16:59:28 -0700230// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere0c01962012-12-05 19:52:05 +0000231// CHECK: call void @t22_helper
Chad Rosier87d2a372013-03-27 21:54:09 +0000232// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosiere0c01962012-12-05 19:52:05 +0000233}
Chad Rosier7520fca2013-01-07 20:34:40 +0000234
235void t23() {
236 __asm {
237 the_label:
238 }
239// CHECK: t23
Chad Rosier87d2a372013-03-27 21:54:09 +0000240// CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier7520fca2013-01-07 20:34:40 +0000241}
Chad Rosier3731a412013-01-10 22:11:28 +0000242
243void t24_helper(void) {}
244void t24() {
245 __asm call t24_helper
246// CHECK: t24
Chad Rosier87d2a372013-03-27 21:54:09 +0000247// CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper)
Chad Rosier3731a412013-01-10 22:11:28 +0000248}
Chad Rosier8e70b002013-02-12 18:45:21 +0000249
250void t25() {
251 __asm mov eax, 0ffffffffh
252 __asm mov eax, 0fh
253 __asm mov eax, 0a2h
254 __asm mov eax, 0xa2h
255 __asm mov eax, 0xa2
256// CHECK: t25
Chad Rosier7b4700c2013-04-17 00:12:09 +0000257// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967295", "~{eax},~{dirflag},~{fpsr},~{flags}"()
258// CHECK: call void asm sideeffect inteldialect "mov eax, $$15", "~{eax},~{dirflag},~{fpsr},~{flags}"()
259// CHECK: call void asm sideeffect inteldialect "mov eax, $$162", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier87d2a372013-03-27 21:54:09 +0000260// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"()
261// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier8e70b002013-02-12 18:45:21 +0000262}
263
264void t26() {
265 __asm pushad
266 __asm mov eax, 0
267 __asm __emit 0fh
268 __asm __emit 0a2h
Chad Rosier7243b0f2013-02-12 21:34:14 +0000269 __asm __EMIT 0a2h
Chad Rosier8e70b002013-02-12 18:45:21 +0000270 __asm popad
Stephen Hines651f13c2014-04-23 16:59:28 -0700271// FIXME: These all need to be merged into the same asm blob.
Chad Rosier8e70b002013-02-12 18:45:21 +0000272// CHECK: t26
Stephen Hines651f13c2014-04-23 16:59:28 -0700273// CHECK: call void asm sideeffect inteldialect "pushad", "~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier87d2a372013-03-27 21:54:09 +0000274// CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"()
275// CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"()
276// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
277// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"()
Stephen Hines651f13c2014-04-23 16:59:28 -0700278// CHECK: call void asm sideeffect inteldialect "popad", "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier8e70b002013-02-12 18:45:21 +0000279}
280
281void t27() {
282 __asm mov eax, fs:[0h]
283// CHECK: t27
Chad Rosierb8018372013-04-05 16:29:17 +0000284// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier8e70b002013-02-12 18:45:21 +0000285}
Chad Rosier7243b0f2013-02-12 21:34:14 +0000286
287void t28() {
288 __asm align 8
289 __asm align 16;
290 __asm align 128;
291 __asm ALIGN 256;
292// CHECK: t28
Chad Rosier87d2a372013-03-27 21:54:09 +0000293// CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"()
294// CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"()
295// CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"()
296// CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"()
Chad Rosier7243b0f2013-02-12 21:34:14 +0000297}
Chad Rosier74992c42013-02-13 01:06:08 +0000298
299void t29() {
300 int arr[2] = {0, 0};
301 int olen = 0, osize = 0, otype = 0;
302 __asm mov olen, LENGTH arr
303 __asm mov osize, SIZE arr
304 __asm mov otype, TYPE arr
305// CHECK: t29
Chad Rosier87d2a372013-03-27 21:54:09 +0000306// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
307// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
308// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier74992c42013-02-13 01:06:08 +0000309}
Chad Rosierd8d7f5f2013-02-13 21:34:54 +0000310
311int results[2] = {13, 37};
312int *t30()
313{
314 int *res;
315 __asm lea edi, results
316 __asm mov res, edi
317 return res;
318// CHECK: t30
Chad Rosier87d2a372013-03-27 21:54:09 +0000319// CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}})
320// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}})
Chad Rosierd8d7f5f2013-02-13 21:34:54 +0000321}
Bill Wendling4e1125f2013-02-22 09:10:20 +0000322
Chad Rosier59c90032013-02-25 19:13:23 +0000323void t31() {
324 __asm pushad
325 __asm popad
326// CHECK: t31
Stephen Hines651f13c2014-04-23 16:59:28 -0700327// CHECK: call void asm sideeffect inteldialect "pushad", "~{esp},~{dirflag},~{fpsr},~{flags}"()
328// CHECK: call void asm sideeffect inteldialect "popad", "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier59c90032013-02-25 19:13:23 +0000329}
330
Chad Rosier2317dc82013-03-18 23:32:33 +0000331void t32() {
332 int i;
333 __asm mov eax, i
334 __asm mov eax, dword ptr i
335 __asm mov ax, word ptr i
336 __asm mov al, byte ptr i
337// CHECK: t32
Chad Rosier87d2a372013-03-27 21:54:09 +0000338// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
339// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
340// CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
341// CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosier2317dc82013-03-18 23:32:33 +0000342}
343
Chad Rosierc7936c92013-03-19 21:12:57 +0000344void t33() {
345 int i;
346 __asm mov eax, [i]
347 __asm mov eax, dword ptr [i]
348 __asm mov ax, word ptr [i]
349 __asm mov al, byte ptr [i]
350// CHECK: t33
Chad Rosier87d2a372013-03-27 21:54:09 +0000351// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
352// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
353// CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
354// CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
Chad Rosierc7936c92013-03-19 21:12:57 +0000355}
356
Chad Rosier5e5ca1b2013-03-27 21:50:39 +0000357void t34() {
358 __asm prefetchnta 64[eax]
359 __asm mov eax, dword ptr 4[eax]
360// CHECK: t34
361// CHECK: call void asm sideeffect inteldialect "prefetchnta $$64[eax]", "~{dirflag},~{fpsr},~{flags}"()
362// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4[eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
363}
Chad Rosierb8018372013-04-05 16:29:17 +0000364
365void t35() {
366 __asm prefetchnta [eax + (200*64)]
367 __asm mov eax, dword ptr [eax + (200*64)]
368// CHECK: t35
369// CHECK: call void asm sideeffect inteldialect "prefetchnta [eax + ($$200*$$64)]", "~{dirflag},~{fpsr},~{flags}"()
370// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax + ($$200*$$64)]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
371}
Chad Rosier36ec9c22013-04-08 17:44:05 +0000372
373void t36() {
374 int arr[4];
375 __asm mov eax, 4[arr]
Chad Rosier0c50a032013-04-12 19:52:07 +0000376 __asm mov eax, 4[arr + 4]
377 __asm mov eax, 8[arr + 4 + 32*2 - 4]
378 __asm mov eax, 12[4 + arr]
379 __asm mov eax, 4[4 + arr + 4]
380 __asm mov eax, 4[64 + arr + (2*32)]
381 __asm mov eax, 4[64 + arr - 2*32]
Chad Rosiera5ceca92013-04-10 16:33:34 +0000382 __asm mov eax, [arr + 4]
Chad Rosier579d8d12013-04-12 18:54:40 +0000383 __asm mov eax, [arr + 4 + 32*2 - 4]
Chad Rosiera5ceca92013-04-10 16:33:34 +0000384 __asm mov eax, [4 + arr]
385 __asm mov eax, [4 + arr + 4]
Chad Rosier333ac6e2013-04-12 18:22:08 +0000386 __asm mov eax, [64 + arr + (2*32)]
387 __asm mov eax, [64 + arr - 2*32]
Chad Rosier36ec9c22013-04-08 17:44:05 +0000388// CHECK: t36
Chad Rosier333ac6e2013-04-12 18:22:08 +0000389// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier0c50a032013-04-12 19:52:07 +0000390// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
391// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
392// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
393// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
394// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
395// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier579d8d12013-04-12 18:54:40 +0000396// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
397// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier333ac6e2013-04-12 18:22:08 +0000398// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
399// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
400// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
401// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
Chad Rosier36ec9c22013-04-08 17:44:05 +0000402}
Chad Rosier7b4700c2013-04-17 00:12:09 +0000403
404void t37() {
405 __asm mov eax, 4 + 8
406 __asm mov eax, 4 + 8 * 16
407 __asm mov eax, -4 + 8 * 16
408 __asm mov eax, (4 + 4) * 16
Chad Rosierabee27b2013-04-17 21:02:39 +0000409 __asm mov eax, 4 + 8 * -16
410 __asm mov eax, 4 + 16 / -8
411 __asm mov eax, (16 + 16) / -8
Chad Rosier7b4700c2013-04-17 00:12:09 +0000412// CHECK: t37
413// CHECK: call void asm sideeffect inteldialect "mov eax, $$12", "~{eax},~{dirflag},~{fpsr},~{flags}"()
414// CHECK: call void asm sideeffect inteldialect "mov eax, $$132", "~{eax},~{dirflag},~{fpsr},~{flags}"()
415// CHECK: call void asm sideeffect inteldialect "mov eax, $$124", "~{eax},~{dirflag},~{fpsr},~{flags}"()
416// CHECK: call void asm sideeffect inteldialect "mov eax, $$128", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosierabee27b2013-04-17 21:02:39 +0000417// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967172", "~{eax},~{dirflag},~{fpsr},~{flags}"()
418// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
419// CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967292", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier7b4700c2013-04-17 00:12:09 +0000420}
421
422void t38() {
423 int arr[4];
424 __asm mov eax, 4+4[arr]
425 __asm mov eax, (4+4)[arr + 4]
426 __asm mov eax, 8*2[arr + 4 + 32*2 - 4]
427 __asm mov eax, 12+20[4 + arr]
428 __asm mov eax, 4*16+4[4 + arr + 4]
429 __asm mov eax, 4*4[64 + arr + (2*32)]
430 __asm mov eax, 4*(4-2)[64 + arr - 2*32]
431 __asm mov eax, 32*(4-2)[arr - 2*32]
Chad Rosier68ea1d22013-04-18 23:12:05 +0000432// CHECK: t38
Chad Rosier7b4700c2013-04-17 00:12:09 +0000433// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
434// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
435// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
436// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
437// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
438// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
439// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
440// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
441}
Stephen Hines651f13c2014-04-23 16:59:28 -0700442
443void cpuid() {
444 __asm cpuid
445// CHECK-LABEL: define void @cpuid
446// CHECK: call void asm sideeffect inteldialect "cpuid", "~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()
447}
448
449typedef struct {
450 int a;
451 int b;
452} A;
453
454void t39() {
455 __asm mov eax, [eax].A.b
456 __asm mov eax, [eax] A.b
457 __asm mov eax, fs:[0] A.b
458 // CHECK-LABEL: define void @t39
459 // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
460 // CHECK: call void asm sideeffect inteldialect "mov eax, [eax] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
461 // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
462}
463
464void t40(float a) {
465 int i;
466 __asm fld a
467 __asm fistp i
468 // CHECK-LABEL: define void @t40
469 // CHECK: call void asm sideeffect inteldialect "fld dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(float* {{.*}})
470 // CHECK: call void asm sideeffect inteldialect "fistp dword ptr $0", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* {{.*}})
471}