• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s
4
5define <4 x double> @andpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
6; CHECK-LABEL: andpd256:
7; CHECK:       # BB#0: # %entry
8; CHECK-NEXT:    vandpd %ymm0, %ymm1, %ymm0
9; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
10; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
11; CHECK-NEXT:    retq
12entry:
13  %0 = bitcast <4 x double> %x to <4 x i64>
14  %1 = bitcast <4 x double> %y to <4 x i64>
15  %and.i = and <4 x i64> %0, %1
16  %2 = bitcast <4 x i64> %and.i to <4 x double>
17  ; add forces execution domain
18  %3 = fadd <4 x double> %2, <double 0x0, double 0x0, double 0x0, double 0x0>
19  ret <4 x double> %3
20}
21
22define <4 x double> @andpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
23; CHECK-LABEL: andpd256fold:
24; CHECK:       # BB#0: # %entry
25; CHECK-NEXT:    vandpd {{.*}}(%rip), %ymm0, %ymm0
26; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
27; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
28; CHECK-NEXT:    retq
29entry:
30  %0 = bitcast <4 x double> %y to <4 x i64>
31  %and.i = and <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
32  %1 = bitcast <4 x i64> %and.i to <4 x double>
33  ; add forces execution domain
34  %2 = fadd <4 x double> %1, <double 0x0, double 0x0, double 0x0, double 0x0>
35  ret <4 x double> %2
36}
37
38define <8 x float> @andps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
39; CHECK-LABEL: andps256:
40; CHECK:       # BB#0: # %entry
41; CHECK-NEXT:    vandps %ymm0, %ymm1, %ymm0
42; CHECK-NEXT:    retq
43entry:
44  %0 = bitcast <8 x float> %x to <8 x i32>
45  %1 = bitcast <8 x float> %y to <8 x i32>
46  %and.i = and <8 x i32> %0, %1
47  %2 = bitcast <8 x i32> %and.i to <8 x float>
48  ret <8 x float> %2
49}
50
51define <8 x float> @andps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
52; CHECK-LABEL: andps256fold:
53; CHECK:       # BB#0: # %entry
54; CHECK-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
55; CHECK-NEXT:    retq
56entry:
57  %0 = bitcast <8 x float> %y to <8 x i32>
58  %and.i = and <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
59  %1 = bitcast <8 x i32> %and.i to <8 x float>
60  ret <8 x float> %1
61}
62
63define <4 x double> @xorpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
64; CHECK-LABEL: xorpd256:
65; CHECK:       # BB#0: # %entry
66; CHECK-NEXT:    vxorpd %ymm0, %ymm1, %ymm0
67; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
68; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
69; CHECK-NEXT:    retq
70entry:
71  %0 = bitcast <4 x double> %x to <4 x i64>
72  %1 = bitcast <4 x double> %y to <4 x i64>
73  %xor.i = xor <4 x i64> %0, %1
74  %2 = bitcast <4 x i64> %xor.i to <4 x double>
75  ; add forces execution domain
76  %3 = fadd <4 x double> %2, <double 0x0, double 0x0, double 0x0, double 0x0>
77  ret <4 x double> %3
78}
79
80define <4 x double> @xorpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
81; CHECK-LABEL: xorpd256fold:
82; CHECK:       # BB#0: # %entry
83; CHECK-NEXT:    vxorpd {{.*}}(%rip), %ymm0, %ymm0
84; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
85; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
86; CHECK-NEXT:    retq
87entry:
88  %0 = bitcast <4 x double> %y to <4 x i64>
89  %xor.i = xor <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
90  %1 = bitcast <4 x i64> %xor.i to <4 x double>
91  ; add forces execution domain
92  %2 = fadd <4 x double> %1, <double 0x0, double 0x0, double 0x0, double 0x0>
93  ret <4 x double> %2
94}
95
96define <8 x float> @xorps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
97; CHECK-LABEL: xorps256:
98; CHECK:       # BB#0: # %entry
99; CHECK-NEXT:    vxorps %ymm0, %ymm1, %ymm0
100; CHECK-NEXT:    retq
101entry:
102  %0 = bitcast <8 x float> %x to <8 x i32>
103  %1 = bitcast <8 x float> %y to <8 x i32>
104  %xor.i = xor <8 x i32> %0, %1
105  %2 = bitcast <8 x i32> %xor.i to <8 x float>
106  ret <8 x float> %2
107}
108
109define <8 x float> @xorps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
110; CHECK-LABEL: xorps256fold:
111; CHECK:       # BB#0: # %entry
112; CHECK-NEXT:    vxorps {{.*}}(%rip), %ymm0, %ymm0
113; CHECK-NEXT:    retq
114entry:
115  %0 = bitcast <8 x float> %y to <8 x i32>
116  %xor.i = xor <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
117  %1 = bitcast <8 x i32> %xor.i to <8 x float>
118  ret <8 x float> %1
119}
120
121define <4 x double> @orpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
122; CHECK-LABEL: orpd256:
123; CHECK:       # BB#0: # %entry
124; CHECK-NEXT:    vorpd %ymm0, %ymm1, %ymm0
125; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
126; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
127; CHECK-NEXT:    retq
128entry:
129  %0 = bitcast <4 x double> %x to <4 x i64>
130  %1 = bitcast <4 x double> %y to <4 x i64>
131  %or.i = or <4 x i64> %0, %1
132  %2 = bitcast <4 x i64> %or.i to <4 x double>
133  ; add forces execution domain
134  %3 = fadd <4 x double> %2, <double 0x0, double 0x0, double 0x0, double 0x0>
135  ret <4 x double> %3
136}
137
138define <4 x double> @orpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
139; CHECK-LABEL: orpd256fold:
140; CHECK:       # BB#0: # %entry
141; CHECK-NEXT:    vorpd {{.*}}(%rip), %ymm0, %ymm0
142; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
143; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
144; CHECK-NEXT:    retq
145entry:
146  %0 = bitcast <4 x double> %y to <4 x i64>
147  %or.i = or <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
148  %1 = bitcast <4 x i64> %or.i to <4 x double>
149  ; add forces execution domain
150  %2 = fadd <4 x double> %1, <double 0x0, double 0x0, double 0x0, double 0x0>
151  ret <4 x double> %2
152}
153
154define <8 x float> @orps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
155; CHECK-LABEL: orps256:
156; CHECK:       # BB#0: # %entry
157; CHECK-NEXT:    vorps %ymm0, %ymm1, %ymm0
158; CHECK-NEXT:    retq
159entry:
160  %0 = bitcast <8 x float> %x to <8 x i32>
161  %1 = bitcast <8 x float> %y to <8 x i32>
162  %or.i = or <8 x i32> %0, %1
163  %2 = bitcast <8 x i32> %or.i to <8 x float>
164  ret <8 x float> %2
165}
166
167define <8 x float> @orps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
168; CHECK-LABEL: orps256fold:
169; CHECK:       # BB#0: # %entry
170; CHECK-NEXT:    vorps {{.*}}(%rip), %ymm0, %ymm0
171; CHECK-NEXT:    retq
172entry:
173  %0 = bitcast <8 x float> %y to <8 x i32>
174  %or.i = or <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
175  %1 = bitcast <8 x i32> %or.i to <8 x float>
176  ret <8 x float> %1
177}
178
179define <4 x double> @andnotpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
180; CHECK-LABEL: andnotpd256:
181; CHECK:       # BB#0: # %entry
182; CHECK-NEXT:    vandnpd %ymm0, %ymm1, %ymm0
183; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
184; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
185; CHECK-NEXT:    retq
186entry:
187  %0 = bitcast <4 x double> %x to <4 x i64>
188  %neg.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
189  %1 = bitcast <4 x double> %y to <4 x i64>
190  %and.i = and <4 x i64> %1, %neg.i
191  %2 = bitcast <4 x i64> %and.i to <4 x double>
192  ; add forces execution domain
193  %3 = fadd <4 x double> %2, <double 0x0, double 0x0, double 0x0, double 0x0>
194  ret <4 x double> %3
195}
196
197define <4 x double> @andnotpd256fold(<4 x double> %y, <4 x double>* nocapture %x) nounwind uwtable readonly ssp {
198; CHECK-LABEL: andnotpd256fold:
199; CHECK:       # BB#0: # %entry
200; CHECK-NEXT:    vandnpd (%rdi), %ymm0, %ymm0
201; CHECK-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
202; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
203; CHECK-NEXT:    retq
204entry:
205  %tmp2 = load <4 x double>, <4 x double>* %x, align 32
206  %0 = bitcast <4 x double> %y to <4 x i64>
207  %neg.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
208  %1 = bitcast <4 x double> %tmp2 to <4 x i64>
209  %and.i = and <4 x i64> %1, %neg.i
210  %2 = bitcast <4 x i64> %and.i to <4 x double>
211  ; add forces execution domain
212  %3 = fadd <4 x double> %2, <double 0x0, double 0x0, double 0x0, double 0x0>
213  ret <4 x double> %3
214}
215
216define <8 x float> @andnotps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
217; CHECK-LABEL: andnotps256:
218; CHECK:       # BB#0: # %entry
219; CHECK-NEXT:    vandnps %ymm0, %ymm1, %ymm0
220; CHECK-NEXT:    retq
221entry:
222  %0 = bitcast <8 x float> %x to <8 x i32>
223  %neg.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
224  %1 = bitcast <8 x float> %y to <8 x i32>
225  %and.i = and <8 x i32> %1, %neg.i
226  %2 = bitcast <8 x i32> %and.i to <8 x float>
227  ret <8 x float> %2
228}
229
230define <8 x float> @andnotps256fold(<8 x float> %y, <8 x float>* nocapture %x) nounwind uwtable readonly ssp {
231; CHECK-LABEL: andnotps256fold:
232; CHECK:       # BB#0: # %entry
233; CHECK-NEXT:    vandnps (%rdi), %ymm0, %ymm0
234; CHECK-NEXT:    retq
235entry:
236  %tmp2 = load <8 x float>, <8 x float>* %x, align 32
237  %0 = bitcast <8 x float> %y to <8 x i32>
238  %neg.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
239  %1 = bitcast <8 x float> %tmp2 to <8 x i32>
240  %and.i = and <8 x i32> %1, %neg.i
241  %2 = bitcast <8 x i32> %and.i to <8 x float>
242  ret <8 x float> %2
243}
244
245;;; Test that basic 2 x i64 logic use the integer version on AVX
246
247define <2 x i64> @vpandn(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
248; CHECK-LABEL: vpandn:
249; CHECK:       # BB#0: # %entry
250; CHECK-NEXT:    vpaddq {{.*}}(%rip), %xmm0, %xmm1
251; CHECK-NEXT:    vpandn %xmm0, %xmm1, %xmm0
252; CHECK-NEXT:    retq
253entry:
254  ; Force the execution domain with an add.
255  %a2 = add <2 x i64> %a, <i64 1, i64 1>
256  %y = xor <2 x i64> %a2, <i64 -1, i64 -1>
257  %x = and <2 x i64> %a, %y
258  ret <2 x i64> %x
259}
260
261define <2 x i64> @vpand(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
262; CHECK-LABEL: vpand:
263; CHECK:       # BB#0: # %entry
264; CHECK-NEXT:    vpaddq {{.*}}(%rip), %xmm0, %xmm0
265; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0
266; CHECK-NEXT:    retq
267entry:
268  ; Force the execution domain with an add.
269  %a2 = add <2 x i64> %a, <i64 1, i64 1>
270  %x = and <2 x i64> %a2, %b
271  ret <2 x i64> %x
272}
273
274