blob: 84f26e1013c135dbfa2b2706753346d65f4e6665 [file] [log] [blame]
Chris Lattnerb9922592010-03-03 21:52:23 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
Chris Lattner9f5bff02011-07-23 20:04:25 +00002
3// PR10415
4__asm__ ("foo1");
5__asm__ ("foo2");
6__asm__ ("foo3");
7// CHECK: module asm "foo1"
8// CHECK-NEXT: module asm "foo2"
9// CHECK-NEXT: module asm "foo3"
10
Chris Lattner10ca96a2009-03-10 06:33:24 +000011void t1(int len) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000012 __asm__ volatile("" : "=&r"(len), "+&r"(len));
Anders Carlsson2763b3a2009-01-11 19:46:50 +000013}
Anders Carlsson9f2505b2009-01-11 21:23:27 +000014
Chris Lattner10ca96a2009-03-10 06:33:24 +000015void t2(unsigned long long t) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000016 __asm__ volatile("" : "+m"(t));
17}
18
Chris Lattner10ca96a2009-03-10 06:33:24 +000019void t3(unsigned char *src, unsigned long long temp) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000020 __asm__ volatile("" : "+m"(temp), "+r"(src));
21}
22
Chris Lattner10ca96a2009-03-10 06:33:24 +000023void t4() {
Anders Carlssonebaae2a2009-01-12 02:22:13 +000024 unsigned long long a;
25 struct reg { unsigned long long a, b; } b;
26
Mike Stump1eb44332009-09-09 15:08:12 +000027 __asm__ volatile ("":: "m"(a), "m"(b));
Anders Carlssonebaae2a2009-01-12 02:22:13 +000028}
Anders Carlsson9f2505b2009-01-11 21:23:27 +000029
Anders Carlsson03eb5432009-01-27 20:38:24 +000030// PR3417
Chris Lattner10ca96a2009-03-10 06:33:24 +000031void t5(int i) {
Anders Carlsson03eb5432009-01-27 20:38:24 +000032 asm("nop" : "=r"(i) : "0"(t5));
33}
Anders Carlsson60329792009-02-22 02:11:23 +000034
35// PR3641
Chris Lattner10ca96a2009-03-10 06:33:24 +000036void t6(void) {
Anders Carlsson60329792009-02-22 02:11:23 +000037 __asm__ volatile("" : : "i" (t6));
38}
Chris Lattner10ca96a2009-03-10 06:33:24 +000039
Chris Lattner10ca96a2009-03-10 06:33:24 +000040void t7(int a) {
41 __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
Chris Lattner29a40712010-03-04 00:38:16 +000042 // CHECK: @t7(i32
43 // CHECK: T7 NAMED: $1
Chris Lattner02af9742009-03-10 06:38:02 +000044}
45
Chris Lattner02af9742009-03-10 06:38:02 +000046void t8() {
47 __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
Chris Lattner29a40712010-03-04 00:38:16 +000048 // CHECK: @t8()
49 // CHECK: T8 NAMED MODIFIER: ${0:c}
Chris Lattner02af9742009-03-10 06:38:02 +000050}
Chris Lattner88beebe2009-03-10 06:42:37 +000051
52// PR3682
53unsigned t9(unsigned int a) {
54 asm("bswap %0 %1" : "+r" (a));
55 return a;
56}
Anders Carlssonec91dab2009-04-03 05:57:08 +000057
58// PR3908
Anders Carlssonec91dab2009-04-03 05:57:08 +000059void t10(int r) {
60 __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0)));
Eric Christopher78b92912011-07-07 23:11:01 +000061
Chris Lattner29a40712010-03-04 00:38:16 +000062// CHECK: @t10(
63// CHECK:PR3908 $1 $3 $2 $0
Eric Christopher78b92912011-07-07 23:11:01 +000064}
Chris Lattner4df4ee02009-05-03 07:27:51 +000065
Chris Lattner4df4ee02009-05-03 07:27:51 +000066// PR3373
67unsigned t11(signed char input) {
68 unsigned output;
69 __asm__("xyz"
70 : "=a" (output)
71 : "0" (input));
72 return output;
73}
Chris Lattnerede9d902009-05-03 07:53:25 +000074
Chris Lattnera077b5c2009-05-03 08:21:20 +000075// PR3373
76unsigned char t12(unsigned input) {
77 unsigned char output;
78 __asm__("xyz"
79 : "=a" (output)
80 : "0" (input));
81 return output;
82}
Chris Lattnerede9d902009-05-03 07:53:25 +000083
Chris Lattner3351f112009-05-03 08:32:32 +000084unsigned char t13(unsigned input) {
85 unsigned char output;
86 __asm__("xyz %1"
87 : "=a" (output)
88 : "0" (input));
89 return output;
90}
Chris Lattnerede9d902009-05-03 07:53:25 +000091
Chris Lattner0bdaa5b2009-05-03 09:05:53 +000092struct large {
93 int x[1000];
94};
95
96unsigned long t15(int x, struct large *P) {
97 __asm__("xyz "
98 : "=r" (x)
99 : "m" (*P), "0" (x));
100 return x;
101}
102
Chris Lattner3351f112009-05-03 08:32:32 +0000103// bitfield destination of an asm.
Chris Lattnerede9d902009-05-03 07:53:25 +0000104struct S {
105 int a : 4;
106};
107
Chris Lattner3351f112009-05-03 08:32:32 +0000108void t14(struct S *P) {
Chris Lattnerede9d902009-05-03 07:53:25 +0000109 __asm__("abc %0" : "=r"(P->a) );
110}
Chris Lattner3351f112009-05-03 08:32:32 +0000111
Chris Lattner40539832009-10-13 04:32:07 +0000112// PR4938
113int t16() {
114 int a,b;
115 asm ( "nop;"
116 :"=%c" (a)
117 : "r" (b)
118 );
119 return 0;
120}
Chris Lattnerb9922592010-03-03 21:52:23 +0000121
122// PR6475
123void t17() {
124 int i;
125 __asm__ ( "nop": "=m"(i));
Eric Christopher78b92912011-07-07 23:11:01 +0000126
Chris Lattnerb9922592010-03-03 21:52:23 +0000127// CHECK: @t17()
128// CHECK: call void asm "nop", "=*m,
129}
130
Chris Lattnereeeb49a2010-03-03 21:56:57 +0000131// <rdar://problem/6841383>
132int t18(unsigned data) {
133 int a, b;
Eric Christopher78b92912011-07-07 23:11:01 +0000134
Chris Lattnereeeb49a2010-03-03 21:56:57 +0000135 asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
136 return a + b;
137// CHECK: t18(i32
138// CHECK: = call {{.*}}asm "xyz"
139// CHECK-NEXT: extractvalue
140// CHECK-NEXT: extractvalue
141}
Chris Lattner018b54e2010-04-05 18:44:00 +0000142
Chris Lattner018b54e2010-04-05 18:44:00 +0000143// PR6780
144int t19(unsigned data) {
145 int a, b;
Eric Christopher78b92912011-07-07 23:11:01 +0000146
Chris Lattner018b54e2010-04-05 18:44:00 +0000147 asm("x{abc|def|ghi}z" :"=r"(a): "r"(data));
148 return a + b;
149 // CHECK: t19(i32
150 // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z"
151}
152
Chris Lattneraab64d02010-04-23 17:27:29 +0000153// PR6845 - Mismatching source/dest fp types.
154double t20(double x) {
155 register long double result;
156 __asm __volatile ("frndint" : "=t" (result) : "0" (x));
157 return result;
Eric Christopher78b92912011-07-07 23:11:01 +0000158
Chris Lattneraab64d02010-04-23 17:27:29 +0000159 // CHECK: @t20
160 // CHECK: fpext double {{.*}} to x86_fp80
161 // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint"
162 // CHECK: fptrunc x86_fp80 {{.*}} to double
163}
164
165float t21(long double x) {
166 register float result;
167 __asm __volatile ("frndint" : "=t" (result) : "0" (x));
168 return result;
169 // CHECK: @t21
170 // CHECK: call x86_fp80 asm sideeffect "frndint"
171 // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float
172}
Dale Johannesen545be512010-08-24 22:33:12 +0000173
174// <rdar://problem/8348447> - accept 'l' constraint
175unsigned char t22(unsigned char a, unsigned char b) {
176 unsigned int la = a;
177 unsigned int lb = b;
178 unsigned int bigres;
179 unsigned char res;
180 __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) :
181 "edx", "cc");
182 res = bigres;
183 return res;
184}
185
186// <rdar://problem/8348447> - accept 'l' constraint
187unsigned char t23(unsigned char a, unsigned char b) {
188 unsigned int la = a;
189 unsigned int lb = b;
190 unsigned char res;
191 __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) :
192 "edx", "cc");
193 return res;
194}
Eric Christopher78b92912011-07-07 23:11:01 +0000195
Peter Collingbourne93f13222011-07-29 00:24:50 +0000196void *t24(char c) {
197 void *addr;
198 // CHECK: @t24
199 // CHECK: zext i8 {{.*}} to i32
200 // CHECK-NEXT: call i8* asm "foobar"
201 __asm__ ("foobar" : "=a" (addr) : "0" (c));
202 return addr;
203}
204
Eric Christopher78b92912011-07-07 23:11:01 +0000205// PR10299 - fpsr, fpcr
Eric Christopher867a3792011-12-02 02:12:09 +0000206void t25(void)
Eric Christopher78b92912011-07-07 23:11:01 +0000207{
208 __asm__ __volatile__( \
209 "finit" \
210 : \
211 : \
212 :"st","st(1)","st(2)","st(3)", \
213 "st(4)","st(5)","st(6)","st(7)", \
214 "fpsr","fpcr" \
215 );
216}
Eric Christopherc5f9a012011-12-02 02:12:16 +0000217
218// rdar://10510405 - AVX registers
219typedef long long __m256i __attribute__((__vector_size__(32)));
220void t26 (__m256i *p) {
221 __asm__ volatile("vmovaps %0, %%ymm0" :: "m" (*(__m256i*)p) : "ymm0");
222}