Fix AVX512 vector sqrt assembly strings.
[oota-llvm.git] / test / CodeGen / X86 / avx512-arith.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl --show-mc-encoding| FileCheck %s
2
3 ; CHECK-LABEL: addpd512
4 ; CHECK: vaddpd
5 ; CHECK: ret
6 define <8 x double> @addpd512(<8 x double> %y, <8 x double> %x) {
7 entry:
8   %add.i = fadd <8 x double> %x, %y
9   ret <8 x double> %add.i
10 }
11
12 ; CHECK-LABEL: addpd512fold
13 ; CHECK: vaddpd LCP{{.*}}(%rip)
14 ; CHECK: ret
15 define <8 x double> @addpd512fold(<8 x double> %y) {
16 entry:
17   %add.i = fadd <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.800000e+00, double 2.300000e+00, double 1.200000e+00>
18   ret <8 x double> %add.i
19 }
20
21 ; CHECK-LABEL: addps512
22 ; CHECK: vaddps
23 ; CHECK: ret
24 define <16 x float> @addps512(<16 x float> %y, <16 x float> %x) {
25 entry:
26   %add.i = fadd <16 x float> %x, %y
27   ret <16 x float> %add.i
28 }
29
30 ; CHECK-LABEL: addps512fold
31 ; CHECK: vaddps LCP{{.*}}(%rip)
32 ; CHECK: ret
33 define <16 x float> @addps512fold(<16 x float> %y) {
34 entry:
35   %add.i = fadd <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 4.500000e+00, float 4.500000e+00, float 0x400B333340000000,  float 0x4002666660000000, float 0x3FF3333340000000>
36   ret <16 x float> %add.i
37 }
38
39 ; CHECK-LABEL: subpd512
40 ; CHECK: vsubpd
41 ; CHECK: ret
42 define <8 x double> @subpd512(<8 x double> %y, <8 x double> %x) {
43 entry:
44   %sub.i = fsub <8 x double> %x, %y
45   ret <8 x double> %sub.i
46 }
47
48 ; CHECK-LABEL: @subpd512fold
49 ; CHECK: vsubpd (%
50 ; CHECK: ret
51 define <8 x double> @subpd512fold(<8 x double> %y, <8 x double>* %x) {
52 entry:
53   %tmp2 = load <8 x double>* %x, align 8
54   %sub.i = fsub <8 x double> %y, %tmp2
55   ret <8 x double> %sub.i
56 }
57
58 ; CHECK-LABEL: @subps512
59 ; CHECK: vsubps
60 ; CHECK: ret
61 define <16 x float> @subps512(<16 x float> %y, <16 x float> %x) {
62 entry:
63   %sub.i = fsub <16 x float> %x, %y
64   ret <16 x float> %sub.i
65 }
66
67 ; CHECK-LABEL: subps512fold
68 ; CHECK: vsubps (%
69 ; CHECK: ret
70 define <16 x float> @subps512fold(<16 x float> %y, <16 x float>* %x) {
71 entry:
72   %tmp2 = load <16 x float>* %x, align 4
73   %sub.i = fsub <16 x float> %y, %tmp2
74   ret <16 x float> %sub.i
75 }
76
77 ; CHECK-LABEL: imulq512
78 ; CHECK: vpmuludq
79 ; CHECK: vpmuludq
80 ; CHECK: ret
81 define <8 x i64> @imulq512(<8 x i64> %y, <8 x i64> %x) {
82   %z = mul <8 x i64>%x, %y
83   ret <8 x i64>%z
84 }
85
86 ; CHECK-LABEL: mulpd512
87 ; CHECK: vmulpd
88 ; CHECK: ret
89 define <8 x double> @mulpd512(<8 x double> %y, <8 x double> %x) {
90 entry:
91   %mul.i = fmul <8 x double> %x, %y
92   ret <8 x double> %mul.i
93 }
94
95 ; CHECK-LABEL: mulpd512fold
96 ; CHECK: vmulpd LCP{{.*}}(%rip)
97 ; CHECK: ret
98 define <8 x double> @mulpd512fold(<8 x double> %y) {
99 entry:
100   %mul.i = fmul <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>
101   ret <8 x double> %mul.i
102 }
103
104 ; CHECK-LABEL: mulps512
105 ; CHECK: vmulps
106 ; CHECK: ret
107 define <16 x float> @mulps512(<16 x float> %y, <16 x float> %x) {
108 entry:
109   %mul.i = fmul <16 x float> %x, %y
110   ret <16 x float> %mul.i
111 }
112
113 ; CHECK-LABEL: mulps512fold
114 ; CHECK: vmulps LCP{{.*}}(%rip)
115 ; CHECK: ret
116 define <16 x float> @mulps512fold(<16 x float> %y) {
117 entry:
118   %mul.i = fmul <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000>
119   ret <16 x float> %mul.i
120 }
121
122 ; CHECK-LABEL: divpd512
123 ; CHECK: vdivpd
124 ; CHECK: ret
125 define <8 x double> @divpd512(<8 x double> %y, <8 x double> %x) {
126 entry:
127   %div.i = fdiv <8 x double> %x, %y
128   ret <8 x double> %div.i
129 }
130
131 ; CHECK-LABEL: divpd512fold
132 ; CHECK: vdivpd LCP{{.*}}(%rip)
133 ; CHECK: ret
134 define <8 x double> @divpd512fold(<8 x double> %y) {
135 entry:
136   %div.i = fdiv <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>
137   ret <8 x double> %div.i
138 }
139
140 ; CHECK-LABEL: divps512
141 ; CHECK: vdivps
142 ; CHECK: ret
143 define <16 x float> @divps512(<16 x float> %y, <16 x float> %x) {
144 entry:
145   %div.i = fdiv <16 x float> %x, %y
146   ret <16 x float> %div.i
147 }
148
149 ; CHECK-LABEL: divps512fold
150 ; CHECK: vdivps LCP{{.*}}(%rip)
151 ; CHECK: ret
152 define <16 x float> @divps512fold(<16 x float> %y) {
153 entry:
154   %div.i = fdiv <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 4.500000e+00, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 4.500000e+00, float 0x4002666660000000, float 0x3FF3333340000000>
155   ret <16 x float> %div.i
156 }
157
158 ; CHECK-LABEL: vpaddq_test
159 ; CHECK: vpaddq %zmm
160 ; CHECK: ret
161 define <8 x i64> @vpaddq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
162   %x = add <8 x i64> %i, %j
163   ret <8 x i64> %x
164 }
165
166 ; CHECK-LABEL: vpaddd_test
167 ; CHECK: vpaddd %zmm
168 ; CHECK: ret
169 define <16 x i32> @vpaddd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
170   %x = add <16 x i32> %i, %j
171   ret <16 x i32> %x
172 }
173
174 ; CHECK-LABEL: vpsubq_test
175 ; CHECK: vpsubq %zmm
176 ; CHECK: ret
177 define <8 x i64> @vpsubq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
178   %x = sub <8 x i64> %i, %j
179   ret <8 x i64> %x
180 }
181
182 ; CHECK-LABEL: vpsubd_test
183 ; CHECK: vpsubd
184 ; CHECK: ret
185 define <16 x i32> @vpsubd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
186   %x = sub <16 x i32> %i, %j
187   ret <16 x i32> %x
188 }
189
190 ; CHECK-LABEL: vpmulld_test
191 ; CHECK: vpmulld %zmm
192 ; CHECK: ret
193 define <16 x i32> @vpmulld_test(<16 x i32> %i, <16 x i32> %j) {
194   %x = mul <16 x i32> %i, %j
195   ret <16 x i32> %x
196 }
197
198 ; CHECK-LABEL: sqrtA
199 ; CHECK: vsqrtss {{.*}} encoding: [0x62
200 ; CHECK: ret
201 declare float @sqrtf(float) readnone
202 define float @sqrtA(float %a) nounwind uwtable readnone ssp {
203 entry:
204   %conv1 = tail call float @sqrtf(float %a) nounwind readnone
205   ret float %conv1
206 }
207
208 ; CHECK-LABEL: sqrtB
209 ; CHECK: vsqrtsd {{.*}}## encoding: [0x62
210 ; CHECK: ret
211 declare double @sqrt(double) readnone
212 define double @sqrtB(double %a) nounwind uwtable readnone ssp {
213 entry:
214   %call = tail call double @sqrt(double %a) nounwind readnone
215   ret double %call
216 }
217
218 ; CHECK-LABEL: sqrtC
219 ; CHECK: vsqrtss {{.*}}## encoding: [0x62
220 ; CHECK: ret
221 declare float @llvm.sqrt.f32(float)
222 define float @sqrtC(float %a) nounwind {
223   %b = call float @llvm.sqrt.f32(float %a)
224   ret float %b
225 }
226
227 ; CHECK-LABEL: sqrtD
228 ; CHECK: vsqrtps {{.*}}
229 ; CHECK: ret
230 declare <16 x float> @llvm.sqrt.v16f32(<16 x float>)
231 define <16 x float> @sqrtD(<16 x float> %a) nounwind {
232   %b = call <16 x float> @llvm.sqrt.v16f32(<16 x float> %a)
233   ret <16 x float> %b
234 }
235
236 ; CHECK-LABEL: sqrtE
237 ; CHECK: vsqrtpd {{.*}}
238 ; CHECK: ret
239 declare <8 x double> @llvm.sqrt.v8f64(<8 x double>)
240 define <8 x double> @sqrtE(<8 x double> %a) nounwind {
241   %b = call <8 x double> @llvm.sqrt.v8f64(<8 x double> %a)
242   ret <8 x double> %b
243 }
244
245 ; CHECK-LABEL: fadd_broadcast
246 ; CHECK: LCP{{.*}}(%rip){1to16}, %zmm0, %zmm0
247 ; CHECK: ret
248 define <16 x float> @fadd_broadcast(<16 x float> %a) nounwind {
249   %b = fadd <16 x float> %a, <float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000>
250   ret <16 x float> %b
251 }
252
253 ; CHECK-LABEL: addq_broadcast
254 ; CHECK: vpaddq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
255 ; CHECK: ret
256 define <8 x i64> @addq_broadcast(<8 x i64> %a) nounwind {
257   %b = add <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
258   ret <8 x i64> %b
259 }
260
261 ; CHECK-LABEL: orq_broadcast
262 ; CHECK: vporq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
263 ; CHECK: ret
264 define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind {
265   %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
266   ret <8 x i64> %b
267 }
268
269 ; CHECK-LABEL: andd512fold
270 ; CHECK: vpandd (%
271 ; CHECK: ret
272 define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) {
273 entry:
274   %a = load <16 x i32>* %x, align 4
275   %b = and <16 x i32> %y, %a
276   ret <16 x i32> %b
277 }
278
279 ; CHECK-LABEL: andqbrst
280 ; CHECK: vpandq  (%rdi){1to8}, %zmm
281 ; CHECK: ret
282 define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) {
283 entry:
284   %a = load i64* %ap, align 8
285   %b = insertelement <8 x i64> undef, i64 %a, i32 0
286   %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
287   %d = and <8 x i64> %p1, %c
288   ret <8 x i64>%d
289 }