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
10
11define <4 x i16> @fold_srem_vec_1(<4 x i16> %x) {
12; P9LE-LABEL: fold_srem_vec_1:
13; P9LE:       # %bb.0:
14; P9LE-NEXT:    li r3, 0
15; P9LE-NEXT:    vextuhrx r3, r3, v2
16; P9LE-NEXT:    extsh r4, r3
17; P9LE-NEXT:    lis r5, -21386
18; P9LE-NEXT:    ori r5, r5, 37253
19; P9LE-NEXT:    extsw r4, r4
20; P9LE-NEXT:    mulld r5, r4, r5
21; P9LE-NEXT:    rldicl r5, r5, 32, 32
22; P9LE-NEXT:    add r4, r5, r4
23; P9LE-NEXT:    srwi r5, r4, 31
24; P9LE-NEXT:    srawi r4, r4, 6
25; P9LE-NEXT:    add r4, r4, r5
26; P9LE-NEXT:    lis r5, 31710
27; P9LE-NEXT:    mulli r4, r4, 95
28; P9LE-NEXT:    subf r3, r4, r3
29; P9LE-NEXT:    mtfprd f0, r3
30; P9LE-NEXT:    li r3, 2
31; P9LE-NEXT:    vextuhrx r3, r3, v2
32; P9LE-NEXT:    extsh r4, r3
33; P9LE-NEXT:    extsw r4, r4
34; P9LE-NEXT:    ori r5, r5, 63421
35; P9LE-NEXT:    mulld r5, r4, r5
36; P9LE-NEXT:    rldicl r5, r5, 32, 32
37; P9LE-NEXT:    subf r4, r4, r5
38; P9LE-NEXT:    srwi r5, r4, 31
39; P9LE-NEXT:    srawi r4, r4, 6
40; P9LE-NEXT:    add r4, r4, r5
41; P9LE-NEXT:    lis r5, 21399
42; P9LE-NEXT:    mulli r4, r4, -124
43; P9LE-NEXT:    subf r3, r4, r3
44; P9LE-NEXT:    xxswapd v3, vs0
45; P9LE-NEXT:    mtfprd f0, r3
46; P9LE-NEXT:    li r3, 4
47; P9LE-NEXT:    vextuhrx r3, r3, v2
48; P9LE-NEXT:    extsh r4, r3
49; P9LE-NEXT:    extsw r4, r4
50; P9LE-NEXT:    ori r5, r5, 33437
51; P9LE-NEXT:    mulld r4, r4, r5
52; P9LE-NEXT:    rldicl r5, r4, 1, 63
53; P9LE-NEXT:    rldicl r4, r4, 32, 32
54; P9LE-NEXT:    srawi r4, r4, 5
55; P9LE-NEXT:    add r4, r4, r5
56; P9LE-NEXT:    lis r5, -16728
57; P9LE-NEXT:    mulli r4, r4, 98
58; P9LE-NEXT:    subf r3, r4, r3
59; P9LE-NEXT:    xxswapd v4, vs0
60; P9LE-NEXT:    mtfprd f0, r3
61; P9LE-NEXT:    li r3, 6
62; P9LE-NEXT:    vextuhrx r3, r3, v2
63; P9LE-NEXT:    extsh r4, r3
64; P9LE-NEXT:    extsw r4, r4
65; P9LE-NEXT:    ori r5, r5, 63249
66; P9LE-NEXT:    mulld r4, r4, r5
67; P9LE-NEXT:    rldicl r5, r4, 1, 63
68; P9LE-NEXT:    rldicl r4, r4, 32, 32
69; P9LE-NEXT:    srawi r4, r4, 8
70; P9LE-NEXT:    add r4, r4, r5
71; P9LE-NEXT:    mulli r4, r4, -1003
72; P9LE-NEXT:    subf r3, r4, r3
73; P9LE-NEXT:    vmrglh v3, v4, v3
74; P9LE-NEXT:    xxswapd v4, vs0
75; P9LE-NEXT:    mtfprd f0, r3
76; P9LE-NEXT:    xxswapd v2, vs0
77; P9LE-NEXT:    vmrglh v2, v2, v4
78; P9LE-NEXT:    vmrglw v2, v2, v3
79; P9LE-NEXT:    blr
80;
81; P9BE-LABEL: fold_srem_vec_1:
82; P9BE:       # %bb.0:
83; P9BE-NEXT:    li r3, 2
84; P9BE-NEXT:    vextuhlx r3, r3, v2
85; P9BE-NEXT:    extsh r3, r3
86; P9BE-NEXT:    lis r4, 31710
87; P9BE-NEXT:    ori r4, r4, 63421
88; P9BE-NEXT:    extsw r3, r3
89; P9BE-NEXT:    mulld r4, r3, r4
90; P9BE-NEXT:    rldicl r4, r4, 32, 32
91; P9BE-NEXT:    subf r4, r3, r4
92; P9BE-NEXT:    srwi r5, r4, 31
93; P9BE-NEXT:    srawi r4, r4, 6
94; P9BE-NEXT:    add r4, r4, r5
95; P9BE-NEXT:    mulli r4, r4, -124
96; P9BE-NEXT:    subf r3, r4, r3
97; P9BE-NEXT:    lis r4, -21386
98; P9BE-NEXT:    sldi r3, r3, 48
99; P9BE-NEXT:    mtvsrd v3, r3
100; P9BE-NEXT:    li r3, 0
101; P9BE-NEXT:    vextuhlx r3, r3, v2
102; P9BE-NEXT:    extsh r3, r3
103; P9BE-NEXT:    extsw r3, r3
104; P9BE-NEXT:    ori r4, r4, 37253
105; P9BE-NEXT:    mulld r4, r3, r4
106; P9BE-NEXT:    rldicl r4, r4, 32, 32
107; P9BE-NEXT:    add r4, r4, r3
108; P9BE-NEXT:    srwi r5, r4, 31
109; P9BE-NEXT:    srawi r4, r4, 6
110; P9BE-NEXT:    add r4, r4, r5
111; P9BE-NEXT:    mulli r4, r4, 95
112; P9BE-NEXT:    subf r3, r4, r3
113; P9BE-NEXT:    lis r4, -16728
114; P9BE-NEXT:    sldi r3, r3, 48
115; P9BE-NEXT:    mtvsrd v4, r3
116; P9BE-NEXT:    li r3, 6
117; P9BE-NEXT:    vextuhlx r3, r3, v2
118; P9BE-NEXT:    extsh r3, r3
119; P9BE-NEXT:    extsw r3, r3
120; P9BE-NEXT:    ori r4, r4, 63249
121; P9BE-NEXT:    mulld r4, r3, r4
122; P9BE-NEXT:    rldicl r5, r4, 1, 63
123; P9BE-NEXT:    rldicl r4, r4, 32, 32
124; P9BE-NEXT:    srawi r4, r4, 8
125; P9BE-NEXT:    add r4, r4, r5
126; P9BE-NEXT:    mulli r4, r4, -1003
127; P9BE-NEXT:    subf r3, r4, r3
128; P9BE-NEXT:    lis r4, 21399
129; P9BE-NEXT:    sldi r3, r3, 48
130; P9BE-NEXT:    vmrghh v3, v4, v3
131; P9BE-NEXT:    mtvsrd v4, r3
132; P9BE-NEXT:    li r3, 4
133; P9BE-NEXT:    vextuhlx r3, r3, v2
134; P9BE-NEXT:    extsh r3, r3
135; P9BE-NEXT:    extsw r3, r3
136; P9BE-NEXT:    ori r4, r4, 33437
137; P9BE-NEXT:    mulld r4, r3, r4
138; P9BE-NEXT:    rldicl r5, r4, 1, 63
139; P9BE-NEXT:    rldicl r4, r4, 32, 32
140; P9BE-NEXT:    srawi r4, r4, 5
141; P9BE-NEXT:    add r4, r4, r5
142; P9BE-NEXT:    mulli r4, r4, 98
143; P9BE-NEXT:    subf r3, r4, r3
144; P9BE-NEXT:    sldi r3, r3, 48
145; P9BE-NEXT:    mtvsrd v2, r3
146; P9BE-NEXT:    vmrghh v2, v2, v4
147; P9BE-NEXT:    vmrghw v2, v3, v2
148; P9BE-NEXT:    blr
149;
150; P8LE-LABEL: fold_srem_vec_1:
151; P8LE:       # %bb.0:
152; P8LE-NEXT:    xxswapd vs0, v2
153; P8LE-NEXT:    lis r4, 21399
154; P8LE-NEXT:    lis r9, -16728
155; P8LE-NEXT:    lis r11, -21386
156; P8LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
157; P8LE-NEXT:    ori r4, r4, 33437
158; P8LE-NEXT:    ori r9, r9, 63249
159; P8LE-NEXT:    ori r11, r11, 37253
160; P8LE-NEXT:    mffprd r5, f0
161; P8LE-NEXT:    rldicl r3, r5, 32, 48
162; P8LE-NEXT:    rldicl r6, r5, 16, 48
163; P8LE-NEXT:    clrldi r7, r5, 48
164; P8LE-NEXT:    extsh r8, r3
165; P8LE-NEXT:    extsh r10, r6
166; P8LE-NEXT:    rldicl r5, r5, 48, 48
167; P8LE-NEXT:    extsw r8, r8
168; P8LE-NEXT:    extsh r12, r7
169; P8LE-NEXT:    extsw r10, r10
170; P8LE-NEXT:    mulld r4, r8, r4
171; P8LE-NEXT:    lis r8, 31710
172; P8LE-NEXT:    extsh r0, r5
173; P8LE-NEXT:    extsw r12, r12
174; P8LE-NEXT:    mulld r9, r10, r9
175; P8LE-NEXT:    ori r8, r8, 63421
176; P8LE-NEXT:    extsw r10, r0
177; P8LE-NEXT:    mulld r11, r12, r11
178; P8LE-NEXT:    mulld r8, r10, r8
179; P8LE-NEXT:    rldicl r0, r4, 1, 63
180; P8LE-NEXT:    rldicl r4, r4, 32, 32
181; P8LE-NEXT:    rldicl r30, r9, 1, 63
182; P8LE-NEXT:    rldicl r9, r9, 32, 32
183; P8LE-NEXT:    rldicl r11, r11, 32, 32
184; P8LE-NEXT:    rldicl r8, r8, 32, 32
185; P8LE-NEXT:    add r11, r11, r12
186; P8LE-NEXT:    srawi r4, r4, 5
187; P8LE-NEXT:    subf r8, r10, r8
188; P8LE-NEXT:    srawi r9, r9, 8
189; P8LE-NEXT:    srwi r10, r11, 31
190; P8LE-NEXT:    add r4, r4, r0
191; P8LE-NEXT:    srawi r11, r11, 6
192; P8LE-NEXT:    add r9, r9, r30
193; P8LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
194; P8LE-NEXT:    add r10, r11, r10
195; P8LE-NEXT:    srwi r11, r8, 31
196; P8LE-NEXT:    srawi r8, r8, 6
197; P8LE-NEXT:    mulli r4, r4, 98
198; P8LE-NEXT:    mulli r9, r9, -1003
199; P8LE-NEXT:    add r8, r8, r11
200; P8LE-NEXT:    mulli r10, r10, 95
201; P8LE-NEXT:    mulli r8, r8, -124
202; P8LE-NEXT:    subf r3, r4, r3
203; P8LE-NEXT:    subf r4, r9, r6
204; P8LE-NEXT:    mtfprd f0, r3
205; P8LE-NEXT:    subf r3, r10, r7
206; P8LE-NEXT:    mtfprd f1, r4
207; P8LE-NEXT:    subf r4, r8, r5
208; P8LE-NEXT:    mtfprd f2, r3
209; P8LE-NEXT:    xxswapd v2, vs0
210; P8LE-NEXT:    mtfprd f3, r4
211; P8LE-NEXT:    xxswapd v3, vs1
212; P8LE-NEXT:    xxswapd v4, vs2
213; P8LE-NEXT:    xxswapd v5, vs3
214; P8LE-NEXT:    vmrglh v2, v3, v2
215; P8LE-NEXT:    vmrglh v3, v5, v4
216; P8LE-NEXT:    vmrglw v2, v2, v3
217; P8LE-NEXT:    blr
218;
219; P8BE-LABEL: fold_srem_vec_1:
220; P8BE:       # %bb.0:
221; P8BE-NEXT:    mfvsrd r4, v2
222; P8BE-NEXT:    lis r3, -16728
223; P8BE-NEXT:    lis r9, 31710
224; P8BE-NEXT:    lis r8, 21399
225; P8BE-NEXT:    lis r10, -21386
226; P8BE-NEXT:    ori r3, r3, 63249
227; P8BE-NEXT:    ori r9, r9, 63421
228; P8BE-NEXT:    ori r8, r8, 33437
229; P8BE-NEXT:    ori r10, r10, 37253
230; P8BE-NEXT:    clrldi r5, r4, 48
231; P8BE-NEXT:    rldicl r7, r4, 32, 48
232; P8BE-NEXT:    rldicl r6, r4, 48, 48
233; P8BE-NEXT:    rldicl r4, r4, 16, 48
234; P8BE-NEXT:    extsh r5, r5
235; P8BE-NEXT:    extsh r7, r7
236; P8BE-NEXT:    extsh r6, r6
237; P8BE-NEXT:    extsw r5, r5
238; P8BE-NEXT:    extsh r4, r4
239; P8BE-NEXT:    extsw r7, r7
240; P8BE-NEXT:    extsw r6, r6
241; P8BE-NEXT:    mulld r3, r5, r3
242; P8BE-NEXT:    extsw r4, r4
243; P8BE-NEXT:    mulld r9, r7, r9
244; P8BE-NEXT:    mulld r8, r6, r8
245; P8BE-NEXT:    mulld r10, r4, r10
246; P8BE-NEXT:    rldicl r11, r3, 1, 63
247; P8BE-NEXT:    rldicl r3, r3, 32, 32
248; P8BE-NEXT:    rldicl r9, r9, 32, 32
249; P8BE-NEXT:    rldicl r12, r8, 1, 63
250; P8BE-NEXT:    rldicl r8, r8, 32, 32
251; P8BE-NEXT:    rldicl r10, r10, 32, 32
252; P8BE-NEXT:    subf r9, r7, r9
253; P8BE-NEXT:    srawi r3, r3, 8
254; P8BE-NEXT:    srawi r8, r8, 5
255; P8BE-NEXT:    add r10, r10, r4
256; P8BE-NEXT:    add r3, r3, r11
257; P8BE-NEXT:    srwi r11, r9, 31
258; P8BE-NEXT:    add r8, r8, r12
259; P8BE-NEXT:    srawi r9, r9, 6
260; P8BE-NEXT:    mulli r3, r3, -1003
261; P8BE-NEXT:    add r9, r9, r11
262; P8BE-NEXT:    srwi r11, r10, 31
263; P8BE-NEXT:    srawi r10, r10, 6
264; P8BE-NEXT:    mulli r8, r8, 98
265; P8BE-NEXT:    add r10, r10, r11
266; P8BE-NEXT:    mulli r9, r9, -124
267; P8BE-NEXT:    mulli r10, r10, 95
268; P8BE-NEXT:    subf r3, r3, r5
269; P8BE-NEXT:    sldi r3, r3, 48
270; P8BE-NEXT:    subf r5, r8, r6
271; P8BE-NEXT:    mtvsrd v2, r3
272; P8BE-NEXT:    subf r6, r9, r7
273; P8BE-NEXT:    sldi r3, r5, 48
274; P8BE-NEXT:    subf r4, r10, r4
275; P8BE-NEXT:    mtvsrd v3, r3
276; P8BE-NEXT:    sldi r3, r6, 48
277; P8BE-NEXT:    sldi r4, r4, 48
278; P8BE-NEXT:    mtvsrd v4, r3
279; P8BE-NEXT:    mtvsrd v5, r4
280; P8BE-NEXT:    vmrghh v2, v3, v2
281; P8BE-NEXT:    vmrghh v3, v5, v4
282; P8BE-NEXT:    vmrghw v2, v3, v2
283; P8BE-NEXT:    blr
284  %1 = srem <4 x i16> %x, <i16 95, i16 -124, i16 98, i16 -1003>
285  ret <4 x i16> %1
286}
287
288define <4 x i16> @fold_srem_vec_2(<4 x i16> %x) {
289; P9LE-LABEL: fold_srem_vec_2:
290; P9LE:       # %bb.0:
291; P9LE-NEXT:    li r3, 0
292; P9LE-NEXT:    vextuhrx r3, r3, v2
293; P9LE-NEXT:    extsh r4, r3
294; P9LE-NEXT:    lis r5, -21386
295; P9LE-NEXT:    ori r5, r5, 37253
296; P9LE-NEXT:    extsw r4, r4
297; P9LE-NEXT:    mulld r6, r4, r5
298; P9LE-NEXT:    rldicl r6, r6, 32, 32
299; P9LE-NEXT:    add r4, r6, r4
300; P9LE-NEXT:    srwi r6, r4, 31
301; P9LE-NEXT:    srawi r4, r4, 6
302; P9LE-NEXT:    add r4, r4, r6
303; P9LE-NEXT:    mulli r4, r4, 95
304; P9LE-NEXT:    subf r3, r4, r3
305; P9LE-NEXT:    mtfprd f0, r3
306; P9LE-NEXT:    li r3, 2
307; P9LE-NEXT:    vextuhrx r3, r3, v2
308; P9LE-NEXT:    extsh r4, r3
309; P9LE-NEXT:    extsw r4, r4
310; P9LE-NEXT:    mulld r6, r4, r5
311; P9LE-NEXT:    rldicl r6, r6, 32, 32
312; P9LE-NEXT:    add r4, r6, r4
313; P9LE-NEXT:    srwi r6, r4, 31
314; P9LE-NEXT:    srawi r4, r4, 6
315; P9LE-NEXT:    add r4, r4, r6
316; P9LE-NEXT:    mulli r4, r4, 95
317; P9LE-NEXT:    subf r3, r4, r3
318; P9LE-NEXT:    xxswapd v3, vs0
319; P9LE-NEXT:    mtfprd f0, r3
320; P9LE-NEXT:    li r3, 4
321; P9LE-NEXT:    vextuhrx r3, r3, v2
322; P9LE-NEXT:    extsh r4, r3
323; P9LE-NEXT:    extsw r4, r4
324; P9LE-NEXT:    mulld r6, r4, r5
325; P9LE-NEXT:    rldicl r6, r6, 32, 32
326; P9LE-NEXT:    add r4, r6, r4
327; P9LE-NEXT:    srwi r6, r4, 31
328; P9LE-NEXT:    srawi r4, r4, 6
329; P9LE-NEXT:    add r4, r4, r6
330; P9LE-NEXT:    mulli r4, r4, 95
331; P9LE-NEXT:    subf r3, r4, r3
332; P9LE-NEXT:    xxswapd v4, vs0
333; P9LE-NEXT:    mtfprd f0, r3
334; P9LE-NEXT:    li r3, 6
335; P9LE-NEXT:    vextuhrx r3, r3, v2
336; P9LE-NEXT:    extsh r4, r3
337; P9LE-NEXT:    extsw r4, r4
338; P9LE-NEXT:    mulld r5, r4, r5
339; P9LE-NEXT:    rldicl r5, r5, 32, 32
340; P9LE-NEXT:    add r4, r5, r4
341; P9LE-NEXT:    srwi r5, r4, 31
342; P9LE-NEXT:    srawi r4, r4, 6
343; P9LE-NEXT:    add r4, r4, r5
344; P9LE-NEXT:    mulli r4, r4, 95
345; P9LE-NEXT:    subf r3, r4, r3
346; P9LE-NEXT:    vmrglh v3, v4, v3
347; P9LE-NEXT:    xxswapd v4, vs0
348; P9LE-NEXT:    mtfprd f0, r3
349; P9LE-NEXT:    xxswapd v2, vs0
350; P9LE-NEXT:    vmrglh v2, v2, v4
351; P9LE-NEXT:    vmrglw v2, v2, v3
352; P9LE-NEXT:    blr
353;
354; P9BE-LABEL: fold_srem_vec_2:
355; P9BE:       # %bb.0:
356; P9BE-NEXT:    li r3, 6
357; P9BE-NEXT:    vextuhlx r3, r3, v2
358; P9BE-NEXT:    extsh r3, r3
359; P9BE-NEXT:    lis r4, -21386
360; P9BE-NEXT:    ori r4, r4, 37253
361; P9BE-NEXT:    extsw r3, r3
362; P9BE-NEXT:    mulld r5, r3, r4
363; P9BE-NEXT:    rldicl r5, r5, 32, 32
364; P9BE-NEXT:    add r5, r5, r3
365; P9BE-NEXT:    srwi r6, r5, 31
366; P9BE-NEXT:    srawi r5, r5, 6
367; P9BE-NEXT:    add r5, r5, r6
368; P9BE-NEXT:    mulli r5, r5, 95
369; P9BE-NEXT:    subf r3, r5, r3
370; P9BE-NEXT:    sldi r3, r3, 48
371; P9BE-NEXT:    mtvsrd v3, r3
372; P9BE-NEXT:    li r3, 4
373; P9BE-NEXT:    vextuhlx r3, r3, v2
374; P9BE-NEXT:    extsh r3, r3
375; P9BE-NEXT:    extsw r3, r3
376; P9BE-NEXT:    mulld r5, r3, r4
377; P9BE-NEXT:    rldicl r5, r5, 32, 32
378; P9BE-NEXT:    add r5, r5, r3
379; P9BE-NEXT:    srwi r6, r5, 31
380; P9BE-NEXT:    srawi r5, r5, 6
381; P9BE-NEXT:    add r5, r5, r6
382; P9BE-NEXT:    mulli r5, r5, 95
383; P9BE-NEXT:    subf r3, r5, r3
384; P9BE-NEXT:    sldi r3, r3, 48
385; P9BE-NEXT:    mtvsrd v4, r3
386; P9BE-NEXT:    li r3, 2
387; P9BE-NEXT:    vextuhlx r3, r3, v2
388; P9BE-NEXT:    extsh r3, r3
389; P9BE-NEXT:    extsw r3, r3
390; P9BE-NEXT:    mulld r5, r3, r4
391; P9BE-NEXT:    rldicl r5, r5, 32, 32
392; P9BE-NEXT:    add r5, r5, r3
393; P9BE-NEXT:    srwi r6, r5, 31
394; P9BE-NEXT:    srawi r5, r5, 6
395; P9BE-NEXT:    add r5, r5, r6
396; P9BE-NEXT:    mulli r5, r5, 95
397; P9BE-NEXT:    subf r3, r5, r3
398; P9BE-NEXT:    sldi r3, r3, 48
399; P9BE-NEXT:    vmrghh v3, v4, v3
400; P9BE-NEXT:    mtvsrd v4, r3
401; P9BE-NEXT:    li r3, 0
402; P9BE-NEXT:    vextuhlx r3, r3, v2
403; P9BE-NEXT:    extsh r3, r3
404; P9BE-NEXT:    extsw r3, r3
405; P9BE-NEXT:    mulld r4, r3, r4
406; P9BE-NEXT:    rldicl r4, r4, 32, 32
407; P9BE-NEXT:    add r4, r4, r3
408; P9BE-NEXT:    srwi r5, r4, 31
409; P9BE-NEXT:    srawi r4, r4, 6
410; P9BE-NEXT:    add r4, r4, r5
411; P9BE-NEXT:    mulli r4, r4, 95
412; P9BE-NEXT:    subf r3, r4, r3
413; P9BE-NEXT:    sldi r3, r3, 48
414; P9BE-NEXT:    mtvsrd v2, r3
415; P9BE-NEXT:    vmrghh v2, v2, v4
416; P9BE-NEXT:    vmrghw v2, v2, v3
417; P9BE-NEXT:    blr
418;
419; P8LE-LABEL: fold_srem_vec_2:
420; P8LE:       # %bb.0:
421; P8LE-NEXT:    xxswapd vs0, v2
422; P8LE-NEXT:    lis r4, -21386
423; P8LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
424; P8LE-NEXT:    ori r4, r4, 37253
425; P8LE-NEXT:    mffprd r5, f0
426; P8LE-NEXT:    clrldi r3, r5, 48
427; P8LE-NEXT:    rldicl r7, r5, 32, 48
428; P8LE-NEXT:    extsh r8, r3
429; P8LE-NEXT:    rldicl r6, r5, 48, 48
430; P8LE-NEXT:    extsh r10, r7
431; P8LE-NEXT:    rldicl r5, r5, 16, 48
432; P8LE-NEXT:    extsw r8, r8
433; P8LE-NEXT:    extsh r9, r6
434; P8LE-NEXT:    extsw r10, r10
435; P8LE-NEXT:    extsh r11, r5
436; P8LE-NEXT:    mulld r12, r8, r4
437; P8LE-NEXT:    extsw r9, r9
438; P8LE-NEXT:    extsw r11, r11
439; P8LE-NEXT:    mulld r30, r10, r4
440; P8LE-NEXT:    mulld r0, r9, r4
441; P8LE-NEXT:    mulld r4, r11, r4
442; P8LE-NEXT:    rldicl r12, r12, 32, 32
443; P8LE-NEXT:    add r8, r12, r8
444; P8LE-NEXT:    rldicl r12, r30, 32, 32
445; P8LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
446; P8LE-NEXT:    rldicl r0, r0, 32, 32
447; P8LE-NEXT:    rldicl r4, r4, 32, 32
448; P8LE-NEXT:    add r10, r12, r10
449; P8LE-NEXT:    add r9, r0, r9
450; P8LE-NEXT:    srwi r0, r8, 31
451; P8LE-NEXT:    add r4, r4, r11
452; P8LE-NEXT:    srwi r11, r10, 31
453; P8LE-NEXT:    srawi r8, r8, 6
454; P8LE-NEXT:    srawi r10, r10, 6
455; P8LE-NEXT:    srwi r12, r9, 31
456; P8LE-NEXT:    add r8, r8, r0
457; P8LE-NEXT:    srawi r9, r9, 6
458; P8LE-NEXT:    add r10, r10, r11
459; P8LE-NEXT:    srwi r11, r4, 31
460; P8LE-NEXT:    srawi r4, r4, 6
461; P8LE-NEXT:    add r9, r9, r12
462; P8LE-NEXT:    mulli r8, r8, 95
463; P8LE-NEXT:    add r4, r4, r11
464; P8LE-NEXT:    mulli r9, r9, 95
465; P8LE-NEXT:    mulli r10, r10, 95
466; P8LE-NEXT:    mulli r4, r4, 95
467; P8LE-NEXT:    subf r3, r8, r3
468; P8LE-NEXT:    subf r6, r9, r6
469; P8LE-NEXT:    mtfprd f0, r3
470; P8LE-NEXT:    subf r3, r10, r7
471; P8LE-NEXT:    subf r4, r4, r5
472; P8LE-NEXT:    mtfprd f1, r6
473; P8LE-NEXT:    mtfprd f2, r3
474; P8LE-NEXT:    xxswapd v2, vs0
475; P8LE-NEXT:    mtfprd f3, r4
476; P8LE-NEXT:    xxswapd v3, vs1
477; P8LE-NEXT:    xxswapd v4, vs2
478; P8LE-NEXT:    xxswapd v5, vs3
479; P8LE-NEXT:    vmrglh v2, v3, v2
480; P8LE-NEXT:    vmrglh v3, v5, v4
481; P8LE-NEXT:    vmrglw v2, v3, v2
482; P8LE-NEXT:    blr
483;
484; P8BE-LABEL: fold_srem_vec_2:
485; P8BE:       # %bb.0:
486; P8BE-NEXT:    mfvsrd r4, v2
487; P8BE-NEXT:    lis r3, -21386
488; P8BE-NEXT:    ori r3, r3, 37253
489; P8BE-NEXT:    clrldi r5, r4, 48
490; P8BE-NEXT:    rldicl r6, r4, 48, 48
491; P8BE-NEXT:    extsh r5, r5
492; P8BE-NEXT:    rldicl r7, r4, 32, 48
493; P8BE-NEXT:    extsh r6, r6
494; P8BE-NEXT:    extsw r5, r5
495; P8BE-NEXT:    rldicl r4, r4, 16, 48
496; P8BE-NEXT:    extsh r7, r7
497; P8BE-NEXT:    extsw r6, r6
498; P8BE-NEXT:    mulld r8, r5, r3
499; P8BE-NEXT:    extsh r4, r4
500; P8BE-NEXT:    extsw r7, r7
501; P8BE-NEXT:    mulld r9, r6, r3
502; P8BE-NEXT:    extsw r4, r4
503; P8BE-NEXT:    mulld r10, r7, r3
504; P8BE-NEXT:    mulld r3, r4, r3
505; P8BE-NEXT:    rldicl r8, r8, 32, 32
506; P8BE-NEXT:    rldicl r9, r9, 32, 32
507; P8BE-NEXT:    add r8, r8, r5
508; P8BE-NEXT:    rldicl r10, r10, 32, 32
509; P8BE-NEXT:    add r9, r9, r6
510; P8BE-NEXT:    srwi r11, r8, 31
511; P8BE-NEXT:    srawi r8, r8, 6
512; P8BE-NEXT:    rldicl r3, r3, 32, 32
513; P8BE-NEXT:    add r10, r10, r7
514; P8BE-NEXT:    add r8, r8, r11
515; P8BE-NEXT:    srwi r11, r9, 31
516; P8BE-NEXT:    add r3, r3, r4
517; P8BE-NEXT:    srawi r9, r9, 6
518; P8BE-NEXT:    mulli r8, r8, 95
519; P8BE-NEXT:    add r9, r9, r11
520; P8BE-NEXT:    srwi r11, r10, 31
521; P8BE-NEXT:    srawi r10, r10, 6
522; P8BE-NEXT:    mulli r9, r9, 95
523; P8BE-NEXT:    add r10, r10, r11
524; P8BE-NEXT:    srwi r11, r3, 31
525; P8BE-NEXT:    srawi r3, r3, 6
526; P8BE-NEXT:    mulli r10, r10, 95
527; P8BE-NEXT:    subf r5, r8, r5
528; P8BE-NEXT:    add r3, r3, r11
529; P8BE-NEXT:    sldi r5, r5, 48
530; P8BE-NEXT:    mulli r3, r3, 95
531; P8BE-NEXT:    subf r6, r9, r6
532; P8BE-NEXT:    mtvsrd v2, r5
533; P8BE-NEXT:    sldi r6, r6, 48
534; P8BE-NEXT:    subf r7, r10, r7
535; P8BE-NEXT:    mtvsrd v3, r6
536; P8BE-NEXT:    subf r3, r3, r4
537; P8BE-NEXT:    sldi r4, r7, 48
538; P8BE-NEXT:    vmrghh v2, v3, v2
539; P8BE-NEXT:    sldi r3, r3, 48
540; P8BE-NEXT:    mtvsrd v4, r4
541; P8BE-NEXT:    mtvsrd v5, r3
542; P8BE-NEXT:    vmrghh v3, v5, v4
543; P8BE-NEXT:    vmrghw v2, v3, v2
544; P8BE-NEXT:    blr
545  %1 = srem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
546  ret <4 x i16> %1
547}
548
549
550; Don't fold if we can combine srem with sdiv.
551define <4 x i16> @combine_srem_sdiv(<4 x i16> %x) {
552; P9LE-LABEL: combine_srem_sdiv:
553; P9LE:       # %bb.0:
554; P9LE-NEXT:    li r3, 0
555; P9LE-NEXT:    vextuhrx r3, r3, v2
556; P9LE-NEXT:    extsh r4, r3
557; P9LE-NEXT:    lis r5, -21386
558; P9LE-NEXT:    ori r5, r5, 37253
559; P9LE-NEXT:    extsw r4, r4
560; P9LE-NEXT:    mulld r6, r4, r5
561; P9LE-NEXT:    rldicl r6, r6, 32, 32
562; P9LE-NEXT:    add r4, r6, r4
563; P9LE-NEXT:    srwi r6, r4, 31
564; P9LE-NEXT:    srawi r4, r4, 6
565; P9LE-NEXT:    add r4, r4, r6
566; P9LE-NEXT:    mulli r6, r4, 95
567; P9LE-NEXT:    subf r3, r6, r3
568; P9LE-NEXT:    mtfprd f0, r3
569; P9LE-NEXT:    li r3, 2
570; P9LE-NEXT:    vextuhrx r3, r3, v2
571; P9LE-NEXT:    extsh r6, r3
572; P9LE-NEXT:    extsw r6, r6
573; P9LE-NEXT:    mulld r7, r6, r5
574; P9LE-NEXT:    rldicl r7, r7, 32, 32
575; P9LE-NEXT:    add r6, r7, r6
576; P9LE-NEXT:    srwi r7, r6, 31
577; P9LE-NEXT:    srawi r6, r6, 6
578; P9LE-NEXT:    add r6, r6, r7
579; P9LE-NEXT:    mulli r7, r6, 95
580; P9LE-NEXT:    subf r3, r7, r3
581; P9LE-NEXT:    xxswapd v3, vs0
582; P9LE-NEXT:    mtfprd f0, r3
583; P9LE-NEXT:    li r3, 4
584; P9LE-NEXT:    vextuhrx r3, r3, v2
585; P9LE-NEXT:    extsh r7, r3
586; P9LE-NEXT:    extsw r7, r7
587; P9LE-NEXT:    mulld r8, r7, r5
588; P9LE-NEXT:    rldicl r8, r8, 32, 32
589; P9LE-NEXT:    add r7, r8, r7
590; P9LE-NEXT:    srwi r8, r7, 31
591; P9LE-NEXT:    srawi r7, r7, 6
592; P9LE-NEXT:    add r7, r7, r8
593; P9LE-NEXT:    mulli r8, r7, 95
594; P9LE-NEXT:    subf r3, r8, r3
595; P9LE-NEXT:    xxswapd v4, vs0
596; P9LE-NEXT:    mtfprd f0, r3
597; P9LE-NEXT:    li r3, 6
598; P9LE-NEXT:    vextuhrx r3, r3, v2
599; P9LE-NEXT:    extsh r8, r3
600; P9LE-NEXT:    extsw r8, r8
601; P9LE-NEXT:    mulld r5, r8, r5
602; P9LE-NEXT:    rldicl r5, r5, 32, 32
603; P9LE-NEXT:    add r5, r5, r8
604; P9LE-NEXT:    srwi r8, r5, 31
605; P9LE-NEXT:    srawi r5, r5, 6
606; P9LE-NEXT:    add r5, r5, r8
607; P9LE-NEXT:    mulli r8, r5, 95
608; P9LE-NEXT:    subf r3, r8, r3
609; P9LE-NEXT:    vmrglh v3, v4, v3
610; P9LE-NEXT:    xxswapd v4, vs0
611; P9LE-NEXT:    mtfprd f0, r3
612; P9LE-NEXT:    xxswapd v2, vs0
613; P9LE-NEXT:    mtfprd f0, r4
614; P9LE-NEXT:    vmrglh v2, v2, v4
615; P9LE-NEXT:    vmrglw v2, v2, v3
616; P9LE-NEXT:    xxswapd v3, vs0
617; P9LE-NEXT:    mtfprd f0, r6
618; P9LE-NEXT:    xxswapd v4, vs0
619; P9LE-NEXT:    mtfprd f0, r7
620; P9LE-NEXT:    vmrglh v3, v4, v3
621; P9LE-NEXT:    xxswapd v4, vs0
622; P9LE-NEXT:    mtfprd f0, r5
623; P9LE-NEXT:    xxswapd v5, vs0
624; P9LE-NEXT:    vmrglh v4, v5, v4
625; P9LE-NEXT:    vmrglw v3, v4, v3
626; P9LE-NEXT:    vadduhm v2, v2, v3
627; P9LE-NEXT:    blr
628;
629; P9BE-LABEL: combine_srem_sdiv:
630; P9BE:       # %bb.0:
631; P9BE-NEXT:    li r3, 6
632; P9BE-NEXT:    vextuhlx r3, r3, v2
633; P9BE-NEXT:    extsh r4, r3
634; P9BE-NEXT:    lis r5, -21386
635; P9BE-NEXT:    ori r5, r5, 37253
636; P9BE-NEXT:    extsw r4, r4
637; P9BE-NEXT:    mulld r6, r4, r5
638; P9BE-NEXT:    rldicl r6, r6, 32, 32
639; P9BE-NEXT:    add r4, r6, r4
640; P9BE-NEXT:    srwi r6, r4, 31
641; P9BE-NEXT:    srawi r4, r4, 6
642; P9BE-NEXT:    add r4, r4, r6
643; P9BE-NEXT:    mulli r6, r4, 95
644; P9BE-NEXT:    subf r3, r6, r3
645; P9BE-NEXT:    sldi r3, r3, 48
646; P9BE-NEXT:    mtvsrd v3, r3
647; P9BE-NEXT:    li r3, 4
648; P9BE-NEXT:    vextuhlx r3, r3, v2
649; P9BE-NEXT:    extsh r6, r3
650; P9BE-NEXT:    extsw r6, r6
651; P9BE-NEXT:    mulld r7, r6, r5
652; P9BE-NEXT:    rldicl r7, r7, 32, 32
653; P9BE-NEXT:    add r6, r7, r6
654; P9BE-NEXT:    srwi r7, r6, 31
655; P9BE-NEXT:    srawi r6, r6, 6
656; P9BE-NEXT:    add r6, r6, r7
657; P9BE-NEXT:    mulli r7, r6, 95
658; P9BE-NEXT:    subf r3, r7, r3
659; P9BE-NEXT:    sldi r3, r3, 48
660; P9BE-NEXT:    mtvsrd v4, r3
661; P9BE-NEXT:    li r3, 2
662; P9BE-NEXT:    vextuhlx r3, r3, v2
663; P9BE-NEXT:    extsh r7, r3
664; P9BE-NEXT:    extsw r7, r7
665; P9BE-NEXT:    mulld r8, r7, r5
666; P9BE-NEXT:    rldicl r8, r8, 32, 32
667; P9BE-NEXT:    add r7, r8, r7
668; P9BE-NEXT:    srwi r8, r7, 31
669; P9BE-NEXT:    srawi r7, r7, 6
670; P9BE-NEXT:    add r7, r7, r8
671; P9BE-NEXT:    mulli r8, r7, 95
672; P9BE-NEXT:    subf r3, r8, r3
673; P9BE-NEXT:    sldi r3, r3, 48
674; P9BE-NEXT:    vmrghh v3, v4, v3
675; P9BE-NEXT:    mtvsrd v4, r3
676; P9BE-NEXT:    li r3, 0
677; P9BE-NEXT:    vextuhlx r3, r3, v2
678; P9BE-NEXT:    extsh r3, r3
679; P9BE-NEXT:    extsw r3, r3
680; P9BE-NEXT:    mulld r5, r3, r5
681; P9BE-NEXT:    rldicl r5, r5, 32, 32
682; P9BE-NEXT:    add r5, r5, r3
683; P9BE-NEXT:    srwi r8, r5, 31
684; P9BE-NEXT:    srawi r5, r5, 6
685; P9BE-NEXT:    add r5, r5, r8
686; P9BE-NEXT:    mulli r8, r5, 95
687; P9BE-NEXT:    subf r3, r8, r3
688; P9BE-NEXT:    sldi r3, r3, 48
689; P9BE-NEXT:    mtvsrd v2, r3
690; P9BE-NEXT:    sldi r3, r4, 48
691; P9BE-NEXT:    vmrghh v2, v2, v4
692; P9BE-NEXT:    vmrghw v2, v2, v3
693; P9BE-NEXT:    mtvsrd v3, r3
694; P9BE-NEXT:    sldi r3, r6, 48
695; P9BE-NEXT:    mtvsrd v4, r3
696; P9BE-NEXT:    sldi r3, r7, 48
697; P9BE-NEXT:    vmrghh v3, v4, v3
698; P9BE-NEXT:    mtvsrd v4, r3
699; P9BE-NEXT:    sldi r3, r5, 48
700; P9BE-NEXT:    mtvsrd v5, r3
701; P9BE-NEXT:    vmrghh v4, v5, v4
702; P9BE-NEXT:    vmrghw v3, v4, v3
703; P9BE-NEXT:    vadduhm v2, v2, v3
704; P9BE-NEXT:    blr
705;
706; P8LE-LABEL: combine_srem_sdiv:
707; P8LE:       # %bb.0:
708; P8LE-NEXT:    xxswapd vs0, v2
709; P8LE-NEXT:    lis r5, -21386
710; P8LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
711; P8LE-NEXT:    ori r5, r5, 37253
712; P8LE-NEXT:    mffprd r6, f0
713; P8LE-NEXT:    clrldi r3, r6, 48
714; P8LE-NEXT:    rldicl r4, r6, 48, 48
715; P8LE-NEXT:    rldicl r7, r6, 32, 48
716; P8LE-NEXT:    extsh r8, r3
717; P8LE-NEXT:    extsh r9, r4
718; P8LE-NEXT:    rldicl r6, r6, 16, 48
719; P8LE-NEXT:    extsh r10, r7
720; P8LE-NEXT:    extsw r8, r8
721; P8LE-NEXT:    extsw r9, r9
722; P8LE-NEXT:    extsh r11, r6
723; P8LE-NEXT:    extsw r10, r10
724; P8LE-NEXT:    mulld r12, r8, r5
725; P8LE-NEXT:    extsw r11, r11
726; P8LE-NEXT:    mulld r0, r9, r5
727; P8LE-NEXT:    mulld r30, r10, r5
728; P8LE-NEXT:    mulld r5, r11, r5
729; P8LE-NEXT:    rldicl r12, r12, 32, 32
730; P8LE-NEXT:    rldicl r0, r0, 32, 32
731; P8LE-NEXT:    rldicl r30, r30, 32, 32
732; P8LE-NEXT:    add r8, r12, r8
733; P8LE-NEXT:    rldicl r5, r5, 32, 32
734; P8LE-NEXT:    add r9, r0, r9
735; P8LE-NEXT:    add r10, r30, r10
736; P8LE-NEXT:    srwi r12, r8, 31
737; P8LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
738; P8LE-NEXT:    srawi r8, r8, 6
739; P8LE-NEXT:    srawi r0, r9, 6
740; P8LE-NEXT:    srwi r9, r9, 31
741; P8LE-NEXT:    add r5, r5, r11
742; P8LE-NEXT:    add r8, r8, r12
743; P8LE-NEXT:    srawi r12, r10, 6
744; P8LE-NEXT:    srwi r10, r10, 31
745; P8LE-NEXT:    add r9, r0, r9
746; P8LE-NEXT:    mulli r0, r8, 95
747; P8LE-NEXT:    add r10, r12, r10
748; P8LE-NEXT:    mtfprd f0, r8
749; P8LE-NEXT:    srwi r8, r5, 31
750; P8LE-NEXT:    srawi r5, r5, 6
751; P8LE-NEXT:    mulli r11, r9, 95
752; P8LE-NEXT:    mtfprd f1, r9
753; P8LE-NEXT:    mulli r9, r10, 95
754; P8LE-NEXT:    add r5, r5, r8
755; P8LE-NEXT:    xxswapd v2, vs0
756; P8LE-NEXT:    mtfprd f2, r10
757; P8LE-NEXT:    mtfprd f3, r5
758; P8LE-NEXT:    mulli r5, r5, 95
759; P8LE-NEXT:    xxswapd v3, vs1
760; P8LE-NEXT:    subf r3, r0, r3
761; P8LE-NEXT:    xxswapd v1, vs2
762; P8LE-NEXT:    mtfprd f0, r3
763; P8LE-NEXT:    subf r4, r11, r4
764; P8LE-NEXT:    xxswapd v6, vs3
765; P8LE-NEXT:    subf r3, r9, r7
766; P8LE-NEXT:    mtfprd f1, r4
767; P8LE-NEXT:    mtfprd f4, r3
768; P8LE-NEXT:    subf r3, r5, r6
769; P8LE-NEXT:    mtfprd f5, r3
770; P8LE-NEXT:    xxswapd v4, vs1
771; P8LE-NEXT:    vmrglh v2, v3, v2
772; P8LE-NEXT:    xxswapd v3, vs0
773; P8LE-NEXT:    xxswapd v5, vs4
774; P8LE-NEXT:    xxswapd v0, vs5
775; P8LE-NEXT:    vmrglh v3, v4, v3
776; P8LE-NEXT:    vmrglh v4, v0, v5
777; P8LE-NEXT:    vmrglh v5, v6, v1
778; P8LE-NEXT:    vmrglw v3, v4, v3
779; P8LE-NEXT:    vmrglw v2, v5, v2
780; P8LE-NEXT:    vadduhm v2, v3, v2
781; P8LE-NEXT:    blr
782;
783; P8BE-LABEL: combine_srem_sdiv:
784; P8BE:       # %bb.0:
785; P8BE-NEXT:    mfvsrd r6, v2
786; P8BE-NEXT:    lis r5, -21386
787; P8BE-NEXT:    ori r5, r5, 37253
788; P8BE-NEXT:    clrldi r3, r6, 48
789; P8BE-NEXT:    rldicl r4, r6, 48, 48
790; P8BE-NEXT:    extsh r8, r3
791; P8BE-NEXT:    rldicl r7, r6, 32, 48
792; P8BE-NEXT:    extsh r9, r4
793; P8BE-NEXT:    rldicl r6, r6, 16, 48
794; P8BE-NEXT:    extsw r8, r8
795; P8BE-NEXT:    extsh r10, r7
796; P8BE-NEXT:    extsw r9, r9
797; P8BE-NEXT:    extsh r6, r6
798; P8BE-NEXT:    mulld r11, r8, r5
799; P8BE-NEXT:    extsw r10, r10
800; P8BE-NEXT:    extsw r6, r6
801; P8BE-NEXT:    mulld r12, r9, r5
802; P8BE-NEXT:    mulld r0, r10, r5
803; P8BE-NEXT:    mulld r5, r6, r5
804; P8BE-NEXT:    rldicl r11, r11, 32, 32
805; P8BE-NEXT:    rldicl r12, r12, 32, 32
806; P8BE-NEXT:    add r8, r11, r8
807; P8BE-NEXT:    rldicl r0, r0, 32, 32
808; P8BE-NEXT:    rldicl r5, r5, 32, 32
809; P8BE-NEXT:    add r9, r12, r9
810; P8BE-NEXT:    srawi r11, r8, 6
811; P8BE-NEXT:    srwi r8, r8, 31
812; P8BE-NEXT:    add r10, r0, r10
813; P8BE-NEXT:    add r5, r5, r6
814; P8BE-NEXT:    srawi r12, r9, 6
815; P8BE-NEXT:    srwi r9, r9, 31
816; P8BE-NEXT:    add r8, r11, r8
817; P8BE-NEXT:    srawi r0, r10, 6
818; P8BE-NEXT:    srawi r11, r5, 6
819; P8BE-NEXT:    srwi r10, r10, 31
820; P8BE-NEXT:    add r9, r12, r9
821; P8BE-NEXT:    srwi r5, r5, 31
822; P8BE-NEXT:    mulli r12, r8, 95
823; P8BE-NEXT:    add r10, r0, r10
824; P8BE-NEXT:    add r5, r11, r5
825; P8BE-NEXT:    mulli r0, r9, 95
826; P8BE-NEXT:    sldi r9, r9, 48
827; P8BE-NEXT:    sldi r8, r8, 48
828; P8BE-NEXT:    mtvsrd v3, r9
829; P8BE-NEXT:    mulli r9, r5, 95
830; P8BE-NEXT:    mtvsrd v2, r8
831; P8BE-NEXT:    mulli r8, r10, 95
832; P8BE-NEXT:    sldi r10, r10, 48
833; P8BE-NEXT:    subf r3, r12, r3
834; P8BE-NEXT:    mtvsrd v4, r10
835; P8BE-NEXT:    subf r4, r0, r4
836; P8BE-NEXT:    sldi r3, r3, 48
837; P8BE-NEXT:    vmrghh v2, v3, v2
838; P8BE-NEXT:    sldi r4, r4, 48
839; P8BE-NEXT:    mtvsrd v3, r3
840; P8BE-NEXT:    subf r3, r9, r6
841; P8BE-NEXT:    subf r7, r8, r7
842; P8BE-NEXT:    mtvsrd v5, r4
843; P8BE-NEXT:    sldi r3, r3, 48
844; P8BE-NEXT:    sldi r6, r7, 48
845; P8BE-NEXT:    mtvsrd v1, r3
846; P8BE-NEXT:    sldi r3, r5, 48
847; P8BE-NEXT:    mtvsrd v0, r6
848; P8BE-NEXT:    vmrghh v3, v5, v3
849; P8BE-NEXT:    mtvsrd v5, r3
850; P8BE-NEXT:    vmrghh v0, v1, v0
851; P8BE-NEXT:    vmrghh v4, v5, v4
852; P8BE-NEXT:    vmrghw v3, v0, v3
853; P8BE-NEXT:    vmrghw v2, v4, v2
854; P8BE-NEXT:    vadduhm v2, v3, v2
855; P8BE-NEXT:    blr
856  %1 = srem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
857  %2 = sdiv <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
858  %3 = add <4 x i16> %1, %2
859  ret <4 x i16> %3
860}
861
862; Don't fold for divisors that are a power of two.
863define <4 x i16> @dont_fold_srem_power_of_two(<4 x i16> %x) {
864; P9LE-LABEL: dont_fold_srem_power_of_two:
865; P9LE:       # %bb.0:
866; P9LE-NEXT:    li r3, 0
867; P9LE-NEXT:    vextuhrx r3, r3, v2
868; P9LE-NEXT:    extsh r4, r3
869; P9LE-NEXT:    srawi r4, r4, 6
870; P9LE-NEXT:    addze r4, r4
871; P9LE-NEXT:    slwi r4, r4, 6
872; P9LE-NEXT:    subf r3, r4, r3
873; P9LE-NEXT:    mtfprd f0, r3
874; P9LE-NEXT:    li r3, 2
875; P9LE-NEXT:    vextuhrx r3, r3, v2
876; P9LE-NEXT:    extsh r4, r3
877; P9LE-NEXT:    srawi r4, r4, 5
878; P9LE-NEXT:    addze r4, r4
879; P9LE-NEXT:    slwi r4, r4, 5
880; P9LE-NEXT:    subf r3, r4, r3
881; P9LE-NEXT:    xxswapd v3, vs0
882; P9LE-NEXT:    mtfprd f0, r3
883; P9LE-NEXT:    li r3, 6
884; P9LE-NEXT:    vextuhrx r3, r3, v2
885; P9LE-NEXT:    extsh r4, r3
886; P9LE-NEXT:    lis r5, -21386
887; P9LE-NEXT:    ori r5, r5, 37253
888; P9LE-NEXT:    xxswapd v4, vs0
889; P9LE-NEXT:    vmrglh v3, v4, v3
890; P9LE-NEXT:    extsw r4, r4
891; P9LE-NEXT:    mulld r5, r4, r5
892; P9LE-NEXT:    rldicl r5, r5, 32, 32
893; P9LE-NEXT:    add r4, r5, r4
894; P9LE-NEXT:    srwi r5, r4, 31
895; P9LE-NEXT:    srawi r4, r4, 6
896; P9LE-NEXT:    add r4, r4, r5
897; P9LE-NEXT:    mulli r4, r4, 95
898; P9LE-NEXT:    subf r3, r4, r3
899; P9LE-NEXT:    mtfprd f0, r3
900; P9LE-NEXT:    li r3, 4
901; P9LE-NEXT:    vextuhrx r3, r3, v2
902; P9LE-NEXT:    extsh r4, r3
903; P9LE-NEXT:    srawi r4, r4, 3
904; P9LE-NEXT:    addze r4, r4
905; P9LE-NEXT:    slwi r4, r4, 3
906; P9LE-NEXT:    subf r3, r4, r3
907; P9LE-NEXT:    xxswapd v4, vs0
908; P9LE-NEXT:    mtfprd f0, r3
909; P9LE-NEXT:    xxswapd v2, vs0
910; P9LE-NEXT:    vmrglh v2, v4, v2
911; P9LE-NEXT:    vmrglw v2, v2, v3
912; P9LE-NEXT:    blr
913;
914; P9BE-LABEL: dont_fold_srem_power_of_two:
915; P9BE:       # %bb.0:
916; P9BE-NEXT:    li r3, 2
917; P9BE-NEXT:    vextuhlx r3, r3, v2
918; P9BE-NEXT:    extsh r3, r3
919; P9BE-NEXT:    srawi r4, r3, 5
920; P9BE-NEXT:    addze r4, r4
921; P9BE-NEXT:    slwi r4, r4, 5
922; P9BE-NEXT:    subf r3, r4, r3
923; P9BE-NEXT:    sldi r3, r3, 48
924; P9BE-NEXT:    mtvsrd v3, r3
925; P9BE-NEXT:    li r3, 0
926; P9BE-NEXT:    vextuhlx r3, r3, v2
927; P9BE-NEXT:    extsh r3, r3
928; P9BE-NEXT:    srawi r4, r3, 6
929; P9BE-NEXT:    addze r4, r4
930; P9BE-NEXT:    slwi r4, r4, 6
931; P9BE-NEXT:    subf r3, r4, r3
932; P9BE-NEXT:    lis r4, -21386
933; P9BE-NEXT:    sldi r3, r3, 48
934; P9BE-NEXT:    mtvsrd v4, r3
935; P9BE-NEXT:    li r3, 6
936; P9BE-NEXT:    vextuhlx r3, r3, v2
937; P9BE-NEXT:    extsh r3, r3
938; P9BE-NEXT:    extsw r3, r3
939; P9BE-NEXT:    ori r4, r4, 37253
940; P9BE-NEXT:    mulld r4, r3, r4
941; P9BE-NEXT:    rldicl r4, r4, 32, 32
942; P9BE-NEXT:    add r4, r4, r3
943; P9BE-NEXT:    srwi r5, r4, 31
944; P9BE-NEXT:    srawi r4, r4, 6
945; P9BE-NEXT:    add r4, r4, r5
946; P9BE-NEXT:    mulli r4, r4, 95
947; P9BE-NEXT:    subf r3, r4, r3
948; P9BE-NEXT:    sldi r3, r3, 48
949; P9BE-NEXT:    vmrghh v3, v4, v3
950; P9BE-NEXT:    mtvsrd v4, r3
951; P9BE-NEXT:    li r3, 4
952; P9BE-NEXT:    vextuhlx r3, r3, v2
953; P9BE-NEXT:    extsh r3, r3
954; P9BE-NEXT:    srawi r4, r3, 3
955; P9BE-NEXT:    addze r4, r4
956; P9BE-NEXT:    slwi r4, r4, 3
957; P9BE-NEXT:    subf r3, r4, r3
958; P9BE-NEXT:    sldi r3, r3, 48
959; P9BE-NEXT:    mtvsrd v2, r3
960; P9BE-NEXT:    vmrghh v2, v2, v4
961; P9BE-NEXT:    vmrghw v2, v3, v2
962; P9BE-NEXT:    blr
963;
964; P8LE-LABEL: dont_fold_srem_power_of_two:
965; P8LE:       # %bb.0:
966; P8LE-NEXT:    xxswapd vs0, v2
967; P8LE-NEXT:    lis r3, -21386
968; P8LE-NEXT:    ori r3, r3, 37253
969; P8LE-NEXT:    mffprd r4, f0
970; P8LE-NEXT:    rldicl r5, r4, 16, 48
971; P8LE-NEXT:    clrldi r7, r4, 48
972; P8LE-NEXT:    extsh r6, r5
973; P8LE-NEXT:    extsh r8, r7
974; P8LE-NEXT:    extsw r6, r6
975; P8LE-NEXT:    rldicl r9, r4, 48, 48
976; P8LE-NEXT:    mulld r3, r6, r3
977; P8LE-NEXT:    srawi r8, r8, 6
978; P8LE-NEXT:    extsh r10, r9
979; P8LE-NEXT:    addze r8, r8
980; P8LE-NEXT:    rldicl r4, r4, 32, 48
981; P8LE-NEXT:    srawi r10, r10, 5
982; P8LE-NEXT:    slwi r8, r8, 6
983; P8LE-NEXT:    subf r7, r8, r7
984; P8LE-NEXT:    rldicl r3, r3, 32, 32
985; P8LE-NEXT:    mtfprd f0, r7
986; P8LE-NEXT:    add r3, r3, r6
987; P8LE-NEXT:    addze r6, r10
988; P8LE-NEXT:    srwi r10, r3, 31
989; P8LE-NEXT:    srawi r3, r3, 6
990; P8LE-NEXT:    slwi r6, r6, 5
991; P8LE-NEXT:    xxswapd v2, vs0
992; P8LE-NEXT:    add r3, r3, r10
993; P8LE-NEXT:    extsh r10, r4
994; P8LE-NEXT:    subf r6, r6, r9
995; P8LE-NEXT:    mulli r3, r3, 95
996; P8LE-NEXT:    srawi r8, r10, 3
997; P8LE-NEXT:    mtfprd f1, r6
998; P8LE-NEXT:    addze r7, r8
999; P8LE-NEXT:    xxswapd v3, vs1
1000; P8LE-NEXT:    subf r3, r3, r5
1001; P8LE-NEXT:    slwi r5, r7, 3
1002; P8LE-NEXT:    subf r4, r5, r4
1003; P8LE-NEXT:    mtfprd f2, r3
1004; P8LE-NEXT:    mtfprd f3, r4
1005; P8LE-NEXT:    xxswapd v4, vs2
1006; P8LE-NEXT:    vmrglh v2, v3, v2
1007; P8LE-NEXT:    xxswapd v5, vs3
1008; P8LE-NEXT:    vmrglh v3, v4, v5
1009; P8LE-NEXT:    vmrglw v2, v3, v2
1010; P8LE-NEXT:    blr
1011;
1012; P8BE-LABEL: dont_fold_srem_power_of_two:
1013; P8BE:       # %bb.0:
1014; P8BE-NEXT:    mfvsrd r4, v2
1015; P8BE-NEXT:    lis r3, -21386
1016; P8BE-NEXT:    ori r3, r3, 37253
1017; P8BE-NEXT:    clrldi r5, r4, 48
1018; P8BE-NEXT:    rldicl r6, r4, 32, 48
1019; P8BE-NEXT:    extsh r5, r5
1020; P8BE-NEXT:    extsh r6, r6
1021; P8BE-NEXT:    extsw r5, r5
1022; P8BE-NEXT:    rldicl r7, r4, 16, 48
1023; P8BE-NEXT:    mulld r3, r5, r3
1024; P8BE-NEXT:    srawi r8, r6, 5
1025; P8BE-NEXT:    extsh r7, r7
1026; P8BE-NEXT:    addze r8, r8
1027; P8BE-NEXT:    rldicl r4, r4, 48, 48
1028; P8BE-NEXT:    srawi r9, r7, 6
1029; P8BE-NEXT:    extsh r4, r4
1030; P8BE-NEXT:    slwi r8, r8, 5
1031; P8BE-NEXT:    addze r9, r9
1032; P8BE-NEXT:    subf r6, r8, r6
1033; P8BE-NEXT:    rldicl r3, r3, 32, 32
1034; P8BE-NEXT:    slwi r8, r9, 6
1035; P8BE-NEXT:    add r3, r3, r5
1036; P8BE-NEXT:    subf r7, r8, r7
1037; P8BE-NEXT:    srwi r10, r3, 31
1038; P8BE-NEXT:    srawi r3, r3, 6
1039; P8BE-NEXT:    add r3, r3, r10
1040; P8BE-NEXT:    srawi r9, r4, 3
1041; P8BE-NEXT:    mulli r3, r3, 95
1042; P8BE-NEXT:    sldi r6, r6, 48
1043; P8BE-NEXT:    addze r8, r9
1044; P8BE-NEXT:    mtvsrd v2, r6
1045; P8BE-NEXT:    slwi r6, r8, 3
1046; P8BE-NEXT:    subf r4, r6, r4
1047; P8BE-NEXT:    sldi r4, r4, 48
1048; P8BE-NEXT:    subf r3, r3, r5
1049; P8BE-NEXT:    sldi r5, r7, 48
1050; P8BE-NEXT:    mtvsrd v5, r4
1051; P8BE-NEXT:    sldi r3, r3, 48
1052; P8BE-NEXT:    mtvsrd v3, r5
1053; P8BE-NEXT:    mtvsrd v4, r3
1054; P8BE-NEXT:    vmrghh v2, v3, v2
1055; P8BE-NEXT:    vmrghh v3, v5, v4
1056; P8BE-NEXT:    vmrghw v2, v2, v3
1057; P8BE-NEXT:    blr
1058  %1 = srem <4 x i16> %x, <i16 64, i16 32, i16 8, i16 95>
1059  ret <4 x i16> %1
1060}
1061
1062; Don't fold if the divisor is one.
1063define <4 x i16> @dont_fold_srem_one(<4 x i16> %x) {
1064; P9LE-LABEL: dont_fold_srem_one:
1065; P9LE:       # %bb.0:
1066; P9LE-NEXT:    li r3, 2
1067; P9LE-NEXT:    vextuhrx r3, r3, v2
1068; P9LE-NEXT:    extsh r4, r3
1069; P9LE-NEXT:    lis r5, -14230
1070; P9LE-NEXT:    ori r5, r5, 30865
1071; P9LE-NEXT:    extsw r4, r4
1072; P9LE-NEXT:    mulld r5, r4, r5
1073; P9LE-NEXT:    rldicl r5, r5, 32, 32
1074; P9LE-NEXT:    xxlxor v4, v4, v4
1075; P9LE-NEXT:    add r4, r5, r4
1076; P9LE-NEXT:    srwi r5, r4, 31
1077; P9LE-NEXT:    srawi r4, r4, 9
1078; P9LE-NEXT:    add r4, r4, r5
1079; P9LE-NEXT:    lis r5, -19946
1080; P9LE-NEXT:    mulli r4, r4, 654
1081; P9LE-NEXT:    subf r3, r4, r3
1082; P9LE-NEXT:    mtfprd f0, r3
1083; P9LE-NEXT:    li r3, 4
1084; P9LE-NEXT:    vextuhrx r3, r3, v2
1085; P9LE-NEXT:    extsh r4, r3
1086; P9LE-NEXT:    extsw r4, r4
1087; P9LE-NEXT:    ori r5, r5, 17097
1088; P9LE-NEXT:    mulld r5, r4, r5
1089; P9LE-NEXT:    rldicl r5, r5, 32, 32
1090; P9LE-NEXT:    add r4, r5, r4
1091; P9LE-NEXT:    srwi r5, r4, 31
1092; P9LE-NEXT:    srawi r4, r4, 4
1093; P9LE-NEXT:    add r4, r4, r5
1094; P9LE-NEXT:    lis r5, 24749
1095; P9LE-NEXT:    mulli r4, r4, 23
1096; P9LE-NEXT:    subf r3, r4, r3
1097; P9LE-NEXT:    xxswapd v3, vs0
1098; P9LE-NEXT:    mtfprd f0, r3
1099; P9LE-NEXT:    li r3, 6
1100; P9LE-NEXT:    vextuhrx r3, r3, v2
1101; P9LE-NEXT:    extsh r4, r3
1102; P9LE-NEXT:    extsw r4, r4
1103; P9LE-NEXT:    ori r5, r5, 47143
1104; P9LE-NEXT:    mulld r4, r4, r5
1105; P9LE-NEXT:    rldicl r5, r4, 1, 63
1106; P9LE-NEXT:    rldicl r4, r4, 32, 32
1107; P9LE-NEXT:    srawi r4, r4, 11
1108; P9LE-NEXT:    add r4, r4, r5
1109; P9LE-NEXT:    mulli r4, r4, 5423
1110; P9LE-NEXT:    subf r3, r4, r3
1111; P9LE-NEXT:    vmrglh v3, v3, v4
1112; P9LE-NEXT:    xxswapd v4, vs0
1113; P9LE-NEXT:    mtfprd f0, r3
1114; P9LE-NEXT:    xxswapd v2, vs0
1115; P9LE-NEXT:    vmrglh v2, v2, v4
1116; P9LE-NEXT:    vmrglw v2, v2, v3
1117; P9LE-NEXT:    blr
1118;
1119; P9BE-LABEL: dont_fold_srem_one:
1120; P9BE:       # %bb.0:
1121; P9BE-NEXT:    li r3, 4
1122; P9BE-NEXT:    vextuhlx r3, r3, v2
1123; P9BE-NEXT:    extsh r3, r3
1124; P9BE-NEXT:    lis r4, -19946
1125; P9BE-NEXT:    ori r4, r4, 17097
1126; P9BE-NEXT:    extsw r3, r3
1127; P9BE-NEXT:    mulld r4, r3, r4
1128; P9BE-NEXT:    rldicl r4, r4, 32, 32
1129; P9BE-NEXT:    add r4, r4, r3
1130; P9BE-NEXT:    srwi r5, r4, 31
1131; P9BE-NEXT:    srawi r4, r4, 4
1132; P9BE-NEXT:    add r4, r4, r5
1133; P9BE-NEXT:    mulli r4, r4, 23
1134; P9BE-NEXT:    subf r3, r4, r3
1135; P9BE-NEXT:    lis r4, 24749
1136; P9BE-NEXT:    sldi r3, r3, 48
1137; P9BE-NEXT:    mtvsrd v3, r3
1138; P9BE-NEXT:    li r3, 6
1139; P9BE-NEXT:    vextuhlx r3, r3, v2
1140; P9BE-NEXT:    extsh r3, r3
1141; P9BE-NEXT:    extsw r3, r3
1142; P9BE-NEXT:    ori r4, r4, 47143
1143; P9BE-NEXT:    mulld r4, r3, r4
1144; P9BE-NEXT:    rldicl r5, r4, 1, 63
1145; P9BE-NEXT:    rldicl r4, r4, 32, 32
1146; P9BE-NEXT:    srawi r4, r4, 11
1147; P9BE-NEXT:    add r4, r4, r5
1148; P9BE-NEXT:    mulli r4, r4, 5423
1149; P9BE-NEXT:    subf r3, r4, r3
1150; P9BE-NEXT:    lis r4, -14230
1151; P9BE-NEXT:    sldi r3, r3, 48
1152; P9BE-NEXT:    mtvsrd v4, r3
1153; P9BE-NEXT:    li r3, 2
1154; P9BE-NEXT:    vextuhlx r3, r3, v2
1155; P9BE-NEXT:    extsh r3, r3
1156; P9BE-NEXT:    extsw r3, r3
1157; P9BE-NEXT:    ori r4, r4, 30865
1158; P9BE-NEXT:    mulld r4, r3, r4
1159; P9BE-NEXT:    rldicl r4, r4, 32, 32
1160; P9BE-NEXT:    add r4, r4, r3
1161; P9BE-NEXT:    srwi r5, r4, 31
1162; P9BE-NEXT:    srawi r4, r4, 9
1163; P9BE-NEXT:    add r4, r4, r5
1164; P9BE-NEXT:    mulli r4, r4, 654
1165; P9BE-NEXT:    subf r3, r4, r3
1166; P9BE-NEXT:    sldi r3, r3, 48
1167; P9BE-NEXT:    mtvsrd v2, r3
1168; P9BE-NEXT:    li r3, 0
1169; P9BE-NEXT:    sldi r3, r3, 48
1170; P9BE-NEXT:    vmrghh v3, v3, v4
1171; P9BE-NEXT:    mtvsrd v4, r3
1172; P9BE-NEXT:    vmrghh v2, v4, v2
1173; P9BE-NEXT:    vmrghw v2, v2, v3
1174; P9BE-NEXT:    blr
1175;
1176; P8LE-LABEL: dont_fold_srem_one:
1177; P8LE:       # %bb.0:
1178; P8LE-NEXT:    xxswapd vs0, v2
1179; P8LE-NEXT:    lis r3, 24749
1180; P8LE-NEXT:    lis r8, -19946
1181; P8LE-NEXT:    lis r10, -14230
1182; P8LE-NEXT:    xxlxor v5, v5, v5
1183; P8LE-NEXT:    ori r3, r3, 47143
1184; P8LE-NEXT:    ori r8, r8, 17097
1185; P8LE-NEXT:    mffprd r4, f0
1186; P8LE-NEXT:    rldicl r5, r4, 16, 48
1187; P8LE-NEXT:    rldicl r6, r4, 32, 48
1188; P8LE-NEXT:    rldicl r4, r4, 48, 48
1189; P8LE-NEXT:    extsh r7, r5
1190; P8LE-NEXT:    extsh r9, r6
1191; P8LE-NEXT:    extsw r7, r7
1192; P8LE-NEXT:    extsh r11, r4
1193; P8LE-NEXT:    extsw r9, r9
1194; P8LE-NEXT:    mulld r3, r7, r3
1195; P8LE-NEXT:    ori r7, r10, 30865
1196; P8LE-NEXT:    extsw r10, r11
1197; P8LE-NEXT:    mulld r8, r9, r8
1198; P8LE-NEXT:    mulld r7, r10, r7
1199; P8LE-NEXT:    rldicl r11, r3, 1, 63
1200; P8LE-NEXT:    rldicl r3, r3, 32, 32
1201; P8LE-NEXT:    rldicl r8, r8, 32, 32
1202; P8LE-NEXT:    rldicl r7, r7, 32, 32
1203; P8LE-NEXT:    add r8, r8, r9
1204; P8LE-NEXT:    srawi r3, r3, 11
1205; P8LE-NEXT:    add r7, r7, r10
1206; P8LE-NEXT:    srwi r9, r8, 31
1207; P8LE-NEXT:    srawi r8, r8, 4
1208; P8LE-NEXT:    add r3, r3, r11
1209; P8LE-NEXT:    add r8, r8, r9
1210; P8LE-NEXT:    srwi r9, r7, 31
1211; P8LE-NEXT:    srawi r7, r7, 9
1212; P8LE-NEXT:    mulli r3, r3, 5423
1213; P8LE-NEXT:    add r7, r7, r9
1214; P8LE-NEXT:    mulli r8, r8, 23
1215; P8LE-NEXT:    mulli r7, r7, 654
1216; P8LE-NEXT:    subf r3, r3, r5
1217; P8LE-NEXT:    mtfprd f0, r3
1218; P8LE-NEXT:    subf r3, r8, r6
1219; P8LE-NEXT:    subf r4, r7, r4
1220; P8LE-NEXT:    mtfprd f1, r3
1221; P8LE-NEXT:    mtfprd f2, r4
1222; P8LE-NEXT:    xxswapd v2, vs0
1223; P8LE-NEXT:    xxswapd v3, vs1
1224; P8LE-NEXT:    xxswapd v4, vs2
1225; P8LE-NEXT:    vmrglh v2, v2, v3
1226; P8LE-NEXT:    vmrglh v3, v4, v5
1227; P8LE-NEXT:    vmrglw v2, v2, v3
1228; P8LE-NEXT:    blr
1229;
1230; P8BE-LABEL: dont_fold_srem_one:
1231; P8BE:       # %bb.0:
1232; P8BE-NEXT:    mfvsrd r4, v2
1233; P8BE-NEXT:    lis r3, 24749
1234; P8BE-NEXT:    lis r7, -19946
1235; P8BE-NEXT:    lis r8, -14230
1236; P8BE-NEXT:    ori r3, r3, 47143
1237; P8BE-NEXT:    ori r7, r7, 17097
1238; P8BE-NEXT:    ori r8, r8, 30865
1239; P8BE-NEXT:    clrldi r5, r4, 48
1240; P8BE-NEXT:    rldicl r6, r4, 48, 48
1241; P8BE-NEXT:    rldicl r4, r4, 32, 48
1242; P8BE-NEXT:    extsh r5, r5
1243; P8BE-NEXT:    extsh r6, r6
1244; P8BE-NEXT:    extsh r4, r4
1245; P8BE-NEXT:    extsw r5, r5
1246; P8BE-NEXT:    extsw r6, r6
1247; P8BE-NEXT:    extsw r4, r4
1248; P8BE-NEXT:    mulld r3, r5, r3
1249; P8BE-NEXT:    mulld r7, r6, r7
1250; P8BE-NEXT:    mulld r8, r4, r8
1251; P8BE-NEXT:    rldicl r9, r3, 1, 63
1252; P8BE-NEXT:    rldicl r3, r3, 32, 32
1253; P8BE-NEXT:    rldicl r7, r7, 32, 32
1254; P8BE-NEXT:    rldicl r8, r8, 32, 32
1255; P8BE-NEXT:    srawi r3, r3, 11
1256; P8BE-NEXT:    add r7, r7, r6
1257; P8BE-NEXT:    add r8, r8, r4
1258; P8BE-NEXT:    add r3, r3, r9
1259; P8BE-NEXT:    srwi r9, r7, 31
1260; P8BE-NEXT:    srawi r7, r7, 4
1261; P8BE-NEXT:    mulli r3, r3, 5423
1262; P8BE-NEXT:    add r7, r7, r9
1263; P8BE-NEXT:    srwi r9, r8, 31
1264; P8BE-NEXT:    srawi r8, r8, 9
1265; P8BE-NEXT:    mulli r7, r7, 23
1266; P8BE-NEXT:    add r8, r8, r9
1267; P8BE-NEXT:    li r9, 0
1268; P8BE-NEXT:    mulli r8, r8, 654
1269; P8BE-NEXT:    subf r3, r3, r5
1270; P8BE-NEXT:    sldi r5, r9, 48
1271; P8BE-NEXT:    sldi r3, r3, 48
1272; P8BE-NEXT:    mtvsrd v2, r5
1273; P8BE-NEXT:    subf r5, r7, r6
1274; P8BE-NEXT:    mtvsrd v3, r3
1275; P8BE-NEXT:    sldi r3, r5, 48
1276; P8BE-NEXT:    subf r4, r8, r4
1277; P8BE-NEXT:    mtvsrd v4, r3
1278; P8BE-NEXT:    sldi r4, r4, 48
1279; P8BE-NEXT:    mtvsrd v5, r4
1280; P8BE-NEXT:    vmrghh v3, v4, v3
1281; P8BE-NEXT:    vmrghh v2, v2, v5
1282; P8BE-NEXT:    vmrghw v2, v2, v3
1283; P8BE-NEXT:    blr
1284  %1 = srem <4 x i16> %x, <i16 1, i16 654, i16 23, i16 5423>
1285  ret <4 x i16> %1
1286}
1287
1288; Don't fold if the divisor is 2^15.
1289define <4 x i16> @dont_fold_urem_i16_smax(<4 x i16> %x) {
1290; P9LE-LABEL: dont_fold_urem_i16_smax:
1291; P9LE:       # %bb.0:
1292; P9LE-NEXT:    li r3, 4
1293; P9LE-NEXT:    vextuhrx r3, r3, v2
1294; P9LE-NEXT:    extsh r4, r3
1295; P9LE-NEXT:    lis r5, -19946
1296; P9LE-NEXT:    ori r5, r5, 17097
1297; P9LE-NEXT:    extsw r4, r4
1298; P9LE-NEXT:    mulld r5, r4, r5
1299; P9LE-NEXT:    rldicl r5, r5, 32, 32
1300; P9LE-NEXT:    add r4, r5, r4
1301; P9LE-NEXT:    srwi r5, r4, 31
1302; P9LE-NEXT:    srawi r4, r4, 4
1303; P9LE-NEXT:    add r4, r4, r5
1304; P9LE-NEXT:    lis r5, 24749
1305; P9LE-NEXT:    mulli r4, r4, 23
1306; P9LE-NEXT:    subf r3, r4, r3
1307; P9LE-NEXT:    mtfprd f0, r3
1308; P9LE-NEXT:    li r3, 6
1309; P9LE-NEXT:    vextuhrx r3, r3, v2
1310; P9LE-NEXT:    extsh r4, r3
1311; P9LE-NEXT:    extsw r4, r4
1312; P9LE-NEXT:    ori r5, r5, 47143
1313; P9LE-NEXT:    mulld r4, r4, r5
1314; P9LE-NEXT:    rldicl r5, r4, 1, 63
1315; P9LE-NEXT:    rldicl r4, r4, 32, 32
1316; P9LE-NEXT:    srawi r4, r4, 11
1317; P9LE-NEXT:    add r4, r4, r5
1318; P9LE-NEXT:    mulli r4, r4, 5423
1319; P9LE-NEXT:    subf r3, r4, r3
1320; P9LE-NEXT:    xxswapd v3, vs0
1321; P9LE-NEXT:    mtfprd f0, r3
1322; P9LE-NEXT:    li r3, 2
1323; P9LE-NEXT:    vextuhrx r3, r3, v2
1324; P9LE-NEXT:    extsh r4, r3
1325; P9LE-NEXT:    srawi r4, r4, 15
1326; P9LE-NEXT:    addze r4, r4
1327; P9LE-NEXT:    slwi r4, r4, 15
1328; P9LE-NEXT:    subf r3, r4, r3
1329; P9LE-NEXT:    xxswapd v4, vs0
1330; P9LE-NEXT:    mtfprd f0, r3
1331; P9LE-NEXT:    xxswapd v2, vs0
1332; P9LE-NEXT:    vmrglh v3, v4, v3
1333; P9LE-NEXT:    xxlxor v4, v4, v4
1334; P9LE-NEXT:    vmrglh v2, v2, v4
1335; P9LE-NEXT:    vmrglw v2, v3, v2
1336; P9LE-NEXT:    blr
1337;
1338; P9BE-LABEL: dont_fold_urem_i16_smax:
1339; P9BE:       # %bb.0:
1340; P9BE-NEXT:    li r3, 4
1341; P9BE-NEXT:    vextuhlx r3, r3, v2
1342; P9BE-NEXT:    extsh r3, r3
1343; P9BE-NEXT:    lis r4, -19946
1344; P9BE-NEXT:    ori r4, r4, 17097
1345; P9BE-NEXT:    extsw r3, r3
1346; P9BE-NEXT:    mulld r4, r3, r4
1347; P9BE-NEXT:    rldicl r4, r4, 32, 32
1348; P9BE-NEXT:    add r4, r4, r3
1349; P9BE-NEXT:    srwi r5, r4, 31
1350; P9BE-NEXT:    srawi r4, r4, 4
1351; P9BE-NEXT:    add r4, r4, r5
1352; P9BE-NEXT:    mulli r4, r4, 23
1353; P9BE-NEXT:    subf r3, r4, r3
1354; P9BE-NEXT:    lis r4, 24749
1355; P9BE-NEXT:    sldi r3, r3, 48
1356; P9BE-NEXT:    mtvsrd v3, r3
1357; P9BE-NEXT:    li r3, 6
1358; P9BE-NEXT:    vextuhlx r3, r3, v2
1359; P9BE-NEXT:    extsh r3, r3
1360; P9BE-NEXT:    extsw r3, r3
1361; P9BE-NEXT:    ori r4, r4, 47143
1362; P9BE-NEXT:    mulld r4, r3, r4
1363; P9BE-NEXT:    rldicl r5, r4, 1, 63
1364; P9BE-NEXT:    rldicl r4, r4, 32, 32
1365; P9BE-NEXT:    srawi r4, r4, 11
1366; P9BE-NEXT:    add r4, r4, r5
1367; P9BE-NEXT:    mulli r4, r4, 5423
1368; P9BE-NEXT:    subf r3, r4, r3
1369; P9BE-NEXT:    sldi r3, r3, 48
1370; P9BE-NEXT:    mtvsrd v4, r3
1371; P9BE-NEXT:    li r3, 2
1372; P9BE-NEXT:    vextuhlx r3, r3, v2
1373; P9BE-NEXT:    extsh r3, r3
1374; P9BE-NEXT:    srawi r4, r3, 15
1375; P9BE-NEXT:    addze r4, r4
1376; P9BE-NEXT:    slwi r4, r4, 15
1377; P9BE-NEXT:    subf r3, r4, r3
1378; P9BE-NEXT:    sldi r3, r3, 48
1379; P9BE-NEXT:    mtvsrd v2, r3
1380; P9BE-NEXT:    li r3, 0
1381; P9BE-NEXT:    sldi r3, r3, 48
1382; P9BE-NEXT:    vmrghh v3, v3, v4
1383; P9BE-NEXT:    mtvsrd v4, r3
1384; P9BE-NEXT:    vmrghh v2, v4, v2
1385; P9BE-NEXT:    vmrghw v2, v2, v3
1386; P9BE-NEXT:    blr
1387;
1388; P8LE-LABEL: dont_fold_urem_i16_smax:
1389; P8LE:       # %bb.0:
1390; P8LE-NEXT:    xxswapd vs0, v2
1391; P8LE-NEXT:    lis r6, 24749
1392; P8LE-NEXT:    lis r7, -19946
1393; P8LE-NEXT:    xxlxor v5, v5, v5
1394; P8LE-NEXT:    ori r6, r6, 47143
1395; P8LE-NEXT:    ori r7, r7, 17097
1396; P8LE-NEXT:    mffprd r3, f0
1397; P8LE-NEXT:    rldicl r4, r3, 16, 48
1398; P8LE-NEXT:    rldicl r5, r3, 32, 48
1399; P8LE-NEXT:    extsh r8, r4
1400; P8LE-NEXT:    extsh r9, r5
1401; P8LE-NEXT:    extsw r8, r8
1402; P8LE-NEXT:    extsw r9, r9
1403; P8LE-NEXT:    mulld r6, r8, r6
1404; P8LE-NEXT:    mulld r7, r9, r7
1405; P8LE-NEXT:    rldicl r3, r3, 48, 48
1406; P8LE-NEXT:    rldicl r8, r6, 32, 32
1407; P8LE-NEXT:    rldicl r7, r7, 32, 32
1408; P8LE-NEXT:    rldicl r6, r6, 1, 63
1409; P8LE-NEXT:    srawi r8, r8, 11
1410; P8LE-NEXT:    add r7, r7, r9
1411; P8LE-NEXT:    add r6, r8, r6
1412; P8LE-NEXT:    srwi r8, r7, 31
1413; P8LE-NEXT:    srawi r7, r7, 4
1414; P8LE-NEXT:    mulli r6, r6, 5423
1415; P8LE-NEXT:    add r7, r7, r8
1416; P8LE-NEXT:    extsh r8, r3
1417; P8LE-NEXT:    mulli r7, r7, 23
1418; P8LE-NEXT:    srawi r8, r8, 15
1419; P8LE-NEXT:    subf r4, r6, r4
1420; P8LE-NEXT:    addze r6, r8
1421; P8LE-NEXT:    mtfprd f0, r4
1422; P8LE-NEXT:    slwi r4, r6, 15
1423; P8LE-NEXT:    subf r5, r7, r5
1424; P8LE-NEXT:    subf r3, r4, r3
1425; P8LE-NEXT:    mtfprd f1, r5
1426; P8LE-NEXT:    xxswapd v2, vs0
1427; P8LE-NEXT:    mtfprd f2, r3
1428; P8LE-NEXT:    xxswapd v3, vs1
1429; P8LE-NEXT:    xxswapd v4, vs2
1430; P8LE-NEXT:    vmrglh v2, v2, v3
1431; P8LE-NEXT:    vmrglh v3, v4, v5
1432; P8LE-NEXT:    vmrglw v2, v2, v3
1433; P8LE-NEXT:    blr
1434;
1435; P8BE-LABEL: dont_fold_urem_i16_smax:
1436; P8BE:       # %bb.0:
1437; P8BE-NEXT:    mfvsrd r4, v2
1438; P8BE-NEXT:    lis r3, 24749
1439; P8BE-NEXT:    lis r7, -19946
1440; P8BE-NEXT:    ori r3, r3, 47143
1441; P8BE-NEXT:    ori r7, r7, 17097
1442; P8BE-NEXT:    clrldi r5, r4, 48
1443; P8BE-NEXT:    rldicl r6, r4, 48, 48
1444; P8BE-NEXT:    extsh r5, r5
1445; P8BE-NEXT:    extsh r6, r6
1446; P8BE-NEXT:    extsw r5, r5
1447; P8BE-NEXT:    extsw r6, r6
1448; P8BE-NEXT:    mulld r3, r5, r3
1449; P8BE-NEXT:    mulld r7, r6, r7
1450; P8BE-NEXT:    rldicl r4, r4, 32, 48
1451; P8BE-NEXT:    extsh r4, r4
1452; P8BE-NEXT:    rldicl r8, r3, 1, 63
1453; P8BE-NEXT:    rldicl r3, r3, 32, 32
1454; P8BE-NEXT:    rldicl r7, r7, 32, 32
1455; P8BE-NEXT:    srawi r3, r3, 11
1456; P8BE-NEXT:    add r7, r7, r6
1457; P8BE-NEXT:    add r3, r3, r8
1458; P8BE-NEXT:    srwi r8, r7, 31
1459; P8BE-NEXT:    srawi r7, r7, 4
1460; P8BE-NEXT:    mulli r3, r3, 5423
1461; P8BE-NEXT:    add r7, r7, r8
1462; P8BE-NEXT:    li r8, 0
1463; P8BE-NEXT:    mulli r7, r7, 23
1464; P8BE-NEXT:    srawi r9, r4, 15
1465; P8BE-NEXT:    subf r3, r3, r5
1466; P8BE-NEXT:    sldi r5, r8, 48
1467; P8BE-NEXT:    addze r8, r9
1468; P8BE-NEXT:    mtvsrd v2, r5
1469; P8BE-NEXT:    subf r5, r7, r6
1470; P8BE-NEXT:    slwi r6, r8, 15
1471; P8BE-NEXT:    sldi r3, r3, 48
1472; P8BE-NEXT:    subf r4, r6, r4
1473; P8BE-NEXT:    mtvsrd v3, r3
1474; P8BE-NEXT:    sldi r3, r5, 48
1475; P8BE-NEXT:    sldi r4, r4, 48
1476; P8BE-NEXT:    mtvsrd v4, r3
1477; P8BE-NEXT:    mtvsrd v5, r4
1478; P8BE-NEXT:    vmrghh v3, v4, v3
1479; P8BE-NEXT:    vmrghh v2, v2, v5
1480; P8BE-NEXT:    vmrghw v2, v2, v3
1481; P8BE-NEXT:    blr
1482  %1 = srem <4 x i16> %x, <i16 1, i16 32768, i16 23, i16 5423>
1483  ret <4 x i16> %1
1484}
1485
1486; Don't fold i64 srem.
1487define <4 x i64> @dont_fold_srem_i64(<4 x i64> %x) {
1488; P9LE-LABEL: dont_fold_srem_i64:
1489; P9LE:       # %bb.0:
1490; P9LE-NEXT:    lis r4, 24749
1491; P9LE-NEXT:    ori r4, r4, 47142
1492; P9LE-NEXT:    sldi r4, r4, 32
1493; P9LE-NEXT:    oris r4, r4, 58853
1494; P9LE-NEXT:    mfvsrd r3, v3
1495; P9LE-NEXT:    ori r4, r4, 6055
1496; P9LE-NEXT:    mulhd r4, r3, r4
1497; P9LE-NEXT:    rldicl r5, r4, 1, 63
1498; P9LE-NEXT:    sradi r4, r4, 11
1499; P9LE-NEXT:    add r4, r4, r5
1500; P9LE-NEXT:    lis r5, -19946
1501; P9LE-NEXT:    mulli r4, r4, 5423
1502; P9LE-NEXT:    ori r5, r5, 17096
1503; P9LE-NEXT:    sldi r5, r5, 32
1504; P9LE-NEXT:    oris r5, r5, 22795
1505; P9LE-NEXT:    sub r3, r3, r4
1506; P9LE-NEXT:    mfvsrld r4, v3
1507; P9LE-NEXT:    ori r5, r5, 8549
1508; P9LE-NEXT:    mulhd r5, r4, r5
1509; P9LE-NEXT:    add r5, r5, r4
1510; P9LE-NEXT:    rldicl r6, r5, 1, 63
1511; P9LE-NEXT:    sradi r5, r5, 4
1512; P9LE-NEXT:    add r5, r5, r6
1513; P9LE-NEXT:    mulli r5, r5, 23
1514; P9LE-NEXT:    sub r4, r4, r5
1515; P9LE-NEXT:    mtvsrdd v3, r3, r4
1516; P9LE-NEXT:    lis r4, 25653
1517; P9LE-NEXT:    ori r4, r4, 15432
1518; P9LE-NEXT:    sldi r4, r4, 32
1519; P9LE-NEXT:    oris r4, r4, 1603
1520; P9LE-NEXT:    mfvsrd r3, v2
1521; P9LE-NEXT:    ori r4, r4, 21445
1522; P9LE-NEXT:    mulhd r4, r3, r4
1523; P9LE-NEXT:    rldicl r5, r4, 1, 63
1524; P9LE-NEXT:    sradi r4, r4, 8
1525; P9LE-NEXT:    add r4, r4, r5
1526; P9LE-NEXT:    mulli r4, r4, 654
1527; P9LE-NEXT:    sub r3, r3, r4
1528; P9LE-NEXT:    li r4, 0
1529; P9LE-NEXT:    mtvsrdd v2, r3, r4
1530; P9LE-NEXT:    blr
1531;
1532; P9BE-LABEL: dont_fold_srem_i64:
1533; P9BE:       # %bb.0:
1534; P9BE-NEXT:    lis r4, 24749
1535; P9BE-NEXT:    ori r4, r4, 47142
1536; P9BE-NEXT:    sldi r4, r4, 32
1537; P9BE-NEXT:    oris r4, r4, 58853
1538; P9BE-NEXT:    mfvsrld r3, v3
1539; P9BE-NEXT:    ori r4, r4, 6055
1540; P9BE-NEXT:    mulhd r4, r3, r4
1541; P9BE-NEXT:    rldicl r5, r4, 1, 63
1542; P9BE-NEXT:    sradi r4, r4, 11
1543; P9BE-NEXT:    add r4, r4, r5
1544; P9BE-NEXT:    lis r5, -19946
1545; P9BE-NEXT:    ori r5, r5, 17096
1546; P9BE-NEXT:    mulli r4, r4, 5423
1547; P9BE-NEXT:    sldi r5, r5, 32
1548; P9BE-NEXT:    oris r5, r5, 22795
1549; P9BE-NEXT:    sub r3, r3, r4
1550; P9BE-NEXT:    mfvsrd r4, v3
1551; P9BE-NEXT:    ori r5, r5, 8549
1552; P9BE-NEXT:    mulhd r5, r4, r5
1553; P9BE-NEXT:    add r5, r5, r4
1554; P9BE-NEXT:    rldicl r6, r5, 1, 63
1555; P9BE-NEXT:    sradi r5, r5, 4
1556; P9BE-NEXT:    add r5, r5, r6
1557; P9BE-NEXT:    mulli r5, r5, 23
1558; P9BE-NEXT:    sub r4, r4, r5
1559; P9BE-NEXT:    mtvsrdd v3, r4, r3
1560; P9BE-NEXT:    lis r4, 25653
1561; P9BE-NEXT:    ori r4, r4, 15432
1562; P9BE-NEXT:    sldi r4, r4, 32
1563; P9BE-NEXT:    oris r4, r4, 1603
1564; P9BE-NEXT:    mfvsrld r3, v2
1565; P9BE-NEXT:    ori r4, r4, 21445
1566; P9BE-NEXT:    mulhd r4, r3, r4
1567; P9BE-NEXT:    rldicl r5, r4, 1, 63
1568; P9BE-NEXT:    sradi r4, r4, 8
1569; P9BE-NEXT:    add r4, r4, r5
1570; P9BE-NEXT:    mulli r4, r4, 654
1571; P9BE-NEXT:    sub r3, r3, r4
1572; P9BE-NEXT:    mtvsrdd v2, 0, r3
1573; P9BE-NEXT:    blr
1574;
1575; P8LE-LABEL: dont_fold_srem_i64:
1576; P8LE:       # %bb.0:
1577; P8LE-NEXT:    lis r3, 24749
1578; P8LE-NEXT:    lis r4, -19946
1579; P8LE-NEXT:    lis r5, 25653
1580; P8LE-NEXT:    xxswapd vs0, v3
1581; P8LE-NEXT:    mfvsrd r6, v3
1582; P8LE-NEXT:    ori r3, r3, 47142
1583; P8LE-NEXT:    ori r4, r4, 17096
1584; P8LE-NEXT:    ori r5, r5, 15432
1585; P8LE-NEXT:    mfvsrd r7, v2
1586; P8LE-NEXT:    sldi r3, r3, 32
1587; P8LE-NEXT:    sldi r4, r4, 32
1588; P8LE-NEXT:    sldi r5, r5, 32
1589; P8LE-NEXT:    oris r3, r3, 58853
1590; P8LE-NEXT:    oris r4, r4, 22795
1591; P8LE-NEXT:    mffprd r8, f0
1592; P8LE-NEXT:    oris r5, r5, 1603
1593; P8LE-NEXT:    ori r3, r3, 6055
1594; P8LE-NEXT:    ori r4, r4, 8549
1595; P8LE-NEXT:    ori r5, r5, 21445
1596; P8LE-NEXT:    mulhd r3, r6, r3
1597; P8LE-NEXT:    mulhd r5, r7, r5
1598; P8LE-NEXT:    mulhd r4, r8, r4
1599; P8LE-NEXT:    rldicl r9, r3, 1, 63
1600; P8LE-NEXT:    sradi r3, r3, 11
1601; P8LE-NEXT:    add r3, r3, r9
1602; P8LE-NEXT:    rldicl r9, r5, 1, 63
1603; P8LE-NEXT:    add r4, r4, r8
1604; P8LE-NEXT:    sradi r5, r5, 8
1605; P8LE-NEXT:    mulli r3, r3, 5423
1606; P8LE-NEXT:    add r5, r5, r9
1607; P8LE-NEXT:    rldicl r9, r4, 1, 63
1608; P8LE-NEXT:    sradi r4, r4, 4
1609; P8LE-NEXT:    mulli r5, r5, 654
1610; P8LE-NEXT:    add r4, r4, r9
1611; P8LE-NEXT:    mulli r4, r4, 23
1612; P8LE-NEXT:    sub r3, r6, r3
1613; P8LE-NEXT:    mtfprd f0, r3
1614; P8LE-NEXT:    sub r5, r7, r5
1615; P8LE-NEXT:    mtfprd f1, r5
1616; P8LE-NEXT:    sub r3, r8, r4
1617; P8LE-NEXT:    li r4, 0
1618; P8LE-NEXT:    mtfprd f2, r3
1619; P8LE-NEXT:    mtfprd f3, r4
1620; P8LE-NEXT:    xxmrghd v3, vs0, vs2
1621; P8LE-NEXT:    xxmrghd v2, vs1, vs3
1622; P8LE-NEXT:    blr
1623;
1624; P8BE-LABEL: dont_fold_srem_i64:
1625; P8BE:       # %bb.0:
1626; P8BE-NEXT:    lis r4, -19946
1627; P8BE-NEXT:    lis r3, 24749
1628; P8BE-NEXT:    xxswapd vs0, v3
1629; P8BE-NEXT:    lis r5, 25653
1630; P8BE-NEXT:    xxswapd vs1, v2
1631; P8BE-NEXT:    ori r4, r4, 17096
1632; P8BE-NEXT:    ori r3, r3, 47142
1633; P8BE-NEXT:    ori r5, r5, 15432
1634; P8BE-NEXT:    mfvsrd r6, v3
1635; P8BE-NEXT:    sldi r4, r4, 32
1636; P8BE-NEXT:    sldi r3, r3, 32
1637; P8BE-NEXT:    oris r4, r4, 22795
1638; P8BE-NEXT:    sldi r5, r5, 32
1639; P8BE-NEXT:    oris r3, r3, 58853
1640; P8BE-NEXT:    mffprd r7, f0
1641; P8BE-NEXT:    ori r4, r4, 8549
1642; P8BE-NEXT:    ori r3, r3, 6055
1643; P8BE-NEXT:    oris r5, r5, 1603
1644; P8BE-NEXT:    mffprd r8, f1
1645; P8BE-NEXT:    mulhd r4, r6, r4
1646; P8BE-NEXT:    mulhd r3, r7, r3
1647; P8BE-NEXT:    ori r5, r5, 21445
1648; P8BE-NEXT:    mulhd r5, r8, r5
1649; P8BE-NEXT:    add r4, r4, r6
1650; P8BE-NEXT:    rldicl r9, r3, 1, 63
1651; P8BE-NEXT:    sradi r3, r3, 11
1652; P8BE-NEXT:    rldicl r10, r4, 1, 63
1653; P8BE-NEXT:    sradi r4, r4, 4
1654; P8BE-NEXT:    add r3, r3, r9
1655; P8BE-NEXT:    rldicl r9, r5, 1, 63
1656; P8BE-NEXT:    add r4, r4, r10
1657; P8BE-NEXT:    sradi r5, r5, 8
1658; P8BE-NEXT:    mulli r3, r3, 5423
1659; P8BE-NEXT:    add r5, r5, r9
1660; P8BE-NEXT:    mulli r4, r4, 23
1661; P8BE-NEXT:    mulli r5, r5, 654
1662; P8BE-NEXT:    sub r3, r7, r3
1663; P8BE-NEXT:    sub r4, r6, r4
1664; P8BE-NEXT:    mtfprd f0, r3
1665; P8BE-NEXT:    sub r3, r8, r5
1666; P8BE-NEXT:    mtfprd f1, r4
1667; P8BE-NEXT:    li r4, 0
1668; P8BE-NEXT:    mtfprd f2, r3
1669; P8BE-NEXT:    mtfprd f3, r4
1670; P8BE-NEXT:    xxmrghd v3, vs1, vs0
1671; P8BE-NEXT:    xxmrghd v2, vs3, vs2
1672; P8BE-NEXT:    blr
1673  %1 = srem <4 x i64> %x, <i64 1, i64 654, i64 23, i64 5423>
1674  ret <4 x i64> %1
1675}
1676