[x86] Revert r214007: Fix PR20355 ...
[oota-llvm.git] / test / CodeGen / X86 / vector-idiv.ll
1 ; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s -check-prefix=SSE41
2 ; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s -check-prefix=SSE
3 ; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s -check-prefix=AVX
4
5 define <4 x i32> @test1(<4 x i32> %a) {
6   %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
7   ret <4 x i32> %div
8
9 ; SSE41-LABEL: test1:
10 ; SSE41: pmuludq
11 ; SSE41: pshufd $49
12 ; SSE41: pmuludq
13 ; SSE41: shufps $-35
14 ; SSE41: psubd
15 ; SSE41: psrld $1
16 ; SSE41: padd
17 ; SSE41: psrld $2
18
19 ; AVX-LABEL: test1:
20 ; AVX: vpmuludq
21 ; AVX: vpshufd  $49
22 ; AVX: vpmuludq
23 ; AVX: vshufps  $-35
24 ; AVX: vpsubd
25 ; AVX: vpsrld $1
26 ; AVX: vpadd
27 ; AVX: vpsrld $2
28 }
29
30 define <8 x i32> @test2(<8 x i32> %a) {
31   %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
32   ret <8 x i32> %div
33
34 ; AVX-LABEL: test2:
35 ; AVX: vpbroadcastd
36 ; AVX: vpalignr $4
37 ; AVX: vpmuludq
38 ; AVX: vpmuludq
39 ; AVX: vpblendd $170
40 ; AVX: vpsubd
41 ; AVX: vpsrld $1
42 ; AVX: vpadd
43 ; AVX: vpsrld $2
44 }
45
46 define <8 x i16> @test3(<8 x i16> %a) {
47   %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
48   ret <8 x i16> %div
49
50 ; SSE41-LABEL: test3:
51 ; SSE41: pmulhuw
52 ; SSE41: psubw
53 ; SSE41: psrlw $1
54 ; SSE41: paddw
55 ; SSE41: psrlw $2
56
57 ; AVX-LABEL: test3:
58 ; AVX: vpmulhuw
59 ; AVX: vpsubw
60 ; AVX: vpsrlw $1
61 ; AVX: vpaddw
62 ; AVX: vpsrlw $2
63 }
64
65 define <16 x i16> @test4(<16 x i16> %a) {
66   %div = udiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
67   ret <16 x i16> %div
68
69 ; AVX-LABEL: test4:
70 ; AVX: vpmulhuw
71 ; AVX: vpsubw
72 ; AVX: vpsrlw $1
73 ; AVX: vpaddw
74 ; AVX: vpsrlw $2
75 ; AVX-NOT: vpmulhuw
76 }
77
78 define <8 x i16> @test5(<8 x i16> %a) {
79   %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
80   ret <8 x i16> %div
81
82 ; SSE41-LABEL: test5:
83 ; SSE41: pmulhw
84 ; SSE41: psrlw $15
85 ; SSE41: psraw $1
86 ; SSE41: paddw
87
88 ; AVX-LABEL: test5:
89 ; AVX: vpmulhw
90 ; AVX: vpsrlw $15
91 ; AVX: vpsraw $1
92 ; AVX: vpaddw
93 }
94
95 define <16 x i16> @test6(<16 x i16> %a) {
96   %div = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
97   ret <16 x i16> %div
98
99 ; AVX-LABEL: test6:
100 ; AVX: vpmulhw
101 ; AVX: vpsrlw $15
102 ; AVX: vpsraw $1
103 ; AVX: vpaddw
104 ; AVX-NOT: vpmulhw
105 }
106
107 define <16 x i8> @test7(<16 x i8> %a) {
108   %div = sdiv <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7>
109   ret <16 x i8> %div
110
111 ; FIXME: scalarized
112 ; SSE41-LABEL: test7:
113 ; SSE41: pext
114 ; AVX-LABEL: test7:
115 ; AVX: pext
116 }
117
118 define <4 x i32> @test8(<4 x i32> %a) {
119   %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
120   ret <4 x i32> %div
121
122 ; SSE41-LABEL: test8:
123 ; SSE41: pmuldq
124 ; SSE41: pshufd $49
125 ; SSE41: pshufd $49
126 ; SSE41: pmuldq
127 ; SSE41: shufps $-35
128 ; SSE41: pshufd $-40
129 ; SSE41: padd
130 ; SSE41: psrld $31
131 ; SSE41: psrad $2
132 ; SSE41: padd
133
134 ; SSE-LABEL: test8:
135 ; SSE: pmuludq
136 ; SSE: pshufd   $49
137 ; SSE: pshufd   $49
138 ; SSE: pmuludq
139 ; SSE: shufps   $-35
140 ; SSE: pshufd   $-40
141 ; SSE: psubd
142 ; SSE: padd
143 ; SSE: psrld $31
144 ; SSE: psrad $2
145 ; SSE: padd
146
147 ; AVX-LABEL: test8:
148 ; AVX: vpmuldq
149 ; AVX: vpshufd  $49
150 ; AVX: vpshufd  $49
151 ; AVX: vpmuldq
152 ; AVX: vshufps  $-35
153 ; AVX: vpshufd  $-40
154 ; AVX: vpadd
155 ; AVX: vpsrld $31
156 ; AVX: vpsrad $2
157 ; AVX: vpadd
158 }
159
160 define <8 x i32> @test9(<8 x i32> %a) {
161   %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
162   ret <8 x i32> %div
163
164 ; AVX-LABEL: test9:
165 ; AVX: vpbroadcastd
166 ; AVX: vpalignr $4
167 ; AVX: vpalignr $4
168 ; AVX: vpmuldq
169 ; AVX: vpmuldq
170 ; AVX: vpalignr $4
171 ; AVX: vpblendd $170
172 ; AVX: vpadd
173 ; AVX: vpsrld $31
174 ; AVX: vpsrad $2
175 ; AVX: vpadd
176 }
177
178 define <8 x i32> @test10(<8 x i32> %a) {
179   %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
180   ret <8 x i32> %rem
181
182 ; AVX-LABEL: test10:
183 ; AVX: vpbroadcastd
184 ; AVX: vpalignr $4
185 ; AVX: vpmuludq
186 ; AVX: vpmuludq
187 ; AVX: vpblendd $170
188 ; AVX: vpsubd
189 ; AVX: vpsrld $1
190 ; AVX: vpadd
191 ; AVX: vpsrld $2
192 ; AVX: vpmulld
193 }
194
195 define <8 x i32> @test11(<8 x i32> %a) {
196   %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
197   ret <8 x i32> %rem
198
199 ; AVX-LABEL: test11:
200 ; AVX: vpbroadcastd
201 ; AVX: vpalignr $4
202 ; AVX: vpalignr $4
203 ; AVX: vpmuldq
204 ; AVX: vpmuldq
205 ; AVX: vpalignr $4
206 ; AVX: vpblendd $170
207 ; AVX: vpadd
208 ; AVX: vpsrld $31
209 ; AVX: vpsrad $2
210 ; AVX: vpadd
211 ; AVX: vpmulld
212 }
213
214 define <2 x i16> @test12() {
215   %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
216   %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
217   %B9 = urem <2 x i16> %I9, %I9
218   ret <2 x i16> %B9
219
220 ; AVX-LABEL: test12:
221 ; AVX: xorps
222 }