blob: 00643406a89bc6227a5c9df115fde800ab65f660 [file] [log] [blame]
NAKAMURA Takumicc59e912012-09-27 14:55:08 +00001// REQUIRES: x86-64-registered-target
Chad Rosier48a05b92012-08-08 21:15:52 +00002// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -O0 -fms-extensions -fenable-experimental-ms-inline-asm -w -emit-llvm -o - | FileCheck %s
Chad Rosierb64f3102012-08-08 20:37:31 +00003
4void t1() {
5// CHECK: @t1
Chad Rosierfcf75a32012-09-05 19:01:07 +00006// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosierfcf75a32012-09-05 19:01:07 +000013// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
14// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
15// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier4de97162012-09-11 00:51:28 +000024// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosierfcf75a32012-09-05 19:01:07 +000031// CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
32// CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier4de97162012-09-11 00:51:28 +000040// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier4de97162012-09-11 00:51:28 +000048// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier4de97162012-09-11 00:51:28 +000057// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierfcf75a32012-09-05 19:01:07 +000058// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier27ef16b2012-08-14 23:48:41 +000062 __asm int 3 ; } comments for single-line asm
63 __asm {}
64 __asm int 4
65 return 10;
Chad Rosier7fcde172012-08-21 17:01:26 +000066// CHECK: t8
Chad Rosier4de97162012-09-11 00:51:28 +000067// CHECK: call void asm sideeffect inteldialect "int $$3", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosierfcf75a32012-09-05 19:01:07 +000068// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier4de97162012-09-11 00:51:28 +000069// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() nounwind
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
Chad Rosier4de97162012-09-11 00:51:28 +000080// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
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 Rosier36d06762012-10-03 22:18:51 +000094// CHECK: call void asm sideeffect inteldialect "mov eax, $1\0A\09mov $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) nounwind
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 Rosier700ce642012-08-16 22:25:38 +0000100 __asm EVEN
101 __asm ALIGN
Chad Rosierc6916492012-09-06 19:56:25 +0000102// CHECK: t11
103// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
104// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier700ce642012-08-16 22:25:38 +0000105}
106
Chad Rosier7fcde172012-08-21 17:01:26 +0000107void t12(void) {
Chad Rosier700ce642012-08-16 22:25:38 +0000108 __asm {
109 _emit 0x4A
110 _emit 0x43
111 _emit 0x4B
112 }
Chad Rosierc6916492012-09-06 19:56:25 +0000113// CHECK: t12
114// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier700ce642012-08-16 22:25:38 +0000115}
116
Chad Rosier7fcde172012-08-21 17:01:26 +0000117void t13(void) {
Chad Rosier700ce642012-08-16 22:25:38 +0000118 unsigned arr[10];
119 __asm LENGTH arr ; sizeof(arr)/sizeof(arr[0])
120 __asm SIZE arr ; sizeof(arr)
121 __asm TYPE arr ; sizeof(arr[0])
Chad Rosierc6916492012-09-06 19:56:25 +0000122// CHECK: t13
123// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
124// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
125// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
Chad Rosier700ce642012-08-16 22:25:38 +0000126}
Chad Rosier4de97162012-09-11 00:51:28 +0000127
128void t14(void) {
129 __asm mov eax, 1
130// CHECK: t14
131// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
132}
Chad Rosier7f9678b2012-09-12 18:14:25 +0000133
134void t15(void) {
135 __asm mov eax, DWORD PTR [eax]
136// CHECK: t15
137// CHECK: call void asm sideeffect inteldialect "mov eax, DWORD PTR [eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
138}
139
Chad Rosierac9289d2012-10-02 20:55:30 +0000140void t16(unsigned V) {
Chad Rosier7f9678b2012-09-12 18:14:25 +0000141 __asm mov eax, DWORD PTR [V]
142// CHECK: t16
Chad Rosier36d06762012-10-03 22:18:51 +0000143// CHECK: call void asm sideeffect inteldialect "mov eax, DWORD PTR [$0]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
Chad Rosier7f9678b2012-09-12 18:14:25 +0000144}
Chad Rosier808a1d02012-09-12 18:25:06 +0000145
146void t17(void) {
147 __asm mov eax, dword ptr [eax]
148// CHECK: t17
149// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
150}
Chad Rosier47fa9992012-09-12 18:34:34 +0000151
152void t18(void) {
153 __asm mov dword ptr [eax], eax
154// CHECK: t18
155// CHECK: call void asm sideeffect inteldialect "mov dword ptr [eax], eax", "~{dirflag},~{fpsr},~{flags}"() nounwind
156}
Chad Rosierb55e6022012-09-13 00:06:55 +0000157
158unsigned t19(void) {
159 unsigned i = 1, j, l = 1, m;
160 __asm {
161 mov eax, i
162 mov j, eax
163 mov eax, l
164 mov m, eax
165 }
166 return j + m;
167// CHECK: t19
Chad Rosier36d06762012-10-03 22:18:51 +0000168// CHECK: call void asm sideeffect inteldialect "mov eax, $2\0A\09mov $0, eax\0A\09mov eax, $3\0A\09mov $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) nounwind
Chad Rosierb55e6022012-09-13 00:06:55 +0000169}