]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/asm.c
Update clang to r103004.
[FreeBSD/FreeBSD.git] / test / CodeGen / asm.c
1 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2 void t1(int len) {
3   __asm__ volatile("" : "=&r"(len), "+&r"(len));
4 }
5
6 void t2(unsigned long long t)  {
7   __asm__ volatile("" : "+m"(t));
8 }
9
10 void t3(unsigned char *src, unsigned long long temp) {
11   __asm__ volatile("" : "+m"(temp), "+r"(src));
12 }
13
14 void 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
22 void t5(int i) {
23   asm("nop" : "=r"(i) : "0"(t5));
24 }
25
26 // PR3641
27 void t6(void) {
28   __asm__ volatile("" : : "i" (t6));
29 }
30
31 void 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
37 void 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
44 unsigned t9(unsigned int a) {
45   asm("bswap %0 %1" : "+r" (a));
46   return a;
47 }
48
49 // PR3908
50 void 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
59 unsigned t11(signed char input) {
60   unsigned  output;
61   __asm__("xyz"
62           : "=a" (output)
63           : "0" (input));
64   return output;
65 }
66
67 // PR3373
68 unsigned char t12(unsigned input) {
69   unsigned char output;
70   __asm__("xyz"
71           : "=a" (output)
72           : "0" (input));
73   return output;
74 }
75
76 unsigned char t13(unsigned input) {
77   unsigned char output;
78   __asm__("xyz %1"
79           : "=a" (output)
80           : "0" (input));
81   return output;
82 }
83
84 struct large {
85   int x[1000];
86 };
87
88 unsigned 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.
99 struct S {
100   int a : 4;
101 };
102
103 void t14(struct S *P) {
104   __asm__("abc %0" : "=r"(P->a) );
105 }
106
107
108 // PR4938
109 int t16() {
110   int a,b;
111   asm ( "nop;"
112        :"=%c" (a)
113        : "r" (b)
114        );
115   return 0;
116 }
117
118 // PR6475
119 void 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>
128 int 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
141 int 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.
152 double 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
163 float 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 }