xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-immediates.ll (revision 8e0cd7382adacd8bc1741dc26bc0be6bdf8e238a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8; Although SVE immediate packing should be fully tested using scalable vectors,
9; these tests protects against the possibility that scalable nodes, resulting
10; from lowering fixed length vector operations, trigger different isel patterns.
11
12; FIXME: These instructions should have the immediate form
13
14;
15; ADD
16;
17
18define void @add_v32i8(ptr %a) {
19; CHECK-LABEL: add_v32i8:
20; CHECK:       // %bb.0:
21; CHECK-NEXT:    ldp q0, q1, [x0]
22; CHECK-NEXT:    add z0.b, z0.b, #7 // =0x7
23; CHECK-NEXT:    add z1.b, z1.b, #7 // =0x7
24; CHECK-NEXT:    stp q0, q1, [x0]
25; CHECK-NEXT:    ret
26;
27; NONEON-NOSVE-LABEL: add_v32i8:
28; NONEON-NOSVE:       // %bb.0:
29; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
30; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
31; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
32; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
33; NONEON-NOSVE-NEXT:    add w8, w8, #7
34; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
35; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
36; NONEON-NOSVE-NEXT:    add w8, w8, #7
37; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
38; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
39; NONEON-NOSVE-NEXT:    add w8, w8, #7
40; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
41; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
42; NONEON-NOSVE-NEXT:    add w8, w8, #7
43; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
44; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
45; NONEON-NOSVE-NEXT:    add w8, w8, #7
46; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
47; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
48; NONEON-NOSVE-NEXT:    add w8, w8, #7
49; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
50; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
51; NONEON-NOSVE-NEXT:    add w8, w8, #7
52; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
53; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
54; NONEON-NOSVE-NEXT:    add w8, w8, #7
55; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
56; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
57; NONEON-NOSVE-NEXT:    add w8, w8, #7
58; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
59; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
60; NONEON-NOSVE-NEXT:    add w8, w8, #7
61; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
62; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
63; NONEON-NOSVE-NEXT:    add w8, w8, #7
64; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
65; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
66; NONEON-NOSVE-NEXT:    add w8, w8, #7
67; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
68; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
69; NONEON-NOSVE-NEXT:    add w8, w8, #7
70; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
71; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
72; NONEON-NOSVE-NEXT:    add w8, w8, #7
73; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
74; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
75; NONEON-NOSVE-NEXT:    add w8, w8, #7
76; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
77; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
78; NONEON-NOSVE-NEXT:    add w8, w8, #7
79; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
80; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
81; NONEON-NOSVE-NEXT:    add w8, w8, #7
82; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
83; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
84; NONEON-NOSVE-NEXT:    add w8, w8, #7
85; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
86; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
87; NONEON-NOSVE-NEXT:    add w8, w8, #7
88; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
89; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
90; NONEON-NOSVE-NEXT:    add w8, w8, #7
91; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
92; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
93; NONEON-NOSVE-NEXT:    add w8, w8, #7
94; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
95; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
96; NONEON-NOSVE-NEXT:    add w8, w8, #7
97; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
98; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
99; NONEON-NOSVE-NEXT:    add w8, w8, #7
100; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
101; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
102; NONEON-NOSVE-NEXT:    add w8, w8, #7
103; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
104; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
105; NONEON-NOSVE-NEXT:    add w8, w8, #7
106; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
107; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
108; NONEON-NOSVE-NEXT:    add w8, w8, #7
109; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
110; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
111; NONEON-NOSVE-NEXT:    add w8, w8, #7
112; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
113; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
114; NONEON-NOSVE-NEXT:    add w8, w8, #7
115; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
116; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
117; NONEON-NOSVE-NEXT:    add w8, w8, #7
118; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
119; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
120; NONEON-NOSVE-NEXT:    add w8, w8, #7
121; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
122; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
123; NONEON-NOSVE-NEXT:    add w8, w8, #7
124; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
125; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
126; NONEON-NOSVE-NEXT:    add w8, w8, #7
127; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
128; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
129; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
130; NONEON-NOSVE-NEXT:    add sp, sp, #64
131; NONEON-NOSVE-NEXT:    ret
132  %op1 = load <32 x i8>, ptr %a
133  %ins = insertelement <32 x i8> undef, i8 7, i32 0
134  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
135  %res = add <32 x i8> %op1, %op2
136  store <32 x i8> %res, ptr %a
137  ret void
138}
139
140define void @add_v16i16(ptr %a) {
141; CHECK-LABEL: add_v16i16:
142; CHECK:       // %bb.0:
143; CHECK-NEXT:    ldp q0, q1, [x0]
144; CHECK-NEXT:    add z0.h, z0.h, #15 // =0xf
145; CHECK-NEXT:    add z1.h, z1.h, #15 // =0xf
146; CHECK-NEXT:    stp q0, q1, [x0]
147; CHECK-NEXT:    ret
148;
149; NONEON-NOSVE-LABEL: add_v16i16:
150; NONEON-NOSVE:       // %bb.0:
151; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
152; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
153; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
154; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
155; NONEON-NOSVE-NEXT:    add w8, w8, #15
156; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
157; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
158; NONEON-NOSVE-NEXT:    add w8, w8, #15
159; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
160; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
161; NONEON-NOSVE-NEXT:    add w8, w8, #15
162; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
163; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
164; NONEON-NOSVE-NEXT:    add w8, w8, #15
165; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
166; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
167; NONEON-NOSVE-NEXT:    add w8, w8, #15
168; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
169; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
170; NONEON-NOSVE-NEXT:    add w8, w8, #15
171; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
172; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
173; NONEON-NOSVE-NEXT:    add w8, w8, #15
174; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
175; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
176; NONEON-NOSVE-NEXT:    add w8, w8, #15
177; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
178; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
179; NONEON-NOSVE-NEXT:    add w8, w8, #15
180; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
181; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
182; NONEON-NOSVE-NEXT:    add w8, w8, #15
183; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
184; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
185; NONEON-NOSVE-NEXT:    add w8, w8, #15
186; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
187; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
188; NONEON-NOSVE-NEXT:    add w8, w8, #15
189; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
190; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
191; NONEON-NOSVE-NEXT:    add w8, w8, #15
192; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
193; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
194; NONEON-NOSVE-NEXT:    add w8, w8, #15
195; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
196; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
197; NONEON-NOSVE-NEXT:    add w8, w8, #15
198; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
199; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
200; NONEON-NOSVE-NEXT:    add w8, w8, #15
201; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
202; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
203; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
204; NONEON-NOSVE-NEXT:    add sp, sp, #64
205; NONEON-NOSVE-NEXT:    ret
206  %op1 = load <16 x i16>, ptr %a
207  %ins = insertelement <16 x i16> undef, i16 15, i64 0
208  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
209  %res = add <16 x i16> %op1, %op2
210  store <16 x i16> %res, ptr %a
211  ret void
212}
213
214define void @add_v8i32(ptr %a) {
215; CHECK-LABEL: add_v8i32:
216; CHECK:       // %bb.0:
217; CHECK-NEXT:    ldp q0, q1, [x0]
218; CHECK-NEXT:    add z0.s, z0.s, #31 // =0x1f
219; CHECK-NEXT:    add z1.s, z1.s, #31 // =0x1f
220; CHECK-NEXT:    stp q0, q1, [x0]
221; CHECK-NEXT:    ret
222;
223; NONEON-NOSVE-LABEL: add_v8i32:
224; NONEON-NOSVE:       // %bb.0:
225; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
226; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
227; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
228; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
229; NONEON-NOSVE-NEXT:    add w9, w8, #31
230; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
231; NONEON-NOSVE-NEXT:    add w8, w8, #31
232; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
233; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
234; NONEON-NOSVE-NEXT:    add w9, w8, #31
235; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
236; NONEON-NOSVE-NEXT:    add w8, w8, #31
237; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
238; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
239; NONEON-NOSVE-NEXT:    add w9, w8, #31
240; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
241; NONEON-NOSVE-NEXT:    add w8, w8, #31
242; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
243; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
244; NONEON-NOSVE-NEXT:    add w9, w8, #31
245; NONEON-NOSVE-NEXT:    ldr w8, [sp]
246; NONEON-NOSVE-NEXT:    add w8, w8, #31
247; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
248; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
249; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
250; NONEON-NOSVE-NEXT:    add sp, sp, #64
251; NONEON-NOSVE-NEXT:    ret
252  %op1 = load <8 x i32>, ptr %a
253  %ins = insertelement <8 x i32> undef, i32 31, i64 0
254  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
255  %res = add <8 x i32> %op1, %op2
256  store <8 x i32> %res, ptr %a
257  ret void
258}
259
260define void @add_v4i64(ptr %a) {
261; CHECK-LABEL: add_v4i64:
262; CHECK:       // %bb.0:
263; CHECK-NEXT:    ldp q0, q1, [x0]
264; CHECK-NEXT:    add z0.d, z0.d, #63 // =0x3f
265; CHECK-NEXT:    add z1.d, z1.d, #63 // =0x3f
266; CHECK-NEXT:    stp q0, q1, [x0]
267; CHECK-NEXT:    ret
268;
269; NONEON-NOSVE-LABEL: add_v4i64:
270; NONEON-NOSVE:       // %bb.0:
271; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
272; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
273; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
274; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
275; NONEON-NOSVE-NEXT:    add x9, x8, #63
276; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
277; NONEON-NOSVE-NEXT:    add x8, x8, #63
278; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
279; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
280; NONEON-NOSVE-NEXT:    add x9, x8, #63
281; NONEON-NOSVE-NEXT:    ldr x8, [sp]
282; NONEON-NOSVE-NEXT:    add x8, x8, #63
283; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
284; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
285; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
286; NONEON-NOSVE-NEXT:    add sp, sp, #64
287; NONEON-NOSVE-NEXT:    ret
288  %op1 = load <4 x i64>, ptr %a
289  %ins = insertelement <4 x i64> undef, i64 63, i64 0
290  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
291  %res = add <4 x i64> %op1, %op2
292  store <4 x i64> %res, ptr %a
293  ret void
294}
295
296;
297; AND
298;
299
300define void @and_v32i8(ptr %a) {
301; CHECK-LABEL: and_v32i8:
302; CHECK:       // %bb.0:
303; CHECK-NEXT:    ldp q0, q1, [x0]
304; CHECK-NEXT:    and z0.b, z0.b, #0x7
305; CHECK-NEXT:    and z1.b, z1.b, #0x7
306; CHECK-NEXT:    stp q0, q1, [x0]
307; CHECK-NEXT:    ret
308;
309; NONEON-NOSVE-LABEL: and_v32i8:
310; NONEON-NOSVE:       // %bb.0:
311; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
312; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
313; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
314; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
315; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
316; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
317; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
318; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
319; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
320; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
321; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
322; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
323; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
324; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
325; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
326; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
327; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
328; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
329; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
330; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
331; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
332; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
333; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
334; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
335; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
336; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
337; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
338; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
339; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
340; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
341; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
342; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
343; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
344; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
345; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
346; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
347; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
348; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
349; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
350; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
351; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
352; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
353; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
354; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
355; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
356; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
357; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
358; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
359; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
360; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
361; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
362; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
363; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
364; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
365; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
366; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
367; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
368; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
369; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
370; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
371; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
372; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
373; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
374; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
375; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
376; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
377; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
378; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
379; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
380; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
381; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
382; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
383; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
384; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
385; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
386; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
387; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
388; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
389; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
390; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
391; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
392; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
393; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
394; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
395; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
396; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
397; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
398; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
399; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
400; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
401; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
402; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
403; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
404; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
405; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
406; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
407; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
408; NONEON-NOSVE-NEXT:    and w8, w8, #0x7
409; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
410; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
411; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
412; NONEON-NOSVE-NEXT:    add sp, sp, #64
413; NONEON-NOSVE-NEXT:    ret
414  %op1 = load <32 x i8>, ptr %a
415  %ins = insertelement <32 x i8> undef, i8 7, i32 0
416  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
417  %res = and <32 x i8> %op1, %op2
418  store <32 x i8> %res, ptr %a
419  ret void
420}
421
422define void @and_v16i16(ptr %a) {
423; CHECK-LABEL: and_v16i16:
424; CHECK:       // %bb.0:
425; CHECK-NEXT:    ldp q0, q1, [x0]
426; CHECK-NEXT:    and z0.h, z0.h, #0xf
427; CHECK-NEXT:    and z1.h, z1.h, #0xf
428; CHECK-NEXT:    stp q0, q1, [x0]
429; CHECK-NEXT:    ret
430;
431; NONEON-NOSVE-LABEL: and_v16i16:
432; NONEON-NOSVE:       // %bb.0:
433; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
434; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
435; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
436; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
437; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
438; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
439; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
440; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
441; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
442; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
443; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
444; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
445; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
446; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
447; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
448; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
449; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
450; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
451; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
452; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
453; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
454; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
455; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
456; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
457; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
458; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
459; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
460; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
461; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
462; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
463; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
464; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
465; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
466; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
467; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
468; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
469; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
470; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
471; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
472; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
473; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
474; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
475; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
476; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
477; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
478; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
479; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
480; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
481; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
482; NONEON-NOSVE-NEXT:    and w8, w8, #0xf
483; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
484; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
485; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
486; NONEON-NOSVE-NEXT:    add sp, sp, #64
487; NONEON-NOSVE-NEXT:    ret
488  %op1 = load <16 x i16>, ptr %a
489  %ins = insertelement <16 x i16> undef, i16 15, i64 0
490  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
491  %res = and <16 x i16> %op1, %op2
492  store <16 x i16> %res, ptr %a
493  ret void
494}
495
496define void @and_v8i32(ptr %a) {
497; CHECK-LABEL: and_v8i32:
498; CHECK:       // %bb.0:
499; CHECK-NEXT:    ldp q0, q1, [x0]
500; CHECK-NEXT:    and z0.s, z0.s, #0x1f
501; CHECK-NEXT:    and z1.s, z1.s, #0x1f
502; CHECK-NEXT:    stp q0, q1, [x0]
503; CHECK-NEXT:    ret
504;
505; NONEON-NOSVE-LABEL: and_v8i32:
506; NONEON-NOSVE:       // %bb.0:
507; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
508; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
509; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
510; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
511; NONEON-NOSVE-NEXT:    and w9, w8, #0x1f
512; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
513; NONEON-NOSVE-NEXT:    and w8, w8, #0x1f
514; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
515; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
516; NONEON-NOSVE-NEXT:    and w9, w8, #0x1f
517; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
518; NONEON-NOSVE-NEXT:    and w8, w8, #0x1f
519; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
520; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
521; NONEON-NOSVE-NEXT:    and w9, w8, #0x1f
522; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
523; NONEON-NOSVE-NEXT:    and w8, w8, #0x1f
524; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
525; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
526; NONEON-NOSVE-NEXT:    and w9, w8, #0x1f
527; NONEON-NOSVE-NEXT:    ldr w8, [sp]
528; NONEON-NOSVE-NEXT:    and w8, w8, #0x1f
529; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
530; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
531; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
532; NONEON-NOSVE-NEXT:    add sp, sp, #64
533; NONEON-NOSVE-NEXT:    ret
534  %op1 = load <8 x i32>, ptr %a
535  %ins = insertelement <8 x i32> undef, i32 31, i64 0
536  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
537  %res = and <8 x i32> %op1, %op2
538  store <8 x i32> %res, ptr %a
539  ret void
540}
541
542define void @and_v4i64(ptr %a) {
543; CHECK-LABEL: and_v4i64:
544; CHECK:       // %bb.0:
545; CHECK-NEXT:    ldp q0, q1, [x0]
546; CHECK-NEXT:    and z0.d, z0.d, #0x3f
547; CHECK-NEXT:    and z1.d, z1.d, #0x3f
548; CHECK-NEXT:    stp q0, q1, [x0]
549; CHECK-NEXT:    ret
550;
551; NONEON-NOSVE-LABEL: and_v4i64:
552; NONEON-NOSVE:       // %bb.0:
553; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
554; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
555; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
556; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
557; NONEON-NOSVE-NEXT:    and x9, x8, #0x3f
558; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
559; NONEON-NOSVE-NEXT:    and x8, x8, #0x3f
560; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
561; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
562; NONEON-NOSVE-NEXT:    and x9, x8, #0x3f
563; NONEON-NOSVE-NEXT:    ldr x8, [sp]
564; NONEON-NOSVE-NEXT:    and x8, x8, #0x3f
565; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
566; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
567; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
568; NONEON-NOSVE-NEXT:    add sp, sp, #64
569; NONEON-NOSVE-NEXT:    ret
570  %op1 = load <4 x i64>, ptr %a
571  %ins = insertelement <4 x i64> undef, i64 63, i64 0
572  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
573  %res = and <4 x i64> %op1, %op2
574  store <4 x i64> %res, ptr %a
575  ret void
576}
577
578;
579; ASHR
580;
581
582define void @ashr_v32i8(ptr %a) {
583; CHECK-LABEL: ashr_v32i8:
584; CHECK:       // %bb.0:
585; CHECK-NEXT:    ldp q0, q1, [x0]
586; CHECK-NEXT:    asr z0.b, z0.b, #7
587; CHECK-NEXT:    asr z1.b, z1.b, #7
588; CHECK-NEXT:    stp q0, q1, [x0]
589; CHECK-NEXT:    ret
590;
591; NONEON-NOSVE-LABEL: ashr_v32i8:
592; NONEON-NOSVE:       // %bb.0:
593; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
594; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
595; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
596; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
597; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
598; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
599; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
600; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
601; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
602; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
603; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
604; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
605; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
606; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
607; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
608; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
609; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
610; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
611; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
612; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
613; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
614; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
615; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
616; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
617; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
618; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
619; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
620; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
621; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
622; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
623; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
624; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
625; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
626; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
627; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
628; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
629; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
630; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
631; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
632; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
633; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
634; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
635; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
636; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
637; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
638; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
639; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
640; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
641; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
642; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
643; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
644; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #15]
645; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
646; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
647; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #14]
648; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
649; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
650; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #13]
651; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
652; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
653; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #12]
654; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
655; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
656; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #11]
657; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
658; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
659; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #10]
660; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
661; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
662; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #9]
663; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
664; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
665; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #8]
666; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
667; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
668; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #7]
669; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
670; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
671; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #6]
672; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
673; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
674; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #5]
675; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
676; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
677; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #4]
678; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
679; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
680; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #3]
681; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
682; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
683; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #2]
684; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
685; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
686; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #1]
687; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
688; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
689; NONEON-NOSVE-NEXT:    ldrsb w8, [sp]
690; NONEON-NOSVE-NEXT:    lsr w8, w8, #7
691; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
692; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
693; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
694; NONEON-NOSVE-NEXT:    add sp, sp, #64
695; NONEON-NOSVE-NEXT:    ret
696  %op1 = load <32 x i8>, ptr %a
697  %ins = insertelement <32 x i8> undef, i8 7, i32 0
698  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
699  %res = ashr <32 x i8> %op1, %op2
700  store <32 x i8> %res, ptr %a
701  ret void
702}
703
704define void @ashr_v16i16(ptr %a) {
705; CHECK-LABEL: ashr_v16i16:
706; CHECK:       // %bb.0:
707; CHECK-NEXT:    ldp q0, q1, [x0]
708; CHECK-NEXT:    asr z0.h, z0.h, #15
709; CHECK-NEXT:    asr z1.h, z1.h, #15
710; CHECK-NEXT:    stp q0, q1, [x0]
711; CHECK-NEXT:    ret
712;
713; NONEON-NOSVE-LABEL: ashr_v16i16:
714; NONEON-NOSVE:       // %bb.0:
715; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
716; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
717; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
718; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
719; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
720; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
721; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
722; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
723; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
724; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
725; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
726; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
727; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
728; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
729; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
730; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
731; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
732; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
733; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
734; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
735; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
736; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
737; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
738; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
739; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
740; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
741; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
742; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #14]
743; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
744; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
745; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
746; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
747; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
748; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #10]
749; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
750; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
751; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
752; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
753; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
754; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #6]
755; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
756; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
757; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
758; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
759; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
760; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #2]
761; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
762; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
763; NONEON-NOSVE-NEXT:    ldrsh w8, [sp]
764; NONEON-NOSVE-NEXT:    lsr w8, w8, #15
765; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
766; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
767; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
768; NONEON-NOSVE-NEXT:    add sp, sp, #64
769; NONEON-NOSVE-NEXT:    ret
770  %op1 = load <16 x i16>, ptr %a
771  %ins = insertelement <16 x i16> undef, i16 15, i64 0
772  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
773  %res = ashr <16 x i16> %op1, %op2
774  store <16 x i16> %res, ptr %a
775  ret void
776}
777
778define void @ashr_v8i32(ptr %a) {
779; CHECK-LABEL: ashr_v8i32:
780; CHECK:       // %bb.0:
781; CHECK-NEXT:    ldp q0, q1, [x0]
782; CHECK-NEXT:    asr z0.s, z0.s, #31
783; CHECK-NEXT:    asr z1.s, z1.s, #31
784; CHECK-NEXT:    stp q0, q1, [x0]
785; CHECK-NEXT:    ret
786;
787; NONEON-NOSVE-LABEL: ashr_v8i32:
788; NONEON-NOSVE:       // %bb.0:
789; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
790; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
791; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
792; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
793; NONEON-NOSVE-NEXT:    asr w9, w8, #31
794; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
795; NONEON-NOSVE-NEXT:    asr w8, w8, #31
796; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
797; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
798; NONEON-NOSVE-NEXT:    asr w9, w8, #31
799; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
800; NONEON-NOSVE-NEXT:    asr w8, w8, #31
801; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
802; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
803; NONEON-NOSVE-NEXT:    asr w9, w8, #31
804; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
805; NONEON-NOSVE-NEXT:    asr w8, w8, #31
806; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
807; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
808; NONEON-NOSVE-NEXT:    asr w9, w8, #31
809; NONEON-NOSVE-NEXT:    ldr w8, [sp]
810; NONEON-NOSVE-NEXT:    asr w8, w8, #31
811; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
812; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
813; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
814; NONEON-NOSVE-NEXT:    add sp, sp, #64
815; NONEON-NOSVE-NEXT:    ret
816  %op1 = load <8 x i32>, ptr %a
817  %ins = insertelement <8 x i32> undef, i32 31, i64 0
818  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
819  %res = ashr <8 x i32> %op1, %op2
820  store <8 x i32> %res, ptr %a
821  ret void
822}
823
824define void @ashr_v4i64(ptr %a) {
825; CHECK-LABEL: ashr_v4i64:
826; CHECK:       // %bb.0:
827; CHECK-NEXT:    ldp q0, q1, [x0]
828; CHECK-NEXT:    asr z0.d, z0.d, #63
829; CHECK-NEXT:    asr z1.d, z1.d, #63
830; CHECK-NEXT:    stp q0, q1, [x0]
831; CHECK-NEXT:    ret
832;
833; NONEON-NOSVE-LABEL: ashr_v4i64:
834; NONEON-NOSVE:       // %bb.0:
835; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
836; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
837; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
838; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
839; NONEON-NOSVE-NEXT:    asr x9, x8, #63
840; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
841; NONEON-NOSVE-NEXT:    asr x8, x8, #63
842; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
843; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
844; NONEON-NOSVE-NEXT:    asr x9, x8, #63
845; NONEON-NOSVE-NEXT:    ldr x8, [sp]
846; NONEON-NOSVE-NEXT:    asr x8, x8, #63
847; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
848; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
849; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
850; NONEON-NOSVE-NEXT:    add sp, sp, #64
851; NONEON-NOSVE-NEXT:    ret
852  %op1 = load <4 x i64>, ptr %a
853  %ins = insertelement <4 x i64> undef, i64 63, i64 0
854  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
855  %res = ashr <4 x i64> %op1, %op2
856  store <4 x i64> %res, ptr %a
857  ret void
858}
859
860;
861; ICMP
862;
863
864define void @icmp_eq_v32i8(ptr %a) {
865; CHECK-LABEL: icmp_eq_v32i8:
866; CHECK:       // %bb.0:
867; CHECK-NEXT:    ldp q0, q1, [x0]
868; CHECK-NEXT:    ptrue p0.b, vl16
869; CHECK-NEXT:    cmpeq p1.b, p0/z, z0.b, #7
870; CHECK-NEXT:    cmpeq p0.b, p0/z, z1.b, #7
871; CHECK-NEXT:    mov z0.b, p1/z, #-1 // =0xffffffffffffffff
872; CHECK-NEXT:    mov z1.b, p0/z, #-1 // =0xffffffffffffffff
873; CHECK-NEXT:    stp q0, q1, [x0]
874; CHECK-NEXT:    ret
875;
876; NONEON-NOSVE-LABEL: icmp_eq_v32i8:
877; NONEON-NOSVE:       // %bb.0:
878; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
879; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
880; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
881; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
882; NONEON-NOSVE-NEXT:    cmp w8, #7
883; NONEON-NOSVE-NEXT:    csetm w8, eq
884; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
885; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
886; NONEON-NOSVE-NEXT:    cmp w8, #7
887; NONEON-NOSVE-NEXT:    csetm w8, eq
888; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
889; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
890; NONEON-NOSVE-NEXT:    cmp w8, #7
891; NONEON-NOSVE-NEXT:    csetm w8, eq
892; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
893; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
894; NONEON-NOSVE-NEXT:    cmp w8, #7
895; NONEON-NOSVE-NEXT:    csetm w8, eq
896; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
897; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
898; NONEON-NOSVE-NEXT:    cmp w8, #7
899; NONEON-NOSVE-NEXT:    csetm w8, eq
900; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
901; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
902; NONEON-NOSVE-NEXT:    cmp w8, #7
903; NONEON-NOSVE-NEXT:    csetm w8, eq
904; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
905; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
906; NONEON-NOSVE-NEXT:    cmp w8, #7
907; NONEON-NOSVE-NEXT:    csetm w8, eq
908; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
909; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
910; NONEON-NOSVE-NEXT:    cmp w8, #7
911; NONEON-NOSVE-NEXT:    csetm w8, eq
912; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
913; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
914; NONEON-NOSVE-NEXT:    cmp w8, #7
915; NONEON-NOSVE-NEXT:    csetm w8, eq
916; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
917; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
918; NONEON-NOSVE-NEXT:    cmp w8, #7
919; NONEON-NOSVE-NEXT:    csetm w8, eq
920; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
921; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
922; NONEON-NOSVE-NEXT:    cmp w8, #7
923; NONEON-NOSVE-NEXT:    csetm w8, eq
924; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
925; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
926; NONEON-NOSVE-NEXT:    cmp w8, #7
927; NONEON-NOSVE-NEXT:    csetm w8, eq
928; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
929; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
930; NONEON-NOSVE-NEXT:    cmp w8, #7
931; NONEON-NOSVE-NEXT:    csetm w8, eq
932; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
933; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
934; NONEON-NOSVE-NEXT:    cmp w8, #7
935; NONEON-NOSVE-NEXT:    csetm w8, eq
936; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
937; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
938; NONEON-NOSVE-NEXT:    cmp w8, #7
939; NONEON-NOSVE-NEXT:    csetm w8, eq
940; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
941; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
942; NONEON-NOSVE-NEXT:    cmp w8, #7
943; NONEON-NOSVE-NEXT:    csetm w8, eq
944; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
945; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
946; NONEON-NOSVE-NEXT:    cmp w8, #7
947; NONEON-NOSVE-NEXT:    csetm w8, eq
948; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
949; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
950; NONEON-NOSVE-NEXT:    cmp w8, #7
951; NONEON-NOSVE-NEXT:    csetm w8, eq
952; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
953; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
954; NONEON-NOSVE-NEXT:    cmp w8, #7
955; NONEON-NOSVE-NEXT:    csetm w8, eq
956; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
957; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
958; NONEON-NOSVE-NEXT:    cmp w8, #7
959; NONEON-NOSVE-NEXT:    csetm w8, eq
960; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
961; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
962; NONEON-NOSVE-NEXT:    cmp w8, #7
963; NONEON-NOSVE-NEXT:    csetm w8, eq
964; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
965; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
966; NONEON-NOSVE-NEXT:    cmp w8, #7
967; NONEON-NOSVE-NEXT:    csetm w8, eq
968; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
969; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
970; NONEON-NOSVE-NEXT:    cmp w8, #7
971; NONEON-NOSVE-NEXT:    csetm w8, eq
972; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
973; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
974; NONEON-NOSVE-NEXT:    cmp w8, #7
975; NONEON-NOSVE-NEXT:    csetm w8, eq
976; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
977; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
978; NONEON-NOSVE-NEXT:    cmp w8, #7
979; NONEON-NOSVE-NEXT:    csetm w8, eq
980; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
981; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
982; NONEON-NOSVE-NEXT:    cmp w8, #7
983; NONEON-NOSVE-NEXT:    csetm w8, eq
984; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
985; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
986; NONEON-NOSVE-NEXT:    cmp w8, #7
987; NONEON-NOSVE-NEXT:    csetm w8, eq
988; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
989; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
990; NONEON-NOSVE-NEXT:    cmp w8, #7
991; NONEON-NOSVE-NEXT:    csetm w8, eq
992; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
993; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
994; NONEON-NOSVE-NEXT:    cmp w8, #7
995; NONEON-NOSVE-NEXT:    csetm w8, eq
996; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
997; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
998; NONEON-NOSVE-NEXT:    cmp w8, #7
999; NONEON-NOSVE-NEXT:    csetm w8, eq
1000; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1001; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
1002; NONEON-NOSVE-NEXT:    cmp w8, #7
1003; NONEON-NOSVE-NEXT:    csetm w8, eq
1004; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1005; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
1006; NONEON-NOSVE-NEXT:    cmp w8, #7
1007; NONEON-NOSVE-NEXT:    csetm w8, eq
1008; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1009; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1010; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1011; NONEON-NOSVE-NEXT:    add sp, sp, #64
1012; NONEON-NOSVE-NEXT:    ret
1013  %op1 = load <32 x i8>, ptr %a
1014  %ins = insertelement <32 x i8> undef, i8 7, i64 0
1015  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
1016  %cmp = icmp eq <32 x i8> %op1, %op2
1017  %res = sext <32 x i1> %cmp to <32 x i8>
1018  store <32 x i8> %res, ptr %a
1019  ret void
1020}
1021
1022define void @icmp_sge_v16i16(ptr %a) {
1023; CHECK-LABEL: icmp_sge_v16i16:
1024; CHECK:       // %bb.0:
1025; CHECK-NEXT:    ldp q0, q1, [x0]
1026; CHECK-NEXT:    ptrue p0.h, vl8
1027; CHECK-NEXT:    cmpge p1.h, p0/z, z0.h, #15
1028; CHECK-NEXT:    cmpge p0.h, p0/z, z1.h, #15
1029; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1030; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1031; CHECK-NEXT:    stp q0, q1, [x0]
1032; CHECK-NEXT:    ret
1033;
1034; NONEON-NOSVE-LABEL: icmp_sge_v16i16:
1035; NONEON-NOSVE:       // %bb.0:
1036; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1037; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1038; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1039; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
1040; NONEON-NOSVE-NEXT:    cmp w8, #14
1041; NONEON-NOSVE-NEXT:    csetm w8, gt
1042; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
1043; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1044; NONEON-NOSVE-NEXT:    cmp w8, #14
1045; NONEON-NOSVE-NEXT:    csetm w8, gt
1046; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
1047; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
1048; NONEON-NOSVE-NEXT:    cmp w8, #14
1049; NONEON-NOSVE-NEXT:    csetm w8, gt
1050; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
1051; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1052; NONEON-NOSVE-NEXT:    cmp w8, #14
1053; NONEON-NOSVE-NEXT:    csetm w8, gt
1054; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
1055; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
1056; NONEON-NOSVE-NEXT:    cmp w8, #14
1057; NONEON-NOSVE-NEXT:    csetm w8, gt
1058; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
1059; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1060; NONEON-NOSVE-NEXT:    cmp w8, #14
1061; NONEON-NOSVE-NEXT:    csetm w8, gt
1062; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
1063; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
1064; NONEON-NOSVE-NEXT:    cmp w8, #14
1065; NONEON-NOSVE-NEXT:    csetm w8, gt
1066; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
1067; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1068; NONEON-NOSVE-NEXT:    cmp w8, #14
1069; NONEON-NOSVE-NEXT:    csetm w8, gt
1070; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
1071; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #14]
1072; NONEON-NOSVE-NEXT:    cmp w8, #14
1073; NONEON-NOSVE-NEXT:    csetm w8, gt
1074; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1075; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1076; NONEON-NOSVE-NEXT:    cmp w8, #14
1077; NONEON-NOSVE-NEXT:    csetm w8, gt
1078; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1079; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #10]
1080; NONEON-NOSVE-NEXT:    cmp w8, #14
1081; NONEON-NOSVE-NEXT:    csetm w8, gt
1082; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1083; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1084; NONEON-NOSVE-NEXT:    cmp w8, #14
1085; NONEON-NOSVE-NEXT:    csetm w8, gt
1086; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1087; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #6]
1088; NONEON-NOSVE-NEXT:    cmp w8, #14
1089; NONEON-NOSVE-NEXT:    csetm w8, gt
1090; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1091; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
1092; NONEON-NOSVE-NEXT:    cmp w8, #14
1093; NONEON-NOSVE-NEXT:    csetm w8, gt
1094; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1095; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #2]
1096; NONEON-NOSVE-NEXT:    cmp w8, #14
1097; NONEON-NOSVE-NEXT:    csetm w8, gt
1098; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1099; NONEON-NOSVE-NEXT:    ldrsh w8, [sp]
1100; NONEON-NOSVE-NEXT:    cmp w8, #14
1101; NONEON-NOSVE-NEXT:    csetm w8, gt
1102; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1103; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1104; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1105; NONEON-NOSVE-NEXT:    add sp, sp, #64
1106; NONEON-NOSVE-NEXT:    ret
1107  %op1 = load <16 x i16>, ptr %a
1108  %ins = insertelement <16 x i16> undef, i16 15, i64 0
1109  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
1110  %cmp = icmp sge <16 x i16> %op1, %op2
1111  %res = sext <16 x i1> %cmp to <16 x i16>
1112  store <16 x i16> %res, ptr %a
1113  ret void
1114}
1115
1116define void @icmp_sgt_v8i32(ptr %a) {
1117; CHECK-LABEL: icmp_sgt_v8i32:
1118; CHECK:       // %bb.0:
1119; CHECK-NEXT:    ldp q0, q1, [x0]
1120; CHECK-NEXT:    ptrue p0.s, vl4
1121; CHECK-NEXT:    cmpgt p1.s, p0/z, z0.s, #-8
1122; CHECK-NEXT:    cmpgt p0.s, p0/z, z1.s, #-8
1123; CHECK-NEXT:    mov z0.s, p1/z, #-1 // =0xffffffffffffffff
1124; CHECK-NEXT:    mov z1.s, p0/z, #-1 // =0xffffffffffffffff
1125; CHECK-NEXT:    stp q0, q1, [x0]
1126; CHECK-NEXT:    ret
1127;
1128; NONEON-NOSVE-LABEL: icmp_sgt_v8i32:
1129; NONEON-NOSVE:       // %bb.0:
1130; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1131; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1132; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1133; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1134; NONEON-NOSVE-NEXT:    cmn w8, #8
1135; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1136; NONEON-NOSVE-NEXT:    csetm w9, gt
1137; NONEON-NOSVE-NEXT:    cmn w8, #8
1138; NONEON-NOSVE-NEXT:    csetm w8, gt
1139; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
1140; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1141; NONEON-NOSVE-NEXT:    cmn w8, #8
1142; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1143; NONEON-NOSVE-NEXT:    csetm w9, gt
1144; NONEON-NOSVE-NEXT:    cmn w8, #8
1145; NONEON-NOSVE-NEXT:    csetm w8, gt
1146; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
1147; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
1148; NONEON-NOSVE-NEXT:    cmn w8, #8
1149; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
1150; NONEON-NOSVE-NEXT:    csetm w9, gt
1151; NONEON-NOSVE-NEXT:    cmn w8, #8
1152; NONEON-NOSVE-NEXT:    csetm w8, gt
1153; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
1154; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
1155; NONEON-NOSVE-NEXT:    cmn w8, #8
1156; NONEON-NOSVE-NEXT:    ldr w8, [sp]
1157; NONEON-NOSVE-NEXT:    csetm w9, gt
1158; NONEON-NOSVE-NEXT:    cmn w8, #8
1159; NONEON-NOSVE-NEXT:    csetm w8, gt
1160; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
1161; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1162; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1163; NONEON-NOSVE-NEXT:    add sp, sp, #64
1164; NONEON-NOSVE-NEXT:    ret
1165  %op1 = load <8 x i32>, ptr %a
1166  %ins = insertelement <8 x i32> undef, i32 -8, i64 0
1167  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
1168  %cmp = icmp sgt <8 x i32> %op1, %op2
1169  %res = sext <8 x i1> %cmp to <8 x i32>
1170  store <8 x i32> %res, ptr %a
1171  ret void
1172}
1173
1174define void @icmp_ult_v4i64(ptr %a) {
1175; CHECK-LABEL: icmp_ult_v4i64:
1176; CHECK:       // %bb.0:
1177; CHECK-NEXT:    ldp q0, q1, [x0]
1178; CHECK-NEXT:    ptrue p0.d, vl2
1179; CHECK-NEXT:    cmplo p1.d, p0/z, z0.d, #63
1180; CHECK-NEXT:    cmplo p0.d, p0/z, z1.d, #63
1181; CHECK-NEXT:    mov z0.d, p1/z, #-1 // =0xffffffffffffffff
1182; CHECK-NEXT:    mov z1.d, p0/z, #-1 // =0xffffffffffffffff
1183; CHECK-NEXT:    stp q0, q1, [x0]
1184; CHECK-NEXT:    ret
1185;
1186; NONEON-NOSVE-LABEL: icmp_ult_v4i64:
1187; NONEON-NOSVE:       // %bb.0:
1188; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1189; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1190; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1191; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1192; NONEON-NOSVE-NEXT:    cmp x8, #63
1193; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1194; NONEON-NOSVE-NEXT:    csetm x9, lo
1195; NONEON-NOSVE-NEXT:    cmp x8, #63
1196; NONEON-NOSVE-NEXT:    csetm x8, lo
1197; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
1198; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
1199; NONEON-NOSVE-NEXT:    cmp x8, #63
1200; NONEON-NOSVE-NEXT:    ldr x8, [sp]
1201; NONEON-NOSVE-NEXT:    csetm x9, lo
1202; NONEON-NOSVE-NEXT:    cmp x8, #63
1203; NONEON-NOSVE-NEXT:    csetm x8, lo
1204; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
1205; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1206; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1207; NONEON-NOSVE-NEXT:    add sp, sp, #64
1208; NONEON-NOSVE-NEXT:    ret
1209  %op1 = load <4 x i64>, ptr %a
1210  %ins = insertelement <4 x i64> undef, i64 63, i64 0
1211  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
1212  %cmp = icmp ult <4 x i64> %op1, %op2
1213  %res = sext <4 x i1> %cmp to <4 x i64>
1214  store <4 x i64> %res, ptr %a
1215  ret void
1216}
1217
1218;
1219; LSHR
1220;
1221
1222define void @lshr_v32i8(ptr %a) {
1223; CHECK-LABEL: lshr_v32i8:
1224; CHECK:       // %bb.0:
1225; CHECK-NEXT:    ldp q0, q1, [x0]
1226; CHECK-NEXT:    lsr z0.b, z0.b, #7
1227; CHECK-NEXT:    lsr z1.b, z1.b, #7
1228; CHECK-NEXT:    stp q0, q1, [x0]
1229; CHECK-NEXT:    ret
1230;
1231; NONEON-NOSVE-LABEL: lshr_v32i8:
1232; NONEON-NOSVE:       // %bb.0:
1233; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1234; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1235; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1236; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1237; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1238; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
1239; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1240; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1241; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
1242; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1243; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1244; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
1245; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1246; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1247; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
1248; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1249; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1250; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
1251; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1252; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1253; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
1254; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1255; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1256; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
1257; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1258; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1259; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
1260; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1261; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1262; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
1263; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1264; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1265; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
1266; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1267; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1268; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
1269; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1270; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1271; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
1272; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1273; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1274; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
1275; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1276; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1277; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
1278; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1279; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1280; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
1281; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1282; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1283; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
1284; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
1285; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1286; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1287; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
1288; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1289; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1290; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
1291; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1292; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1293; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
1294; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1295; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1296; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
1297; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1298; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1299; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
1300; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1301; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1302; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
1303; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1304; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1305; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
1306; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1307; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1308; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
1309; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1310; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1311; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
1312; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1313; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1314; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
1315; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1316; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1317; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
1318; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1319; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1320; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
1321; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1322; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1323; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
1324; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1325; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1326; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
1327; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1328; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1329; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
1330; NONEON-NOSVE-NEXT:    ubfx w8, w8, #7, #1
1331; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1332; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1333; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1334; NONEON-NOSVE-NEXT:    add sp, sp, #64
1335; NONEON-NOSVE-NEXT:    ret
1336  %op1 = load <32 x i8>, ptr %a
1337  %ins = insertelement <32 x i8> undef, i8 7, i64 0
1338  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
1339  %res = lshr <32 x i8> %op1, %op2
1340  store <32 x i8> %res, ptr %a
1341  ret void
1342}
1343
1344define void @lshr_v16i16(ptr %a) {
1345; CHECK-LABEL: lshr_v16i16:
1346; CHECK:       // %bb.0:
1347; CHECK-NEXT:    ldp q0, q1, [x0]
1348; CHECK-NEXT:    lsr z0.h, z0.h, #15
1349; CHECK-NEXT:    lsr z1.h, z1.h, #15
1350; CHECK-NEXT:    stp q0, q1, [x0]
1351; CHECK-NEXT:    ret
1352;
1353; NONEON-NOSVE-LABEL: lshr_v16i16:
1354; NONEON-NOSVE:       // %bb.0:
1355; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1356; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1357; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1358; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1359; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1360; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
1361; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1362; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1363; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
1364; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1365; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1366; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
1367; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1368; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1369; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
1370; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1371; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1372; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
1373; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1374; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1375; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
1376; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1377; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1378; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
1379; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1380; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1381; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
1382; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
1383; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1384; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1385; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
1386; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1387; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1388; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
1389; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1390; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1391; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
1392; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1393; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1394; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
1395; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1396; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1397; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
1398; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1399; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1400; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
1401; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1402; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1403; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
1404; NONEON-NOSVE-NEXT:    ubfx w8, w8, #15, #1
1405; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1406; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1407; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1408; NONEON-NOSVE-NEXT:    add sp, sp, #64
1409; NONEON-NOSVE-NEXT:    ret
1410  %op1 = load <16 x i16>, ptr %a
1411  %ins = insertelement <16 x i16> undef, i16 15, i64 0
1412  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
1413  %res = lshr <16 x i16> %op1, %op2
1414  store <16 x i16> %res, ptr %a
1415  ret void
1416}
1417
1418define void @lshr_v8i32(ptr %a) {
1419; CHECK-LABEL: lshr_v8i32:
1420; CHECK:       // %bb.0:
1421; CHECK-NEXT:    ldp q0, q1, [x0]
1422; CHECK-NEXT:    lsr z0.s, z0.s, #31
1423; CHECK-NEXT:    lsr z1.s, z1.s, #31
1424; CHECK-NEXT:    stp q0, q1, [x0]
1425; CHECK-NEXT:    ret
1426;
1427; NONEON-NOSVE-LABEL: lshr_v8i32:
1428; NONEON-NOSVE:       // %bb.0:
1429; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1430; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1431; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1432; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1433; NONEON-NOSVE-NEXT:    lsr w9, w8, #31
1434; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1435; NONEON-NOSVE-NEXT:    lsr w8, w8, #31
1436; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
1437; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1438; NONEON-NOSVE-NEXT:    lsr w9, w8, #31
1439; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1440; NONEON-NOSVE-NEXT:    lsr w8, w8, #31
1441; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
1442; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
1443; NONEON-NOSVE-NEXT:    lsr w9, w8, #31
1444; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
1445; NONEON-NOSVE-NEXT:    lsr w8, w8, #31
1446; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
1447; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
1448; NONEON-NOSVE-NEXT:    lsr w9, w8, #31
1449; NONEON-NOSVE-NEXT:    ldr w8, [sp]
1450; NONEON-NOSVE-NEXT:    lsr w8, w8, #31
1451; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
1452; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1453; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1454; NONEON-NOSVE-NEXT:    add sp, sp, #64
1455; NONEON-NOSVE-NEXT:    ret
1456  %op1 = load <8 x i32>, ptr %a
1457  %ins = insertelement <8 x i32> undef, i32 31, i64 0
1458  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
1459  %res = lshr <8 x i32> %op1, %op2
1460  store <8 x i32> %res, ptr %a
1461  ret void
1462}
1463
1464define void @lshr_v4i64(ptr %a) {
1465; CHECK-LABEL: lshr_v4i64:
1466; CHECK:       // %bb.0:
1467; CHECK-NEXT:    ldp q0, q1, [x0]
1468; CHECK-NEXT:    lsr z0.d, z0.d, #63
1469; CHECK-NEXT:    lsr z1.d, z1.d, #63
1470; CHECK-NEXT:    stp q0, q1, [x0]
1471; CHECK-NEXT:    ret
1472;
1473; NONEON-NOSVE-LABEL: lshr_v4i64:
1474; NONEON-NOSVE:       // %bb.0:
1475; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1476; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1477; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1478; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1479; NONEON-NOSVE-NEXT:    lsr x9, x8, #63
1480; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1481; NONEON-NOSVE-NEXT:    lsr x8, x8, #63
1482; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
1483; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
1484; NONEON-NOSVE-NEXT:    lsr x9, x8, #63
1485; NONEON-NOSVE-NEXT:    ldr x8, [sp]
1486; NONEON-NOSVE-NEXT:    lsr x8, x8, #63
1487; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
1488; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1489; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1490; NONEON-NOSVE-NEXT:    add sp, sp, #64
1491; NONEON-NOSVE-NEXT:    ret
1492  %op1 = load <4 x i64>, ptr %a
1493  %ins = insertelement <4 x i64> undef, i64 63, i64 0
1494  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
1495  %res = lshr <4 x i64> %op1, %op2
1496  store <4 x i64> %res, ptr %a
1497  ret void
1498}
1499
1500;
1501; MUL
1502;
1503
1504define void @mul_v32i8(ptr %a) {
1505; CHECK-LABEL: mul_v32i8:
1506; CHECK:       // %bb.0:
1507; CHECK-NEXT:    ldp q0, q1, [x0]
1508; CHECK-NEXT:    mul z0.b, z0.b, #7
1509; CHECK-NEXT:    mul z1.b, z1.b, #7
1510; CHECK-NEXT:    stp q0, q1, [x0]
1511; CHECK-NEXT:    ret
1512;
1513; NONEON-NOSVE-LABEL: mul_v32i8:
1514; NONEON-NOSVE:       // %bb.0:
1515; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1516; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1517; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1518; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1519; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1520; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1521; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
1522; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1523; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1524; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1525; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
1526; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1527; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1528; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1529; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
1530; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1531; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1532; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1533; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
1534; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1535; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1536; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1537; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
1538; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1539; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1540; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1541; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
1542; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1543; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1544; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1545; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
1546; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1547; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1548; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1549; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
1550; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1551; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1552; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1553; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
1554; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1555; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1556; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1557; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
1558; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1559; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1560; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1561; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
1562; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1563; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1564; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1565; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
1566; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1567; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1568; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1569; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
1570; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1571; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1572; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1573; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
1574; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1575; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1576; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1577; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
1578; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1579; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1580; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1581; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
1582; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
1583; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1584; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1585; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1586; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
1587; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1588; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1589; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1590; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
1591; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1592; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1593; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1594; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
1595; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1596; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1597; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1598; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
1599; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1600; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1601; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1602; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
1603; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1604; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1605; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1606; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
1607; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1608; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1609; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1610; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
1611; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1612; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1613; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1614; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
1615; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1616; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1617; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1618; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
1619; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1620; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1621; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1622; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
1623; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1624; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1625; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1626; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
1627; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1628; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1629; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1630; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
1631; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1632; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1633; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1634; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
1635; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1636; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1637; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1638; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
1639; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1640; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1641; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1642; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
1643; NONEON-NOSVE-NEXT:    lsl w9, w8, #3
1644; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1645; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1646; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1647; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1648; NONEON-NOSVE-NEXT:    add sp, sp, #64
1649; NONEON-NOSVE-NEXT:    ret
1650  %op1 = load <32 x i8>, ptr %a
1651  %ins = insertelement <32 x i8> undef, i8 7, i64 0
1652  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
1653  %res = mul <32 x i8> %op1, %op2
1654  store <32 x i8> %res, ptr %a
1655  ret void
1656}
1657
1658define void @mul_v16i16(ptr %a) {
1659; CHECK-LABEL: mul_v16i16:
1660; CHECK:       // %bb.0:
1661; CHECK-NEXT:    ldp q0, q1, [x0]
1662; CHECK-NEXT:    mul z0.h, z0.h, #15
1663; CHECK-NEXT:    mul z1.h, z1.h, #15
1664; CHECK-NEXT:    stp q0, q1, [x0]
1665; CHECK-NEXT:    ret
1666;
1667; NONEON-NOSVE-LABEL: mul_v16i16:
1668; NONEON-NOSVE:       // %bb.0:
1669; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1670; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1671; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1672; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1673; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1674; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1675; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
1676; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1677; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1678; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1679; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
1680; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1681; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1682; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1683; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
1684; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1685; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1686; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1687; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
1688; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1689; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1690; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1691; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
1692; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1693; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1694; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1695; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
1696; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1697; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1698; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1699; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
1700; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1701; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1702; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1703; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
1704; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
1705; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1706; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1707; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1708; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
1709; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1710; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1711; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1712; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
1713; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1714; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1715; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1716; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
1717; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1718; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1719; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1720; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
1721; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1722; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1723; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1724; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
1725; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1726; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1727; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1728; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
1729; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1730; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1731; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1732; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
1733; NONEON-NOSVE-NEXT:    lsl w9, w8, #4
1734; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1735; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1736; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1737; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1738; NONEON-NOSVE-NEXT:    add sp, sp, #64
1739; NONEON-NOSVE-NEXT:    ret
1740  %op1 = load <16 x i16>, ptr %a
1741  %ins = insertelement <16 x i16> undef, i16 15, i64 0
1742  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
1743  %res = mul <16 x i16> %op1, %op2
1744  store <16 x i16> %res, ptr %a
1745  ret void
1746}
1747
1748define void @mul_v8i32(ptr %a) {
1749; CHECK-LABEL: mul_v8i32:
1750; CHECK:       // %bb.0:
1751; CHECK-NEXT:    ldp q0, q1, [x0]
1752; CHECK-NEXT:    mul z0.s, z0.s, #31
1753; CHECK-NEXT:    mul z1.s, z1.s, #31
1754; CHECK-NEXT:    stp q0, q1, [x0]
1755; CHECK-NEXT:    ret
1756;
1757; NONEON-NOSVE-LABEL: mul_v8i32:
1758; NONEON-NOSVE:       // %bb.0:
1759; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1760; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1761; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1762; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1763; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1764; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1765; NONEON-NOSVE-NEXT:    str w8, [sp, #60]
1766; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1767; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1768; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1769; NONEON-NOSVE-NEXT:    str w8, [sp, #56]
1770; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1771; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1772; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1773; NONEON-NOSVE-NEXT:    str w8, [sp, #52]
1774; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1775; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1776; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1777; NONEON-NOSVE-NEXT:    str w8, [sp, #48]
1778; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
1779; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1780; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1781; NONEON-NOSVE-NEXT:    str w8, [sp, #44]
1782; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
1783; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1784; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1785; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
1786; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
1787; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1788; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1789; NONEON-NOSVE-NEXT:    str w8, [sp, #36]
1790; NONEON-NOSVE-NEXT:    ldr w8, [sp]
1791; NONEON-NOSVE-NEXT:    lsl w9, w8, #5
1792; NONEON-NOSVE-NEXT:    sub w8, w9, w8
1793; NONEON-NOSVE-NEXT:    str w8, [sp, #32]
1794; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1795; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1796; NONEON-NOSVE-NEXT:    add sp, sp, #64
1797; NONEON-NOSVE-NEXT:    ret
1798  %op1 = load <8 x i32>, ptr %a
1799  %ins = insertelement <8 x i32> undef, i32 31, i64 0
1800  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
1801  %res = mul <8 x i32> %op1, %op2
1802  store <8 x i32> %res, ptr %a
1803  ret void
1804}
1805
1806define void @mul_v4i64(ptr %a) {
1807; CHECK-LABEL: mul_v4i64:
1808; CHECK:       // %bb.0:
1809; CHECK-NEXT:    ldp q0, q1, [x0]
1810; CHECK-NEXT:    mul z0.d, z0.d, #63
1811; CHECK-NEXT:    mul z1.d, z1.d, #63
1812; CHECK-NEXT:    stp q0, q1, [x0]
1813; CHECK-NEXT:    ret
1814;
1815; NONEON-NOSVE-LABEL: mul_v4i64:
1816; NONEON-NOSVE:       // %bb.0:
1817; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1818; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1819; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1820; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1821; NONEON-NOSVE-NEXT:    lsl x9, x8, #6
1822; NONEON-NOSVE-NEXT:    sub x8, x9, x8
1823; NONEON-NOSVE-NEXT:    str x8, [sp, #56]
1824; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1825; NONEON-NOSVE-NEXT:    lsl x9, x8, #6
1826; NONEON-NOSVE-NEXT:    sub x8, x9, x8
1827; NONEON-NOSVE-NEXT:    str x8, [sp, #48]
1828; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
1829; NONEON-NOSVE-NEXT:    lsl x9, x8, #6
1830; NONEON-NOSVE-NEXT:    sub x8, x9, x8
1831; NONEON-NOSVE-NEXT:    str x8, [sp, #40]
1832; NONEON-NOSVE-NEXT:    ldr x8, [sp]
1833; NONEON-NOSVE-NEXT:    lsl x9, x8, #6
1834; NONEON-NOSVE-NEXT:    sub x8, x9, x8
1835; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
1836; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1837; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1838; NONEON-NOSVE-NEXT:    add sp, sp, #64
1839; NONEON-NOSVE-NEXT:    ret
1840  %op1 = load <4 x i64>, ptr %a
1841  %ins = insertelement <4 x i64> undef, i64 63, i64 0
1842  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
1843  %res = mul <4 x i64> %op1, %op2
1844  store <4 x i64> %res, ptr %a
1845  ret void
1846}
1847
1848;
1849; OR
1850;
1851
1852define void @or_v32i8(ptr %a) {
1853; CHECK-LABEL: or_v32i8:
1854; CHECK:       // %bb.0:
1855; CHECK-NEXT:    ldp q0, q1, [x0]
1856; CHECK-NEXT:    orr z0.b, z0.b, #0x7
1857; CHECK-NEXT:    orr z1.b, z1.b, #0x7
1858; CHECK-NEXT:    stp q0, q1, [x0]
1859; CHECK-NEXT:    ret
1860;
1861; NONEON-NOSVE-LABEL: or_v32i8:
1862; NONEON-NOSVE:       // %bb.0:
1863; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1864; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1865; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1866; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1867; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1868; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
1869; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1870; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1871; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
1872; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1873; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1874; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
1875; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1876; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1877; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
1878; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1879; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1880; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
1881; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1882; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1883; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
1884; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1885; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1886; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
1887; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1888; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1889; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
1890; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1891; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1892; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
1893; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1894; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1895; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
1896; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1897; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1898; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
1899; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1900; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1901; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
1902; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1903; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1904; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
1905; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1906; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1907; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
1908; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1909; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1910; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
1911; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1912; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1913; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
1914; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
1915; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1916; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1917; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
1918; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1919; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1920; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
1921; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1922; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1923; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
1924; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1925; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1926; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
1927; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1928; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1929; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
1930; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1931; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1932; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
1933; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1934; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1935; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
1936; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1937; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1938; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
1939; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1940; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1941; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
1942; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1943; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1944; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
1945; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1946; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1947; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
1948; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1949; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1950; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
1951; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1952; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1953; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
1954; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1955; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1956; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
1957; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1958; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1959; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
1960; NONEON-NOSVE-NEXT:    orr w8, w8, #0x7
1961; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1962; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1963; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1964; NONEON-NOSVE-NEXT:    add sp, sp, #64
1965; NONEON-NOSVE-NEXT:    ret
1966  %op1 = load <32 x i8>, ptr %a
1967  %ins = insertelement <32 x i8> undef, i8 7, i64 0
1968  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
1969  %res = or <32 x i8> %op1, %op2
1970  store <32 x i8> %res, ptr %a
1971  ret void
1972}
1973
1974define void @or_v16i16(ptr %a) {
1975; CHECK-LABEL: or_v16i16:
1976; CHECK:       // %bb.0:
1977; CHECK-NEXT:    ldp q0, q1, [x0]
1978; CHECK-NEXT:    orr z0.h, z0.h, #0xf
1979; CHECK-NEXT:    orr z1.h, z1.h, #0xf
1980; CHECK-NEXT:    stp q0, q1, [x0]
1981; CHECK-NEXT:    ret
1982;
1983; NONEON-NOSVE-LABEL: or_v16i16:
1984; NONEON-NOSVE:       // %bb.0:
1985; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1986; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1987; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1988; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1989; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
1990; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
1991; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1992; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
1993; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
1994; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1995; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
1996; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
1997; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1998; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
1999; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
2000; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
2001; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2002; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
2003; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
2004; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2005; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
2006; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
2007; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2008; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
2009; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
2010; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2011; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
2012; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
2013; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2014; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
2015; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
2016; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2017; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
2018; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
2019; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2020; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
2021; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
2022; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2023; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
2024; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
2025; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2026; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
2027; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
2028; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2029; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
2030; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
2031; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2032; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
2033; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
2034; NONEON-NOSVE-NEXT:    orr w8, w8, #0xf
2035; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2036; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2037; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2038; NONEON-NOSVE-NEXT:    add sp, sp, #64
2039; NONEON-NOSVE-NEXT:    ret
2040  %op1 = load <16 x i16>, ptr %a
2041  %ins = insertelement <16 x i16> undef, i16 15, i64 0
2042  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
2043  %res = or <16 x i16> %op1, %op2
2044  store <16 x i16> %res, ptr %a
2045  ret void
2046}
2047
2048define void @or_v8i32(ptr %a) {
2049; CHECK-LABEL: or_v8i32:
2050; CHECK:       // %bb.0:
2051; CHECK-NEXT:    ldp q0, q1, [x0]
2052; CHECK-NEXT:    orr z0.s, z0.s, #0x1f
2053; CHECK-NEXT:    orr z1.s, z1.s, #0x1f
2054; CHECK-NEXT:    stp q0, q1, [x0]
2055; CHECK-NEXT:    ret
2056;
2057; NONEON-NOSVE-LABEL: or_v8i32:
2058; NONEON-NOSVE:       // %bb.0:
2059; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2060; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2061; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2062; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
2063; NONEON-NOSVE-NEXT:    orr w9, w8, #0x1f
2064; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
2065; NONEON-NOSVE-NEXT:    orr w8, w8, #0x1f
2066; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
2067; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
2068; NONEON-NOSVE-NEXT:    orr w9, w8, #0x1f
2069; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
2070; NONEON-NOSVE-NEXT:    orr w8, w8, #0x1f
2071; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
2072; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
2073; NONEON-NOSVE-NEXT:    orr w9, w8, #0x1f
2074; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
2075; NONEON-NOSVE-NEXT:    orr w8, w8, #0x1f
2076; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
2077; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
2078; NONEON-NOSVE-NEXT:    orr w9, w8, #0x1f
2079; NONEON-NOSVE-NEXT:    ldr w8, [sp]
2080; NONEON-NOSVE-NEXT:    orr w8, w8, #0x1f
2081; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
2082; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2083; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2084; NONEON-NOSVE-NEXT:    add sp, sp, #64
2085; NONEON-NOSVE-NEXT:    ret
2086  %op1 = load <8 x i32>, ptr %a
2087  %ins = insertelement <8 x i32> undef, i32 31, i64 0
2088  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
2089  %res = or <8 x i32> %op1, %op2
2090  store <8 x i32> %res, ptr %a
2091  ret void
2092}
2093
2094define void @or_v4i64(ptr %a) {
2095; CHECK-LABEL: or_v4i64:
2096; CHECK:       // %bb.0:
2097; CHECK-NEXT:    ldp q0, q1, [x0]
2098; CHECK-NEXT:    orr z0.d, z0.d, #0x3f
2099; CHECK-NEXT:    orr z1.d, z1.d, #0x3f
2100; CHECK-NEXT:    stp q0, q1, [x0]
2101; CHECK-NEXT:    ret
2102;
2103; NONEON-NOSVE-LABEL: or_v4i64:
2104; NONEON-NOSVE:       // %bb.0:
2105; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2106; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2107; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2108; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2109; NONEON-NOSVE-NEXT:    orr x9, x8, #0x3f
2110; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2111; NONEON-NOSVE-NEXT:    orr x8, x8, #0x3f
2112; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
2113; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
2114; NONEON-NOSVE-NEXT:    orr x9, x8, #0x3f
2115; NONEON-NOSVE-NEXT:    ldr x8, [sp]
2116; NONEON-NOSVE-NEXT:    orr x8, x8, #0x3f
2117; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
2118; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2119; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2120; NONEON-NOSVE-NEXT:    add sp, sp, #64
2121; NONEON-NOSVE-NEXT:    ret
2122  %op1 = load <4 x i64>, ptr %a
2123  %ins = insertelement <4 x i64> undef, i64 63, i64 0
2124  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
2125  %res = or <4 x i64> %op1, %op2
2126  store <4 x i64> %res, ptr %a
2127  ret void
2128}
2129
2130;
2131; SHL
2132;
2133
2134define void @shl_v32i8(ptr %a) {
2135; CHECK-LABEL: shl_v32i8:
2136; CHECK:       // %bb.0:
2137; CHECK-NEXT:    ldp q0, q1, [x0]
2138; CHECK-NEXT:    lsl z0.b, z0.b, #7
2139; CHECK-NEXT:    lsl z1.b, z1.b, #7
2140; CHECK-NEXT:    stp q0, q1, [x0]
2141; CHECK-NEXT:    ret
2142;
2143; NONEON-NOSVE-LABEL: shl_v32i8:
2144; NONEON-NOSVE:       // %bb.0:
2145; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2146; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2147; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2148; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
2149; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2150; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
2151; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
2152; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2153; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
2154; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
2155; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2156; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
2157; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
2158; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2159; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
2160; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
2161; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2162; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
2163; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
2164; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2165; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
2166; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
2167; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2168; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
2169; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
2170; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2171; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
2172; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
2173; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2174; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
2175; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
2176; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2177; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
2178; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
2179; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2180; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
2181; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2182; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2183; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
2184; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
2185; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2186; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
2187; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
2188; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2189; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
2190; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
2191; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2192; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
2193; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
2194; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2195; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
2196; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
2197; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2198; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
2199; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
2200; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2201; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
2202; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
2203; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2204; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
2205; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
2206; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2207; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
2208; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
2209; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2210; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
2211; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
2212; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2213; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
2214; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
2215; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2216; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
2217; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
2218; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2219; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
2220; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
2221; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2222; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
2223; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
2224; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2225; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
2226; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
2227; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2228; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
2229; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
2230; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2231; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
2232; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
2233; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2234; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
2235; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
2236; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2237; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
2238; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
2239; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2240; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
2241; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
2242; NONEON-NOSVE-NEXT:    lsl w8, w8, #7
2243; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
2244; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2245; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2246; NONEON-NOSVE-NEXT:    add sp, sp, #64
2247; NONEON-NOSVE-NEXT:    ret
2248  %op1 = load <32 x i8>, ptr %a
2249  %ins = insertelement <32 x i8> undef, i8 7, i64 0
2250  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
2251  %res = shl <32 x i8> %op1, %op2
2252  store <32 x i8> %res, ptr %a
2253  ret void
2254}
2255
2256define void @shl_v16i16(ptr %a) {
2257; CHECK-LABEL: shl_v16i16:
2258; CHECK:       // %bb.0:
2259; CHECK-NEXT:    ldp q0, q1, [x0]
2260; CHECK-NEXT:    lsl z0.h, z0.h, #15
2261; CHECK-NEXT:    lsl z1.h, z1.h, #15
2262; CHECK-NEXT:    stp q0, q1, [x0]
2263; CHECK-NEXT:    ret
2264;
2265; NONEON-NOSVE-LABEL: shl_v16i16:
2266; NONEON-NOSVE:       // %bb.0:
2267; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2268; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2269; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2270; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
2271; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2272; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
2273; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
2274; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2275; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
2276; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
2277; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2278; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
2279; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
2280; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2281; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
2282; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
2283; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2284; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
2285; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
2286; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2287; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
2288; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
2289; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2290; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
2291; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
2292; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2293; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
2294; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
2295; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2296; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
2297; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
2298; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2299; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
2300; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
2301; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2302; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
2303; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
2304; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2305; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
2306; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
2307; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2308; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
2309; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
2310; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2311; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
2312; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
2313; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2314; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
2315; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
2316; NONEON-NOSVE-NEXT:    lsl w8, w8, #15
2317; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2318; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2319; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2320; NONEON-NOSVE-NEXT:    add sp, sp, #64
2321; NONEON-NOSVE-NEXT:    ret
2322  %op1 = load <16 x i16>, ptr %a
2323  %ins = insertelement <16 x i16> undef, i16 15, i64 0
2324  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
2325  %res = shl <16 x i16> %op1, %op2
2326  store <16 x i16> %res, ptr %a
2327  ret void
2328}
2329
2330define void @shl_v8i32(ptr %a) {
2331; CHECK-LABEL: shl_v8i32:
2332; CHECK:       // %bb.0:
2333; CHECK-NEXT:    ldp q0, q1, [x0]
2334; CHECK-NEXT:    lsl z0.s, z0.s, #31
2335; CHECK-NEXT:    lsl z1.s, z1.s, #31
2336; CHECK-NEXT:    stp q0, q1, [x0]
2337; CHECK-NEXT:    ret
2338;
2339; NONEON-NOSVE-LABEL: shl_v8i32:
2340; NONEON-NOSVE:       // %bb.0:
2341; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2342; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2343; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2344; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
2345; NONEON-NOSVE-NEXT:    lsl w9, w8, #31
2346; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
2347; NONEON-NOSVE-NEXT:    lsl w8, w8, #31
2348; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
2349; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
2350; NONEON-NOSVE-NEXT:    lsl w9, w8, #31
2351; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
2352; NONEON-NOSVE-NEXT:    lsl w8, w8, #31
2353; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
2354; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
2355; NONEON-NOSVE-NEXT:    lsl w9, w8, #31
2356; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
2357; NONEON-NOSVE-NEXT:    lsl w8, w8, #31
2358; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
2359; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
2360; NONEON-NOSVE-NEXT:    lsl w9, w8, #31
2361; NONEON-NOSVE-NEXT:    ldr w8, [sp]
2362; NONEON-NOSVE-NEXT:    lsl w8, w8, #31
2363; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
2364; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2365; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2366; NONEON-NOSVE-NEXT:    add sp, sp, #64
2367; NONEON-NOSVE-NEXT:    ret
2368  %op1 = load <8 x i32>, ptr %a
2369  %ins = insertelement <8 x i32> undef, i32 31, i64 0
2370  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
2371  %res = shl <8 x i32> %op1, %op2
2372  store <8 x i32> %res, ptr %a
2373  ret void
2374}
2375
2376define void @shl_v4i64(ptr %a) {
2377; CHECK-LABEL: shl_v4i64:
2378; CHECK:       // %bb.0:
2379; CHECK-NEXT:    ldp q0, q1, [x0]
2380; CHECK-NEXT:    lsl z0.d, z0.d, #63
2381; CHECK-NEXT:    lsl z1.d, z1.d, #63
2382; CHECK-NEXT:    stp q0, q1, [x0]
2383; CHECK-NEXT:    ret
2384;
2385; NONEON-NOSVE-LABEL: shl_v4i64:
2386; NONEON-NOSVE:       // %bb.0:
2387; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2388; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2389; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2390; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2391; NONEON-NOSVE-NEXT:    lsl x9, x8, #63
2392; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2393; NONEON-NOSVE-NEXT:    lsl x8, x8, #63
2394; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
2395; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
2396; NONEON-NOSVE-NEXT:    lsl x9, x8, #63
2397; NONEON-NOSVE-NEXT:    ldr x8, [sp]
2398; NONEON-NOSVE-NEXT:    lsl x8, x8, #63
2399; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
2400; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2401; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2402; NONEON-NOSVE-NEXT:    add sp, sp, #64
2403; NONEON-NOSVE-NEXT:    ret
2404  %op1 = load <4 x i64>, ptr %a
2405  %ins = insertelement <4 x i64> undef, i64 63, i64 0
2406  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
2407  %res = shl <4 x i64> %op1, %op2
2408  store <4 x i64> %res, ptr %a
2409  ret void
2410}
2411
2412;
2413; SMAX
2414;
2415
2416define void @smax_v32i8(ptr %a) {
2417; CHECK-LABEL: smax_v32i8:
2418; CHECK:       // %bb.0:
2419; CHECK-NEXT:    ldp q0, q1, [x0]
2420; CHECK-NEXT:    smax z0.b, z0.b, #7
2421; CHECK-NEXT:    smax z1.b, z1.b, #7
2422; CHECK-NEXT:    stp q0, q1, [x0]
2423; CHECK-NEXT:    ret
2424;
2425; NONEON-NOSVE-LABEL: smax_v32i8:
2426; NONEON-NOSVE:       // %bb.0:
2427; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2428; NONEON-NOSVE-NEXT:    mov w8, #7 // =0x7
2429; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2430; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2431; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #31]
2432; NONEON-NOSVE-NEXT:    cmp w9, #7
2433; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2434; NONEON-NOSVE-NEXT:    strb w9, [sp, #63]
2435; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #30]
2436; NONEON-NOSVE-NEXT:    cmp w9, #7
2437; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2438; NONEON-NOSVE-NEXT:    strb w9, [sp, #62]
2439; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #29]
2440; NONEON-NOSVE-NEXT:    cmp w9, #7
2441; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2442; NONEON-NOSVE-NEXT:    strb w9, [sp, #61]
2443; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #28]
2444; NONEON-NOSVE-NEXT:    cmp w9, #7
2445; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2446; NONEON-NOSVE-NEXT:    strb w9, [sp, #60]
2447; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #27]
2448; NONEON-NOSVE-NEXT:    cmp w9, #7
2449; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2450; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
2451; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #26]
2452; NONEON-NOSVE-NEXT:    cmp w9, #7
2453; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2454; NONEON-NOSVE-NEXT:    strb w9, [sp, #58]
2455; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #25]
2456; NONEON-NOSVE-NEXT:    cmp w9, #7
2457; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2458; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
2459; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #24]
2460; NONEON-NOSVE-NEXT:    cmp w9, #7
2461; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2462; NONEON-NOSVE-NEXT:    strb w9, [sp, #56]
2463; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #23]
2464; NONEON-NOSVE-NEXT:    cmp w9, #7
2465; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2466; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
2467; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #22]
2468; NONEON-NOSVE-NEXT:    cmp w9, #7
2469; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2470; NONEON-NOSVE-NEXT:    strb w9, [sp, #54]
2471; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #21]
2472; NONEON-NOSVE-NEXT:    cmp w9, #7
2473; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2474; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
2475; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #20]
2476; NONEON-NOSVE-NEXT:    cmp w9, #7
2477; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2478; NONEON-NOSVE-NEXT:    strb w9, [sp, #52]
2479; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #19]
2480; NONEON-NOSVE-NEXT:    cmp w9, #7
2481; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2482; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
2483; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #18]
2484; NONEON-NOSVE-NEXT:    cmp w9, #7
2485; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2486; NONEON-NOSVE-NEXT:    strb w9, [sp, #50]
2487; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #17]
2488; NONEON-NOSVE-NEXT:    cmp w9, #7
2489; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2490; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
2491; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #16]
2492; NONEON-NOSVE-NEXT:    cmp w9, #7
2493; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2494; NONEON-NOSVE-NEXT:    strb w9, [sp, #48]
2495; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
2496; NONEON-NOSVE-NEXT:    cmp w9, #7
2497; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2498; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]
2499; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
2500; NONEON-NOSVE-NEXT:    cmp w9, #7
2501; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2502; NONEON-NOSVE-NEXT:    strb w9, [sp, #46]
2503; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
2504; NONEON-NOSVE-NEXT:    cmp w9, #7
2505; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2506; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]
2507; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
2508; NONEON-NOSVE-NEXT:    cmp w9, #7
2509; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2510; NONEON-NOSVE-NEXT:    strb w9, [sp, #44]
2511; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
2512; NONEON-NOSVE-NEXT:    cmp w9, #7
2513; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2514; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]
2515; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
2516; NONEON-NOSVE-NEXT:    cmp w9, #7
2517; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2518; NONEON-NOSVE-NEXT:    strb w9, [sp, #42]
2519; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
2520; NONEON-NOSVE-NEXT:    cmp w9, #7
2521; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2522; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]
2523; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
2524; NONEON-NOSVE-NEXT:    cmp w9, #7
2525; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2526; NONEON-NOSVE-NEXT:    strb w9, [sp, #40]
2527; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
2528; NONEON-NOSVE-NEXT:    cmp w9, #7
2529; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2530; NONEON-NOSVE-NEXT:    strb w9, [sp, #39]
2531; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
2532; NONEON-NOSVE-NEXT:    cmp w9, #7
2533; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2534; NONEON-NOSVE-NEXT:    strb w9, [sp, #38]
2535; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
2536; NONEON-NOSVE-NEXT:    cmp w9, #7
2537; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2538; NONEON-NOSVE-NEXT:    strb w9, [sp, #37]
2539; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
2540; NONEON-NOSVE-NEXT:    cmp w9, #7
2541; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2542; NONEON-NOSVE-NEXT:    strb w9, [sp, #36]
2543; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
2544; NONEON-NOSVE-NEXT:    cmp w9, #7
2545; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2546; NONEON-NOSVE-NEXT:    strb w9, [sp, #35]
2547; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
2548; NONEON-NOSVE-NEXT:    cmp w9, #7
2549; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2550; NONEON-NOSVE-NEXT:    strb w9, [sp, #34]
2551; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
2552; NONEON-NOSVE-NEXT:    cmp w9, #7
2553; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2554; NONEON-NOSVE-NEXT:    strb w9, [sp, #33]
2555; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
2556; NONEON-NOSVE-NEXT:    cmp w9, #7
2557; NONEON-NOSVE-NEXT:    csel w8, w9, w8, gt
2558; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
2559; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2560; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2561; NONEON-NOSVE-NEXT:    add sp, sp, #64
2562; NONEON-NOSVE-NEXT:    ret
2563  %op1 = load <32 x i8>, ptr %a
2564  %ins = insertelement <32 x i8> undef, i8 7, i64 0
2565  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
2566  %res = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %op1, <32 x i8> %op2)
2567  store <32 x i8> %res, ptr %a
2568  ret void
2569}
2570
2571define void @smax_v16i16(ptr %a) {
2572; CHECK-LABEL: smax_v16i16:
2573; CHECK:       // %bb.0:
2574; CHECK-NEXT:    ldp q0, q1, [x0]
2575; CHECK-NEXT:    smax z0.h, z0.h, #15
2576; CHECK-NEXT:    smax z1.h, z1.h, #15
2577; CHECK-NEXT:    stp q0, q1, [x0]
2578; CHECK-NEXT:    ret
2579;
2580; NONEON-NOSVE-LABEL: smax_v16i16:
2581; NONEON-NOSVE:       // %bb.0:
2582; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2583; NONEON-NOSVE-NEXT:    mov w8, #15 // =0xf
2584; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2585; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2586; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]
2587; NONEON-NOSVE-NEXT:    cmp w9, #15
2588; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2589; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]
2590; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #28]
2591; NONEON-NOSVE-NEXT:    cmp w9, #15
2592; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2593; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]
2594; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]
2595; NONEON-NOSVE-NEXT:    cmp w9, #15
2596; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2597; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
2598; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #24]
2599; NONEON-NOSVE-NEXT:    cmp w9, #15
2600; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2601; NONEON-NOSVE-NEXT:    strh w9, [sp, #56]
2602; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]
2603; NONEON-NOSVE-NEXT:    cmp w9, #15
2604; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2605; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]
2606; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #20]
2607; NONEON-NOSVE-NEXT:    cmp w9, #15
2608; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2609; NONEON-NOSVE-NEXT:    strh w9, [sp, #52]
2610; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]
2611; NONEON-NOSVE-NEXT:    cmp w9, #15
2612; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2613; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
2614; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #16]
2615; NONEON-NOSVE-NEXT:    cmp w9, #15
2616; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2617; NONEON-NOSVE-NEXT:    strh w9, [sp, #48]
2618; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
2619; NONEON-NOSVE-NEXT:    cmp w9, #15
2620; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2621; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]
2622; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
2623; NONEON-NOSVE-NEXT:    cmp w9, #15
2624; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2625; NONEON-NOSVE-NEXT:    strh w9, [sp, #44]
2626; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
2627; NONEON-NOSVE-NEXT:    cmp w9, #15
2628; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2629; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]
2630; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
2631; NONEON-NOSVE-NEXT:    cmp w9, #15
2632; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2633; NONEON-NOSVE-NEXT:    strh w9, [sp, #40]
2634; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
2635; NONEON-NOSVE-NEXT:    cmp w9, #15
2636; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2637; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]
2638; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
2639; NONEON-NOSVE-NEXT:    cmp w9, #15
2640; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2641; NONEON-NOSVE-NEXT:    strh w9, [sp, #36]
2642; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
2643; NONEON-NOSVE-NEXT:    cmp w9, #15
2644; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2645; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]
2646; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
2647; NONEON-NOSVE-NEXT:    cmp w9, #15
2648; NONEON-NOSVE-NEXT:    csel w8, w9, w8, gt
2649; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2650; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2651; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2652; NONEON-NOSVE-NEXT:    add sp, sp, #64
2653; NONEON-NOSVE-NEXT:    ret
2654  %op1 = load <16 x i16>, ptr %a
2655  %ins = insertelement <16 x i16> undef, i16 15, i64 0
2656  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
2657  %res = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %op1, <16 x i16> %op2)
2658  store <16 x i16> %res, ptr %a
2659  ret void
2660}
2661
2662define void @smax_v8i32(ptr %a) {
2663; CHECK-LABEL: smax_v8i32:
2664; CHECK:       // %bb.0:
2665; CHECK-NEXT:    ldp q0, q1, [x0]
2666; CHECK-NEXT:    smax z0.s, z0.s, #31
2667; CHECK-NEXT:    smax z1.s, z1.s, #31
2668; CHECK-NEXT:    stp q0, q1, [x0]
2669; CHECK-NEXT:    ret
2670;
2671; NONEON-NOSVE-LABEL: smax_v8i32:
2672; NONEON-NOSVE:       // %bb.0:
2673; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2674; NONEON-NOSVE-NEXT:    mov w8, #31 // =0x1f
2675; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2676; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2677; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
2678; NONEON-NOSVE-NEXT:    cmp w9, #31
2679; NONEON-NOSVE-NEXT:    csel w10, w9, w8, gt
2680; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
2681; NONEON-NOSVE-NEXT:    cmp w9, #31
2682; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2683; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
2684; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
2685; NONEON-NOSVE-NEXT:    cmp w9, #31
2686; NONEON-NOSVE-NEXT:    csel w10, w9, w8, gt
2687; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
2688; NONEON-NOSVE-NEXT:    cmp w9, #31
2689; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2690; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
2691; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
2692; NONEON-NOSVE-NEXT:    cmp w9, #31
2693; NONEON-NOSVE-NEXT:    csel w10, w9, w8, gt
2694; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
2695; NONEON-NOSVE-NEXT:    cmp w9, #31
2696; NONEON-NOSVE-NEXT:    csel w9, w9, w8, gt
2697; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #40]
2698; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
2699; NONEON-NOSVE-NEXT:    cmp w9, #31
2700; NONEON-NOSVE-NEXT:    csel w10, w9, w8, gt
2701; NONEON-NOSVE-NEXT:    ldr w9, [sp]
2702; NONEON-NOSVE-NEXT:    cmp w9, #31
2703; NONEON-NOSVE-NEXT:    csel w8, w9, w8, gt
2704; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
2705; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2706; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2707; NONEON-NOSVE-NEXT:    add sp, sp, #64
2708; NONEON-NOSVE-NEXT:    ret
2709  %op1 = load <8 x i32>, ptr %a
2710  %ins = insertelement <8 x i32> undef, i32 31, i64 0
2711  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
2712  %res = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %op1, <8 x i32> %op2)
2713  store <8 x i32> %res, ptr %a
2714  ret void
2715}
2716
2717define void @smax_v4i64(ptr %a) {
2718; CHECK-LABEL: smax_v4i64:
2719; CHECK:       // %bb.0:
2720; CHECK-NEXT:    ldp q0, q1, [x0]
2721; CHECK-NEXT:    smax z0.d, z0.d, #63
2722; CHECK-NEXT:    smax z1.d, z1.d, #63
2723; CHECK-NEXT:    stp q0, q1, [x0]
2724; CHECK-NEXT:    ret
2725;
2726; NONEON-NOSVE-LABEL: smax_v4i64:
2727; NONEON-NOSVE:       // %bb.0:
2728; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2729; NONEON-NOSVE-NEXT:    mov w8, #63 // =0x3f
2730; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2731; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2732; NONEON-NOSVE-NEXT:    ldr x9, [sp, #24]
2733; NONEON-NOSVE-NEXT:    cmp x9, #63
2734; NONEON-NOSVE-NEXT:    csel x10, x9, x8, gt
2735; NONEON-NOSVE-NEXT:    ldr x9, [sp, #16]
2736; NONEON-NOSVE-NEXT:    cmp x9, #63
2737; NONEON-NOSVE-NEXT:    csel x9, x9, x8, gt
2738; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #48]
2739; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
2740; NONEON-NOSVE-NEXT:    cmp x9, #63
2741; NONEON-NOSVE-NEXT:    csel x10, x9, x8, gt
2742; NONEON-NOSVE-NEXT:    ldr x9, [sp]
2743; NONEON-NOSVE-NEXT:    cmp x9, #63
2744; NONEON-NOSVE-NEXT:    csel x8, x9, x8, gt
2745; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
2746; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2747; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2748; NONEON-NOSVE-NEXT:    add sp, sp, #64
2749; NONEON-NOSVE-NEXT:    ret
2750  %op1 = load <4 x i64>, ptr %a
2751  %ins = insertelement <4 x i64> undef, i64 63, i64 0
2752  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
2753  %res = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %op1, <4 x i64> %op2)
2754  store <4 x i64> %res, ptr %a
2755  ret void
2756}
2757
2758;
2759; SMIN
2760;
2761
2762define void @smin_v32i8(ptr %a) {
2763; CHECK-LABEL: smin_v32i8:
2764; CHECK:       // %bb.0:
2765; CHECK-NEXT:    ldp q0, q1, [x0]
2766; CHECK-NEXT:    smin z0.b, z0.b, #7
2767; CHECK-NEXT:    smin z1.b, z1.b, #7
2768; CHECK-NEXT:    stp q0, q1, [x0]
2769; CHECK-NEXT:    ret
2770;
2771; NONEON-NOSVE-LABEL: smin_v32i8:
2772; NONEON-NOSVE:       // %bb.0:
2773; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2774; NONEON-NOSVE-NEXT:    mov w8, #7 // =0x7
2775; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2776; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2777; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #31]
2778; NONEON-NOSVE-NEXT:    cmp w9, #7
2779; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2780; NONEON-NOSVE-NEXT:    strb w9, [sp, #63]
2781; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #30]
2782; NONEON-NOSVE-NEXT:    cmp w9, #7
2783; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2784; NONEON-NOSVE-NEXT:    strb w9, [sp, #62]
2785; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #29]
2786; NONEON-NOSVE-NEXT:    cmp w9, #7
2787; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2788; NONEON-NOSVE-NEXT:    strb w9, [sp, #61]
2789; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #28]
2790; NONEON-NOSVE-NEXT:    cmp w9, #7
2791; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2792; NONEON-NOSVE-NEXT:    strb w9, [sp, #60]
2793; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #27]
2794; NONEON-NOSVE-NEXT:    cmp w9, #7
2795; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2796; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
2797; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #26]
2798; NONEON-NOSVE-NEXT:    cmp w9, #7
2799; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2800; NONEON-NOSVE-NEXT:    strb w9, [sp, #58]
2801; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #25]
2802; NONEON-NOSVE-NEXT:    cmp w9, #7
2803; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2804; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
2805; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #24]
2806; NONEON-NOSVE-NEXT:    cmp w9, #7
2807; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2808; NONEON-NOSVE-NEXT:    strb w9, [sp, #56]
2809; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #23]
2810; NONEON-NOSVE-NEXT:    cmp w9, #7
2811; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2812; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
2813; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #22]
2814; NONEON-NOSVE-NEXT:    cmp w9, #7
2815; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2816; NONEON-NOSVE-NEXT:    strb w9, [sp, #54]
2817; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #21]
2818; NONEON-NOSVE-NEXT:    cmp w9, #7
2819; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2820; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
2821; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #20]
2822; NONEON-NOSVE-NEXT:    cmp w9, #7
2823; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2824; NONEON-NOSVE-NEXT:    strb w9, [sp, #52]
2825; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #19]
2826; NONEON-NOSVE-NEXT:    cmp w9, #7
2827; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2828; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
2829; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #18]
2830; NONEON-NOSVE-NEXT:    cmp w9, #7
2831; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2832; NONEON-NOSVE-NEXT:    strb w9, [sp, #50]
2833; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #17]
2834; NONEON-NOSVE-NEXT:    cmp w9, #7
2835; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2836; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
2837; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #16]
2838; NONEON-NOSVE-NEXT:    cmp w9, #7
2839; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2840; NONEON-NOSVE-NEXT:    strb w9, [sp, #48]
2841; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
2842; NONEON-NOSVE-NEXT:    cmp w9, #7
2843; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2844; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]
2845; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
2846; NONEON-NOSVE-NEXT:    cmp w9, #7
2847; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2848; NONEON-NOSVE-NEXT:    strb w9, [sp, #46]
2849; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
2850; NONEON-NOSVE-NEXT:    cmp w9, #7
2851; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2852; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]
2853; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
2854; NONEON-NOSVE-NEXT:    cmp w9, #7
2855; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2856; NONEON-NOSVE-NEXT:    strb w9, [sp, #44]
2857; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
2858; NONEON-NOSVE-NEXT:    cmp w9, #7
2859; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2860; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]
2861; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
2862; NONEON-NOSVE-NEXT:    cmp w9, #7
2863; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2864; NONEON-NOSVE-NEXT:    strb w9, [sp, #42]
2865; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
2866; NONEON-NOSVE-NEXT:    cmp w9, #7
2867; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2868; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]
2869; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
2870; NONEON-NOSVE-NEXT:    cmp w9, #7
2871; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2872; NONEON-NOSVE-NEXT:    strb w9, [sp, #40]
2873; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
2874; NONEON-NOSVE-NEXT:    cmp w9, #7
2875; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2876; NONEON-NOSVE-NEXT:    strb w9, [sp, #39]
2877; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
2878; NONEON-NOSVE-NEXT:    cmp w9, #7
2879; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2880; NONEON-NOSVE-NEXT:    strb w9, [sp, #38]
2881; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
2882; NONEON-NOSVE-NEXT:    cmp w9, #7
2883; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2884; NONEON-NOSVE-NEXT:    strb w9, [sp, #37]
2885; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
2886; NONEON-NOSVE-NEXT:    cmp w9, #7
2887; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2888; NONEON-NOSVE-NEXT:    strb w9, [sp, #36]
2889; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
2890; NONEON-NOSVE-NEXT:    cmp w9, #7
2891; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2892; NONEON-NOSVE-NEXT:    strb w9, [sp, #35]
2893; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
2894; NONEON-NOSVE-NEXT:    cmp w9, #7
2895; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2896; NONEON-NOSVE-NEXT:    strb w9, [sp, #34]
2897; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
2898; NONEON-NOSVE-NEXT:    cmp w9, #7
2899; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2900; NONEON-NOSVE-NEXT:    strb w9, [sp, #33]
2901; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
2902; NONEON-NOSVE-NEXT:    cmp w9, #7
2903; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lt
2904; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
2905; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2906; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2907; NONEON-NOSVE-NEXT:    add sp, sp, #64
2908; NONEON-NOSVE-NEXT:    ret
2909  %op1 = load <32 x i8>, ptr %a
2910  %ins = insertelement <32 x i8> undef, i8 7, i64 0
2911  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
2912  %res = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %op1, <32 x i8> %op2)
2913  store <32 x i8> %res, ptr %a
2914  ret void
2915}
2916
2917define void @smin_v16i16(ptr %a) {
2918; CHECK-LABEL: smin_v16i16:
2919; CHECK:       // %bb.0:
2920; CHECK-NEXT:    ldp q0, q1, [x0]
2921; CHECK-NEXT:    smin z0.h, z0.h, #15
2922; CHECK-NEXT:    smin z1.h, z1.h, #15
2923; CHECK-NEXT:    stp q0, q1, [x0]
2924; CHECK-NEXT:    ret
2925;
2926; NONEON-NOSVE-LABEL: smin_v16i16:
2927; NONEON-NOSVE:       // %bb.0:
2928; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2929; NONEON-NOSVE-NEXT:    mov w8, #15 // =0xf
2930; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2931; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2932; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]
2933; NONEON-NOSVE-NEXT:    cmp w9, #15
2934; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2935; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]
2936; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #28]
2937; NONEON-NOSVE-NEXT:    cmp w9, #15
2938; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2939; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]
2940; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]
2941; NONEON-NOSVE-NEXT:    cmp w9, #15
2942; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2943; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
2944; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #24]
2945; NONEON-NOSVE-NEXT:    cmp w9, #15
2946; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2947; NONEON-NOSVE-NEXT:    strh w9, [sp, #56]
2948; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]
2949; NONEON-NOSVE-NEXT:    cmp w9, #15
2950; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2951; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]
2952; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #20]
2953; NONEON-NOSVE-NEXT:    cmp w9, #15
2954; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2955; NONEON-NOSVE-NEXT:    strh w9, [sp, #52]
2956; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]
2957; NONEON-NOSVE-NEXT:    cmp w9, #15
2958; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2959; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
2960; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #16]
2961; NONEON-NOSVE-NEXT:    cmp w9, #15
2962; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2963; NONEON-NOSVE-NEXT:    strh w9, [sp, #48]
2964; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
2965; NONEON-NOSVE-NEXT:    cmp w9, #15
2966; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2967; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]
2968; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
2969; NONEON-NOSVE-NEXT:    cmp w9, #15
2970; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2971; NONEON-NOSVE-NEXT:    strh w9, [sp, #44]
2972; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
2973; NONEON-NOSVE-NEXT:    cmp w9, #15
2974; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2975; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]
2976; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
2977; NONEON-NOSVE-NEXT:    cmp w9, #15
2978; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2979; NONEON-NOSVE-NEXT:    strh w9, [sp, #40]
2980; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
2981; NONEON-NOSVE-NEXT:    cmp w9, #15
2982; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2983; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]
2984; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
2985; NONEON-NOSVE-NEXT:    cmp w9, #15
2986; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2987; NONEON-NOSVE-NEXT:    strh w9, [sp, #36]
2988; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
2989; NONEON-NOSVE-NEXT:    cmp w9, #15
2990; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
2991; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]
2992; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
2993; NONEON-NOSVE-NEXT:    cmp w9, #15
2994; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lt
2995; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2996; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2997; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2998; NONEON-NOSVE-NEXT:    add sp, sp, #64
2999; NONEON-NOSVE-NEXT:    ret
3000  %op1 = load <16 x i16>, ptr %a
3001  %ins = insertelement <16 x i16> undef, i16 15, i64 0
3002  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
3003  %res = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %op1, <16 x i16> %op2)
3004  store <16 x i16> %res, ptr %a
3005  ret void
3006}
3007
3008define void @smin_v8i32(ptr %a) {
3009; CHECK-LABEL: smin_v8i32:
3010; CHECK:       // %bb.0:
3011; CHECK-NEXT:    ldp q0, q1, [x0]
3012; CHECK-NEXT:    smin z0.s, z0.s, #31
3013; CHECK-NEXT:    smin z1.s, z1.s, #31
3014; CHECK-NEXT:    stp q0, q1, [x0]
3015; CHECK-NEXT:    ret
3016;
3017; NONEON-NOSVE-LABEL: smin_v8i32:
3018; NONEON-NOSVE:       // %bb.0:
3019; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3020; NONEON-NOSVE-NEXT:    mov w8, #31 // =0x1f
3021; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3022; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3023; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
3024; NONEON-NOSVE-NEXT:    cmp w9, #31
3025; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lt
3026; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
3027; NONEON-NOSVE-NEXT:    cmp w9, #31
3028; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
3029; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
3030; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
3031; NONEON-NOSVE-NEXT:    cmp w9, #31
3032; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lt
3033; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
3034; NONEON-NOSVE-NEXT:    cmp w9, #31
3035; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
3036; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
3037; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
3038; NONEON-NOSVE-NEXT:    cmp w9, #31
3039; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lt
3040; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
3041; NONEON-NOSVE-NEXT:    cmp w9, #31
3042; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lt
3043; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #40]
3044; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
3045; NONEON-NOSVE-NEXT:    cmp w9, #31
3046; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lt
3047; NONEON-NOSVE-NEXT:    ldr w9, [sp]
3048; NONEON-NOSVE-NEXT:    cmp w9, #31
3049; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lt
3050; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
3051; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3052; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3053; NONEON-NOSVE-NEXT:    add sp, sp, #64
3054; NONEON-NOSVE-NEXT:    ret
3055  %op1 = load <8 x i32>, ptr %a
3056  %ins = insertelement <8 x i32> undef, i32 31, i64 0
3057  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
3058  %res = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %op1, <8 x i32> %op2)
3059  store <8 x i32> %res, ptr %a
3060  ret void
3061}
3062
3063define void @smin_v4i64(ptr %a) {
3064; CHECK-LABEL: smin_v4i64:
3065; CHECK:       // %bb.0:
3066; CHECK-NEXT:    ldp q0, q1, [x0]
3067; CHECK-NEXT:    smin z0.d, z0.d, #63
3068; CHECK-NEXT:    smin z1.d, z1.d, #63
3069; CHECK-NEXT:    stp q0, q1, [x0]
3070; CHECK-NEXT:    ret
3071;
3072; NONEON-NOSVE-LABEL: smin_v4i64:
3073; NONEON-NOSVE:       // %bb.0:
3074; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3075; NONEON-NOSVE-NEXT:    mov w8, #63 // =0x3f
3076; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3077; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3078; NONEON-NOSVE-NEXT:    ldr x9, [sp, #24]
3079; NONEON-NOSVE-NEXT:    cmp x9, #63
3080; NONEON-NOSVE-NEXT:    csel x10, x9, x8, lt
3081; NONEON-NOSVE-NEXT:    ldr x9, [sp, #16]
3082; NONEON-NOSVE-NEXT:    cmp x9, #63
3083; NONEON-NOSVE-NEXT:    csel x9, x9, x8, lt
3084; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #48]
3085; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
3086; NONEON-NOSVE-NEXT:    cmp x9, #63
3087; NONEON-NOSVE-NEXT:    csel x10, x9, x8, lt
3088; NONEON-NOSVE-NEXT:    ldr x9, [sp]
3089; NONEON-NOSVE-NEXT:    cmp x9, #63
3090; NONEON-NOSVE-NEXT:    csel x8, x9, x8, lt
3091; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
3092; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3093; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3094; NONEON-NOSVE-NEXT:    add sp, sp, #64
3095; NONEON-NOSVE-NEXT:    ret
3096  %op1 = load <4 x i64>, ptr %a
3097  %ins = insertelement <4 x i64> undef, i64 63, i64 0
3098  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
3099  %res = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %op1, <4 x i64> %op2)
3100  store <4 x i64> %res, ptr %a
3101  ret void
3102}
3103
3104;
3105; SUB
3106;
3107
3108define void @sub_v32i8(ptr %a) {
3109; CHECK-LABEL: sub_v32i8:
3110; CHECK:       // %bb.0:
3111; CHECK-NEXT:    ldp q0, q1, [x0]
3112; CHECK-NEXT:    sub z0.b, z0.b, #7 // =0x7
3113; CHECK-NEXT:    sub z1.b, z1.b, #7 // =0x7
3114; CHECK-NEXT:    stp q0, q1, [x0]
3115; CHECK-NEXT:    ret
3116;
3117; NONEON-NOSVE-LABEL: sub_v32i8:
3118; NONEON-NOSVE:       // %bb.0:
3119; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3120; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3121; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3122; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
3123; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3124; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
3125; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
3126; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3127; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
3128; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
3129; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3130; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
3131; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
3132; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3133; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
3134; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
3135; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3136; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
3137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
3138; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3139; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
3140; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
3141; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3142; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
3143; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
3144; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3145; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
3146; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
3147; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3148; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
3149; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
3150; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3151; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
3152; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
3153; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3154; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
3155; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
3156; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3157; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
3158; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
3159; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3160; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
3161; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
3162; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3163; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
3164; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
3165; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3166; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
3167; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
3168; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3169; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
3170; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
3171; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3172; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
3173; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
3174; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3175; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
3176; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
3177; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3178; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
3179; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
3180; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3181; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
3182; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
3183; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3184; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
3185; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
3186; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3187; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
3188; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
3189; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3190; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
3191; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
3192; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3193; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
3194; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
3195; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3196; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
3197; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
3198; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3199; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
3200; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
3201; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3202; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
3203; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
3204; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3205; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
3206; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
3207; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3208; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
3209; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
3210; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3211; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
3212; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
3213; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3214; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
3215; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
3216; NONEON-NOSVE-NEXT:    sub w8, w8, #7
3217; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
3218; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3219; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3220; NONEON-NOSVE-NEXT:    add sp, sp, #64
3221; NONEON-NOSVE-NEXT:    ret
3222  %op1 = load <32 x i8>, ptr %a
3223  %ins = insertelement <32 x i8> undef, i8 7, i64 0
3224  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
3225  %res = sub <32 x i8> %op1, %op2
3226  store <32 x i8> %res, ptr %a
3227  ret void
3228}
3229
3230define void @sub_v16i16(ptr %a) {
3231; CHECK-LABEL: sub_v16i16:
3232; CHECK:       // %bb.0:
3233; CHECK-NEXT:    ldp q0, q1, [x0]
3234; CHECK-NEXT:    sub z0.h, z0.h, #15 // =0xf
3235; CHECK-NEXT:    sub z1.h, z1.h, #15 // =0xf
3236; CHECK-NEXT:    stp q0, q1, [x0]
3237; CHECK-NEXT:    ret
3238;
3239; NONEON-NOSVE-LABEL: sub_v16i16:
3240; NONEON-NOSVE:       // %bb.0:
3241; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3242; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3243; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3244; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
3245; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3246; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
3247; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
3248; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3249; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
3250; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
3251; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3252; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
3253; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3254; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3255; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
3256; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
3257; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3258; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
3259; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
3260; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3261; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
3262; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
3263; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3264; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
3265; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
3266; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3267; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
3268; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
3269; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3270; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
3271; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
3272; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3273; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
3274; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
3275; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3276; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
3277; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
3278; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3279; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
3280; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
3281; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3282; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
3283; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
3284; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3285; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
3286; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
3287; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3288; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
3289; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
3290; NONEON-NOSVE-NEXT:    sub w8, w8, #15
3291; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
3292; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3293; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3294; NONEON-NOSVE-NEXT:    add sp, sp, #64
3295; NONEON-NOSVE-NEXT:    ret
3296  %op1 = load <16 x i16>, ptr %a
3297  %ins = insertelement <16 x i16> undef, i16 15, i64 0
3298  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
3299  %res = sub <16 x i16> %op1, %op2
3300  store <16 x i16> %res, ptr %a
3301  ret void
3302}
3303
3304define void @sub_v8i32(ptr %a) {
3305; CHECK-LABEL: sub_v8i32:
3306; CHECK:       // %bb.0:
3307; CHECK-NEXT:    ldp q0, q1, [x0]
3308; CHECK-NEXT:    sub z0.s, z0.s, #31 // =0x1f
3309; CHECK-NEXT:    sub z1.s, z1.s, #31 // =0x1f
3310; CHECK-NEXT:    stp q0, q1, [x0]
3311; CHECK-NEXT:    ret
3312;
3313; NONEON-NOSVE-LABEL: sub_v8i32:
3314; NONEON-NOSVE:       // %bb.0:
3315; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3316; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3317; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3318; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
3319; NONEON-NOSVE-NEXT:    sub w9, w8, #31
3320; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
3321; NONEON-NOSVE-NEXT:    sub w8, w8, #31
3322; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
3323; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
3324; NONEON-NOSVE-NEXT:    sub w9, w8, #31
3325; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
3326; NONEON-NOSVE-NEXT:    sub w8, w8, #31
3327; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
3328; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
3329; NONEON-NOSVE-NEXT:    sub w9, w8, #31
3330; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
3331; NONEON-NOSVE-NEXT:    sub w8, w8, #31
3332; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
3333; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
3334; NONEON-NOSVE-NEXT:    sub w9, w8, #31
3335; NONEON-NOSVE-NEXT:    ldr w8, [sp]
3336; NONEON-NOSVE-NEXT:    sub w8, w8, #31
3337; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
3338; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3339; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3340; NONEON-NOSVE-NEXT:    add sp, sp, #64
3341; NONEON-NOSVE-NEXT:    ret
3342  %op1 = load <8 x i32>, ptr %a
3343  %ins = insertelement <8 x i32> undef, i32 31, i64 0
3344  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
3345  %res = sub <8 x i32> %op1, %op2
3346  store <8 x i32> %res, ptr %a
3347  ret void
3348}
3349
3350define void @sub_v4i64(ptr %a) {
3351; CHECK-LABEL: sub_v4i64:
3352; CHECK:       // %bb.0:
3353; CHECK-NEXT:    ldp q0, q1, [x0]
3354; CHECK-NEXT:    sub z0.d, z0.d, #63 // =0x3f
3355; CHECK-NEXT:    sub z1.d, z1.d, #63 // =0x3f
3356; CHECK-NEXT:    stp q0, q1, [x0]
3357; CHECK-NEXT:    ret
3358;
3359; NONEON-NOSVE-LABEL: sub_v4i64:
3360; NONEON-NOSVE:       // %bb.0:
3361; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3362; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3363; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3364; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
3365; NONEON-NOSVE-NEXT:    sub x9, x8, #63
3366; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
3367; NONEON-NOSVE-NEXT:    sub x8, x8, #63
3368; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
3369; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
3370; NONEON-NOSVE-NEXT:    sub x9, x8, #63
3371; NONEON-NOSVE-NEXT:    ldr x8, [sp]
3372; NONEON-NOSVE-NEXT:    sub x8, x8, #63
3373; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
3374; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3375; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3376; NONEON-NOSVE-NEXT:    add sp, sp, #64
3377; NONEON-NOSVE-NEXT:    ret
3378  %op1 = load <4 x i64>, ptr %a
3379  %ins = insertelement <4 x i64> undef, i64 63, i64 0
3380  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
3381  %res = sub <4 x i64> %op1, %op2
3382  store <4 x i64> %res, ptr %a
3383  ret void
3384}
3385
3386;
3387; UMAX
3388;
3389
3390define void @umax_v32i8(ptr %a) {
3391; CHECK-LABEL: umax_v32i8:
3392; CHECK:       // %bb.0:
3393; CHECK-NEXT:    ldp q0, q1, [x0]
3394; CHECK-NEXT:    umax z0.b, z0.b, #7
3395; CHECK-NEXT:    umax z1.b, z1.b, #7
3396; CHECK-NEXT:    stp q0, q1, [x0]
3397; CHECK-NEXT:    ret
3398;
3399; NONEON-NOSVE-LABEL: umax_v32i8:
3400; NONEON-NOSVE:       // %bb.0:
3401; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3402; NONEON-NOSVE-NEXT:    mov w8, #7 // =0x7
3403; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3404; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3405; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #31]
3406; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3407; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3408; NONEON-NOSVE-NEXT:    strb w9, [sp, #63]
3409; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #30]
3410; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3411; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3412; NONEON-NOSVE-NEXT:    strb w9, [sp, #62]
3413; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #29]
3414; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3415; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3416; NONEON-NOSVE-NEXT:    strb w9, [sp, #61]
3417; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #28]
3418; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3419; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3420; NONEON-NOSVE-NEXT:    strb w9, [sp, #60]
3421; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #27]
3422; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3423; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3424; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
3425; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #26]
3426; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3427; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3428; NONEON-NOSVE-NEXT:    strb w9, [sp, #58]
3429; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #25]
3430; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3431; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3432; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
3433; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #24]
3434; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3435; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3436; NONEON-NOSVE-NEXT:    strb w9, [sp, #56]
3437; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #23]
3438; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3439; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3440; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
3441; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #22]
3442; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3443; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3444; NONEON-NOSVE-NEXT:    strb w9, [sp, #54]
3445; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #21]
3446; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3447; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3448; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
3449; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #20]
3450; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3451; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3452; NONEON-NOSVE-NEXT:    strb w9, [sp, #52]
3453; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
3454; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3455; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3456; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
3457; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #18]
3458; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3459; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3460; NONEON-NOSVE-NEXT:    strb w9, [sp, #50]
3461; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #17]
3462; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3463; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3464; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
3465; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #16]
3466; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3467; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3468; NONEON-NOSVE-NEXT:    strb w9, [sp, #48]
3469; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
3470; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3471; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3472; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]
3473; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
3474; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3475; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3476; NONEON-NOSVE-NEXT:    strb w9, [sp, #46]
3477; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
3478; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3479; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3480; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]
3481; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
3482; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3483; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3484; NONEON-NOSVE-NEXT:    strb w9, [sp, #44]
3485; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
3486; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3487; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3488; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]
3489; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
3490; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3491; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3492; NONEON-NOSVE-NEXT:    strb w9, [sp, #42]
3493; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
3494; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3495; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3496; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]
3497; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
3498; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3499; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3500; NONEON-NOSVE-NEXT:    strb w9, [sp, #40]
3501; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
3502; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3503; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3504; NONEON-NOSVE-NEXT:    strb w9, [sp, #39]
3505; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
3506; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3507; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3508; NONEON-NOSVE-NEXT:    strb w9, [sp, #38]
3509; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
3510; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3511; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3512; NONEON-NOSVE-NEXT:    strb w9, [sp, #37]
3513; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
3514; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3515; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3516; NONEON-NOSVE-NEXT:    strb w9, [sp, #36]
3517; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
3518; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3519; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3520; NONEON-NOSVE-NEXT:    strb w9, [sp, #35]
3521; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
3522; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3523; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3524; NONEON-NOSVE-NEXT:    strb w9, [sp, #34]
3525; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
3526; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3527; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3528; NONEON-NOSVE-NEXT:    strb w9, [sp, #33]
3529; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
3530; NONEON-NOSVE-NEXT:    tst w9, #0xf8
3531; NONEON-NOSVE-NEXT:    csel w8, w9, w8, ne
3532; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
3533; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3534; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3535; NONEON-NOSVE-NEXT:    add sp, sp, #64
3536; NONEON-NOSVE-NEXT:    ret
3537  %op1 = load <32 x i8>, ptr %a
3538  %ins = insertelement <32 x i8> undef, i8 7, i64 0
3539  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
3540  %res = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %op1, <32 x i8> %op2)
3541  store <32 x i8> %res, ptr %a
3542  ret void
3543}
3544
3545define void @umax_v16i16(ptr %a) {
3546; CHECK-LABEL: umax_v16i16:
3547; CHECK:       // %bb.0:
3548; CHECK-NEXT:    ldp q0, q1, [x0]
3549; CHECK-NEXT:    umax z0.h, z0.h, #15
3550; CHECK-NEXT:    umax z1.h, z1.h, #15
3551; CHECK-NEXT:    stp q0, q1, [x0]
3552; CHECK-NEXT:    ret
3553;
3554; NONEON-NOSVE-LABEL: umax_v16i16:
3555; NONEON-NOSVE:       // %bb.0:
3556; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3557; NONEON-NOSVE-NEXT:    mov w8, #15 // =0xf
3558; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3559; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3560; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
3561; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3562; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3563; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]
3564; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #28]
3565; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3566; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3567; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]
3568; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3569; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3570; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3571; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
3572; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #24]
3573; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3574; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3575; NONEON-NOSVE-NEXT:    strh w9, [sp, #56]
3576; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
3577; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3578; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3579; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]
3580; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #20]
3581; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3582; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3583; NONEON-NOSVE-NEXT:    strh w9, [sp, #52]
3584; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
3585; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3586; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3587; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
3588; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #16]
3589; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3590; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3591; NONEON-NOSVE-NEXT:    strh w9, [sp, #48]
3592; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
3593; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3594; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3595; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]
3596; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
3597; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3598; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3599; NONEON-NOSVE-NEXT:    strh w9, [sp, #44]
3600; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
3601; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3602; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3603; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]
3604; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
3605; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3606; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3607; NONEON-NOSVE-NEXT:    strh w9, [sp, #40]
3608; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
3609; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3610; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3611; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]
3612; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
3613; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3614; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3615; NONEON-NOSVE-NEXT:    strh w9, [sp, #36]
3616; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
3617; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3618; NONEON-NOSVE-NEXT:    csel w9, w9, w8, ne
3619; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]
3620; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
3621; NONEON-NOSVE-NEXT:    tst w9, #0xfff0
3622; NONEON-NOSVE-NEXT:    csel w8, w9, w8, ne
3623; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
3624; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3625; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3626; NONEON-NOSVE-NEXT:    add sp, sp, #64
3627; NONEON-NOSVE-NEXT:    ret
3628  %op1 = load <16 x i16>, ptr %a
3629  %ins = insertelement <16 x i16> undef, i16 15, i64 0
3630  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
3631  %res = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %op1, <16 x i16> %op2)
3632  store <16 x i16> %res, ptr %a
3633  ret void
3634}
3635
3636define void @umax_v8i32(ptr %a) {
3637; CHECK-LABEL: umax_v8i32:
3638; CHECK:       // %bb.0:
3639; CHECK-NEXT:    ldp q0, q1, [x0]
3640; CHECK-NEXT:    umax z0.s, z0.s, #31
3641; CHECK-NEXT:    umax z1.s, z1.s, #31
3642; CHECK-NEXT:    stp q0, q1, [x0]
3643; CHECK-NEXT:    ret
3644;
3645; NONEON-NOSVE-LABEL: umax_v8i32:
3646; NONEON-NOSVE:       // %bb.0:
3647; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3648; NONEON-NOSVE-NEXT:    mov w8, #31 // =0x1f
3649; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3650; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3651; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
3652; NONEON-NOSVE-NEXT:    cmp w9, #31
3653; NONEON-NOSVE-NEXT:    csel w10, w9, w8, hi
3654; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
3655; NONEON-NOSVE-NEXT:    cmp w9, #31
3656; NONEON-NOSVE-NEXT:    csel w9, w9, w8, hi
3657; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
3658; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
3659; NONEON-NOSVE-NEXT:    cmp w9, #31
3660; NONEON-NOSVE-NEXT:    csel w10, w9, w8, hi
3661; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
3662; NONEON-NOSVE-NEXT:    cmp w9, #31
3663; NONEON-NOSVE-NEXT:    csel w9, w9, w8, hi
3664; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
3665; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
3666; NONEON-NOSVE-NEXT:    cmp w9, #31
3667; NONEON-NOSVE-NEXT:    csel w10, w9, w8, hi
3668; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
3669; NONEON-NOSVE-NEXT:    cmp w9, #31
3670; NONEON-NOSVE-NEXT:    csel w9, w9, w8, hi
3671; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #40]
3672; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
3673; NONEON-NOSVE-NEXT:    cmp w9, #31
3674; NONEON-NOSVE-NEXT:    csel w10, w9, w8, hi
3675; NONEON-NOSVE-NEXT:    ldr w9, [sp]
3676; NONEON-NOSVE-NEXT:    cmp w9, #31
3677; NONEON-NOSVE-NEXT:    csel w8, w9, w8, hi
3678; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
3679; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3680; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3681; NONEON-NOSVE-NEXT:    add sp, sp, #64
3682; NONEON-NOSVE-NEXT:    ret
3683  %op1 = load <8 x i32>, ptr %a
3684  %ins = insertelement <8 x i32> undef, i32 31, i64 0
3685  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
3686  %res = call <8 x i32> @llvm.umax.v8i32(<8 x i32> %op1, <8 x i32> %op2)
3687  store <8 x i32> %res, ptr %a
3688  ret void
3689}
3690
3691define void @umax_v4i64(ptr %a) {
3692; CHECK-LABEL: umax_v4i64:
3693; CHECK:       // %bb.0:
3694; CHECK-NEXT:    ldp q0, q1, [x0]
3695; CHECK-NEXT:    umax z0.d, z0.d, #63
3696; CHECK-NEXT:    umax z1.d, z1.d, #63
3697; CHECK-NEXT:    stp q0, q1, [x0]
3698; CHECK-NEXT:    ret
3699;
3700; NONEON-NOSVE-LABEL: umax_v4i64:
3701; NONEON-NOSVE:       // %bb.0:
3702; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3703; NONEON-NOSVE-NEXT:    mov w8, #63 // =0x3f
3704; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3705; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3706; NONEON-NOSVE-NEXT:    ldr x9, [sp, #24]
3707; NONEON-NOSVE-NEXT:    cmp x9, #63
3708; NONEON-NOSVE-NEXT:    csel x10, x9, x8, hi
3709; NONEON-NOSVE-NEXT:    ldr x9, [sp, #16]
3710; NONEON-NOSVE-NEXT:    cmp x9, #63
3711; NONEON-NOSVE-NEXT:    csel x9, x9, x8, hi
3712; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #48]
3713; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
3714; NONEON-NOSVE-NEXT:    cmp x9, #63
3715; NONEON-NOSVE-NEXT:    csel x10, x9, x8, hi
3716; NONEON-NOSVE-NEXT:    ldr x9, [sp]
3717; NONEON-NOSVE-NEXT:    cmp x9, #63
3718; NONEON-NOSVE-NEXT:    csel x8, x9, x8, hi
3719; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
3720; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3721; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3722; NONEON-NOSVE-NEXT:    add sp, sp, #64
3723; NONEON-NOSVE-NEXT:    ret
3724  %op1 = load <4 x i64>, ptr %a
3725  %ins = insertelement <4 x i64> undef, i64 63, i64 0
3726  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
3727  %res = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %op1, <4 x i64> %op2)
3728  store <4 x i64> %res, ptr %a
3729  ret void
3730}
3731
3732;
3733; UMIN
3734;
3735
3736define void @umin_v32i8(ptr %a) {
3737; CHECK-LABEL: umin_v32i8:
3738; CHECK:       // %bb.0:
3739; CHECK-NEXT:    ldp q0, q1, [x0]
3740; CHECK-NEXT:    umin z0.b, z0.b, #7
3741; CHECK-NEXT:    umin z1.b, z1.b, #7
3742; CHECK-NEXT:    stp q0, q1, [x0]
3743; CHECK-NEXT:    ret
3744;
3745; NONEON-NOSVE-LABEL: umin_v32i8:
3746; NONEON-NOSVE:       // %bb.0:
3747; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3748; NONEON-NOSVE-NEXT:    mov w8, #7 // =0x7
3749; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3750; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3751; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #31]
3752; NONEON-NOSVE-NEXT:    cmp w9, #7
3753; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3754; NONEON-NOSVE-NEXT:    strb w9, [sp, #63]
3755; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #30]
3756; NONEON-NOSVE-NEXT:    cmp w9, #7
3757; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3758; NONEON-NOSVE-NEXT:    strb w9, [sp, #62]
3759; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #29]
3760; NONEON-NOSVE-NEXT:    cmp w9, #7
3761; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3762; NONEON-NOSVE-NEXT:    strb w9, [sp, #61]
3763; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #28]
3764; NONEON-NOSVE-NEXT:    cmp w9, #7
3765; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3766; NONEON-NOSVE-NEXT:    strb w9, [sp, #60]
3767; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #27]
3768; NONEON-NOSVE-NEXT:    cmp w9, #7
3769; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3770; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
3771; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #26]
3772; NONEON-NOSVE-NEXT:    cmp w9, #7
3773; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3774; NONEON-NOSVE-NEXT:    strb w9, [sp, #58]
3775; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #25]
3776; NONEON-NOSVE-NEXT:    cmp w9, #7
3777; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3778; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
3779; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #24]
3780; NONEON-NOSVE-NEXT:    cmp w9, #7
3781; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3782; NONEON-NOSVE-NEXT:    strb w9, [sp, #56]
3783; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #23]
3784; NONEON-NOSVE-NEXT:    cmp w9, #7
3785; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3786; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
3787; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #22]
3788; NONEON-NOSVE-NEXT:    cmp w9, #7
3789; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3790; NONEON-NOSVE-NEXT:    strb w9, [sp, #54]
3791; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #21]
3792; NONEON-NOSVE-NEXT:    cmp w9, #7
3793; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3794; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
3795; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #20]
3796; NONEON-NOSVE-NEXT:    cmp w9, #7
3797; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3798; NONEON-NOSVE-NEXT:    strb w9, [sp, #52]
3799; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
3800; NONEON-NOSVE-NEXT:    cmp w9, #7
3801; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3802; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
3803; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #18]
3804; NONEON-NOSVE-NEXT:    cmp w9, #7
3805; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3806; NONEON-NOSVE-NEXT:    strb w9, [sp, #50]
3807; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #17]
3808; NONEON-NOSVE-NEXT:    cmp w9, #7
3809; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3810; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
3811; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #16]
3812; NONEON-NOSVE-NEXT:    cmp w9, #7
3813; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3814; NONEON-NOSVE-NEXT:    strb w9, [sp, #48]
3815; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
3816; NONEON-NOSVE-NEXT:    cmp w9, #7
3817; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3818; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]
3819; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
3820; NONEON-NOSVE-NEXT:    cmp w9, #7
3821; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3822; NONEON-NOSVE-NEXT:    strb w9, [sp, #46]
3823; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
3824; NONEON-NOSVE-NEXT:    cmp w9, #7
3825; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3826; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]
3827; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
3828; NONEON-NOSVE-NEXT:    cmp w9, #7
3829; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3830; NONEON-NOSVE-NEXT:    strb w9, [sp, #44]
3831; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
3832; NONEON-NOSVE-NEXT:    cmp w9, #7
3833; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3834; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]
3835; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
3836; NONEON-NOSVE-NEXT:    cmp w9, #7
3837; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3838; NONEON-NOSVE-NEXT:    strb w9, [sp, #42]
3839; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
3840; NONEON-NOSVE-NEXT:    cmp w9, #7
3841; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3842; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]
3843; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
3844; NONEON-NOSVE-NEXT:    cmp w9, #7
3845; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3846; NONEON-NOSVE-NEXT:    strb w9, [sp, #40]
3847; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
3848; NONEON-NOSVE-NEXT:    cmp w9, #7
3849; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3850; NONEON-NOSVE-NEXT:    strb w9, [sp, #39]
3851; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
3852; NONEON-NOSVE-NEXT:    cmp w9, #7
3853; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3854; NONEON-NOSVE-NEXT:    strb w9, [sp, #38]
3855; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
3856; NONEON-NOSVE-NEXT:    cmp w9, #7
3857; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3858; NONEON-NOSVE-NEXT:    strb w9, [sp, #37]
3859; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
3860; NONEON-NOSVE-NEXT:    cmp w9, #7
3861; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3862; NONEON-NOSVE-NEXT:    strb w9, [sp, #36]
3863; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
3864; NONEON-NOSVE-NEXT:    cmp w9, #7
3865; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3866; NONEON-NOSVE-NEXT:    strb w9, [sp, #35]
3867; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
3868; NONEON-NOSVE-NEXT:    cmp w9, #7
3869; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3870; NONEON-NOSVE-NEXT:    strb w9, [sp, #34]
3871; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
3872; NONEON-NOSVE-NEXT:    cmp w9, #7
3873; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3874; NONEON-NOSVE-NEXT:    strb w9, [sp, #33]
3875; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
3876; NONEON-NOSVE-NEXT:    cmp w9, #7
3877; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lo
3878; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
3879; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3880; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3881; NONEON-NOSVE-NEXT:    add sp, sp, #64
3882; NONEON-NOSVE-NEXT:    ret
3883  %op1 = load <32 x i8>, ptr %a
3884  %ins = insertelement <32 x i8> undef, i8 7, i64 0
3885  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
3886  %res = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %op1, <32 x i8> %op2)
3887  store <32 x i8> %res, ptr %a
3888  ret void
3889}
3890
3891define void @umin_v16i16(ptr %a) {
3892; CHECK-LABEL: umin_v16i16:
3893; CHECK:       // %bb.0:
3894; CHECK-NEXT:    ldp q0, q1, [x0]
3895; CHECK-NEXT:    umin z0.h, z0.h, #15
3896; CHECK-NEXT:    umin z1.h, z1.h, #15
3897; CHECK-NEXT:    stp q0, q1, [x0]
3898; CHECK-NEXT:    ret
3899;
3900; NONEON-NOSVE-LABEL: umin_v16i16:
3901; NONEON-NOSVE:       // %bb.0:
3902; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3903; NONEON-NOSVE-NEXT:    mov w8, #15 // =0xf
3904; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3905; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3906; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
3907; NONEON-NOSVE-NEXT:    cmp w9, #15
3908; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3909; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]
3910; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #28]
3911; NONEON-NOSVE-NEXT:    cmp w9, #15
3912; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3913; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]
3914; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3915; NONEON-NOSVE-NEXT:    cmp w9, #15
3916; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3917; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
3918; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #24]
3919; NONEON-NOSVE-NEXT:    cmp w9, #15
3920; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3921; NONEON-NOSVE-NEXT:    strh w9, [sp, #56]
3922; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
3923; NONEON-NOSVE-NEXT:    cmp w9, #15
3924; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3925; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]
3926; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #20]
3927; NONEON-NOSVE-NEXT:    cmp w9, #15
3928; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3929; NONEON-NOSVE-NEXT:    strh w9, [sp, #52]
3930; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
3931; NONEON-NOSVE-NEXT:    cmp w9, #15
3932; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3933; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
3934; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #16]
3935; NONEON-NOSVE-NEXT:    cmp w9, #15
3936; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3937; NONEON-NOSVE-NEXT:    strh w9, [sp, #48]
3938; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
3939; NONEON-NOSVE-NEXT:    cmp w9, #15
3940; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3941; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]
3942; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
3943; NONEON-NOSVE-NEXT:    cmp w9, #15
3944; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3945; NONEON-NOSVE-NEXT:    strh w9, [sp, #44]
3946; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
3947; NONEON-NOSVE-NEXT:    cmp w9, #15
3948; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3949; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]
3950; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
3951; NONEON-NOSVE-NEXT:    cmp w9, #15
3952; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3953; NONEON-NOSVE-NEXT:    strh w9, [sp, #40]
3954; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
3955; NONEON-NOSVE-NEXT:    cmp w9, #15
3956; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3957; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]
3958; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
3959; NONEON-NOSVE-NEXT:    cmp w9, #15
3960; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3961; NONEON-NOSVE-NEXT:    strh w9, [sp, #36]
3962; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
3963; NONEON-NOSVE-NEXT:    cmp w9, #15
3964; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
3965; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]
3966; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
3967; NONEON-NOSVE-NEXT:    cmp w9, #15
3968; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lo
3969; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
3970; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3971; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3972; NONEON-NOSVE-NEXT:    add sp, sp, #64
3973; NONEON-NOSVE-NEXT:    ret
3974  %op1 = load <16 x i16>, ptr %a
3975  %ins = insertelement <16 x i16> undef, i16 15, i64 0
3976  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
3977  %res = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %op1, <16 x i16> %op2)
3978  store <16 x i16> %res, ptr %a
3979  ret void
3980}
3981
3982define void @umin_v8i32(ptr %a) {
3983; CHECK-LABEL: umin_v8i32:
3984; CHECK:       // %bb.0:
3985; CHECK-NEXT:    ldp q0, q1, [x0]
3986; CHECK-NEXT:    umin z0.s, z0.s, #31
3987; CHECK-NEXT:    umin z1.s, z1.s, #31
3988; CHECK-NEXT:    stp q0, q1, [x0]
3989; CHECK-NEXT:    ret
3990;
3991; NONEON-NOSVE-LABEL: umin_v8i32:
3992; NONEON-NOSVE:       // %bb.0:
3993; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3994; NONEON-NOSVE-NEXT:    mov w8, #31 // =0x1f
3995; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3996; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3997; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
3998; NONEON-NOSVE-NEXT:    cmp w9, #31
3999; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lo
4000; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
4001; NONEON-NOSVE-NEXT:    cmp w9, #31
4002; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
4003; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
4004; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
4005; NONEON-NOSVE-NEXT:    cmp w9, #31
4006; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lo
4007; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
4008; NONEON-NOSVE-NEXT:    cmp w9, #31
4009; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
4010; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
4011; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
4012; NONEON-NOSVE-NEXT:    cmp w9, #31
4013; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lo
4014; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
4015; NONEON-NOSVE-NEXT:    cmp w9, #31
4016; NONEON-NOSVE-NEXT:    csel w9, w9, w8, lo
4017; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #40]
4018; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
4019; NONEON-NOSVE-NEXT:    cmp w9, #31
4020; NONEON-NOSVE-NEXT:    csel w10, w9, w8, lo
4021; NONEON-NOSVE-NEXT:    ldr w9, [sp]
4022; NONEON-NOSVE-NEXT:    cmp w9, #31
4023; NONEON-NOSVE-NEXT:    csel w8, w9, w8, lo
4024; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
4025; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4026; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4027; NONEON-NOSVE-NEXT:    add sp, sp, #64
4028; NONEON-NOSVE-NEXT:    ret
4029  %op1 = load <8 x i32>, ptr %a
4030  %ins = insertelement <8 x i32> undef, i32 31, i64 0
4031  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
4032  %res = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %op1, <8 x i32> %op2)
4033  store <8 x i32> %res, ptr %a
4034  ret void
4035}
4036
4037define void @umin_v4i64(ptr %a) {
4038; CHECK-LABEL: umin_v4i64:
4039; CHECK:       // %bb.0:
4040; CHECK-NEXT:    ldp q0, q1, [x0]
4041; CHECK-NEXT:    umin z0.d, z0.d, #63
4042; CHECK-NEXT:    umin z1.d, z1.d, #63
4043; CHECK-NEXT:    stp q0, q1, [x0]
4044; CHECK-NEXT:    ret
4045;
4046; NONEON-NOSVE-LABEL: umin_v4i64:
4047; NONEON-NOSVE:       // %bb.0:
4048; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4049; NONEON-NOSVE-NEXT:    mov w8, #63 // =0x3f
4050; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
4051; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4052; NONEON-NOSVE-NEXT:    ldr x9, [sp, #24]
4053; NONEON-NOSVE-NEXT:    cmp x9, #63
4054; NONEON-NOSVE-NEXT:    csel x10, x9, x8, lo
4055; NONEON-NOSVE-NEXT:    ldr x9, [sp, #16]
4056; NONEON-NOSVE-NEXT:    cmp x9, #63
4057; NONEON-NOSVE-NEXT:    csel x9, x9, x8, lo
4058; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #48]
4059; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
4060; NONEON-NOSVE-NEXT:    cmp x9, #63
4061; NONEON-NOSVE-NEXT:    csel x10, x9, x8, lo
4062; NONEON-NOSVE-NEXT:    ldr x9, [sp]
4063; NONEON-NOSVE-NEXT:    cmp x9, #63
4064; NONEON-NOSVE-NEXT:    csel x8, x9, x8, lo
4065; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
4066; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4067; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4068; NONEON-NOSVE-NEXT:    add sp, sp, #64
4069; NONEON-NOSVE-NEXT:    ret
4070  %op1 = load <4 x i64>, ptr %a
4071  %ins = insertelement <4 x i64> undef, i64 63, i64 0
4072  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
4073  %res = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %op1, <4 x i64> %op2)
4074  store <4 x i64> %res, ptr %a
4075  ret void
4076}
4077
4078;
4079; XOR
4080;
4081
4082define void @xor_v32i8(ptr %a) {
4083; CHECK-LABEL: xor_v32i8:
4084; CHECK:       // %bb.0:
4085; CHECK-NEXT:    ldp q0, q1, [x0]
4086; CHECK-NEXT:    eor z0.b, z0.b, #0x7
4087; CHECK-NEXT:    eor z1.b, z1.b, #0x7
4088; CHECK-NEXT:    stp q0, q1, [x0]
4089; CHECK-NEXT:    ret
4090;
4091; NONEON-NOSVE-LABEL: xor_v32i8:
4092; NONEON-NOSVE:       // %bb.0:
4093; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4094; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
4095; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4096; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
4097; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4098; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
4099; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
4100; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4101; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
4102; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
4103; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4104; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
4105; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
4106; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4107; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
4108; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
4109; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4110; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
4111; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
4112; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4113; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
4114; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
4115; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4116; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
4117; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
4118; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4119; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
4120; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
4121; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4122; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
4123; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
4124; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4125; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
4126; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
4127; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4128; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
4129; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
4130; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4131; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
4132; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
4133; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4134; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
4135; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
4136; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4137; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
4138; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
4139; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4140; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
4141; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
4142; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4143; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
4144; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
4145; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4146; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
4147; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
4148; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4149; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
4150; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
4151; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4152; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
4153; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
4154; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4155; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
4156; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
4157; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4158; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
4159; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
4160; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4161; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
4162; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
4163; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4164; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
4165; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
4166; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4167; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
4168; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
4169; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4170; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
4171; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
4172; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4173; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
4174; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
4175; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4176; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
4177; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
4178; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4179; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
4180; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
4181; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4182; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
4183; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
4184; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4185; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
4186; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
4187; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4188; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
4189; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
4190; NONEON-NOSVE-NEXT:    eor w8, w8, #0x7
4191; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
4192; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4193; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4194; NONEON-NOSVE-NEXT:    add sp, sp, #64
4195; NONEON-NOSVE-NEXT:    ret
4196  %op1 = load <32 x i8>, ptr %a
4197  %ins = insertelement <32 x i8> undef, i8 7, i64 0
4198  %op2 = shufflevector <32 x i8> %ins, <32 x i8> undef, <32 x i32> zeroinitializer
4199  %res = xor <32 x i8> %op1, %op2
4200  store <32 x i8> %res, ptr %a
4201  ret void
4202}
4203
4204define void @xor_v16i16(ptr %a) {
4205; CHECK-LABEL: xor_v16i16:
4206; CHECK:       // %bb.0:
4207; CHECK-NEXT:    ldp q0, q1, [x0]
4208; CHECK-NEXT:    eor z0.h, z0.h, #0xf
4209; CHECK-NEXT:    eor z1.h, z1.h, #0xf
4210; CHECK-NEXT:    stp q0, q1, [x0]
4211; CHECK-NEXT:    ret
4212;
4213; NONEON-NOSVE-LABEL: xor_v16i16:
4214; NONEON-NOSVE:       // %bb.0:
4215; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4216; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
4217; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4218; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
4219; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4220; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
4221; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
4222; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4223; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
4224; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
4225; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4226; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
4227; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
4228; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4229; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
4230; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
4231; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4232; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
4233; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
4234; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4235; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
4236; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
4237; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4238; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
4239; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
4240; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4241; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
4242; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
4243; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4244; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
4245; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
4246; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4247; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
4248; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
4249; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4250; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
4251; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
4252; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4253; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
4254; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
4255; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4256; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
4257; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
4258; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4259; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
4260; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
4261; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4262; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
4263; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
4264; NONEON-NOSVE-NEXT:    eor w8, w8, #0xf
4265; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
4266; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4267; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4268; NONEON-NOSVE-NEXT:    add sp, sp, #64
4269; NONEON-NOSVE-NEXT:    ret
4270  %op1 = load <16 x i16>, ptr %a
4271  %ins = insertelement <16 x i16> undef, i16 15, i64 0
4272  %op2 = shufflevector <16 x i16> %ins, <16 x i16> undef, <16 x i32> zeroinitializer
4273  %res = xor <16 x i16> %op1, %op2
4274  store <16 x i16> %res, ptr %a
4275  ret void
4276}
4277
4278define void @xor_v8i32(ptr %a) {
4279; CHECK-LABEL: xor_v8i32:
4280; CHECK:       // %bb.0:
4281; CHECK-NEXT:    ldp q0, q1, [x0]
4282; CHECK-NEXT:    eor z0.s, z0.s, #0x1f
4283; CHECK-NEXT:    eor z1.s, z1.s, #0x1f
4284; CHECK-NEXT:    stp q0, q1, [x0]
4285; CHECK-NEXT:    ret
4286;
4287; NONEON-NOSVE-LABEL: xor_v8i32:
4288; NONEON-NOSVE:       // %bb.0:
4289; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4290; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
4291; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4292; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
4293; NONEON-NOSVE-NEXT:    eor w9, w8, #0x1f
4294; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
4295; NONEON-NOSVE-NEXT:    eor w8, w8, #0x1f
4296; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
4297; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
4298; NONEON-NOSVE-NEXT:    eor w9, w8, #0x1f
4299; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
4300; NONEON-NOSVE-NEXT:    eor w8, w8, #0x1f
4301; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
4302; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
4303; NONEON-NOSVE-NEXT:    eor w9, w8, #0x1f
4304; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
4305; NONEON-NOSVE-NEXT:    eor w8, w8, #0x1f
4306; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
4307; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
4308; NONEON-NOSVE-NEXT:    eor w9, w8, #0x1f
4309; NONEON-NOSVE-NEXT:    ldr w8, [sp]
4310; NONEON-NOSVE-NEXT:    eor w8, w8, #0x1f
4311; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
4312; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4313; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4314; NONEON-NOSVE-NEXT:    add sp, sp, #64
4315; NONEON-NOSVE-NEXT:    ret
4316  %op1 = load <8 x i32>, ptr %a
4317  %ins = insertelement <8 x i32> undef, i32 31, i64 0
4318  %op2 = shufflevector <8 x i32> %ins, <8 x i32> undef, <8 x i32> zeroinitializer
4319  %res = xor <8 x i32> %op1, %op2
4320  store <8 x i32> %res, ptr %a
4321  ret void
4322}
4323
4324define void @xor_v4i64(ptr %a) {
4325; CHECK-LABEL: xor_v4i64:
4326; CHECK:       // %bb.0:
4327; CHECK-NEXT:    ldp q0, q1, [x0]
4328; CHECK-NEXT:    eor z0.d, z0.d, #0x3f
4329; CHECK-NEXT:    eor z1.d, z1.d, #0x3f
4330; CHECK-NEXT:    stp q0, q1, [x0]
4331; CHECK-NEXT:    ret
4332;
4333; NONEON-NOSVE-LABEL: xor_v4i64:
4334; NONEON-NOSVE:       // %bb.0:
4335; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4336; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
4337; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4338; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
4339; NONEON-NOSVE-NEXT:    eor x9, x8, #0x3f
4340; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
4341; NONEON-NOSVE-NEXT:    eor x8, x8, #0x3f
4342; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
4343; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
4344; NONEON-NOSVE-NEXT:    eor x9, x8, #0x3f
4345; NONEON-NOSVE-NEXT:    ldr x8, [sp]
4346; NONEON-NOSVE-NEXT:    eor x8, x8, #0x3f
4347; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
4348; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4349; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
4350; NONEON-NOSVE-NEXT:    add sp, sp, #64
4351; NONEON-NOSVE-NEXT:    ret
4352  %op1 = load <4 x i64>, ptr %a
4353  %ins = insertelement <4 x i64> undef, i64 63, i64 0
4354  %op2 = shufflevector <4 x i64> %ins, <4 x i64> undef, <4 x i32> zeroinitializer
4355  %res = xor <4 x i64> %op1, %op2
4356  store <4 x i64> %res, ptr %a
4357  ret void
4358}
4359
4360declare <32 x i8> @llvm.smax.v32i8(<32 x i8>, <32 x i8>)
4361declare <16 x i16> @llvm.smax.v16i16(<16 x i16>, <16 x i16>)
4362declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
4363declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
4364
4365declare <32 x i8> @llvm.smin.v32i8(<32 x i8>, <32 x i8>)
4366declare <16 x i16> @llvm.smin.v16i16(<16 x i16>, <16 x i16>)
4367declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
4368declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
4369
4370declare <32 x i8> @llvm.umax.v32i8(<32 x i8>, <32 x i8>)
4371declare <16 x i16> @llvm.umax.v16i16(<16 x i16>, <16 x i16>)
4372declare <8 x i32> @llvm.umax.v8i32(<8 x i32>, <8 x i32>)
4373declare <4 x i64> @llvm.umax.v4i64(<4 x i64>, <4 x i64>)
4374
4375declare <32 x i8> @llvm.umin.v32i8(<32 x i8>, <32 x i8>)
4376declare <16 x i16> @llvm.umin.v16i16(<16 x i16>, <16 x i16>)
4377declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
4378declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)
4379