55ce9f9512d9f0d2ba58c23b64010e8161a89f9e
[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: addq_broadcast
190 ; CHECK: vpaddq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
191 ; CHECK: ret
192 define <8 x i64> @addq_broadcast(<8 x i64> %a) nounwind {
193   %b = add <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
194   ret <8 x i64> %b
195 }
196
197 ; CHECK-LABEL: orq_broadcast
198 ; CHECK: vporq LCP{{.*}}(%rip){1to8}, %zmm0, %zmm0
199 ; CHECK: ret
200 define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind {
201   %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
202   ret <8 x i64> %b
203 }
204
205 ; CHECK-LABEL: andd512fold
206 ; CHECK: vpandd (%
207 ; CHECK: ret
208 define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) {
209 entry:
210   %a = load <16 x i32>* %x, align 4
211   %b = and <16 x i32> %y, %a
212   ret <16 x i32> %b
213 }
214
215 ; CHECK-LABEL: andqbrst
216 ; CHECK: vpandq  (%rdi){1to8}, %zmm
217 ; CHECK: ret
218 define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) {
219 entry:
220   %a = load i64* %ap, align 8
221   %b = insertelement <8 x i64> undef, i64 %a, i32 0
222   %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
223   %d = and <8 x i64> %p1, %c
224   ret <8 x i64>%d
225 }