d5af76fdfa4db9e653522107dae0b0ad9f05a670
[oota-llvm.git] / test / CodeGen / X86 / avx512-arith.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | 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: mulpd512
78 ; CHECK: vmulpd
79 ; CHECK: ret
80 define <8 x double> @mulpd512(<8 x double> %y, <8 x double> %x) {
81 entry:
82   %mul.i = fmul <8 x double> %x, %y
83   ret <8 x double> %mul.i
84 }
85
86 ; CHECK-LABEL: mulpd512fold
87 ; CHECK: vmulpd LCP{{.*}}(%rip)
88 ; CHECK: ret
89 define <8 x double> @mulpd512fold(<8 x double> %y) {
90 entry:
91   %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>
92   ret <8 x double> %mul.i
93 }
94
95 ; CHECK-LABEL: mulps512
96 ; CHECK: vmulps
97 ; CHECK: ret
98 define <16 x float> @mulps512(<16 x float> %y, <16 x float> %x) {
99 entry:
100   %mul.i = fmul <16 x float> %x, %y
101   ret <16 x float> %mul.i
102 }
103
104 ; CHECK-LABEL: mulps512fold
105 ; CHECK: vmulps LCP{{.*}}(%rip)
106 ; CHECK: ret
107 define <16 x float> @mulps512fold(<16 x float> %y) {
108 entry:
109   %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>
110   ret <16 x float> %mul.i
111 }
112
113 ; CHECK-LABEL: divpd512
114 ; CHECK: vdivpd
115 ; CHECK: ret
116 define <8 x double> @divpd512(<8 x double> %y, <8 x double> %x) {
117 entry:
118   %div.i = fdiv <8 x double> %x, %y
119   ret <8 x double> %div.i
120 }
121
122 ; CHECK-LABEL: divpd512fold
123 ; CHECK: vdivpd LCP{{.*}}(%rip)
124 ; CHECK: ret
125 define <8 x double> @divpd512fold(<8 x double> %y) {
126 entry:
127   %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>
128   ret <8 x double> %div.i
129 }
130
131 ; CHECK-LABEL: divps512
132 ; CHECK: vdivps
133 ; CHECK: ret
134 define <16 x float> @divps512(<16 x float> %y, <16 x float> %x) {
135 entry:
136   %div.i = fdiv <16 x float> %x, %y
137   ret <16 x float> %div.i
138 }
139
140 ; CHECK-LABEL: divps512fold
141 ; CHECK: vdivps LCP{{.*}}(%rip)
142 ; CHECK: ret
143 define <16 x float> @divps512fold(<16 x float> %y) {
144 entry:
145   %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>
146   ret <16 x float> %div.i
147 }
148
149 ; CHECK-LABEL: vpaddq_test
150 ; CHECK: vpaddq %zmm
151 ; CHECK: ret
152 define <8 x i64> @vpaddq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
153   %x = add <8 x i64> %i, %j
154   ret <8 x i64> %x
155 }
156
157 ; CHECK-LABEL: vpaddd_test
158 ; CHECK: vpaddd %zmm
159 ; CHECK: ret
160 define <16 x i32> @vpaddd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
161   %x = add <16 x i32> %i, %j
162   ret <16 x i32> %x
163 }
164
165 ; CHECK-LABEL: vpsubq_test
166 ; CHECK: vpsubq %zmm
167 ; CHECK: ret
168 define <8 x i64> @vpsubq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
169   %x = sub <8 x i64> %i, %j
170   ret <8 x i64> %x
171 }
172
173 ; CHECK-LABEL: vpsubd_test
174 ; CHECK: vpsubd
175 ; CHECK: ret
176 define <16 x i32> @vpsubd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
177   %x = sub <16 x i32> %i, %j
178   ret <16 x i32> %x
179 }
180
181 ; CHECK-LABEL: vpmulld_test
182 ; CHECK: vpmulld %zmm
183 ; CHECK: ret
184 define <16 x i32> @vpmulld_test(<16 x i32> %i, <16 x i32> %j) {
185   %x = mul <16 x i32> %i, %j
186   ret <16 x i32> %x
187 }
188
189 ; CHECK-LABEL: sqrtA
190 ; CHECK: vsqrtssz
191 ; CHECK: ret
192 declare float @sqrtf(float) readnone
193 define float @sqrtA(float %a) nounwind uwtable readnone ssp {
194 entry:
195   %conv1 = tail call float @sqrtf(float %a) nounwind readnone
196   ret float %conv1
197 }
198
199 ; CHECK-LABEL: sqrtB
200 ; CHECK: vsqrtsdz
201 ; CHECK: ret
202 declare double @sqrt(double) readnone
203 define double @sqrtB(double %a) nounwind uwtable readnone ssp {
204 entry:
205   %call = tail call double @sqrt(double %a) nounwind readnone
206   ret double %call
207 }
208
209 ; CHECK-LABEL: sqrtC
210 ; CHECK: vsqrtssz
211 ; CHECK: ret
212 declare float @llvm.sqrt.f32(float)
213 define float @sqrtC(float %a) nounwind {
214   %b = call float @llvm.sqrt.f32(float %a)
215   ret float %b
216 }
217
218 ; CHECK-LABEL: fadd_broadcast
219 ; CHECK: LCP{{.*}}(%rip){1to16}, %zmm0, %zmm0
220 ; CHECK: ret
221 define <16 x float> @fadd_broadcast(<16 x float> %a) nounwind {
222   %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>
223   ret <16 x float> %b
224 }
225
226 ; CHECK-LABEL: addq_broadcast
227 ; CHECK: vpaddq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
228 ; CHECK: ret
229 define <8 x i64> @addq_broadcast(<8 x i64> %a) nounwind {
230   %b = add <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
231   ret <8 x i64> %b
232 }
233
234 ; CHECK-LABEL: orq_broadcast
235 ; CHECK: vporq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
236 ; CHECK: ret
237 define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind {
238   %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
239   ret <8 x i64> %b
240 }
241
242 ; CHECK-LABEL: andd512fold
243 ; CHECK: vpandd (%
244 ; CHECK: ret
245 define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) {
246 entry:
247   %a = load <16 x i32>* %x, align 4
248   %b = and <16 x i32> %y, %a
249   ret <16 x i32> %b
250 }
251
252 ; CHECK-LABEL: andqbrst
253 ; CHECK: vpandq  (%rdi){1to8}, %zmm
254 ; CHECK: ret
255 define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) {
256 entry:
257   %a = load i64* %ap, align 8
258   %b = insertelement <8 x i64> undef, i64 %a, i32 0
259   %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
260   %d = and <8 x i64> %p1, %c
261   ret <8 x i64>%d
262 }