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