asm.c revision 9f5bff086cad25c15b4deb8a7763786097aadccd
1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// PR10415
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)__asm__ ("foo1");
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)__asm__ ("foo2");
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)__asm__ ("foo3");
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// CHECK: module asm "foo1"
8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// CHECK-NEXT: module asm "foo2"
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// CHECK-NEXT: module asm "foo3"
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t1(int len) {
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  __asm__ volatile("" : "=&r"(len), "+&r"(len));
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t2(unsigned long long t)  {
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  __asm__ volatile("" : "+m"(t));
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t3(unsigned char *src, unsigned long long temp) {
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  __asm__ volatile("" : "+m"(temp), "+r"(src));
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t4() {
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  unsigned long long a;
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  struct reg { unsigned long long a, b; } b;
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  __asm__ volatile ("":: "m"(a), "m"(b));
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// PR3417
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t5(int i) {
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  asm("nop" : "=r"(i) : "0"(t5));
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// PR3641
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void t6(void) {
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  __asm__ volatile("" : : "i" (t6));
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
40void t7(int a) {
41  __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
42  // CHECK: @t7(i32
43  // CHECK: T7 NAMED: $1
44}
45
46void t8() {
47  __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
48  // CHECK: @t8()
49  // CHECK: T8 NAMED MODIFIER: ${0:c}
50}
51
52// PR3682
53unsigned t9(unsigned int a) {
54  asm("bswap %0 %1" : "+r" (a));
55  return a;
56}
57
58// PR3908
59void t10(int r) {
60  __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0)));
61
62// CHECK: @t10(
63// CHECK:PR3908 $1 $3 $2 $0
64}
65
66
67// PR3373
68unsigned t11(signed char input) {
69  unsigned  output;
70  __asm__("xyz"
71          : "=a" (output)
72          : "0" (input));
73  return output;
74}
75
76// PR3373
77unsigned char t12(unsigned input) {
78  unsigned char output;
79  __asm__("xyz"
80          : "=a" (output)
81          : "0" (input));
82  return output;
83}
84
85unsigned char t13(unsigned input) {
86  unsigned char output;
87  __asm__("xyz %1"
88          : "=a" (output)
89          : "0" (input));
90  return output;
91}
92
93struct large {
94  int x[1000];
95};
96
97unsigned long t15(int x, struct large *P) {
98  __asm__("xyz "
99          : "=r" (x)
100          : "m" (*P), "0" (x));
101  return x;
102}
103
104
105
106
107// bitfield destination of an asm.
108struct S {
109  int a : 4;
110};
111
112void t14(struct S *P) {
113  __asm__("abc %0" : "=r"(P->a) );
114}
115
116
117// PR4938
118int t16() {
119  int a,b;
120  asm ( "nop;"
121       :"=%c" (a)
122       : "r" (b)
123       );
124  return 0;
125}
126
127// PR6475
128void t17() {
129  int i;
130  __asm__ ( "nop": "=m"(i));
131
132// CHECK: @t17()
133// CHECK: call void asm "nop", "=*m,
134}
135
136// <rdar://problem/6841383>
137int t18(unsigned data) {
138  int a, b;
139
140  asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
141  return a + b;
142// CHECK: t18(i32
143// CHECK: = call {{.*}}asm "xyz"
144// CHECK-NEXT: extractvalue
145// CHECK-NEXT: extractvalue
146}
147
148
149// PR6780
150int t19(unsigned data) {
151  int a, b;
152
153  asm("x{abc|def|ghi}z" :"=r"(a): "r"(data));
154  return a + b;
155  // CHECK: t19(i32
156  // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z"
157}
158
159
160// PR6845 - Mismatching source/dest fp types.
161double t20(double x) {
162  register long double result;
163  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
164  return result;
165
166  // CHECK: @t20
167  // CHECK: fpext double {{.*}} to x86_fp80
168  // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint"
169  // CHECK: fptrunc x86_fp80 {{.*}} to double
170}
171
172float t21(long double x) {
173  register float result;
174  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
175  return result;
176  // CHECK: @t21
177  // CHECK: call x86_fp80 asm sideeffect "frndint"
178  // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float
179}
180
181// <rdar://problem/8348447> - accept 'l' constraint
182unsigned char t22(unsigned char a, unsigned char b) {
183  unsigned int la = a;
184  unsigned int lb = b;
185  unsigned int bigres;
186  unsigned char res;
187  __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) :
188                        "edx", "cc");
189  res = bigres;
190  return res;
191}
192
193// <rdar://problem/8348447> - accept 'l' constraint
194unsigned char t23(unsigned char a, unsigned char b) {
195  unsigned int la = a;
196  unsigned int lb = b;
197  unsigned char res;
198  __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) :
199                        "edx", "cc");
200  return res;
201}
202
203
204// PR10299 - fpsr, fpcr
205void test(void)
206{
207  __asm__ __volatile__(					   \
208		       "finit"				   \
209		       :				   \
210		       :				   \
211		       :"st","st(1)","st(2)","st(3)",	   \
212			"st(4)","st(5)","st(6)","st(7)",   \
213			"fpsr","fpcr"			   \
214							   );
215}
216