4c30184a5426b7a58c7f21c80808e525be5af5e8
[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 $57
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  $57
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: vpermd
36 ; AVX: vpmuludq
37 ; AVX: vshufps  $-35
38 ; AVX: vpmuludq
39 ; AVX: vshufps  $-35
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
112 define <4 x i32> @test8(<4 x i32> %a) {
113   %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
114   ret <4 x i32> %div
115
116 ; SSE41-LABEL: test8:
117 ; SSE41: pmuldq
118 ; SSE41: pshufd $57
119 ; SSE41-NOT: pshufd     $57
120 ; SSE41: pmuldq
121 ; SSE41: shufps $-35
122 ; SSE41: pshufd $-40
123 ; SSE41: padd
124 ; SSE41: psrld $31
125 ; SSE41: psrad $2
126 ; SSE41: padd
127
128 ; SSE-LABEL: test8:
129 ; SSE: psrad $31
130 ; SSE: pand
131 ; SSE: paddd
132 ; SSE: pmuludq
133 ; SSE: pshufd   $57
134 ; SSE-NOT: pshufd       $57
135 ; SSE: pmuludq
136 ; SSE: shufps   $-35
137 ; SSE: pshufd   $-40
138 ; SSE: psubd
139 ; SSE: padd
140 ; SSE: psrld $31
141 ; SSE: psrad $2
142 ; SSE: padd
143
144 ; AVX-LABEL: test8:
145 ; AVX: vpmuldq
146 ; AVX: vpshufd  $57
147 ; AVX-NOT: vpshufd      $57
148 ; AVX: vpmuldq
149 ; AVX: vshufps  $-35
150 ; AVX: vpshufd  $-40
151 ; AVX: vpadd
152 ; AVX: vpsrld $31
153 ; AVX: vpsrad $2
154 ; AVX: vpadd
155 }
156
157 define <8 x i32> @test9(<8 x i32> %a) {
158   %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
159   ret <8 x i32> %div
160
161 ; AVX-LABEL: test9:
162 ; AVX: vpbroadcastd
163 ; AVX: vpmuldq
164 ; AVX: vshufps  $-35
165 ; AVX: vpmuldq
166 ; AVX: vshufps  $-35
167 ; AVX: vpshufd  $-40
168 ; AVX: vpadd
169 ; AVX: vpsrld $31
170 ; AVX: vpsrad $2
171 ; AVX: vpadd
172 }
173
174 define <8 x i32> @test10(<8 x i32> %a) {
175   %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
176   ret <8 x i32> %rem
177
178 ; AVX-LABEL: test10:
179 ; AVX: vpbroadcastd
180 ; AVX: vpmuludq
181 ; AVX: vshufps  $-35
182 ; AVX: vpmuludq
183 ; AVX: vshufps  $-35
184 ; AVX: vpsubd
185 ; AVX: vpsrld $1
186 ; AVX: vpadd
187 ; AVX: vpsrld $2
188 ; AVX: vpmulld
189 }
190
191 define <8 x i32> @test11(<8 x i32> %a) {
192   %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
193   ret <8 x i32> %rem
194
195 ; AVX-LABEL: test11:
196 ; AVX: vpbroadcastd
197 ; AVX: vpmuldq
198 ; AVX: vshufps  $-35
199 ; AVX: vpmuldq
200 ; AVX: vshufps  $-35
201 ; AVX: vpshufd  $-40
202 ; AVX: vpadd
203 ; AVX: vpsrld $31
204 ; AVX: vpsrad $2
205 ; AVX: vpadd
206 ; AVX: vpmulld
207 }
208
209 define <2 x i16> @test12() {
210   %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
211   %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
212   %B9 = urem <2 x i16> %I9, %I9
213   ret <2 x i16> %B9
214
215 ; AVX-LABEL: test12:
216 ; AVX: xorps
217 }