X86: When lowering v8i32 himuls use the correct shuffle masks for AVX2.
[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-NOT: 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: psrad $31
136 ; SSE: pand
137 ; SSE: paddd
138 ; SSE: pmuludq
139 ; SSE: pshufd   $49
140 ; SSE-NOT: pshufd       $49
141 ; SSE: pmuludq
142 ; SSE: shufps   $-35
143 ; SSE: pshufd   $-40
144 ; SSE: psubd
145 ; SSE: padd
146 ; SSE: psrld $31
147 ; SSE: psrad $2
148 ; SSE: padd
149
150 ; AVX-LABEL: test8:
151 ; AVX: vpmuldq
152 ; AVX: vpshufd  $49
153 ; AVX-NOT: vpshufd      $49
154 ; AVX: vpmuldq
155 ; AVX: vshufps  $-35
156 ; AVX: vpshufd  $-40
157 ; AVX: vpadd
158 ; AVX: vpsrld $31
159 ; AVX: vpsrad $2
160 ; AVX: vpadd
161 }
162
163 define <8 x i32> @test9(<8 x i32> %a) {
164   %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
165   ret <8 x i32> %div
166
167 ; AVX-LABEL: test9:
168 ; AVX: vpalignr $4
169 ; AVX: vpbroadcastd
170 ; AVX: vpmuldq
171 ; AVX: vpmuldq
172 ; AVX: vpblendd $170
173 ; AVX: vpadd
174 ; AVX: vpsrld $31
175 ; AVX: vpsrad $2
176 ; AVX: vpadd
177 }
178
179 define <8 x i32> @test10(<8 x i32> %a) {
180   %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
181   ret <8 x i32> %rem
182
183 ; AVX-LABEL: test10:
184 ; AVX: vpbroadcastd
185 ; AVX: vpalignr $4
186 ; AVX: vpmuludq
187 ; AVX: vpmuludq
188 ; AVX: vpblendd $170
189 ; AVX: vpsubd
190 ; AVX: vpsrld $1
191 ; AVX: vpadd
192 ; AVX: vpsrld $2
193 ; AVX: vpmulld
194 }
195
196 define <8 x i32> @test11(<8 x i32> %a) {
197   %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
198   ret <8 x i32> %rem
199
200 ; AVX-LABEL: test11:
201 ; AVX: vpalignr $4
202 ; AVX: vpbroadcastd
203 ; AVX: vpmuldq
204 ; AVX: vpmuldq
205 ; AVX: vpblendd $170
206 ; AVX: vpadd
207 ; AVX: vpsrld $31
208 ; AVX: vpsrad $2
209 ; AVX: vpadd
210 ; AVX: vpmulld
211 }
212
213 define <2 x i16> @test12() {
214   %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
215   %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
216   %B9 = urem <2 x i16> %I9, %I9
217   ret <2 x i16> %B9
218
219 ; AVX-LABEL: test12:
220 ; AVX: xorps
221 }