Taints the non-acquire RMW's store address with the load part
[oota-llvm.git] / test / CodeGen / X86 / mult-alt-x86.ll
1 ; RUN: llc < %s -march=x86 -mattr=+mmx,+sse2 -no-integrated-as
2 ; ModuleID = 'mult-alt-x86.c'
3 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
4 target triple = "i686-pc-win32"
5
6 @mout0 = common global i32 0, align 4
7 @min1 = common global i32 0, align 4
8 @dout0 = common global double 0.000000e+000, align 8
9 @din1 = common global double 0.000000e+000, align 8
10 @marray = common global [2 x i32] zeroinitializer, align 4
11
12 define void @single_R() nounwind {
13 entry:
14   %tmp = load i32, i32* @min1, align 4
15   %0 = call i32 asm "foo $1,$0", "=R,R,~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
16   store i32 %0, i32* @mout0, align 4
17   ret void
18 }
19
20 define void @single_q() nounwind {
21 entry:
22   %tmp = load i32, i32* @min1, align 4
23   %0 = call i32 asm "foo $1,$0", "=q,q,~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
24   store i32 %0, i32* @mout0, align 4
25   ret void
26 }
27
28 define void @single_Q() nounwind {
29 entry:
30   %tmp = load i32, i32* @min1, align 4
31   %0 = call i32 asm "foo $1,$0", "=Q,Q,~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
32   store i32 %0, i32* @mout0, align 4
33   ret void
34 }
35
36 define void @single_a() nounwind {
37 entry:
38   %tmp = load i32, i32* @min1, align 4
39   %0 = call i32 asm "foo $1,$0", "={ax},{ax},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
40   store i32 %0, i32* @mout0, align 4
41   ret void
42 }
43
44 define void @single_b() nounwind {
45 entry:
46   %tmp = load i32, i32* @min1, align 4
47   %0 = call i32 asm "foo $1,$0", "={bx},{bx},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
48   store i32 %0, i32* @mout0, align 4
49   ret void
50 }
51
52 define void @single_c() nounwind {
53 entry:
54   %tmp = load i32, i32* @min1, align 4
55   %0 = call i32 asm "foo $1,$0", "={cx},{cx},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
56   store i32 %0, i32* @mout0, align 4
57   ret void
58 }
59
60 define void @single_d() nounwind {
61 entry:
62   %tmp = load i32, i32* @min1, align 4
63   %0 = call i32 asm "foo $1,$0", "={dx},{dx},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
64   store i32 %0, i32* @mout0, align 4
65   ret void
66 }
67
68 define void @single_S() nounwind {
69 entry:
70   %tmp = load i32, i32* @min1, align 4
71   %0 = call i32 asm "foo $1,$0", "={si},{si},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
72   store i32 %0, i32* @mout0, align 4
73   ret void
74 }
75
76 define void @single_D() nounwind {
77 entry:
78   %tmp = load i32, i32* @min1, align 4
79   %0 = call i32 asm "foo $1,$0", "={di},{di},~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
80   store i32 %0, i32* @mout0, align 4
81   ret void
82 }
83
84 define void @single_A() nounwind {
85 entry:
86   %tmp = load i32, i32* @min1, align 4
87   %0 = call i32 asm "foo $1,$0", "=A,A,~{dirflag},~{fpsr},~{flags}"(i32 %tmp) nounwind
88   store i32 %0, i32* @mout0, align 4
89   ret void
90 }
91
92 define void @single_f() nounwind {
93 entry:
94   ret void
95 }
96
97 define void @single_t() nounwind {
98 entry:
99   ret void
100 }
101
102 define void @single_u() nounwind {
103 entry:
104   ret void
105 }
106
107 define void @single_y() nounwind {
108 entry:
109   %tmp = load double, double* @din1, align 8
110   %0 = call double asm "foo $1,$0", "=y,y,~{dirflag},~{fpsr},~{flags}"(double %tmp) nounwind
111   store double %0, double* @dout0, align 8
112   ret void
113 }
114
115 define void @single_x() nounwind {
116 entry:
117   %tmp = load double, double* @din1, align 8
118   %0 = call double asm "foo $1,$0", "=x,x,~{dirflag},~{fpsr},~{flags}"(double %tmp) nounwind
119   store double %0, double* @dout0, align 8
120   ret void
121 }
122
123 define void @single_Y0() nounwind {
124 entry:
125   ret void
126 }
127
128 define void @single_I() nounwind {
129 entry:
130   call void asm "foo $1,$0", "=*m,I,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
131   ret void
132 }
133
134 define void @single_J() nounwind {
135 entry:
136   call void asm "foo $1,$0", "=*m,J,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
137   ret void
138 }
139
140 define void @single_K() nounwind {
141 entry:
142   call void asm "foo $1,$0", "=*m,K,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
143   ret void
144 }
145
146 define void @single_L() nounwind {
147 entry:
148 ; Missing lowering support for 'L'.
149 ;  call void asm "foo $1,$0", "=*m,L,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
150   ret void
151 }
152
153 define void @single_M() nounwind {
154 entry:
155 ; Missing lowering support for 'M'.
156 ;  call void asm "foo $1,$0", "=*m,M,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
157   ret void
158 }
159
160 define void @single_N() nounwind {
161 entry:
162   call void asm "foo $1,$0", "=*m,N,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
163   ret void
164 }
165
166 define void @single_G() nounwind {
167 entry:
168 ; Missing lowering support for 'G'.
169 ;  call void asm "foo $1,$0", "=*m,G,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, double 1.000000e+000) nounwind
170   ret void
171 }
172
173 define void @single_C() nounwind {
174 entry:
175 ; Missing lowering support for 'C'.
176 ;  call void asm "foo $1,$0", "=*m,C,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, double 1.000000e+000) nounwind
177   ret void
178 }
179
180 define void @single_e() nounwind {
181 entry:
182   call void asm "foo $1,$0", "=*m,e,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
183   ret void
184 }
185
186 define void @single_Z() nounwind {
187 entry:
188   call void asm "foo $1,$0", "=*m,Z,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
189   ret void
190 }
191
192 define void @multi_R() nounwind {
193 entry:
194   %tmp = load i32, i32* @min1, align 4
195   call void asm "foo $1,$0", "=*r|R|m,r|R|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
196   ret void
197 }
198
199 define void @multi_q() nounwind {
200 entry:
201   %tmp = load i32, i32* @min1, align 4
202   call void asm "foo $1,$0", "=*r|q|m,r|q|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
203   ret void
204 }
205
206 define void @multi_Q() nounwind {
207 entry:
208   %tmp = load i32, i32* @min1, align 4
209   call void asm "foo $1,$0", "=*r|Q|m,r|Q|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
210   ret void
211 }
212
213 define void @multi_a() nounwind {
214 entry:
215   %tmp = load i32, i32* @min1, align 4
216   call void asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
217   ret void
218 }
219
220 define void @multi_b() nounwind {
221 entry:
222   %tmp = load i32, i32* @min1, align 4
223   call void asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
224   ret void
225 }
226
227 define void @multi_c() nounwind {
228 entry:
229   %tmp = load i32, i32* @min1, align 4
230   call void asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
231   ret void
232 }
233
234 define void @multi_d() nounwind {
235 entry:
236   %tmp = load i32, i32* @min1, align 4
237   call void asm "foo $1,$0", "=*r|{dx}|m,r|{dx},~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
238   ret void
239 }
240
241 define void @multi_S() nounwind {
242 entry:
243   %tmp = load i32, i32* @min1, align 4
244   call void asm "foo $1,$0", "=*r|{si}|m,r|{si}|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
245   ret void
246 }
247
248 define void @multi_D() nounwind {
249 entry:
250   %tmp = load i32, i32* @min1, align 4
251   call void asm "foo $1,$0", "=*r|{di}|m,r|{di}|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
252   ret void
253 }
254
255 define void @multi_A() nounwind {
256 entry:
257   %tmp = load i32, i32* @min1, align 4
258   call void asm "foo $1,$0", "=*r|A|m,r|A|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 %tmp) nounwind
259   ret void
260 }
261
262 define void @multi_f() nounwind {
263 entry:
264   ret void
265 }
266
267 define void @multi_t() nounwind {
268 entry:
269   ret void
270 }
271
272 define void @multi_u() nounwind {
273 entry:
274   ret void
275 }
276
277 define void @multi_y() nounwind {
278 entry:
279   %tmp = load double, double* @din1, align 8
280   call void asm "foo $1,$0", "=*r|y|m,r|y|m,~{dirflag},~{fpsr},~{flags}"(double* @dout0, double %tmp) nounwind
281   ret void
282 }
283
284 define void @multi_x() nounwind {
285 entry:
286   %tmp = load double, double* @din1, align 8
287   call void asm "foo $1,$0", "=*r|x|m,r|x|m,~{dirflag},~{fpsr},~{flags}"(double* @dout0, double %tmp) nounwind
288   ret void
289 }
290
291 define void @multi_Y0() nounwind {
292 entry:
293   ret void
294 }
295
296 define void @multi_I() nounwind {
297 entry:
298   call void asm "foo $1,$0", "=*r|m|m,r|I|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
299   ret void
300 }
301
302 define void @multi_J() nounwind {
303 entry:
304   call void asm "foo $1,$0", "=*r|m|m,r|J|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
305   ret void
306 }
307
308 define void @multi_K() nounwind {
309 entry:
310   call void asm "foo $1,$0", "=*r|m|m,r|K|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
311   ret void
312 }
313
314 define void @multi_L() nounwind {
315 entry:
316 ; Missing lowering support for 'L'.
317 ;  call void asm "foo $1,$0", "=*r|m|m,r|L|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
318   ret void
319 }
320
321 define void @multi_M() nounwind {
322 entry:
323 ; Missing lowering support for 'M'.
324 ;  call void asm "foo $1,$0", "=*r|m|m,r|M|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
325   ret void
326 }
327
328 define void @multi_N() nounwind {
329 entry:
330   call void asm "foo $1,$0", "=*r|m|m,r|N|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
331   ret void
332 }
333
334 define void @multi_G() nounwind {
335 entry:
336 ; Missing lowering support for 'G'.
337 ;  call void asm "foo $1,$0", "=*r|m|m,r|G|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, double 1.000000e+000) nounwind
338   ret void
339 }
340
341 define void @multi_C() nounwind {
342 entry:
343 ; Missing lowering support for 'C'.
344 ;  call void asm "foo $1,$0", "=*r|m|m,r|C|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, double 1.000000e+000) nounwind
345   ret void
346 }
347
348 define void @multi_e() nounwind {
349 entry:
350   call void asm "foo $1,$0", "=*r|m|m,r|e|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
351   ret void
352 }
353
354 define void @multi_Z() nounwind {
355 entry:
356   call void asm "foo $1,$0", "=*r|m|m,r|Z|m,~{dirflag},~{fpsr},~{flags}"(i32* @mout0, i32 1) nounwind
357   ret void
358 }