[Demangle] Add a few more options to the microsoft demangler
[llvm-complete.git] / test / CodeGen / PowerPC / urem-vector-lkk.ll
blobe3d9027d9e98c6728bc248145c331fb87736ad07
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
3 ; RUN:          -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,P9LE
4 ; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
5 ; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,P9BE
6 ; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
7 ; RUN:    -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,P8LE
8 ; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
9 ; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,P8BE
11 define <4 x i16> @fold_urem_vec_1(<4 x i16> %x) {
12 ; P9LE-LABEL: fold_urem_vec_1:
13 ; P9LE:       # %bb.0:
14 ; P9LE-NEXT:    li r3, 4
15 ; P9LE-NEXT:    vextuhrx r3, r3, v2
16 ; P9LE-NEXT:    lis r5, 21399
17 ; P9LE-NEXT:    ori r5, r5, 33437
18 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
19 ; P9LE-NEXT:    mulld r4, r4, r5
20 ; P9LE-NEXT:    lis r5, 16727
21 ; P9LE-NEXT:    ori r5, r5, 2287
22 ; P9LE-NEXT:    rldicl r4, r4, 27, 37
23 ; P9LE-NEXT:    mulli r4, r4, 98
24 ; P9LE-NEXT:    subf r3, r4, r3
25 ; P9LE-NEXT:    mtvsrd f0, r3
26 ; P9LE-NEXT:    li r3, 6
27 ; P9LE-NEXT:    vextuhrx r3, r3, v2
28 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
29 ; P9LE-NEXT:    mulld r4, r4, r5
30 ; P9LE-NEXT:    lis r5, 8456
31 ; P9LE-NEXT:    ori r5, r5, 16913
32 ; P9LE-NEXT:    rldicl r4, r4, 24, 40
33 ; P9LE-NEXT:    mulli r4, r4, 1003
34 ; P9LE-NEXT:    subf r3, r4, r3
35 ; P9LE-NEXT:    xxswapd v3, vs0
36 ; P9LE-NEXT:    mtvsrd f0, r3
37 ; P9LE-NEXT:    li r3, 2
38 ; P9LE-NEXT:    vextuhrx r3, r3, v2
39 ; P9LE-NEXT:    rlwinm r4, r3, 30, 18, 31
40 ; P9LE-NEXT:    mulld r4, r4, r5
41 ; P9LE-NEXT:    rldicl r4, r4, 30, 34
42 ; P9LE-NEXT:    mulli r4, r4, 124
43 ; P9LE-NEXT:    subf r3, r4, r3
44 ; P9LE-NEXT:    xxswapd v4, vs0
45 ; P9LE-NEXT:    mtvsrd f0, r3
46 ; P9LE-NEXT:    li r3, 0
47 ; P9LE-NEXT:    vextuhrx r3, r3, v2
48 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
49 ; P9LE-NEXT:    lis r6, 22765
50 ; P9LE-NEXT:    ori r6, r6, 8969
51 ; P9LE-NEXT:    vmrglh v3, v4, v3
52 ; P9LE-NEXT:    xxswapd v4, vs0
53 ; P9LE-NEXT:    clrldi r5, r4, 32
54 ; P9LE-NEXT:    mulld r5, r5, r6
55 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
56 ; P9LE-NEXT:    subf r4, r5, r4
57 ; P9LE-NEXT:    srwi r4, r4, 1
58 ; P9LE-NEXT:    add r4, r4, r5
59 ; P9LE-NEXT:    srwi r4, r4, 6
60 ; P9LE-NEXT:    mulli r4, r4, 95
61 ; P9LE-NEXT:    subf r3, r4, r3
62 ; P9LE-NEXT:    mtvsrd f0, r3
63 ; P9LE-NEXT:    xxswapd v2, vs0
64 ; P9LE-NEXT:    vmrglh v2, v4, v2
65 ; P9LE-NEXT:    vmrglw v2, v3, v2
66 ; P9LE-NEXT:    blr
68 ; P9BE-LABEL: fold_urem_vec_1:
69 ; P9BE:       # %bb.0:
70 ; P9BE-NEXT:    li r3, 6
71 ; P9BE-NEXT:    vextuhlx r3, r3, v2
72 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
73 ; P9BE-NEXT:    lis r5, 16727
74 ; P9BE-NEXT:    ori r5, r5, 2287
75 ; P9BE-NEXT:    clrldi r4, r3, 32
76 ; P9BE-NEXT:    mulld r4, r4, r5
77 ; P9BE-NEXT:    lis r5, 21399
78 ; P9BE-NEXT:    ori r5, r5, 33437
79 ; P9BE-NEXT:    rldicl r4, r4, 24, 40
80 ; P9BE-NEXT:    mulli r4, r4, 1003
81 ; P9BE-NEXT:    subf r3, r4, r3
82 ; P9BE-NEXT:    sldi r3, r3, 48
83 ; P9BE-NEXT:    mtvsrd v3, r3
84 ; P9BE-NEXT:    li r3, 4
85 ; P9BE-NEXT:    vextuhlx r3, r3, v2
86 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
87 ; P9BE-NEXT:    clrldi r4, r3, 32
88 ; P9BE-NEXT:    mulld r4, r4, r5
89 ; P9BE-NEXT:    lis r5, 8456
90 ; P9BE-NEXT:    ori r5, r5, 16913
91 ; P9BE-NEXT:    rldicl r4, r4, 27, 37
92 ; P9BE-NEXT:    mulli r4, r4, 98
93 ; P9BE-NEXT:    subf r3, r4, r3
94 ; P9BE-NEXT:    sldi r3, r3, 48
95 ; P9BE-NEXT:    mtvsrd v4, r3
96 ; P9BE-NEXT:    li r3, 2
97 ; P9BE-NEXT:    vextuhlx r3, r3, v2
98 ; P9BE-NEXT:    clrlwi r4, r3, 16
99 ; P9BE-NEXT:    rlwinm r3, r3, 30, 18, 31
100 ; P9BE-NEXT:    mulld r3, r3, r5
101 ; P9BE-NEXT:    lis r5, 22765
102 ; P9BE-NEXT:    ori r5, r5, 8969
103 ; P9BE-NEXT:    rldicl r3, r3, 30, 34
104 ; P9BE-NEXT:    mulli r3, r3, 124
105 ; P9BE-NEXT:    subf r3, r3, r4
106 ; P9BE-NEXT:    sldi r3, r3, 48
107 ; P9BE-NEXT:    vmrghh v3, v4, v3
108 ; P9BE-NEXT:    mtvsrd v4, r3
109 ; P9BE-NEXT:    li r3, 0
110 ; P9BE-NEXT:    vextuhlx r3, r3, v2
111 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
112 ; P9BE-NEXT:    clrldi r4, r3, 32
113 ; P9BE-NEXT:    mulld r4, r4, r5
114 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
115 ; P9BE-NEXT:    subf r5, r4, r3
116 ; P9BE-NEXT:    srwi r5, r5, 1
117 ; P9BE-NEXT:    add r4, r5, r4
118 ; P9BE-NEXT:    srwi r4, r4, 6
119 ; P9BE-NEXT:    mulli r4, r4, 95
120 ; P9BE-NEXT:    subf r3, r4, r3
121 ; P9BE-NEXT:    sldi r3, r3, 48
122 ; P9BE-NEXT:    mtvsrd v2, r3
123 ; P9BE-NEXT:    vmrghh v2, v2, v4
124 ; P9BE-NEXT:    vmrghw v2, v2, v3
125 ; P9BE-NEXT:    blr
127 ; P8LE-LABEL: fold_urem_vec_1:
128 ; P8LE:       # %bb.0:
129 ; P8LE-NEXT:    xxswapd vs0, v2
130 ; P8LE-NEXT:    lis r3, 22765
131 ; P8LE-NEXT:    lis r8, 21399
132 ; P8LE-NEXT:    ori r3, r3, 8969
133 ; P8LE-NEXT:    ori r8, r8, 33437
134 ; P8LE-NEXT:    mfvsrd r4, f0
135 ; P8LE-NEXT:    clrldi r5, r4, 48
136 ; P8LE-NEXT:    rldicl r9, r4, 32, 48
137 ; P8LE-NEXT:    rlwinm r6, r5, 0, 16, 31
138 ; P8LE-NEXT:    rldicl r10, r4, 16, 48
139 ; P8LE-NEXT:    rlwinm r11, r9, 0, 16, 31
140 ; P8LE-NEXT:    clrldi r7, r6, 32
141 ; P8LE-NEXT:    rlwinm r12, r10, 0, 16, 31
142 ; P8LE-NEXT:    mulld r3, r7, r3
143 ; P8LE-NEXT:    lis r7, 16727
144 ; P8LE-NEXT:    ori r7, r7, 2287
145 ; P8LE-NEXT:    mulld r8, r11, r8
146 ; P8LE-NEXT:    lis r11, 8456
147 ; P8LE-NEXT:    rldicl r4, r4, 48, 48
148 ; P8LE-NEXT:    mulld r7, r12, r7
149 ; P8LE-NEXT:    ori r11, r11, 16913
150 ; P8LE-NEXT:    rlwinm r12, r4, 30, 18, 31
151 ; P8LE-NEXT:    rldicl r3, r3, 32, 32
152 ; P8LE-NEXT:    mulld r11, r12, r11
153 ; P8LE-NEXT:    subf r6, r3, r6
154 ; P8LE-NEXT:    rldicl r8, r8, 27, 37
155 ; P8LE-NEXT:    srwi r6, r6, 1
156 ; P8LE-NEXT:    add r3, r6, r3
157 ; P8LE-NEXT:    rldicl r6, r7, 24, 40
158 ; P8LE-NEXT:    mulli r7, r8, 98
159 ; P8LE-NEXT:    srwi r3, r3, 6
160 ; P8LE-NEXT:    rldicl r8, r11, 30, 34
161 ; P8LE-NEXT:    mulli r6, r6, 1003
162 ; P8LE-NEXT:    mulli r3, r3, 95
163 ; P8LE-NEXT:    mulli r8, r8, 124
164 ; P8LE-NEXT:    subf r7, r7, r9
165 ; P8LE-NEXT:    subf r6, r6, r10
166 ; P8LE-NEXT:    mtvsrd f0, r7
167 ; P8LE-NEXT:    subf r3, r3, r5
168 ; P8LE-NEXT:    subf r4, r8, r4
169 ; P8LE-NEXT:    mtvsrd f1, r6
170 ; P8LE-NEXT:    mtvsrd f2, r3
171 ; P8LE-NEXT:    xxswapd v2, vs0
172 ; P8LE-NEXT:    mtvsrd f3, r4
173 ; P8LE-NEXT:    xxswapd v3, vs1
174 ; P8LE-NEXT:    xxswapd v4, vs2
175 ; P8LE-NEXT:    xxswapd v5, vs3
176 ; P8LE-NEXT:    vmrglh v2, v3, v2
177 ; P8LE-NEXT:    vmrglh v3, v5, v4
178 ; P8LE-NEXT:    vmrglw v2, v2, v3
179 ; P8LE-NEXT:    blr
181 ; P8BE-LABEL: fold_urem_vec_1:
182 ; P8BE:       # %bb.0:
183 ; P8BE-NEXT:    mfvsrd r4, v2
184 ; P8BE-NEXT:    lis r3, 22765
185 ; P8BE-NEXT:    lis r9, 16727
186 ; P8BE-NEXT:    ori r3, r3, 8969
187 ; P8BE-NEXT:    ori r9, r9, 2287
188 ; P8BE-NEXT:    rldicl r5, r4, 16, 48
189 ; P8BE-NEXT:    clrldi r6, r4, 48
190 ; P8BE-NEXT:    rlwinm r5, r5, 0, 16, 31
191 ; P8BE-NEXT:    rldicl r7, r4, 48, 48
192 ; P8BE-NEXT:    rlwinm r6, r6, 0, 16, 31
193 ; P8BE-NEXT:    clrldi r8, r5, 32
194 ; P8BE-NEXT:    rlwinm r7, r7, 0, 16, 31
195 ; P8BE-NEXT:    mulld r3, r8, r3
196 ; P8BE-NEXT:    lis r8, 21399
197 ; P8BE-NEXT:    clrldi r10, r6, 32
198 ; P8BE-NEXT:    ori r8, r8, 33437
199 ; P8BE-NEXT:    clrldi r11, r7, 32
200 ; P8BE-NEXT:    mulld r9, r10, r9
201 ; P8BE-NEXT:    lis r10, 8456
202 ; P8BE-NEXT:    rldicl r4, r4, 32, 48
203 ; P8BE-NEXT:    mulld r8, r11, r8
204 ; P8BE-NEXT:    ori r10, r10, 16913
205 ; P8BE-NEXT:    rlwinm r11, r4, 30, 18, 31
206 ; P8BE-NEXT:    rldicl r3, r3, 32, 32
207 ; P8BE-NEXT:    rlwinm r4, r4, 0, 16, 31
208 ; P8BE-NEXT:    mulld r10, r11, r10
209 ; P8BE-NEXT:    subf r11, r3, r5
210 ; P8BE-NEXT:    srwi r11, r11, 1
211 ; P8BE-NEXT:    rldicl r9, r9, 24, 40
212 ; P8BE-NEXT:    add r3, r11, r3
213 ; P8BE-NEXT:    rldicl r8, r8, 27, 37
214 ; P8BE-NEXT:    srwi r3, r3, 6
215 ; P8BE-NEXT:    mulli r9, r9, 1003
216 ; P8BE-NEXT:    rldicl r10, r10, 30, 34
217 ; P8BE-NEXT:    mulli r8, r8, 98
218 ; P8BE-NEXT:    mulli r3, r3, 95
219 ; P8BE-NEXT:    mulli r10, r10, 124
220 ; P8BE-NEXT:    subf r6, r9, r6
221 ; P8BE-NEXT:    subf r7, r8, r7
222 ; P8BE-NEXT:    sldi r6, r6, 48
223 ; P8BE-NEXT:    subf r3, r3, r5
224 ; P8BE-NEXT:    subf r4, r10, r4
225 ; P8BE-NEXT:    mtvsrd v2, r6
226 ; P8BE-NEXT:    sldi r5, r7, 48
227 ; P8BE-NEXT:    sldi r3, r3, 48
228 ; P8BE-NEXT:    sldi r4, r4, 48
229 ; P8BE-NEXT:    mtvsrd v3, r5
230 ; P8BE-NEXT:    mtvsrd v4, r3
231 ; P8BE-NEXT:    mtvsrd v5, r4
232 ; P8BE-NEXT:    vmrghh v2, v3, v2
233 ; P8BE-NEXT:    vmrghh v3, v4, v5
234 ; P8BE-NEXT:    vmrghw v2, v3, v2
235 ; P8BE-NEXT:    blr
236   %1 = urem <4 x i16> %x, <i16 95, i16 124, i16 98, i16 1003>
237   ret <4 x i16> %1
240 define <4 x i16> @fold_urem_vec_2(<4 x i16> %x) {
241 ; P9LE-LABEL: fold_urem_vec_2:
242 ; P9LE:       # %bb.0:
243 ; P9LE-NEXT:    li r3, 0
244 ; P9LE-NEXT:    vextuhrx r3, r3, v2
245 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
246 ; P9LE-NEXT:    lis r6, 22765
247 ; P9LE-NEXT:    ori r6, r6, 8969
248 ; P9LE-NEXT:    clrldi r5, r4, 32
249 ; P9LE-NEXT:    mulld r5, r5, r6
250 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
251 ; P9LE-NEXT:    subf r4, r5, r4
252 ; P9LE-NEXT:    srwi r4, r4, 1
253 ; P9LE-NEXT:    add r4, r4, r5
254 ; P9LE-NEXT:    srwi r4, r4, 6
255 ; P9LE-NEXT:    mulli r4, r4, 95
256 ; P9LE-NEXT:    subf r3, r4, r3
257 ; P9LE-NEXT:    mtvsrd f0, r3
258 ; P9LE-NEXT:    li r3, 2
259 ; P9LE-NEXT:    vextuhrx r3, r3, v2
260 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
261 ; P9LE-NEXT:    clrldi r5, r4, 32
262 ; P9LE-NEXT:    mulld r5, r5, r6
263 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
264 ; P9LE-NEXT:    subf r4, r5, r4
265 ; P9LE-NEXT:    srwi r4, r4, 1
266 ; P9LE-NEXT:    add r4, r4, r5
267 ; P9LE-NEXT:    srwi r4, r4, 6
268 ; P9LE-NEXT:    mulli r4, r4, 95
269 ; P9LE-NEXT:    subf r3, r4, r3
270 ; P9LE-NEXT:    xxswapd v3, vs0
271 ; P9LE-NEXT:    mtvsrd f0, r3
272 ; P9LE-NEXT:    li r3, 4
273 ; P9LE-NEXT:    vextuhrx r3, r3, v2
274 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
275 ; P9LE-NEXT:    clrldi r5, r4, 32
276 ; P9LE-NEXT:    mulld r5, r5, r6
277 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
278 ; P9LE-NEXT:    subf r4, r5, r4
279 ; P9LE-NEXT:    srwi r4, r4, 1
280 ; P9LE-NEXT:    add r4, r4, r5
281 ; P9LE-NEXT:    srwi r4, r4, 6
282 ; P9LE-NEXT:    mulli r4, r4, 95
283 ; P9LE-NEXT:    subf r3, r4, r3
284 ; P9LE-NEXT:    xxswapd v4, vs0
285 ; P9LE-NEXT:    mtvsrd f0, r3
286 ; P9LE-NEXT:    li r3, 6
287 ; P9LE-NEXT:    vextuhrx r3, r3, v2
288 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
289 ; P9LE-NEXT:    clrldi r5, r4, 32
290 ; P9LE-NEXT:    mulld r5, r5, r6
291 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
292 ; P9LE-NEXT:    subf r4, r5, r4
293 ; P9LE-NEXT:    srwi r4, r4, 1
294 ; P9LE-NEXT:    add r4, r4, r5
295 ; P9LE-NEXT:    srwi r4, r4, 6
296 ; P9LE-NEXT:    mulli r4, r4, 95
297 ; P9LE-NEXT:    subf r3, r4, r3
298 ; P9LE-NEXT:    vmrglh v3, v4, v3
299 ; P9LE-NEXT:    xxswapd v4, vs0
300 ; P9LE-NEXT:    mtvsrd f0, r3
301 ; P9LE-NEXT:    xxswapd v2, vs0
302 ; P9LE-NEXT:    vmrglh v2, v2, v4
303 ; P9LE-NEXT:    vmrglw v2, v2, v3
304 ; P9LE-NEXT:    blr
306 ; P9BE-LABEL: fold_urem_vec_2:
307 ; P9BE:       # %bb.0:
308 ; P9BE-NEXT:    li r3, 6
309 ; P9BE-NEXT:    vextuhlx r3, r3, v2
310 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
311 ; P9BE-NEXT:    lis r5, 22765
312 ; P9BE-NEXT:    ori r5, r5, 8969
313 ; P9BE-NEXT:    clrldi r4, r3, 32
314 ; P9BE-NEXT:    mulld r4, r4, r5
315 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
316 ; P9BE-NEXT:    subf r6, r4, r3
317 ; P9BE-NEXT:    srwi r6, r6, 1
318 ; P9BE-NEXT:    add r4, r6, r4
319 ; P9BE-NEXT:    srwi r4, r4, 6
320 ; P9BE-NEXT:    mulli r4, r4, 95
321 ; P9BE-NEXT:    subf r3, r4, r3
322 ; P9BE-NEXT:    sldi r3, r3, 48
323 ; P9BE-NEXT:    mtvsrd v3, r3
324 ; P9BE-NEXT:    li r3, 4
325 ; P9BE-NEXT:    vextuhlx r3, r3, v2
326 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
327 ; P9BE-NEXT:    clrldi r4, r3, 32
328 ; P9BE-NEXT:    mulld r4, r4, r5
329 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
330 ; P9BE-NEXT:    subf r6, r4, r3
331 ; P9BE-NEXT:    srwi r6, r6, 1
332 ; P9BE-NEXT:    add r4, r6, r4
333 ; P9BE-NEXT:    srwi r4, r4, 6
334 ; P9BE-NEXT:    mulli r4, r4, 95
335 ; P9BE-NEXT:    subf r3, r4, r3
336 ; P9BE-NEXT:    sldi r3, r3, 48
337 ; P9BE-NEXT:    mtvsrd v4, r3
338 ; P9BE-NEXT:    li r3, 2
339 ; P9BE-NEXT:    vextuhlx r3, r3, v2
340 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
341 ; P9BE-NEXT:    clrldi r4, r3, 32
342 ; P9BE-NEXT:    mulld r4, r4, r5
343 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
344 ; P9BE-NEXT:    subf r6, r4, r3
345 ; P9BE-NEXT:    srwi r6, r6, 1
346 ; P9BE-NEXT:    add r4, r6, r4
347 ; P9BE-NEXT:    srwi r4, r4, 6
348 ; P9BE-NEXT:    mulli r4, r4, 95
349 ; P9BE-NEXT:    subf r3, r4, r3
350 ; P9BE-NEXT:    sldi r3, r3, 48
351 ; P9BE-NEXT:    vmrghh v3, v4, v3
352 ; P9BE-NEXT:    mtvsrd v4, r3
353 ; P9BE-NEXT:    li r3, 0
354 ; P9BE-NEXT:    vextuhlx r3, r3, v2
355 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
356 ; P9BE-NEXT:    clrldi r4, r3, 32
357 ; P9BE-NEXT:    mulld r4, r4, r5
358 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
359 ; P9BE-NEXT:    subf r5, r4, r3
360 ; P9BE-NEXT:    srwi r5, r5, 1
361 ; P9BE-NEXT:    add r4, r5, r4
362 ; P9BE-NEXT:    srwi r4, r4, 6
363 ; P9BE-NEXT:    mulli r4, r4, 95
364 ; P9BE-NEXT:    subf r3, r4, r3
365 ; P9BE-NEXT:    sldi r3, r3, 48
366 ; P9BE-NEXT:    mtvsrd v2, r3
367 ; P9BE-NEXT:    vmrghh v2, v2, v4
368 ; P9BE-NEXT:    vmrghw v2, v2, v3
369 ; P9BE-NEXT:    blr
371 ; P8LE-LABEL: fold_urem_vec_2:
372 ; P8LE:       # %bb.0:
373 ; P8LE-NEXT:    xxswapd vs0, v2
374 ; P8LE-NEXT:    lis r4, 22765
375 ; P8LE-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
376 ; P8LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
377 ; P8LE-NEXT:    ori r4, r4, 8969
378 ; P8LE-NEXT:    mfvsrd r5, f0
379 ; P8LE-NEXT:    clrldi r3, r5, 48
380 ; P8LE-NEXT:    rldicl r6, r5, 48, 48
381 ; P8LE-NEXT:    rlwinm r8, r3, 0, 16, 31
382 ; P8LE-NEXT:    rldicl r7, r5, 32, 48
383 ; P8LE-NEXT:    rlwinm r9, r6, 0, 16, 31
384 ; P8LE-NEXT:    rldicl r5, r5, 16, 48
385 ; P8LE-NEXT:    clrldi r11, r8, 32
386 ; P8LE-NEXT:    rlwinm r10, r7, 0, 16, 31
387 ; P8LE-NEXT:    rlwinm r12, r5, 0, 16, 31
388 ; P8LE-NEXT:    mulld r11, r11, r4
389 ; P8LE-NEXT:    clrldi r0, r9, 32
390 ; P8LE-NEXT:    clrldi r30, r10, 32
391 ; P8LE-NEXT:    clrldi r29, r12, 32
392 ; P8LE-NEXT:    mulld r0, r0, r4
393 ; P8LE-NEXT:    mulld r30, r30, r4
394 ; P8LE-NEXT:    mulld r4, r29, r4
395 ; P8LE-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
396 ; P8LE-NEXT:    rldicl r11, r11, 32, 32
397 ; P8LE-NEXT:    subf r8, r11, r8
398 ; P8LE-NEXT:    rldicl r0, r0, 32, 32
399 ; P8LE-NEXT:    srwi r8, r8, 1
400 ; P8LE-NEXT:    rldicl r30, r30, 32, 32
401 ; P8LE-NEXT:    rldicl r4, r4, 32, 32
402 ; P8LE-NEXT:    subf r9, r0, r9
403 ; P8LE-NEXT:    add r8, r8, r11
404 ; P8LE-NEXT:    subf r10, r30, r10
405 ; P8LE-NEXT:    subf r11, r4, r12
406 ; P8LE-NEXT:    srwi r9, r9, 1
407 ; P8LE-NEXT:    srwi r8, r8, 6
408 ; P8LE-NEXT:    srwi r10, r10, 1
409 ; P8LE-NEXT:    srwi r11, r11, 1
410 ; P8LE-NEXT:    add r9, r9, r0
411 ; P8LE-NEXT:    add r10, r10, r30
412 ; P8LE-NEXT:    add r4, r11, r4
413 ; P8LE-NEXT:    srwi r9, r9, 6
414 ; P8LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
415 ; P8LE-NEXT:    mulli r8, r8, 95
416 ; P8LE-NEXT:    srwi r10, r10, 6
417 ; P8LE-NEXT:    srwi r4, r4, 6
418 ; P8LE-NEXT:    mulli r9, r9, 95
419 ; P8LE-NEXT:    mulli r10, r10, 95
420 ; P8LE-NEXT:    mulli r4, r4, 95
421 ; P8LE-NEXT:    subf r3, r8, r3
422 ; P8LE-NEXT:    subf r6, r9, r6
423 ; P8LE-NEXT:    mtvsrd f0, r3
424 ; P8LE-NEXT:    subf r3, r10, r7
425 ; P8LE-NEXT:    subf r4, r4, r5
426 ; P8LE-NEXT:    mtvsrd f1, r6
427 ; P8LE-NEXT:    mtvsrd f2, r3
428 ; P8LE-NEXT:    xxswapd v2, vs0
429 ; P8LE-NEXT:    mtvsrd f3, r4
430 ; P8LE-NEXT:    xxswapd v3, vs1
431 ; P8LE-NEXT:    xxswapd v4, vs2
432 ; P8LE-NEXT:    xxswapd v5, vs3
433 ; P8LE-NEXT:    vmrglh v2, v3, v2
434 ; P8LE-NEXT:    vmrglh v3, v5, v4
435 ; P8LE-NEXT:    vmrglw v2, v3, v2
436 ; P8LE-NEXT:    blr
438 ; P8BE-LABEL: fold_urem_vec_2:
439 ; P8BE:       # %bb.0:
440 ; P8BE-NEXT:    mfvsrd r4, v2
441 ; P8BE-NEXT:    lis r3, 22765
442 ; P8BE-NEXT:    ori r3, r3, 8969
443 ; P8BE-NEXT:    clrldi r5, r4, 48
444 ; P8BE-NEXT:    rldicl r6, r4, 48, 48
445 ; P8BE-NEXT:    rlwinm r5, r5, 0, 16, 31
446 ; P8BE-NEXT:    rldicl r7, r4, 32, 48
447 ; P8BE-NEXT:    rlwinm r6, r6, 0, 16, 31
448 ; P8BE-NEXT:    clrldi r8, r5, 32
449 ; P8BE-NEXT:    rldicl r4, r4, 16, 48
450 ; P8BE-NEXT:    rlwinm r7, r7, 0, 16, 31
451 ; P8BE-NEXT:    clrldi r9, r6, 32
452 ; P8BE-NEXT:    mulld r8, r8, r3
453 ; P8BE-NEXT:    rlwinm r4, r4, 0, 16, 31
454 ; P8BE-NEXT:    clrldi r10, r7, 32
455 ; P8BE-NEXT:    mulld r9, r9, r3
456 ; P8BE-NEXT:    clrldi r11, r4, 32
457 ; P8BE-NEXT:    mulld r10, r10, r3
458 ; P8BE-NEXT:    mulld r3, r11, r3
459 ; P8BE-NEXT:    rldicl r8, r8, 32, 32
460 ; P8BE-NEXT:    rldicl r9, r9, 32, 32
461 ; P8BE-NEXT:    subf r11, r8, r5
462 ; P8BE-NEXT:    rldicl r10, r10, 32, 32
463 ; P8BE-NEXT:    subf r12, r9, r6
464 ; P8BE-NEXT:    srwi r11, r11, 1
465 ; P8BE-NEXT:    rldicl r3, r3, 32, 32
466 ; P8BE-NEXT:    add r8, r11, r8
467 ; P8BE-NEXT:    subf r11, r10, r7
468 ; P8BE-NEXT:    srwi r12, r12, 1
469 ; P8BE-NEXT:    add r9, r12, r9
470 ; P8BE-NEXT:    subf r12, r3, r4
471 ; P8BE-NEXT:    srwi r11, r11, 1
472 ; P8BE-NEXT:    srwi r8, r8, 6
473 ; P8BE-NEXT:    add r10, r11, r10
474 ; P8BE-NEXT:    srwi r11, r12, 1
475 ; P8BE-NEXT:    srwi r9, r9, 6
476 ; P8BE-NEXT:    add r3, r11, r3
477 ; P8BE-NEXT:    srwi r10, r10, 6
478 ; P8BE-NEXT:    srwi r3, r3, 6
479 ; P8BE-NEXT:    mulli r8, r8, 95
480 ; P8BE-NEXT:    mulli r9, r9, 95
481 ; P8BE-NEXT:    mulli r10, r10, 95
482 ; P8BE-NEXT:    mulli r3, r3, 95
483 ; P8BE-NEXT:    subf r5, r8, r5
484 ; P8BE-NEXT:    subf r6, r9, r6
485 ; P8BE-NEXT:    subf r7, r10, r7
486 ; P8BE-NEXT:    subf r3, r3, r4
487 ; P8BE-NEXT:    sldi r5, r5, 48
488 ; P8BE-NEXT:    sldi r6, r6, 48
489 ; P8BE-NEXT:    sldi r4, r7, 48
490 ; P8BE-NEXT:    mtvsrd v2, r5
491 ; P8BE-NEXT:    sldi r3, r3, 48
492 ; P8BE-NEXT:    mtvsrd v3, r6
493 ; P8BE-NEXT:    mtvsrd v4, r4
494 ; P8BE-NEXT:    mtvsrd v5, r3
495 ; P8BE-NEXT:    vmrghh v2, v3, v2
496 ; P8BE-NEXT:    vmrghh v3, v5, v4
497 ; P8BE-NEXT:    vmrghw v2, v3, v2
498 ; P8BE-NEXT:    blr
499   %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
500   ret <4 x i16> %1
504 ; Don't fold if we can combine urem with udiv.
505 define <4 x i16> @combine_urem_udiv(<4 x i16> %x) {
506 ; P9LE-LABEL: combine_urem_udiv:
507 ; P9LE:       # %bb.0:
508 ; P9LE-NEXT:    li r3, 0
509 ; P9LE-NEXT:    vextuhrx r3, r3, v2
510 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
511 ; P9LE-NEXT:    lis r6, 22765
512 ; P9LE-NEXT:    ori r6, r6, 8969
513 ; P9LE-NEXT:    clrldi r5, r4, 32
514 ; P9LE-NEXT:    mulld r5, r5, r6
515 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
516 ; P9LE-NEXT:    subf r4, r5, r4
517 ; P9LE-NEXT:    srwi r4, r4, 1
518 ; P9LE-NEXT:    add r4, r4, r5
519 ; P9LE-NEXT:    srwi r4, r4, 6
520 ; P9LE-NEXT:    mulli r5, r4, 95
521 ; P9LE-NEXT:    subf r3, r5, r3
522 ; P9LE-NEXT:    mtvsrd f0, r3
523 ; P9LE-NEXT:    li r3, 2
524 ; P9LE-NEXT:    vextuhrx r3, r3, v2
525 ; P9LE-NEXT:    rlwinm r5, r3, 0, 16, 31
526 ; P9LE-NEXT:    clrldi r7, r5, 32
527 ; P9LE-NEXT:    mulld r7, r7, r6
528 ; P9LE-NEXT:    rldicl r7, r7, 32, 32
529 ; P9LE-NEXT:    subf r5, r7, r5
530 ; P9LE-NEXT:    srwi r5, r5, 1
531 ; P9LE-NEXT:    add r5, r5, r7
532 ; P9LE-NEXT:    srwi r5, r5, 6
533 ; P9LE-NEXT:    mulli r7, r5, 95
534 ; P9LE-NEXT:    subf r3, r7, r3
535 ; P9LE-NEXT:    xxswapd v3, vs0
536 ; P9LE-NEXT:    mtvsrd f0, r3
537 ; P9LE-NEXT:    li r3, 4
538 ; P9LE-NEXT:    vextuhrx r3, r3, v2
539 ; P9LE-NEXT:    rlwinm r7, r3, 0, 16, 31
540 ; P9LE-NEXT:    clrldi r8, r7, 32
541 ; P9LE-NEXT:    mulld r8, r8, r6
542 ; P9LE-NEXT:    rldicl r8, r8, 32, 32
543 ; P9LE-NEXT:    subf r7, r8, r7
544 ; P9LE-NEXT:    srwi r7, r7, 1
545 ; P9LE-NEXT:    add r7, r7, r8
546 ; P9LE-NEXT:    srwi r7, r7, 6
547 ; P9LE-NEXT:    mulli r8, r7, 95
548 ; P9LE-NEXT:    subf r3, r8, r3
549 ; P9LE-NEXT:    xxswapd v4, vs0
550 ; P9LE-NEXT:    mtvsrd f0, r3
551 ; P9LE-NEXT:    li r3, 6
552 ; P9LE-NEXT:    vextuhrx r3, r3, v2
553 ; P9LE-NEXT:    rlwinm r8, r3, 0, 16, 31
554 ; P9LE-NEXT:    clrldi r9, r8, 32
555 ; P9LE-NEXT:    mulld r6, r9, r6
556 ; P9LE-NEXT:    rldicl r6, r6, 32, 32
557 ; P9LE-NEXT:    subf r8, r6, r8
558 ; P9LE-NEXT:    srwi r8, r8, 1
559 ; P9LE-NEXT:    add r6, r8, r6
560 ; P9LE-NEXT:    srwi r6, r6, 6
561 ; P9LE-NEXT:    mulli r8, r6, 95
562 ; P9LE-NEXT:    subf r3, r8, r3
563 ; P9LE-NEXT:    vmrglh v3, v4, v3
564 ; P9LE-NEXT:    xxswapd v4, vs0
565 ; P9LE-NEXT:    mtvsrd f0, r3
566 ; P9LE-NEXT:    xxswapd v2, vs0
567 ; P9LE-NEXT:    mtvsrd f0, r4
568 ; P9LE-NEXT:    vmrglh v2, v2, v4
569 ; P9LE-NEXT:    vmrglw v2, v2, v3
570 ; P9LE-NEXT:    xxswapd v3, vs0
571 ; P9LE-NEXT:    mtvsrd f0, r5
572 ; P9LE-NEXT:    xxswapd v4, vs0
573 ; P9LE-NEXT:    mtvsrd f0, r7
574 ; P9LE-NEXT:    vmrglh v3, v4, v3
575 ; P9LE-NEXT:    xxswapd v4, vs0
576 ; P9LE-NEXT:    mtvsrd f0, r6
577 ; P9LE-NEXT:    xxswapd v5, vs0
578 ; P9LE-NEXT:    vmrglh v4, v5, v4
579 ; P9LE-NEXT:    vmrglw v3, v4, v3
580 ; P9LE-NEXT:    vadduhm v2, v2, v3
581 ; P9LE-NEXT:    blr
583 ; P9BE-LABEL: combine_urem_udiv:
584 ; P9BE:       # %bb.0:
585 ; P9BE-NEXT:    li r3, 6
586 ; P9BE-NEXT:    vextuhlx r3, r3, v2
587 ; P9BE-NEXT:    rlwinm r4, r3, 0, 16, 31
588 ; P9BE-NEXT:    lis r6, 22765
589 ; P9BE-NEXT:    ori r6, r6, 8969
590 ; P9BE-NEXT:    clrldi r5, r4, 32
591 ; P9BE-NEXT:    mulld r5, r5, r6
592 ; P9BE-NEXT:    rldicl r5, r5, 32, 32
593 ; P9BE-NEXT:    subf r4, r5, r4
594 ; P9BE-NEXT:    srwi r4, r4, 1
595 ; P9BE-NEXT:    add r4, r4, r5
596 ; P9BE-NEXT:    srwi r4, r4, 6
597 ; P9BE-NEXT:    mulli r5, r4, 95
598 ; P9BE-NEXT:    subf r3, r5, r3
599 ; P9BE-NEXT:    sldi r3, r3, 48
600 ; P9BE-NEXT:    mtvsrd v3, r3
601 ; P9BE-NEXT:    li r3, 4
602 ; P9BE-NEXT:    vextuhlx r3, r3, v2
603 ; P9BE-NEXT:    rlwinm r5, r3, 0, 16, 31
604 ; P9BE-NEXT:    clrldi r7, r5, 32
605 ; P9BE-NEXT:    mulld r7, r7, r6
606 ; P9BE-NEXT:    rldicl r7, r7, 32, 32
607 ; P9BE-NEXT:    subf r5, r7, r5
608 ; P9BE-NEXT:    srwi r5, r5, 1
609 ; P9BE-NEXT:    add r5, r5, r7
610 ; P9BE-NEXT:    srwi r5, r5, 6
611 ; P9BE-NEXT:    mulli r7, r5, 95
612 ; P9BE-NEXT:    subf r3, r7, r3
613 ; P9BE-NEXT:    sldi r3, r3, 48
614 ; P9BE-NEXT:    mtvsrd v4, r3
615 ; P9BE-NEXT:    li r3, 2
616 ; P9BE-NEXT:    vextuhlx r3, r3, v2
617 ; P9BE-NEXT:    rlwinm r7, r3, 0, 16, 31
618 ; P9BE-NEXT:    clrldi r8, r7, 32
619 ; P9BE-NEXT:    mulld r8, r8, r6
620 ; P9BE-NEXT:    rldicl r8, r8, 32, 32
621 ; P9BE-NEXT:    subf r7, r8, r7
622 ; P9BE-NEXT:    srwi r7, r7, 1
623 ; P9BE-NEXT:    add r7, r7, r8
624 ; P9BE-NEXT:    srwi r7, r7, 6
625 ; P9BE-NEXT:    mulli r8, r7, 95
626 ; P9BE-NEXT:    subf r3, r8, r3
627 ; P9BE-NEXT:    sldi r3, r3, 48
628 ; P9BE-NEXT:    vmrghh v3, v4, v3
629 ; P9BE-NEXT:    mtvsrd v4, r3
630 ; P9BE-NEXT:    li r3, 0
631 ; P9BE-NEXT:    vextuhlx r3, r3, v2
632 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
633 ; P9BE-NEXT:    clrldi r8, r3, 32
634 ; P9BE-NEXT:    mulld r6, r8, r6
635 ; P9BE-NEXT:    rldicl r6, r6, 32, 32
636 ; P9BE-NEXT:    subf r8, r6, r3
637 ; P9BE-NEXT:    srwi r8, r8, 1
638 ; P9BE-NEXT:    add r6, r8, r6
639 ; P9BE-NEXT:    srwi r6, r6, 6
640 ; P9BE-NEXT:    mulli r8, r6, 95
641 ; P9BE-NEXT:    subf r3, r8, r3
642 ; P9BE-NEXT:    sldi r3, r3, 48
643 ; P9BE-NEXT:    mtvsrd v2, r3
644 ; P9BE-NEXT:    sldi r3, r4, 48
645 ; P9BE-NEXT:    vmrghh v2, v2, v4
646 ; P9BE-NEXT:    vmrghw v2, v2, v3
647 ; P9BE-NEXT:    mtvsrd v3, r3
648 ; P9BE-NEXT:    sldi r3, r5, 48
649 ; P9BE-NEXT:    mtvsrd v4, r3
650 ; P9BE-NEXT:    sldi r3, r7, 48
651 ; P9BE-NEXT:    vmrghh v3, v4, v3
652 ; P9BE-NEXT:    mtvsrd v4, r3
653 ; P9BE-NEXT:    sldi r3, r6, 48
654 ; P9BE-NEXT:    mtvsrd v5, r3
655 ; P9BE-NEXT:    vmrghh v4, v5, v4
656 ; P9BE-NEXT:    vmrghw v3, v4, v3
657 ; P9BE-NEXT:    vadduhm v2, v2, v3
658 ; P9BE-NEXT:    blr
660 ; P8LE-LABEL: combine_urem_udiv:
661 ; P8LE:       # %bb.0:
662 ; P8LE-NEXT:    xxswapd vs0, v2
663 ; P8LE-NEXT:    lis r5, 22765
664 ; P8LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
665 ; P8LE-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
666 ; P8LE-NEXT:    ori r5, r5, 8969
667 ; P8LE-NEXT:    mfvsrd r6, f0
668 ; P8LE-NEXT:    clrldi r3, r6, 48
669 ; P8LE-NEXT:    rldicl r4, r6, 48, 48
670 ; P8LE-NEXT:    rldicl r7, r6, 32, 48
671 ; P8LE-NEXT:    rlwinm r8, r3, 0, 16, 31
672 ; P8LE-NEXT:    rlwinm r9, r4, 0, 16, 31
673 ; P8LE-NEXT:    rldicl r6, r6, 16, 48
674 ; P8LE-NEXT:    rlwinm r10, r7, 0, 16, 31
675 ; P8LE-NEXT:    clrldi r11, r8, 32
676 ; P8LE-NEXT:    rlwinm r12, r6, 0, 16, 31
677 ; P8LE-NEXT:    clrldi r0, r9, 32
678 ; P8LE-NEXT:    clrldi r30, r10, 32
679 ; P8LE-NEXT:    mulld r11, r11, r5
680 ; P8LE-NEXT:    clrldi r29, r12, 32
681 ; P8LE-NEXT:    mulld r0, r0, r5
682 ; P8LE-NEXT:    mulld r30, r30, r5
683 ; P8LE-NEXT:    mulld r5, r29, r5
684 ; P8LE-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
685 ; P8LE-NEXT:    rldicl r11, r11, 32, 32
686 ; P8LE-NEXT:    rldicl r0, r0, 32, 32
687 ; P8LE-NEXT:    rldicl r30, r30, 32, 32
688 ; P8LE-NEXT:    subf r8, r11, r8
689 ; P8LE-NEXT:    rldicl r5, r5, 32, 32
690 ; P8LE-NEXT:    subf r9, r0, r9
691 ; P8LE-NEXT:    srwi r8, r8, 1
692 ; P8LE-NEXT:    subf r10, r30, r10
693 ; P8LE-NEXT:    add r8, r8, r11
694 ; P8LE-NEXT:    srwi r9, r9, 1
695 ; P8LE-NEXT:    srwi r10, r10, 1
696 ; P8LE-NEXT:    subf r11, r5, r12
697 ; P8LE-NEXT:    add r9, r9, r0
698 ; P8LE-NEXT:    srwi r8, r8, 6
699 ; P8LE-NEXT:    add r10, r10, r30
700 ; P8LE-NEXT:    srwi r11, r11, 1
701 ; P8LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
702 ; P8LE-NEXT:    srwi r9, r9, 6
703 ; P8LE-NEXT:    mulli r12, r8, 95
704 ; P8LE-NEXT:    srwi r10, r10, 6
705 ; P8LE-NEXT:    add r5, r11, r5
706 ; P8LE-NEXT:    mtvsrd f0, r8
707 ; P8LE-NEXT:    mulli r8, r9, 95
708 ; P8LE-NEXT:    mtvsrd f1, r9
709 ; P8LE-NEXT:    mulli r9, r10, 95
710 ; P8LE-NEXT:    srwi r5, r5, 6
711 ; P8LE-NEXT:    mtvsrd f3, r5
712 ; P8LE-NEXT:    mulli r5, r5, 95
713 ; P8LE-NEXT:    xxswapd v2, vs0
714 ; P8LE-NEXT:    xxswapd v3, vs1
715 ; P8LE-NEXT:    mtvsrd f2, r10
716 ; P8LE-NEXT:    subf r3, r12, r3
717 ; P8LE-NEXT:    xxswapd v6, vs3
718 ; P8LE-NEXT:    mtvsrd f0, r3
719 ; P8LE-NEXT:    subf r3, r9, r7
720 ; P8LE-NEXT:    subf r4, r8, r4
721 ; P8LE-NEXT:    xxswapd v1, vs2
722 ; P8LE-NEXT:    mtvsrd f4, r3
723 ; P8LE-NEXT:    subf r3, r5, r6
724 ; P8LE-NEXT:    mtvsrd f1, r4
725 ; P8LE-NEXT:    mtvsrd f5, r3
726 ; P8LE-NEXT:    xxswapd v5, vs4
727 ; P8LE-NEXT:    vmrglh v2, v3, v2
728 ; P8LE-NEXT:    xxswapd v3, vs0
729 ; P8LE-NEXT:    xxswapd v4, vs1
730 ; P8LE-NEXT:    xxswapd v0, vs5
731 ; P8LE-NEXT:    vmrglh v3, v4, v3
732 ; P8LE-NEXT:    vmrglh v4, v0, v5
733 ; P8LE-NEXT:    vmrglh v5, v6, v1
734 ; P8LE-NEXT:    vmrglw v3, v4, v3
735 ; P8LE-NEXT:    vmrglw v2, v5, v2
736 ; P8LE-NEXT:    vadduhm v2, v3, v2
737 ; P8LE-NEXT:    blr
739 ; P8BE-LABEL: combine_urem_udiv:
740 ; P8BE:       # %bb.0:
741 ; P8BE-NEXT:    mfvsrd r6, v2
742 ; P8BE-NEXT:    lis r5, 22765
743 ; P8BE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
744 ; P8BE-NEXT:    ori r5, r5, 8969
745 ; P8BE-NEXT:    clrldi r3, r6, 48
746 ; P8BE-NEXT:    rldicl r4, r6, 48, 48
747 ; P8BE-NEXT:    rlwinm r8, r3, 0, 16, 31
748 ; P8BE-NEXT:    rldicl r7, r6, 32, 48
749 ; P8BE-NEXT:    rlwinm r9, r4, 0, 16, 31
750 ; P8BE-NEXT:    rldicl r6, r6, 16, 48
751 ; P8BE-NEXT:    clrldi r11, r8, 32
752 ; P8BE-NEXT:    rlwinm r10, r7, 0, 16, 31
753 ; P8BE-NEXT:    rlwinm r6, r6, 0, 16, 31
754 ; P8BE-NEXT:    clrldi r12, r9, 32
755 ; P8BE-NEXT:    mulld r11, r11, r5
756 ; P8BE-NEXT:    clrldi r0, r10, 32
757 ; P8BE-NEXT:    clrldi r30, r6, 32
758 ; P8BE-NEXT:    mulld r12, r12, r5
759 ; P8BE-NEXT:    mulld r0, r0, r5
760 ; P8BE-NEXT:    mulld r5, r30, r5
761 ; P8BE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
762 ; P8BE-NEXT:    rldicl r11, r11, 32, 32
763 ; P8BE-NEXT:    rldicl r12, r12, 32, 32
764 ; P8BE-NEXT:    subf r8, r11, r8
765 ; P8BE-NEXT:    rldicl r5, r5, 32, 32
766 ; P8BE-NEXT:    subf r9, r12, r9
767 ; P8BE-NEXT:    srwi r8, r8, 1
768 ; P8BE-NEXT:    rldicl r0, r0, 32, 32
769 ; P8BE-NEXT:    add r8, r8, r11
770 ; P8BE-NEXT:    srwi r9, r9, 1
771 ; P8BE-NEXT:    subf r11, r5, r6
772 ; P8BE-NEXT:    subf r10, r0, r10
773 ; P8BE-NEXT:    add r9, r9, r12
774 ; P8BE-NEXT:    srwi r8, r8, 6
775 ; P8BE-NEXT:    srwi r11, r11, 1
776 ; P8BE-NEXT:    srwi r10, r10, 1
777 ; P8BE-NEXT:    srwi r9, r9, 6
778 ; P8BE-NEXT:    add r5, r11, r5
779 ; P8BE-NEXT:    mulli r12, r8, 95
780 ; P8BE-NEXT:    add r10, r10, r0
781 ; P8BE-NEXT:    srwi r5, r5, 6
782 ; P8BE-NEXT:    mulli r11, r9, 95
783 ; P8BE-NEXT:    sldi r9, r9, 48
784 ; P8BE-NEXT:    srwi r10, r10, 6
785 ; P8BE-NEXT:    sldi r8, r8, 48
786 ; P8BE-NEXT:    mtvsrd v3, r9
787 ; P8BE-NEXT:    mulli r9, r5, 95
788 ; P8BE-NEXT:    mtvsrd v2, r8
789 ; P8BE-NEXT:    mulli r8, r10, 95
790 ; P8BE-NEXT:    sldi r10, r10, 48
791 ; P8BE-NEXT:    subf r3, r12, r3
792 ; P8BE-NEXT:    mtvsrd v4, r10
793 ; P8BE-NEXT:    subf r4, r11, r4
794 ; P8BE-NEXT:    sldi r3, r3, 48
795 ; P8BE-NEXT:    vmrghh v2, v3, v2
796 ; P8BE-NEXT:    sldi r4, r4, 48
797 ; P8BE-NEXT:    mtvsrd v3, r3
798 ; P8BE-NEXT:    subf r3, r9, r6
799 ; P8BE-NEXT:    subf r7, r8, r7
800 ; P8BE-NEXT:    mtvsrd v5, r4
801 ; P8BE-NEXT:    sldi r3, r3, 48
802 ; P8BE-NEXT:    sldi r6, r7, 48
803 ; P8BE-NEXT:    mtvsrd v1, r3
804 ; P8BE-NEXT:    sldi r3, r5, 48
805 ; P8BE-NEXT:    mtvsrd v0, r6
806 ; P8BE-NEXT:    vmrghh v3, v5, v3
807 ; P8BE-NEXT:    mtvsrd v5, r3
808 ; P8BE-NEXT:    vmrghh v0, v1, v0
809 ; P8BE-NEXT:    vmrghh v4, v5, v4
810 ; P8BE-NEXT:    vmrghw v3, v0, v3
811 ; P8BE-NEXT:    vmrghw v2, v4, v2
812 ; P8BE-NEXT:    vadduhm v2, v3, v2
813 ; P8BE-NEXT:    blr
814   %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
815   %2 = udiv <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
816   %3 = add <4 x i16> %1, %2
817   ret <4 x i16> %3
820 ; Don't fold for divisors that are a power of two.
821 define <4 x i16> @dont_fold_urem_power_of_two(<4 x i16> %x) {
822 ; P9LE-LABEL: dont_fold_urem_power_of_two:
823 ; P9LE:       # %bb.0:
824 ; P9LE-NEXT:    li r3, 0
825 ; P9LE-NEXT:    vextuhrx r3, r3, v2
826 ; P9LE-NEXT:    rlwinm r3, r3, 0, 26, 31
827 ; P9LE-NEXT:    mtvsrd f0, r3
828 ; P9LE-NEXT:    li r3, 2
829 ; P9LE-NEXT:    vextuhrx r3, r3, v2
830 ; P9LE-NEXT:    rlwinm r3, r3, 0, 27, 31
831 ; P9LE-NEXT:    xxswapd v3, vs0
832 ; P9LE-NEXT:    mtvsrd f0, r3
833 ; P9LE-NEXT:    li r3, 6
834 ; P9LE-NEXT:    vextuhrx r3, r3, v2
835 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
836 ; P9LE-NEXT:    lis r6, 22765
837 ; P9LE-NEXT:    ori r6, r6, 8969
838 ; P9LE-NEXT:    xxswapd v4, vs0
839 ; P9LE-NEXT:    vmrglh v3, v4, v3
840 ; P9LE-NEXT:    clrldi r5, r4, 32
841 ; P9LE-NEXT:    mulld r5, r5, r6
842 ; P9LE-NEXT:    rldicl r5, r5, 32, 32
843 ; P9LE-NEXT:    subf r4, r5, r4
844 ; P9LE-NEXT:    srwi r4, r4, 1
845 ; P9LE-NEXT:    add r4, r4, r5
846 ; P9LE-NEXT:    srwi r4, r4, 6
847 ; P9LE-NEXT:    mulli r4, r4, 95
848 ; P9LE-NEXT:    subf r3, r4, r3
849 ; P9LE-NEXT:    mtvsrd f0, r3
850 ; P9LE-NEXT:    li r3, 4
851 ; P9LE-NEXT:    vextuhrx r3, r3, v2
852 ; P9LE-NEXT:    rlwinm r3, r3, 0, 29, 31
853 ; P9LE-NEXT:    xxswapd v4, vs0
854 ; P9LE-NEXT:    mtvsrd f0, r3
855 ; P9LE-NEXT:    xxswapd v2, vs0
856 ; P9LE-NEXT:    vmrglh v2, v4, v2
857 ; P9LE-NEXT:    vmrglw v2, v2, v3
858 ; P9LE-NEXT:    blr
860 ; P9BE-LABEL: dont_fold_urem_power_of_two:
861 ; P9BE:       # %bb.0:
862 ; P9BE-NEXT:    li r3, 2
863 ; P9BE-NEXT:    vextuhlx r3, r3, v2
864 ; P9BE-NEXT:    rlwinm r3, r3, 0, 27, 31
865 ; P9BE-NEXT:    sldi r3, r3, 48
866 ; P9BE-NEXT:    mtvsrd v3, r3
867 ; P9BE-NEXT:    li r3, 0
868 ; P9BE-NEXT:    vextuhlx r3, r3, v2
869 ; P9BE-NEXT:    rlwinm r3, r3, 0, 26, 31
870 ; P9BE-NEXT:    sldi r3, r3, 48
871 ; P9BE-NEXT:    mtvsrd v4, r3
872 ; P9BE-NEXT:    li r3, 6
873 ; P9BE-NEXT:    vextuhlx r3, r3, v2
874 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
875 ; P9BE-NEXT:    lis r5, 22765
876 ; P9BE-NEXT:    ori r5, r5, 8969
877 ; P9BE-NEXT:    vmrghh v3, v4, v3
878 ; P9BE-NEXT:    clrldi r4, r3, 32
879 ; P9BE-NEXT:    mulld r4, r4, r5
880 ; P9BE-NEXT:    rldicl r4, r4, 32, 32
881 ; P9BE-NEXT:    subf r5, r4, r3
882 ; P9BE-NEXT:    srwi r5, r5, 1
883 ; P9BE-NEXT:    add r4, r5, r4
884 ; P9BE-NEXT:    srwi r4, r4, 6
885 ; P9BE-NEXT:    mulli r4, r4, 95
886 ; P9BE-NEXT:    subf r3, r4, r3
887 ; P9BE-NEXT:    sldi r3, r3, 48
888 ; P9BE-NEXT:    mtvsrd v4, r3
889 ; P9BE-NEXT:    li r3, 4
890 ; P9BE-NEXT:    vextuhlx r3, r3, v2
891 ; P9BE-NEXT:    rlwinm r3, r3, 0, 29, 31
892 ; P9BE-NEXT:    sldi r3, r3, 48
893 ; P9BE-NEXT:    mtvsrd v2, r3
894 ; P9BE-NEXT:    vmrghh v2, v2, v4
895 ; P9BE-NEXT:    vmrghw v2, v3, v2
896 ; P9BE-NEXT:    blr
898 ; P8LE-LABEL: dont_fold_urem_power_of_two:
899 ; P8LE:       # %bb.0:
900 ; P8LE-NEXT:    xxswapd vs0, v2
901 ; P8LE-NEXT:    lis r3, 22765
902 ; P8LE-NEXT:    ori r3, r3, 8969
903 ; P8LE-NEXT:    mfvsrd r4, f0
904 ; P8LE-NEXT:    rldicl r5, r4, 16, 48
905 ; P8LE-NEXT:    rlwinm r6, r5, 0, 16, 31
906 ; P8LE-NEXT:    clrldi r7, r6, 32
907 ; P8LE-NEXT:    mulld r3, r7, r3
908 ; P8LE-NEXT:    rldicl r7, r4, 48, 48
909 ; P8LE-NEXT:    rlwinm r7, r7, 0, 27, 31
910 ; P8LE-NEXT:    mtvsrd f1, r7
911 ; P8LE-NEXT:    rldicl r3, r3, 32, 32
912 ; P8LE-NEXT:    xxswapd v3, vs1
913 ; P8LE-NEXT:    subf r6, r3, r6
914 ; P8LE-NEXT:    srwi r6, r6, 1
915 ; P8LE-NEXT:    add r3, r6, r3
916 ; P8LE-NEXT:    clrldi r6, r4, 48
917 ; P8LE-NEXT:    srwi r3, r3, 6
918 ; P8LE-NEXT:    rldicl r4, r4, 32, 48
919 ; P8LE-NEXT:    rlwinm r6, r6, 0, 26, 31
920 ; P8LE-NEXT:    mulli r3, r3, 95
921 ; P8LE-NEXT:    rlwinm r4, r4, 0, 29, 31
922 ; P8LE-NEXT:    mtvsrd f0, r6
923 ; P8LE-NEXT:    mtvsrd f3, r4
924 ; P8LE-NEXT:    xxswapd v2, vs0
925 ; P8LE-NEXT:    xxswapd v5, vs3
926 ; P8LE-NEXT:    subf r3, r3, r5
927 ; P8LE-NEXT:    mtvsrd f2, r3
928 ; P8LE-NEXT:    vmrglh v2, v3, v2
929 ; P8LE-NEXT:    xxswapd v4, vs2
930 ; P8LE-NEXT:    vmrglh v3, v4, v5
931 ; P8LE-NEXT:    vmrglw v2, v3, v2
932 ; P8LE-NEXT:    blr
934 ; P8BE-LABEL: dont_fold_urem_power_of_two:
935 ; P8BE:       # %bb.0:
936 ; P8BE-NEXT:    mfvsrd r4, v2
937 ; P8BE-NEXT:    lis r3, 22765
938 ; P8BE-NEXT:    ori r3, r3, 8969
939 ; P8BE-NEXT:    clrldi r5, r4, 48
940 ; P8BE-NEXT:    rldicl r7, r4, 16, 48
941 ; P8BE-NEXT:    rlwinm r5, r5, 0, 16, 31
942 ; P8BE-NEXT:    rlwinm r7, r7, 0, 26, 31
943 ; P8BE-NEXT:    clrldi r6, r5, 32
944 ; P8BE-NEXT:    mulld r3, r6, r3
945 ; P8BE-NEXT:    rldicl r3, r3, 32, 32
946 ; P8BE-NEXT:    subf r6, r3, r5
947 ; P8BE-NEXT:    srwi r6, r6, 1
948 ; P8BE-NEXT:    add r3, r6, r3
949 ; P8BE-NEXT:    rldicl r6, r4, 32, 48
950 ; P8BE-NEXT:    srwi r3, r3, 6
951 ; P8BE-NEXT:    rldicl r4, r4, 48, 48
952 ; P8BE-NEXT:    rlwinm r6, r6, 0, 27, 31
953 ; P8BE-NEXT:    mulli r3, r3, 95
954 ; P8BE-NEXT:    sldi r6, r6, 48
955 ; P8BE-NEXT:    rlwinm r4, r4, 0, 29, 31
956 ; P8BE-NEXT:    mtvsrd v2, r6
957 ; P8BE-NEXT:    sldi r6, r7, 48
958 ; P8BE-NEXT:    sldi r4, r4, 48
959 ; P8BE-NEXT:    mtvsrd v3, r6
960 ; P8BE-NEXT:    mtvsrd v5, r4
961 ; P8BE-NEXT:    subf r3, r3, r5
962 ; P8BE-NEXT:    vmrghh v2, v3, v2
963 ; P8BE-NEXT:    sldi r3, r3, 48
964 ; P8BE-NEXT:    mtvsrd v4, r3
965 ; P8BE-NEXT:    vmrghh v3, v5, v4
966 ; P8BE-NEXT:    vmrghw v2, v2, v3
967 ; P8BE-NEXT:    blr
968   %1 = urem <4 x i16> %x, <i16 64, i16 32, i16 8, i16 95>
969   ret <4 x i16> %1
972 ; Don't fold if the divisor is one.
973 define <4 x i16> @dont_fold_urem_one(<4 x i16> %x) {
974 ; P9LE-LABEL: dont_fold_urem_one:
975 ; P9LE:       # %bb.0:
976 ; P9LE-NEXT:    li r3, 4
977 ; P9LE-NEXT:    li r5, 0
978 ; P9LE-NEXT:    vextuhrx r3, r3, v2
979 ; P9LE-NEXT:    oris r6, r5, 45590
980 ; P9LE-NEXT:    oris r5, r5, 51306
981 ; P9LE-NEXT:    ori r6, r6, 17097
982 ; P9LE-NEXT:    ori r5, r5, 30865
983 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
984 ; P9LE-NEXT:    mulld r4, r4, r6
985 ; P9LE-NEXT:    lis r6, 24749
986 ; P9LE-NEXT:    ori r6, r6, 47143
987 ; P9LE-NEXT:    rldicl r4, r4, 28, 36
988 ; P9LE-NEXT:    mulli r4, r4, 23
989 ; P9LE-NEXT:    subf r3, r4, r3
990 ; P9LE-NEXT:    mtvsrd f0, r3
991 ; P9LE-NEXT:    li r3, 6
992 ; P9LE-NEXT:    vextuhrx r3, r3, v2
993 ; P9LE-NEXT:    rlwinm r4, r3, 0, 16, 31
994 ; P9LE-NEXT:    mulld r4, r4, r6
995 ; P9LE-NEXT:    rldicl r4, r4, 21, 43
996 ; P9LE-NEXT:    mulli r4, r4, 5423
997 ; P9LE-NEXT:    subf r3, r4, r3
998 ; P9LE-NEXT:    xxswapd v3, vs0
999 ; P9LE-NEXT:    mtvsrd f0, r3
1000 ; P9LE-NEXT:    li r3, 2
1001 ; P9LE-NEXT:    vextuhrx r3, r3, v2
1002 ; P9LE-NEXT:    rlwinm r4, r3, 31, 17, 31
1003 ; P9LE-NEXT:    mulld r4, r4, r5
1004 ; P9LE-NEXT:    rldicl r4, r4, 24, 40
1005 ; P9LE-NEXT:    mulli r4, r4, 654
1006 ; P9LE-NEXT:    subf r3, r4, r3
1007 ; P9LE-NEXT:    xxswapd v4, vs0
1008 ; P9LE-NEXT:    mtvsrd f0, r3
1009 ; P9LE-NEXT:    xxswapd v2, vs0
1010 ; P9LE-NEXT:    vmrglh v3, v4, v3
1011 ; P9LE-NEXT:    xxlxor v4, v4, v4
1012 ; P9LE-NEXT:    vmrglh v2, v2, v4
1013 ; P9LE-NEXT:    vmrglw v2, v3, v2
1014 ; P9LE-NEXT:    blr
1016 ; P9BE-LABEL: dont_fold_urem_one:
1017 ; P9BE:       # %bb.0:
1018 ; P9BE-NEXT:    li r3, 6
1019 ; P9BE-NEXT:    vextuhlx r3, r3, v2
1020 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
1021 ; P9BE-NEXT:    lis r5, 24749
1022 ; P9BE-NEXT:    ori r5, r5, 47143
1023 ; P9BE-NEXT:    clrldi r4, r3, 32
1024 ; P9BE-NEXT:    mulld r4, r4, r5
1025 ; P9BE-NEXT:    li r5, 0
1026 ; P9BE-NEXT:    oris r6, r5, 45590
1027 ; P9BE-NEXT:    oris r5, r5, 51306
1028 ; P9BE-NEXT:    ori r6, r6, 17097
1029 ; P9BE-NEXT:    ori r5, r5, 30865
1030 ; P9BE-NEXT:    rldicl r4, r4, 21, 43
1031 ; P9BE-NEXT:    mulli r4, r4, 5423
1032 ; P9BE-NEXT:    subf r3, r4, r3
1033 ; P9BE-NEXT:    sldi r3, r3, 48
1034 ; P9BE-NEXT:    mtvsrd v3, r3
1035 ; P9BE-NEXT:    li r3, 4
1036 ; P9BE-NEXT:    vextuhlx r3, r3, v2
1037 ; P9BE-NEXT:    rlwinm r3, r3, 0, 16, 31
1038 ; P9BE-NEXT:    clrldi r4, r3, 32
1039 ; P9BE-NEXT:    mulld r4, r4, r6
1040 ; P9BE-NEXT:    rldicl r4, r4, 28, 36
1041 ; P9BE-NEXT:    mulli r4, r4, 23
1042 ; P9BE-NEXT:    subf r3, r4, r3
1043 ; P9BE-NEXT:    sldi r3, r3, 48
1044 ; P9BE-NEXT:    mtvsrd v4, r3
1045 ; P9BE-NEXT:    li r3, 2
1046 ; P9BE-NEXT:    vextuhlx r3, r3, v2
1047 ; P9BE-NEXT:    clrlwi r4, r3, 16
1048 ; P9BE-NEXT:    rlwinm r3, r3, 31, 17, 31
1049 ; P9BE-NEXT:    mulld r3, r3, r5
1050 ; P9BE-NEXT:    rldicl r3, r3, 24, 40
1051 ; P9BE-NEXT:    mulli r3, r3, 654
1052 ; P9BE-NEXT:    subf r3, r3, r4
1053 ; P9BE-NEXT:    sldi r3, r3, 48
1054 ; P9BE-NEXT:    mtvsrd v2, r3
1055 ; P9BE-NEXT:    li r3, 0
1056 ; P9BE-NEXT:    sldi r3, r3, 48
1057 ; P9BE-NEXT:    vmrghh v3, v4, v3
1058 ; P9BE-NEXT:    mtvsrd v4, r3
1059 ; P9BE-NEXT:    vmrghh v2, v4, v2
1060 ; P9BE-NEXT:    vmrghw v2, v2, v3
1061 ; P9BE-NEXT:    blr
1063 ; P8LE-LABEL: dont_fold_urem_one:
1064 ; P8LE:       # %bb.0:
1065 ; P8LE-NEXT:    xxswapd vs0, v2
1066 ; P8LE-NEXT:    li r3, 0
1067 ; P8LE-NEXT:    lis r8, 24749
1068 ; P8LE-NEXT:    xxlxor v5, v5, v5
1069 ; P8LE-NEXT:    oris r5, r3, 45590
1070 ; P8LE-NEXT:    ori r8, r8, 47143
1071 ; P8LE-NEXT:    oris r3, r3, 51306
1072 ; P8LE-NEXT:    ori r5, r5, 17097
1073 ; P8LE-NEXT:    ori r3, r3, 30865
1074 ; P8LE-NEXT:    mfvsrd r4, f0
1075 ; P8LE-NEXT:    rldicl r6, r4, 32, 48
1076 ; P8LE-NEXT:    rldicl r7, r4, 16, 48
1077 ; P8LE-NEXT:    rlwinm r9, r6, 0, 16, 31
1078 ; P8LE-NEXT:    rldicl r4, r4, 48, 48
1079 ; P8LE-NEXT:    mulld r5, r9, r5
1080 ; P8LE-NEXT:    rlwinm r9, r7, 0, 16, 31
1081 ; P8LE-NEXT:    mulld r8, r9, r8
1082 ; P8LE-NEXT:    rlwinm r9, r4, 31, 17, 31
1083 ; P8LE-NEXT:    mulld r3, r9, r3
1084 ; P8LE-NEXT:    rldicl r5, r5, 28, 36
1085 ; P8LE-NEXT:    rldicl r8, r8, 21, 43
1086 ; P8LE-NEXT:    mulli r5, r5, 23
1087 ; P8LE-NEXT:    rldicl r3, r3, 24, 40
1088 ; P8LE-NEXT:    mulli r8, r8, 5423
1089 ; P8LE-NEXT:    mulli r3, r3, 654
1090 ; P8LE-NEXT:    subf r5, r5, r6
1091 ; P8LE-NEXT:    subf r6, r8, r7
1092 ; P8LE-NEXT:    mtvsrd f0, r5
1093 ; P8LE-NEXT:    subf r3, r3, r4
1094 ; P8LE-NEXT:    mtvsrd f1, r6
1095 ; P8LE-NEXT:    mtvsrd f2, r3
1096 ; P8LE-NEXT:    xxswapd v2, vs0
1097 ; P8LE-NEXT:    xxswapd v3, vs1
1098 ; P8LE-NEXT:    xxswapd v4, vs2
1099 ; P8LE-NEXT:    vmrglh v2, v3, v2
1100 ; P8LE-NEXT:    vmrglh v3, v4, v5
1101 ; P8LE-NEXT:    vmrglw v2, v2, v3
1102 ; P8LE-NEXT:    blr
1104 ; P8BE-LABEL: dont_fold_urem_one:
1105 ; P8BE:       # %bb.0:
1106 ; P8BE-NEXT:    mfvsrd r4, v2
1107 ; P8BE-NEXT:    li r3, 0
1108 ; P8BE-NEXT:    lis r8, 24749
1109 ; P8BE-NEXT:    oris r6, r3, 51306
1110 ; P8BE-NEXT:    ori r8, r8, 47143
1111 ; P8BE-NEXT:    oris r3, r3, 45590
1112 ; P8BE-NEXT:    rldicl r5, r4, 32, 48
1113 ; P8BE-NEXT:    clrldi r7, r4, 48
1114 ; P8BE-NEXT:    ori r6, r6, 30865
1115 ; P8BE-NEXT:    ori r3, r3, 17097
1116 ; P8BE-NEXT:    rldicl r4, r4, 48, 48
1117 ; P8BE-NEXT:    rlwinm r9, r5, 31, 17, 31
1118 ; P8BE-NEXT:    rlwinm r7, r7, 0, 16, 31
1119 ; P8BE-NEXT:    rlwinm r5, r5, 0, 16, 31
1120 ; P8BE-NEXT:    rlwinm r4, r4, 0, 16, 31
1121 ; P8BE-NEXT:    mulld r6, r9, r6
1122 ; P8BE-NEXT:    clrldi r9, r7, 32
1123 ; P8BE-NEXT:    mulld r8, r9, r8
1124 ; P8BE-NEXT:    clrldi r9, r4, 32
1125 ; P8BE-NEXT:    mulld r3, r9, r3
1126 ; P8BE-NEXT:    li r9, 0
1127 ; P8BE-NEXT:    rldicl r6, r6, 24, 40
1128 ; P8BE-NEXT:    mulli r6, r6, 654
1129 ; P8BE-NEXT:    rldicl r8, r8, 21, 43
1130 ; P8BE-NEXT:    rldicl r3, r3, 28, 36
1131 ; P8BE-NEXT:    mulli r8, r8, 5423
1132 ; P8BE-NEXT:    mulli r3, r3, 23
1133 ; P8BE-NEXT:    subf r5, r6, r5
1134 ; P8BE-NEXT:    sldi r6, r9, 48
1135 ; P8BE-NEXT:    mtvsrd v2, r6
1136 ; P8BE-NEXT:    sldi r5, r5, 48
1137 ; P8BE-NEXT:    subf r6, r8, r7
1138 ; P8BE-NEXT:    mtvsrd v3, r5
1139 ; P8BE-NEXT:    subf r3, r3, r4
1140 ; P8BE-NEXT:    sldi r4, r6, 48
1141 ; P8BE-NEXT:    sldi r3, r3, 48
1142 ; P8BE-NEXT:    mtvsrd v4, r4
1143 ; P8BE-NEXT:    mtvsrd v5, r3
1144 ; P8BE-NEXT:    vmrghh v2, v2, v3
1145 ; P8BE-NEXT:    vmrghh v3, v5, v4
1146 ; P8BE-NEXT:    vmrghw v2, v2, v3
1147 ; P8BE-NEXT:    blr
1148   %1 = urem <4 x i16> %x, <i16 1, i16 654, i16 23, i16 5423>
1149   ret <4 x i16> %1
1152 ; Don't fold if the divisor is 2^16.
1153 define <4 x i16> @dont_fold_urem_i16_smax(<4 x i16> %x) {
1154 ; CHECK-LABEL: dont_fold_urem_i16_smax:
1155 ; CHECK:       # %bb.0:
1156 ; CHECK-NEXT:    blr
1157   %1 = urem <4 x i16> %x, <i16 1, i16 65536, i16 23, i16 5423>
1158   ret <4 x i16> %1
1161 ; Don't fold i64 urem.
1162 define <4 x i64> @dont_fold_urem_i64(<4 x i64> %x) {
1163 ; P9LE-LABEL: dont_fold_urem_i64:
1164 ; P9LE:       # %bb.0:
1165 ; P9LE-NEXT:    lis r4, 25644
1166 ; P9LE-NEXT:    ori r4, r4, 34192
1167 ; P9LE-NEXT:    sldi r4, r4, 32
1168 ; P9LE-NEXT:    oris r4, r4, 45590
1169 ; P9LE-NEXT:    mfvsrld r3, v3
1170 ; P9LE-NEXT:    ori r4, r4, 17097
1171 ; P9LE-NEXT:    mulhdu r4, r3, r4
1172 ; P9LE-NEXT:    sub r5, r3, r4
1173 ; P9LE-NEXT:    rldicl r5, r5, 63, 1
1174 ; P9LE-NEXT:    add r4, r5, r4
1175 ; P9LE-NEXT:    lis r5, -16037
1176 ; P9LE-NEXT:    rldicl r4, r4, 60, 4
1177 ; P9LE-NEXT:    ori r5, r5, 28749
1178 ; P9LE-NEXT:    mulli r4, r4, 23
1179 ; P9LE-NEXT:    sldi r5, r5, 32
1180 ; P9LE-NEXT:    oris r5, r5, 52170
1181 ; P9LE-NEXT:    ori r5, r5, 12109
1182 ; P9LE-NEXT:    sub r3, r3, r4
1183 ; P9LE-NEXT:    mfvsrd r4, v3
1184 ; P9LE-NEXT:    mulhdu r5, r4, r5
1185 ; P9LE-NEXT:    rldicl r5, r5, 52, 12
1186 ; P9LE-NEXT:    mulli r5, r5, 5423
1187 ; P9LE-NEXT:    sub r4, r4, r5
1188 ; P9LE-NEXT:    lis r5, 25653
1189 ; P9LE-NEXT:    ori r5, r5, 15432
1190 ; P9LE-NEXT:    sldi r5, r5, 32
1191 ; P9LE-NEXT:    mtvsrdd v3, r4, r3
1192 ; P9LE-NEXT:    mfvsrd r3, v2
1193 ; P9LE-NEXT:    rldicl r4, r3, 63, 1
1194 ; P9LE-NEXT:    oris r5, r5, 1603
1195 ; P9LE-NEXT:    ori r5, r5, 21445
1196 ; P9LE-NEXT:    mulhdu r4, r4, r5
1197 ; P9LE-NEXT:    rldicl r4, r4, 57, 7
1198 ; P9LE-NEXT:    mulli r4, r4, 654
1199 ; P9LE-NEXT:    sub r3, r3, r4
1200 ; P9LE-NEXT:    li r4, 0
1201 ; P9LE-NEXT:    mtvsrdd v2, r3, r4
1202 ; P9LE-NEXT:    blr
1204 ; P9BE-LABEL: dont_fold_urem_i64:
1205 ; P9BE:       # %bb.0:
1206 ; P9BE-NEXT:    lis r4, 25644
1207 ; P9BE-NEXT:    ori r4, r4, 34192
1208 ; P9BE-NEXT:    sldi r4, r4, 32
1209 ; P9BE-NEXT:    oris r4, r4, 45590
1210 ; P9BE-NEXT:    mfvsrd r3, v3
1211 ; P9BE-NEXT:    ori r4, r4, 17097
1212 ; P9BE-NEXT:    mulhdu r4, r3, r4
1213 ; P9BE-NEXT:    sub r5, r3, r4
1214 ; P9BE-NEXT:    rldicl r5, r5, 63, 1
1215 ; P9BE-NEXT:    add r4, r5, r4
1216 ; P9BE-NEXT:    lis r5, -16037
1217 ; P9BE-NEXT:    rldicl r4, r4, 60, 4
1218 ; P9BE-NEXT:    mulli r4, r4, 23
1219 ; P9BE-NEXT:    ori r5, r5, 28749
1220 ; P9BE-NEXT:    sldi r5, r5, 32
1221 ; P9BE-NEXT:    oris r5, r5, 52170
1222 ; P9BE-NEXT:    ori r5, r5, 12109
1223 ; P9BE-NEXT:    sub r3, r3, r4
1224 ; P9BE-NEXT:    mfvsrld r4, v3
1225 ; P9BE-NEXT:    mulhdu r5, r4, r5
1226 ; P9BE-NEXT:    rldicl r5, r5, 52, 12
1227 ; P9BE-NEXT:    mulli r5, r5, 5423
1228 ; P9BE-NEXT:    sub r4, r4, r5
1229 ; P9BE-NEXT:    lis r5, 25653
1230 ; P9BE-NEXT:    ori r5, r5, 15432
1231 ; P9BE-NEXT:    sldi r5, r5, 32
1232 ; P9BE-NEXT:    mtvsrdd v3, r3, r4
1233 ; P9BE-NEXT:    mfvsrld r3, v2
1234 ; P9BE-NEXT:    rldicl r4, r3, 63, 1
1235 ; P9BE-NEXT:    oris r5, r5, 1603
1236 ; P9BE-NEXT:    ori r5, r5, 21445
1237 ; P9BE-NEXT:    mulhdu r4, r4, r5
1238 ; P9BE-NEXT:    rldicl r4, r4, 57, 7
1239 ; P9BE-NEXT:    mulli r4, r4, 654
1240 ; P9BE-NEXT:    sub r3, r3, r4
1241 ; P9BE-NEXT:    mtvsrdd v2, 0, r3
1242 ; P9BE-NEXT:    blr
1244 ; P8LE-LABEL: dont_fold_urem_i64:
1245 ; P8LE:       # %bb.0:
1246 ; P8LE-NEXT:    lis r3, 25644
1247 ; P8LE-NEXT:    xxswapd vs0, v3
1248 ; P8LE-NEXT:    lis r4, -16037
1249 ; P8LE-NEXT:    lis r5, 25653
1250 ; P8LE-NEXT:    mfvsrd r6, v2
1251 ; P8LE-NEXT:    ori r3, r3, 34192
1252 ; P8LE-NEXT:    ori r4, r4, 28749
1253 ; P8LE-NEXT:    ori r5, r5, 15432
1254 ; P8LE-NEXT:    mfvsrd r8, v3
1255 ; P8LE-NEXT:    sldi r3, r3, 32
1256 ; P8LE-NEXT:    sldi r4, r4, 32
1257 ; P8LE-NEXT:    oris r3, r3, 45590
1258 ; P8LE-NEXT:    mfvsrd r7, f0
1259 ; P8LE-NEXT:    sldi r5, r5, 32
1260 ; P8LE-NEXT:    oris r4, r4, 52170
1261 ; P8LE-NEXT:    ori r3, r3, 17097
1262 ; P8LE-NEXT:    oris r5, r5, 1603
1263 ; P8LE-NEXT:    ori r4, r4, 12109
1264 ; P8LE-NEXT:    mulhdu r3, r7, r3
1265 ; P8LE-NEXT:    rldicl r9, r6, 63, 1
1266 ; P8LE-NEXT:    ori r5, r5, 21445
1267 ; P8LE-NEXT:    mulhdu r4, r8, r4
1268 ; P8LE-NEXT:    mulhdu r5, r9, r5
1269 ; P8LE-NEXT:    sub r9, r7, r3
1270 ; P8LE-NEXT:    rldicl r9, r9, 63, 1
1271 ; P8LE-NEXT:    rldicl r4, r4, 52, 12
1272 ; P8LE-NEXT:    add r3, r9, r3
1273 ; P8LE-NEXT:    rldicl r5, r5, 57, 7
1274 ; P8LE-NEXT:    mulli r4, r4, 5423
1275 ; P8LE-NEXT:    rldicl r3, r3, 60, 4
1276 ; P8LE-NEXT:    mulli r5, r5, 654
1277 ; P8LE-NEXT:    mulli r3, r3, 23
1278 ; P8LE-NEXT:    sub r4, r8, r4
1279 ; P8LE-NEXT:    sub r5, r6, r5
1280 ; P8LE-NEXT:    mtvsrd f0, r4
1281 ; P8LE-NEXT:    sub r3, r7, r3
1282 ; P8LE-NEXT:    li r4, 0
1283 ; P8LE-NEXT:    mtvsrd f1, r5
1284 ; P8LE-NEXT:    mtvsrd f2, r3
1285 ; P8LE-NEXT:    mtvsrd f3, r4
1286 ; P8LE-NEXT:    xxmrghd v3, vs0, vs2
1287 ; P8LE-NEXT:    xxmrghd v2, vs1, vs3
1288 ; P8LE-NEXT:    blr
1290 ; P8BE-LABEL: dont_fold_urem_i64:
1291 ; P8BE:       # %bb.0:
1292 ; P8BE-NEXT:    lis r3, 25644
1293 ; P8BE-NEXT:    lis r4, -16037
1294 ; P8BE-NEXT:    xxswapd vs0, v3
1295 ; P8BE-NEXT:    xxswapd vs1, v2
1296 ; P8BE-NEXT:    lis r5, 25653
1297 ; P8BE-NEXT:    ori r3, r3, 34192
1298 ; P8BE-NEXT:    ori r4, r4, 28749
1299 ; P8BE-NEXT:    mfvsrd r6, v3
1300 ; P8BE-NEXT:    ori r5, r5, 15432
1301 ; P8BE-NEXT:    sldi r3, r3, 32
1302 ; P8BE-NEXT:    sldi r4, r4, 32
1303 ; P8BE-NEXT:    oris r3, r3, 45590
1304 ; P8BE-NEXT:    sldi r5, r5, 32
1305 ; P8BE-NEXT:    mfvsrd r7, f0
1306 ; P8BE-NEXT:    oris r4, r4, 52170
1307 ; P8BE-NEXT:    ori r3, r3, 17097
1308 ; P8BE-NEXT:    mfvsrd r8, f1
1309 ; P8BE-NEXT:    oris r5, r5, 1603
1310 ; P8BE-NEXT:    ori r4, r4, 12109
1311 ; P8BE-NEXT:    mulhdu r3, r6, r3
1312 ; P8BE-NEXT:    ori r5, r5, 21445
1313 ; P8BE-NEXT:    mulhdu r4, r7, r4
1314 ; P8BE-NEXT:    rldicl r9, r8, 63, 1
1315 ; P8BE-NEXT:    mulhdu r5, r9, r5
1316 ; P8BE-NEXT:    sub r9, r6, r3
1317 ; P8BE-NEXT:    rldicl r9, r9, 63, 1
1318 ; P8BE-NEXT:    rldicl r4, r4, 52, 12
1319 ; P8BE-NEXT:    add r3, r9, r3
1320 ; P8BE-NEXT:    mulli r4, r4, 5423
1321 ; P8BE-NEXT:    rldicl r5, r5, 57, 7
1322 ; P8BE-NEXT:    rldicl r3, r3, 60, 4
1323 ; P8BE-NEXT:    mulli r5, r5, 654
1324 ; P8BE-NEXT:    mulli r3, r3, 23
1325 ; P8BE-NEXT:    sub r4, r7, r4
1326 ; P8BE-NEXT:    mtvsrd f0, r4
1327 ; P8BE-NEXT:    sub r4, r8, r5
1328 ; P8BE-NEXT:    sub r3, r6, r3
1329 ; P8BE-NEXT:    mtvsrd f1, r4
1330 ; P8BE-NEXT:    li r4, 0
1331 ; P8BE-NEXT:    mtvsrd f2, r3
1332 ; P8BE-NEXT:    mtvsrd f3, r4
1333 ; P8BE-NEXT:    xxmrghd v3, vs2, vs0
1334 ; P8BE-NEXT:    xxmrghd v2, vs3, vs1
1335 ; P8BE-NEXT:    blr
1336   %1 = urem <4 x i64> %x, <i64 1, i64 654, i64 23, i64 5423>
1337   ret <4 x i64> %1