xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-div.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve2 -force-streaming-compatible  < %s | FileCheck %s --check-prefixes=CHECK
3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s --check-prefixes=CHECK
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8;
9; SDIV
10;
11
12define <4 x i8> @sdiv_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
13; CHECK-LABEL: sdiv_v4i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    ptrue p0.h, vl4
16; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
17; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
18; CHECK-NEXT:    sxtb z0.h, p0/m, z0.h
19; CHECK-NEXT:    sxtb z1.h, p0/m, z1.h
20; CHECK-NEXT:    ptrue p0.s, vl4
21; CHECK-NEXT:    sunpklo z1.s, z1.h
22; CHECK-NEXT:    sunpklo z0.s, z0.h
23; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
24; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
25; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
26; CHECK-NEXT:    ret
27;
28; NONEON-NOSVE-LABEL: sdiv_v4i8:
29; NONEON-NOSVE:       // %bb.0:
30; NONEON-NOSVE-NEXT:    sub sp, sp, #32
31; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
32; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
33; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
34; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
35; NONEON-NOSVE-NEXT:    ldrsb w10, [sp, #12]
36; NONEON-NOSVE-NEXT:    ldrsb w11, [sp, #10]
37; NONEON-NOSVE-NEXT:    ldrsb w12, [sp, #8]
38; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
39; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #20]
40; NONEON-NOSVE-NEXT:    sdiv w9, w10, w9
41; NONEON-NOSVE-NEXT:    ldrsb w10, [sp, #18]
42; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
43; NONEON-NOSVE-NEXT:    sdiv w10, w11, w10
44; NONEON-NOSVE-NEXT:    ldrsb w11, [sp, #16]
45; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]
46; NONEON-NOSVE-NEXT:    sdiv w11, w12, w11
47; NONEON-NOSVE-NEXT:    strh w10, [sp, #26]
48; NONEON-NOSVE-NEXT:    strh w11, [sp, #24]
49; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
50; NONEON-NOSVE-NEXT:    add sp, sp, #32
51; NONEON-NOSVE-NEXT:    ret
52  %res = sdiv <4 x i8> %op1, %op2
53  ret <4 x i8> %res
54}
55
56define <8 x i8> @sdiv_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
57; CHECK-LABEL: sdiv_v8i8:
58; CHECK:       // %bb.0:
59; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
60; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
61; CHECK-NEXT:    ptrue p0.s, vl4
62; CHECK-NEXT:    sunpklo z1.h, z1.b
63; CHECK-NEXT:    sunpklo z0.h, z0.b
64; CHECK-NEXT:    sunpklo z2.s, z1.h
65; CHECK-NEXT:    sunpklo z3.s, z0.h
66; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
67; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
68; CHECK-NEXT:    sunpklo z1.s, z1.h
69; CHECK-NEXT:    sunpklo z0.s, z0.h
70; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s
71; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
72; CHECK-NEXT:    ptrue p0.h, vl4
73; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
74; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
75; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }
76; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
77; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
78; CHECK-NEXT:    ret
79;
80; NONEON-NOSVE-LABEL: sdiv_v8i8:
81; NONEON-NOSVE:       // %bb.0:
82; NONEON-NOSVE-NEXT:    sub sp, sp, #32
83; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
84; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
85; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
86; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
87; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
88; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
89; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
90; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
91; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
92; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
93; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
94; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
95; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
96; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
97; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
98; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
99; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
100; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
101; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
102; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
103; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
104; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
105; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
106; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
107; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
108; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
109; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
110; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
111; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
112; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
113; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
114; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
115; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
116; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
117; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
118; NONEON-NOSVE-NEXT:    add sp, sp, #32
119; NONEON-NOSVE-NEXT:    ret
120  %res = sdiv <8 x i8> %op1, %op2
121  ret <8 x i8> %res
122}
123
124define <16 x i8> @sdiv_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
125; CHECK-LABEL: sdiv_v16i8:
126; CHECK:       // %bb.0:
127; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
128; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
129; CHECK-NEXT:    sunpklo z2.h, z1.b
130; CHECK-NEXT:    sunpklo z3.h, z0.b
131; CHECK-NEXT:    ptrue p0.s, vl4
132; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
133; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
134; CHECK-NEXT:    sunpklo z4.s, z2.h
135; CHECK-NEXT:    sunpklo z5.s, z3.h
136; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
137; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
138; CHECK-NEXT:    sunpklo z1.h, z1.b
139; CHECK-NEXT:    sunpklo z0.h, z0.b
140; CHECK-NEXT:    sunpklo z2.s, z2.h
141; CHECK-NEXT:    sunpklo z3.s, z3.h
142; CHECK-NEXT:    sdivr z4.s, p0/m, z4.s, z5.s
143; CHECK-NEXT:    sunpklo z5.s, z0.h
144; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
145; CHECK-NEXT:    sunpklo z0.s, z0.h
146; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s
147; CHECK-NEXT:    sunpklo z3.s, z1.h
148; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
149; CHECK-NEXT:    sunpklo z1.s, z1.h
150; CHECK-NEXT:    sdivr z3.s, p0/m, z3.s, z5.s
151; CHECK-NEXT:    uzp1 z4.h, z4.h, z4.h
152; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h
153; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
154; CHECK-NEXT:    ptrue p0.h, vl4
155; CHECK-NEXT:    uzp1 z1.h, z3.h, z3.h
156; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
157; CHECK-NEXT:    splice z0.h, p0, { z4.h, z5.h }
158; CHECK-NEXT:    splice z1.h, p0, { z1.h, z2.h }
159; CHECK-NEXT:    ptrue p0.b, vl8
160; CHECK-NEXT:    uzp1 z2.b, z0.b, z0.b
161; CHECK-NEXT:    uzp1 z3.b, z1.b, z1.b
162; CHECK-NEXT:    splice z0.b, p0, { z2.b, z3.b }
163; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
164; CHECK-NEXT:    ret
165;
166; NONEON-NOSVE-LABEL: sdiv_v16i8:
167; NONEON-NOSVE:       // %bb.0:
168; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
169; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
170; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
171; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
172; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
173; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
174; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
175; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
176; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
177; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
178; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
179; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
180; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
181; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
182; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
183; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
184; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
185; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
186; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
187; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
188; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
189; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
190; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
191; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
192; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
193; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
194; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
195; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
196; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
197; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
198; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
199; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
200; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
201; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
202; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
203; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
204; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
205; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
206; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
207; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
208; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
209; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
210; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
211; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
212; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
213; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
214; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
215; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
216; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
217; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
218; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
219; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
220; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
221; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
222; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
223; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
224; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
225; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
226; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
227; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
228; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
229; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
230; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
231; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
232; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
233; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
234; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
235; NONEON-NOSVE-NEXT:    add sp, sp, #48
236; NONEON-NOSVE-NEXT:    ret
237  %res = sdiv <16 x i8> %op1, %op2
238  ret <16 x i8> %res
239}
240
241define void @sdiv_v32i8(ptr %a, ptr %b) {
242; CHECK-LABEL: sdiv_v32i8:
243; CHECK:       // %bb.0:
244; CHECK-NEXT:    ldp q6, q3, [x1]
245; CHECK-NEXT:    ptrue p0.s, vl4
246; CHECK-NEXT:    ldr q2, [x0, #16]
247; CHECK-NEXT:    sunpklo z1.h, z3.b
248; CHECK-NEXT:    sunpklo z4.h, z2.b
249; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
250; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
251; CHECK-NEXT:    sunpklo z7.h, z6.b
252; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
253; CHECK-NEXT:    sunpklo z3.h, z3.b
254; CHECK-NEXT:    sunpklo z0.s, z1.h
255; CHECK-NEXT:    sunpklo z5.s, z4.h
256; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
257; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
258; CHECK-NEXT:    sunpklo z17.s, z7.h
259; CHECK-NEXT:    ext z7.b, z7.b, z7.b, #8
260; CHECK-NEXT:    sunpklo z6.h, z6.b
261; CHECK-NEXT:    sunpklo z1.s, z1.h
262; CHECK-NEXT:    sunpklo z4.s, z4.h
263; CHECK-NEXT:    sunpklo z7.s, z7.h
264; CHECK-NEXT:    sdivr z0.s, p0/m, z0.s, z5.s
265; CHECK-NEXT:    sdivr z1.s, p0/m, z1.s, z4.s
266; CHECK-NEXT:    sunpklo z4.h, z2.b
267; CHECK-NEXT:    sunpklo z2.s, z3.h
268; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
269; CHECK-NEXT:    sunpklo z5.s, z4.h
270; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
271; CHECK-NEXT:    sunpklo z3.s, z3.h
272; CHECK-NEXT:    sunpklo z4.s, z4.h
273; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z5.s
274; CHECK-NEXT:    ldr q5, [x0]
275; CHECK-NEXT:    sunpklo z16.h, z5.b
276; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
277; CHECK-NEXT:    sunpklo z5.h, z5.b
278; CHECK-NEXT:    sunpklo z18.s, z16.h
279; CHECK-NEXT:    ext z16.b, z16.b, z16.b, #8
280; CHECK-NEXT:    sunpklo z16.s, z16.h
281; CHECK-NEXT:    sdivr z17.s, p0/m, z17.s, z18.s
282; CHECK-NEXT:    sunpklo z18.s, z5.h
283; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
284; CHECK-NEXT:    sunpklo z5.s, z5.h
285; CHECK-NEXT:    sdivr z7.s, p0/m, z7.s, z16.s
286; CHECK-NEXT:    sunpklo z16.s, z6.h
287; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
288; CHECK-NEXT:    sunpklo z6.s, z6.h
289; CHECK-NEXT:    uzp1 z20.h, z17.h, z17.h
290; CHECK-NEXT:    sdivr z16.s, p0/m, z16.s, z18.s
291; CHECK-NEXT:    uzp1 z18.h, z0.h, z0.h
292; CHECK-NEXT:    uzp1 z19.h, z1.h, z1.h
293; CHECK-NEXT:    uzp1 z21.h, z7.h, z7.h
294; CHECK-NEXT:    sdiv z5.s, p0/m, z5.s, z6.s
295; CHECK-NEXT:    uzp1 z0.h, z16.h, z16.h
296; CHECK-NEXT:    sdivr z3.s, p0/m, z3.s, z4.s
297; CHECK-NEXT:    ptrue p0.h, vl4
298; CHECK-NEXT:    uzp1 z1.h, z5.h, z5.h
299; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h
300; CHECK-NEXT:    splice z2.h, p0, { z20.h, z21.h }
301; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }
302; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h
303; CHECK-NEXT:    splice z3.h, p0, { z18.h, z19.h }
304; CHECK-NEXT:    splice z1.h, p0, { z4.h, z5.h }
305; CHECK-NEXT:    uzp1 z4.b, z2.b, z2.b
306; CHECK-NEXT:    ptrue p0.b, vl8
307; CHECK-NEXT:    uzp1 z2.b, z3.b, z3.b
308; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b
309; CHECK-NEXT:    uzp1 z3.b, z1.b, z1.b
310; CHECK-NEXT:    splice z0.b, p0, { z4.b, z5.b }
311; CHECK-NEXT:    splice z1.b, p0, { z2.b, z3.b }
312; CHECK-NEXT:    stp q0, q1, [x0]
313; CHECK-NEXT:    ret
314;
315; NONEON-NOSVE-LABEL: sdiv_v32i8:
316; NONEON-NOSVE:       // %bb.0:
317; NONEON-NOSVE-NEXT:    sub sp, sp, #96
318; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
319; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
320; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
321; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
322; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
323; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #63]
324; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #47]
325; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
326; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #46]
327; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
328; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #62]
329; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
330; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #45]
331; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
332; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #61]
333; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
334; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #44]
335; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
336; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #60]
337; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
338; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #43]
339; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
340; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #59]
341; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
342; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #42]
343; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
344; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #58]
345; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
346; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #41]
347; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
348; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #57]
349; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
350; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #40]
351; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
352; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #56]
353; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
354; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #39]
355; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
356; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #55]
357; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
358; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #38]
359; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
360; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #54]
361; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
362; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #37]
363; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
364; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #53]
365; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
366; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #36]
367; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
368; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #52]
369; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
370; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #35]
371; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
372; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #51]
373; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
374; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #34]
375; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
376; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #50]
377; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
378; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #33]
379; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
380; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #49]
381; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
382; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #32]
383; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
384; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #48]
385; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
386; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
387; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
388; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
389; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
390; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
391; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
392; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
393; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
394; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
395; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
396; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
397; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
398; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
399; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
400; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
401; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
402; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
403; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
404; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
405; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
406; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
407; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
408; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
409; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
410; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
411; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
412; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
413; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
414; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
415; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
416; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
417; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
418; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
419; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
420; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
421; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
422; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
423; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
424; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
425; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
426; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
427; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
428; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
429; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
430; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
431; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
432; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
433; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
434; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
435; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
436; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
437; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
438; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
439; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
440; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
441; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
442; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
443; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
444; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
445; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
446; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
447; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
448; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
449; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
450; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
451; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
452; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
453; NONEON-NOSVE-NEXT:    add sp, sp, #96
454; NONEON-NOSVE-NEXT:    ret
455  %op1 = load <32 x i8>, ptr %a
456  %op2 = load <32 x i8>, ptr %b
457  %res = sdiv <32 x i8> %op1, %op2
458  store <32 x i8> %res, ptr %a
459  ret void
460}
461
462define <2 x i16> @sdiv_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
463; CHECK-LABEL: sdiv_v2i16:
464; CHECK:       // %bb.0:
465; CHECK-NEXT:    ptrue p0.s, vl2
466; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
467; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
468; CHECK-NEXT:    sxth z1.s, p0/m, z1.s
469; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
470; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
471; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
472; CHECK-NEXT:    ret
473;
474; NONEON-NOSVE-LABEL: sdiv_v2i16:
475; NONEON-NOSVE:       // %bb.0:
476; NONEON-NOSVE-NEXT:    sub sp, sp, #32
477; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
478; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
479; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
480; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
481; NONEON-NOSVE-NEXT:    ldrsh w10, [sp, #8]
482; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
483; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #16]
484; NONEON-NOSVE-NEXT:    sdiv w9, w10, w9
485; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #24]
486; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
487; NONEON-NOSVE-NEXT:    add sp, sp, #32
488; NONEON-NOSVE-NEXT:    ret
489  %res = sdiv <2 x i16> %op1, %op2
490  ret <2 x i16> %res
491}
492
493define <4 x i16> @sdiv_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
494; CHECK-LABEL: sdiv_v4i16:
495; CHECK:       // %bb.0:
496; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
497; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
498; CHECK-NEXT:    ptrue p0.s, vl4
499; CHECK-NEXT:    sunpklo z1.s, z1.h
500; CHECK-NEXT:    sunpklo z0.s, z0.h
501; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
502; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
503; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
504; CHECK-NEXT:    ret
505;
506; NONEON-NOSVE-LABEL: sdiv_v4i16:
507; NONEON-NOSVE:       // %bb.0:
508; NONEON-NOSVE-NEXT:    sub sp, sp, #32
509; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
510; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
511; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
512; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
513; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
514; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
515; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
516; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
517; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
518; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
519; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
520; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
521; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
522; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
523; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
524; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
525; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
526; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
527; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
528; NONEON-NOSVE-NEXT:    add sp, sp, #32
529; NONEON-NOSVE-NEXT:    ret
530  %res = sdiv <4 x i16> %op1, %op2
531  ret <4 x i16> %res
532}
533
534define <8 x i16> @sdiv_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
535; CHECK-LABEL: sdiv_v8i16:
536; CHECK:       // %bb.0:
537; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
538; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
539; CHECK-NEXT:    sunpklo z2.s, z1.h
540; CHECK-NEXT:    sunpklo z3.s, z0.h
541; CHECK-NEXT:    ptrue p0.s, vl4
542; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
543; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
544; CHECK-NEXT:    sunpklo z1.s, z1.h
545; CHECK-NEXT:    sunpklo z0.s, z0.h
546; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s
547; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
548; CHECK-NEXT:    ptrue p0.h, vl4
549; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
550; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
551; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }
552; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
553; CHECK-NEXT:    ret
554;
555; NONEON-NOSVE-LABEL: sdiv_v8i16:
556; NONEON-NOSVE:       // %bb.0:
557; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
558; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
559; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
560; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
561; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
562; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
563; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
564; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
565; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
566; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
567; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
568; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
569; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
570; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
571; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
572; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
573; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
574; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
575; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
576; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
577; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
578; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
579; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
580; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
581; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
582; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
583; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
584; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
585; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
586; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
587; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
588; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
589; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
590; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
591; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
592; NONEON-NOSVE-NEXT:    add sp, sp, #48
593; NONEON-NOSVE-NEXT:    ret
594  %res = sdiv <8 x i16> %op1, %op2
595  ret <8 x i16> %res
596}
597
598define void @sdiv_v16i16(ptr %a, ptr %b) {
599; CHECK-LABEL: sdiv_v16i16:
600; CHECK:       // %bb.0:
601; CHECK-NEXT:    ldp q4, q1, [x1]
602; CHECK-NEXT:    ptrue p0.s, vl4
603; CHECK-NEXT:    ldr q0, [x0, #16]
604; CHECK-NEXT:    sunpklo z2.s, z1.h
605; CHECK-NEXT:    sunpklo z3.s, z0.h
606; CHECK-NEXT:    sunpklo z5.s, z4.h
607; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
608; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
609; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
610; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s
611; CHECK-NEXT:    ldr q3, [x0]
612; CHECK-NEXT:    sunpklo z4.s, z4.h
613; CHECK-NEXT:    sunpklo z1.s, z1.h
614; CHECK-NEXT:    sunpklo z0.s, z0.h
615; CHECK-NEXT:    sunpklo z6.s, z3.h
616; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
617; CHECK-NEXT:    sunpklo z3.s, z3.h
618; CHECK-NEXT:    sdivr z5.s, p0/m, z5.s, z6.s
619; CHECK-NEXT:    sdiv z3.s, p0/m, z3.s, z4.s
620; CHECK-NEXT:    uzp1 z4.h, z5.h, z5.h
621; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
622; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
623; CHECK-NEXT:    ptrue p0.h, vl4
624; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h
625; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
626; CHECK-NEXT:    splice z0.h, p0, { z4.h, z5.h }
627; CHECK-NEXT:    splice z1.h, p0, { z1.h, z2.h }
628; CHECK-NEXT:    stp q0, q1, [x0]
629; CHECK-NEXT:    ret
630;
631; NONEON-NOSVE-LABEL: sdiv_v16i16:
632; NONEON-NOSVE:       // %bb.0:
633; NONEON-NOSVE-NEXT:    sub sp, sp, #96
634; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
635; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
636; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
637; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
638; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
639; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #62]
640; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]
641; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
642; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #44]
643; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
644; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #60]
645; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
646; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]
647; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
648; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #58]
649; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
650; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #40]
651; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
652; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #56]
653; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
654; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #38]
655; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
656; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #54]
657; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
658; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #36]
659; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
660; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #52]
661; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
662; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #34]
663; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
664; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #50]
665; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
666; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #32]
667; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
668; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #48]
669; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
670; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
671; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
672; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
673; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
674; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
675; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
676; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
677; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
678; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
679; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
680; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
681; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
682; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
683; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
684; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
685; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
686; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
687; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
688; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
689; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
690; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
691; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
692; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
693; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
694; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
695; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
696; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
697; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
698; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
699; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
700; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
701; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
702; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
703; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
704; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
705; NONEON-NOSVE-NEXT:    add sp, sp, #96
706; NONEON-NOSVE-NEXT:    ret
707  %op1 = load <16 x i16>, ptr %a
708  %op2 = load <16 x i16>, ptr %b
709  %res = sdiv <16 x i16> %op1, %op2
710  store <16 x i16> %res, ptr %a
711  ret void
712}
713
714define <2 x i32> @sdiv_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
715; CHECK-LABEL: sdiv_v2i32:
716; CHECK:       // %bb.0:
717; CHECK-NEXT:    ptrue p0.s, vl2
718; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
719; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
720; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
721; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
722; CHECK-NEXT:    ret
723;
724; NONEON-NOSVE-LABEL: sdiv_v2i32:
725; NONEON-NOSVE:       // %bb.0:
726; NONEON-NOSVE-NEXT:    sub sp, sp, #32
727; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
728; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
729; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
730; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
731; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
732; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
733; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
734; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
735; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
736; NONEON-NOSVE-NEXT:    add sp, sp, #32
737; NONEON-NOSVE-NEXT:    ret
738  %res = sdiv <2 x i32> %op1, %op2
739  ret <2 x i32> %res
740}
741
742define <4 x i32> @sdiv_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
743; CHECK-LABEL: sdiv_v4i32:
744; CHECK:       // %bb.0:
745; CHECK-NEXT:    ptrue p0.s, vl4
746; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
747; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
748; CHECK-NEXT:    sdiv z0.s, p0/m, z0.s, z1.s
749; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
750; CHECK-NEXT:    ret
751;
752; NONEON-NOSVE-LABEL: sdiv_v4i32:
753; NONEON-NOSVE:       // %bb.0:
754; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
755; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
756; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
757; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
758; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
759; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
760; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
761; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
762; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #40]
763; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
764; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
765; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
766; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
767; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
768; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
769; NONEON-NOSVE-NEXT:    add sp, sp, #48
770; NONEON-NOSVE-NEXT:    ret
771  %res = sdiv <4 x i32> %op1, %op2
772  ret <4 x i32> %res
773}
774
775define void @sdiv_v8i32(ptr %a, ptr %b)  {
776; CHECK-LABEL: sdiv_v8i32:
777; CHECK:       // %bb.0:
778; CHECK-NEXT:    ldp q0, q3, [x1]
779; CHECK-NEXT:    ptrue p0.s, vl4
780; CHECK-NEXT:    ldp q1, q2, [x0]
781; CHECK-NEXT:    sdivr z0.s, p0/m, z0.s, z1.s
782; CHECK-NEXT:    movprfx z1, z2
783; CHECK-NEXT:    sdiv z1.s, p0/m, z1.s, z3.s
784; CHECK-NEXT:    stp q0, q1, [x0]
785; CHECK-NEXT:    ret
786;
787; NONEON-NOSVE-LABEL: sdiv_v8i32:
788; NONEON-NOSVE:       // %bb.0:
789; NONEON-NOSVE-NEXT:    sub sp, sp, #96
790; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
791; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
792; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
793; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
794; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
795; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
796; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
797; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
798; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
799; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
800; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
801; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #88]
802; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
803; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
804; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
805; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
806; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
807; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #80]
808; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
809; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
810; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
811; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
812; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
813; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #72]
814; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
815; NONEON-NOSVE-NEXT:    sdiv w11, w10, w8
816; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
817; NONEON-NOSVE-NEXT:    sdiv w8, w9, w8
818; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]
819; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
820; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
821; NONEON-NOSVE-NEXT:    add sp, sp, #96
822; NONEON-NOSVE-NEXT:    ret
823  %op1 = load <8 x i32>, ptr %a
824  %op2 = load <8 x i32>, ptr %b
825  %res = sdiv <8 x i32> %op1, %op2
826  store <8 x i32> %res, ptr %a
827  ret void
828}
829
830define <1 x i64> @sdiv_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
831; CHECK-LABEL: sdiv_v1i64:
832; CHECK:       // %bb.0:
833; CHECK-NEXT:    ptrue p0.d, vl1
834; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
835; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
836; CHECK-NEXT:    sdiv z0.d, p0/m, z0.d, z1.d
837; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
838; CHECK-NEXT:    ret
839;
840; NONEON-NOSVE-LABEL: sdiv_v1i64:
841; NONEON-NOSVE:       // %bb.0:
842; NONEON-NOSVE-NEXT:    sub sp, sp, #16
843; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
844; NONEON-NOSVE-NEXT:    fmov x8, d1
845; NONEON-NOSVE-NEXT:    fmov x9, d0
846; NONEON-NOSVE-NEXT:    sdiv x8, x9, x8
847; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
848; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
849; NONEON-NOSVE-NEXT:    add sp, sp, #16
850; NONEON-NOSVE-NEXT:    ret
851  %res = sdiv <1 x i64> %op1, %op2
852  ret <1 x i64> %res
853}
854
855define <2 x i64> @sdiv_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
856; CHECK-LABEL: sdiv_v2i64:
857; CHECK:       // %bb.0:
858; CHECK-NEXT:    ptrue p0.d, vl2
859; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
860; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
861; CHECK-NEXT:    sdiv z0.d, p0/m, z0.d, z1.d
862; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
863; CHECK-NEXT:    ret
864;
865; NONEON-NOSVE-LABEL: sdiv_v2i64:
866; NONEON-NOSVE:       // %bb.0:
867; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
868; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
869; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
870; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
871; NONEON-NOSVE-NEXT:    sdiv x11, x10, x8
872; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
873; NONEON-NOSVE-NEXT:    sdiv x8, x9, x8
874; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
875; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
876; NONEON-NOSVE-NEXT:    add sp, sp, #48
877; NONEON-NOSVE-NEXT:    ret
878  %res = sdiv <2 x i64> %op1, %op2
879  ret <2 x i64> %res
880}
881
882define void @sdiv_v4i64(ptr %a, ptr %b)  {
883; CHECK-LABEL: sdiv_v4i64:
884; CHECK:       // %bb.0:
885; CHECK-NEXT:    ldp q0, q3, [x1]
886; CHECK-NEXT:    ptrue p0.d, vl2
887; CHECK-NEXT:    ldp q1, q2, [x0]
888; CHECK-NEXT:    sdivr z0.d, p0/m, z0.d, z1.d
889; CHECK-NEXT:    movprfx z1, z2
890; CHECK-NEXT:    sdiv z1.d, p0/m, z1.d, z3.d
891; CHECK-NEXT:    stp q0, q1, [x0]
892; CHECK-NEXT:    ret
893;
894; NONEON-NOSVE-LABEL: sdiv_v4i64:
895; NONEON-NOSVE:       // %bb.0:
896; NONEON-NOSVE-NEXT:    sub sp, sp, #96
897; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
898; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
899; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
900; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
901; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
902; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
903; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
904; NONEON-NOSVE-NEXT:    sdiv x11, x10, x8
905; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
906; NONEON-NOSVE-NEXT:    sdiv x8, x9, x8
907; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
908; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #80]
909; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
910; NONEON-NOSVE-NEXT:    sdiv x11, x10, x8
911; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
912; NONEON-NOSVE-NEXT:    sdiv x8, x9, x8
913; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]
914; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
915; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
916; NONEON-NOSVE-NEXT:    add sp, sp, #96
917; NONEON-NOSVE-NEXT:    ret
918  %op1 = load <4 x i64>, ptr %a
919  %op2 = load <4 x i64>, ptr %b
920  %res = sdiv <4 x i64> %op1, %op2
921  store <4 x i64> %res, ptr %a
922  ret void
923}
924
925; UDIV
926
927define <4 x i8> @udiv_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
928; CHECK-LABEL: udiv_v4i8:
929; CHECK:       // %bb.0:
930; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
931; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
932; CHECK-NEXT:    ptrue p0.s, vl4
933; CHECK-NEXT:    and z0.h, z0.h, #0xff
934; CHECK-NEXT:    and z1.h, z1.h, #0xff
935; CHECK-NEXT:    uunpklo z1.s, z1.h
936; CHECK-NEXT:    uunpklo z0.s, z0.h
937; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
938; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
939; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
940; CHECK-NEXT:    ret
941;
942; NONEON-NOSVE-LABEL: udiv_v4i8:
943; NONEON-NOSVE:       // %bb.0:
944; NONEON-NOSVE-NEXT:    sub sp, sp, #32
945; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
946; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
947; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
948; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
949; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #12]
950; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #10]
951; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #8]
952; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
953; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #20]
954; NONEON-NOSVE-NEXT:    udiv w9, w10, w9
955; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #18]
956; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
957; NONEON-NOSVE-NEXT:    udiv w10, w11, w10
958; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #16]
959; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]
960; NONEON-NOSVE-NEXT:    udiv w11, w12, w11
961; NONEON-NOSVE-NEXT:    strh w10, [sp, #26]
962; NONEON-NOSVE-NEXT:    strh w11, [sp, #24]
963; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
964; NONEON-NOSVE-NEXT:    add sp, sp, #32
965; NONEON-NOSVE-NEXT:    ret
966  %res = udiv <4 x i8> %op1, %op2
967  ret <4 x i8> %res
968}
969
970define <8 x i8> @udiv_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
971; CHECK-LABEL: udiv_v8i8:
972; CHECK:       // %bb.0:
973; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
974; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
975; CHECK-NEXT:    ptrue p0.s, vl4
976; CHECK-NEXT:    uunpklo z1.h, z1.b
977; CHECK-NEXT:    uunpklo z0.h, z0.b
978; CHECK-NEXT:    uunpklo z2.s, z1.h
979; CHECK-NEXT:    uunpklo z3.s, z0.h
980; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
981; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
982; CHECK-NEXT:    uunpklo z1.s, z1.h
983; CHECK-NEXT:    uunpklo z0.s, z0.h
984; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s
985; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
986; CHECK-NEXT:    ptrue p0.h, vl4
987; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
988; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
989; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }
990; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
991; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
992; CHECK-NEXT:    ret
993;
994; NONEON-NOSVE-LABEL: udiv_v8i8:
995; NONEON-NOSVE:       // %bb.0:
996; NONEON-NOSVE-NEXT:    sub sp, sp, #32
997; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
998; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
999; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1000; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1001; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1002; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1003; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
1004; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1005; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1006; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1007; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
1008; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1009; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1010; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1011; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
1012; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1013; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1014; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1015; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
1016; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1017; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1018; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1019; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
1020; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1021; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1022; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1023; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
1024; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1025; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1026; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1027; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
1028; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1029; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1030; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
1031; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1032; NONEON-NOSVE-NEXT:    add sp, sp, #32
1033; NONEON-NOSVE-NEXT:    ret
1034  %res = udiv <8 x i8> %op1, %op2
1035  ret <8 x i8> %res
1036}
1037
1038define <16 x i8> @udiv_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
1039; CHECK-LABEL: udiv_v16i8:
1040; CHECK:       // %bb.0:
1041; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1042; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1043; CHECK-NEXT:    uunpklo z2.h, z1.b
1044; CHECK-NEXT:    uunpklo z3.h, z0.b
1045; CHECK-NEXT:    ptrue p0.s, vl4
1046; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1047; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1048; CHECK-NEXT:    uunpklo z4.s, z2.h
1049; CHECK-NEXT:    uunpklo z5.s, z3.h
1050; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1051; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1052; CHECK-NEXT:    uunpklo z1.h, z1.b
1053; CHECK-NEXT:    uunpklo z0.h, z0.b
1054; CHECK-NEXT:    uunpklo z2.s, z2.h
1055; CHECK-NEXT:    uunpklo z3.s, z3.h
1056; CHECK-NEXT:    udivr z4.s, p0/m, z4.s, z5.s
1057; CHECK-NEXT:    uunpklo z5.s, z0.h
1058; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1059; CHECK-NEXT:    uunpklo z0.s, z0.h
1060; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s
1061; CHECK-NEXT:    uunpklo z3.s, z1.h
1062; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1063; CHECK-NEXT:    uunpklo z1.s, z1.h
1064; CHECK-NEXT:    udivr z3.s, p0/m, z3.s, z5.s
1065; CHECK-NEXT:    uzp1 z4.h, z4.h, z4.h
1066; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h
1067; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1068; CHECK-NEXT:    ptrue p0.h, vl4
1069; CHECK-NEXT:    uzp1 z1.h, z3.h, z3.h
1070; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
1071; CHECK-NEXT:    splice z0.h, p0, { z4.h, z5.h }
1072; CHECK-NEXT:    splice z1.h, p0, { z1.h, z2.h }
1073; CHECK-NEXT:    ptrue p0.b, vl8
1074; CHECK-NEXT:    uzp1 z2.b, z0.b, z0.b
1075; CHECK-NEXT:    uzp1 z3.b, z1.b, z1.b
1076; CHECK-NEXT:    splice z0.b, p0, { z2.b, z3.b }
1077; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1078; CHECK-NEXT:    ret
1079;
1080; NONEON-NOSVE-LABEL: udiv_v16i8:
1081; NONEON-NOSVE:       // %bb.0:
1082; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1083; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1084; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1085; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1086; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1087; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1088; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1089; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1090; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1091; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1092; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1093; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1094; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1095; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1096; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1097; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1098; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1099; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1100; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1101; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1102; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1103; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1104; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1105; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1106; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1107; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1108; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1109; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1110; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1111; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1112; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1113; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1114; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1115; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1116; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1117; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1118; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1119; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1120; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1121; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1122; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1123; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1124; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1125; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1126; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1127; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1128; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1129; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1130; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1131; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1132; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1133; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1134; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1135; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1136; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1138; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1139; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1140; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1141; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1142; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1143; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1144; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1145; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1146; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1147; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1148; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1149; NONEON-NOSVE-NEXT:    add sp, sp, #48
1150; NONEON-NOSVE-NEXT:    ret
1151  %res = udiv <16 x i8> %op1, %op2
1152  ret <16 x i8> %res
1153}
1154
1155define void @udiv_v32i8(ptr %a, ptr %b) {
1156; CHECK-LABEL: udiv_v32i8:
1157; CHECK:       // %bb.0:
1158; CHECK-NEXT:    ldp q6, q3, [x1]
1159; CHECK-NEXT:    ptrue p0.s, vl4
1160; CHECK-NEXT:    ldr q2, [x0, #16]
1161; CHECK-NEXT:    uunpklo z1.h, z3.b
1162; CHECK-NEXT:    uunpklo z4.h, z2.b
1163; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1164; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1165; CHECK-NEXT:    uunpklo z7.h, z6.b
1166; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
1167; CHECK-NEXT:    uunpklo z3.h, z3.b
1168; CHECK-NEXT:    uunpklo z0.s, z1.h
1169; CHECK-NEXT:    uunpklo z5.s, z4.h
1170; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1171; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
1172; CHECK-NEXT:    uunpklo z17.s, z7.h
1173; CHECK-NEXT:    ext z7.b, z7.b, z7.b, #8
1174; CHECK-NEXT:    uunpklo z6.h, z6.b
1175; CHECK-NEXT:    uunpklo z1.s, z1.h
1176; CHECK-NEXT:    uunpklo z4.s, z4.h
1177; CHECK-NEXT:    uunpklo z7.s, z7.h
1178; CHECK-NEXT:    udivr z0.s, p0/m, z0.s, z5.s
1179; CHECK-NEXT:    udivr z1.s, p0/m, z1.s, z4.s
1180; CHECK-NEXT:    uunpklo z4.h, z2.b
1181; CHECK-NEXT:    uunpklo z2.s, z3.h
1182; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1183; CHECK-NEXT:    uunpklo z5.s, z4.h
1184; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
1185; CHECK-NEXT:    uunpklo z3.s, z3.h
1186; CHECK-NEXT:    uunpklo z4.s, z4.h
1187; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z5.s
1188; CHECK-NEXT:    ldr q5, [x0]
1189; CHECK-NEXT:    uunpklo z16.h, z5.b
1190; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
1191; CHECK-NEXT:    uunpklo z5.h, z5.b
1192; CHECK-NEXT:    uunpklo z18.s, z16.h
1193; CHECK-NEXT:    ext z16.b, z16.b, z16.b, #8
1194; CHECK-NEXT:    uunpklo z16.s, z16.h
1195; CHECK-NEXT:    udivr z17.s, p0/m, z17.s, z18.s
1196; CHECK-NEXT:    uunpklo z18.s, z5.h
1197; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
1198; CHECK-NEXT:    uunpklo z5.s, z5.h
1199; CHECK-NEXT:    udivr z7.s, p0/m, z7.s, z16.s
1200; CHECK-NEXT:    uunpklo z16.s, z6.h
1201; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
1202; CHECK-NEXT:    uunpklo z6.s, z6.h
1203; CHECK-NEXT:    uzp1 z20.h, z17.h, z17.h
1204; CHECK-NEXT:    udivr z16.s, p0/m, z16.s, z18.s
1205; CHECK-NEXT:    uzp1 z18.h, z0.h, z0.h
1206; CHECK-NEXT:    uzp1 z19.h, z1.h, z1.h
1207; CHECK-NEXT:    uzp1 z21.h, z7.h, z7.h
1208; CHECK-NEXT:    udiv z5.s, p0/m, z5.s, z6.s
1209; CHECK-NEXT:    uzp1 z0.h, z16.h, z16.h
1210; CHECK-NEXT:    udivr z3.s, p0/m, z3.s, z4.s
1211; CHECK-NEXT:    ptrue p0.h, vl4
1212; CHECK-NEXT:    uzp1 z1.h, z5.h, z5.h
1213; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h
1214; CHECK-NEXT:    splice z2.h, p0, { z20.h, z21.h }
1215; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }
1216; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h
1217; CHECK-NEXT:    splice z3.h, p0, { z18.h, z19.h }
1218; CHECK-NEXT:    splice z1.h, p0, { z4.h, z5.h }
1219; CHECK-NEXT:    uzp1 z4.b, z2.b, z2.b
1220; CHECK-NEXT:    ptrue p0.b, vl8
1221; CHECK-NEXT:    uzp1 z2.b, z3.b, z3.b
1222; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b
1223; CHECK-NEXT:    uzp1 z3.b, z1.b, z1.b
1224; CHECK-NEXT:    splice z0.b, p0, { z4.b, z5.b }
1225; CHECK-NEXT:    splice z1.b, p0, { z2.b, z3.b }
1226; CHECK-NEXT:    stp q0, q1, [x0]
1227; CHECK-NEXT:    ret
1228;
1229; NONEON-NOSVE-LABEL: udiv_v32i8:
1230; NONEON-NOSVE:       // %bb.0:
1231; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1232; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1233; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1234; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1235; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1236; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1237; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
1238; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
1239; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1240; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
1241; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
1242; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
1243; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1244; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
1245; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
1246; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
1247; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1248; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
1249; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
1250; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
1251; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1252; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
1253; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
1254; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
1255; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1256; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
1257; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
1258; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
1259; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1260; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
1261; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
1262; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
1263; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1264; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
1265; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
1266; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
1267; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1268; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
1269; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
1270; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
1271; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1272; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
1273; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
1274; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
1275; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1276; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
1277; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
1278; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
1279; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1280; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
1281; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
1282; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
1283; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1284; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
1285; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
1286; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
1287; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1288; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
1289; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
1290; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
1291; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1292; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
1293; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
1294; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
1295; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1296; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
1297; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
1298; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
1299; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1300; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1301; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
1302; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1303; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1304; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1305; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
1306; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1307; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1308; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1309; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
1310; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1311; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1312; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1313; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
1314; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1315; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1316; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1317; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
1318; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1319; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1320; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1321; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
1322; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1323; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1324; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1325; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
1326; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1327; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1328; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1329; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
1330; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1331; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1332; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1333; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
1334; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1335; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1336; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1337; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
1338; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1339; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1340; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1341; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
1342; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1343; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1344; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1345; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
1346; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1347; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1348; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1349; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1350; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1351; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1352; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1353; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
1354; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1355; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1356; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1357; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1358; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1359; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1360; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1361; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
1362; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1363; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1364; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1365; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1366; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1367; NONEON-NOSVE-NEXT:    add sp, sp, #96
1368; NONEON-NOSVE-NEXT:    ret
1369  %op1 = load <32 x i8>, ptr %a
1370  %op2 = load <32 x i8>, ptr %b
1371  %res = udiv <32 x i8> %op1, %op2
1372  store <32 x i8> %res, ptr %a
1373  ret void
1374}
1375
1376define <2 x i16> @udiv_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
1377; CHECK-LABEL: udiv_v2i16:
1378; CHECK:       // %bb.0:
1379; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1380; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1381; CHECK-NEXT:    ptrue p0.s, vl2
1382; CHECK-NEXT:    and z1.s, z1.s, #0xffff
1383; CHECK-NEXT:    and z0.s, z0.s, #0xffff
1384; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1385; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1386; CHECK-NEXT:    ret
1387;
1388; NONEON-NOSVE-LABEL: udiv_v2i16:
1389; NONEON-NOSVE:       // %bb.0:
1390; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1391; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1392; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1393; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1394; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1395; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #8]
1396; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1397; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #16]
1398; NONEON-NOSVE-NEXT:    udiv w9, w10, w9
1399; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #24]
1400; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1401; NONEON-NOSVE-NEXT:    add sp, sp, #32
1402; NONEON-NOSVE-NEXT:    ret
1403  %res = udiv <2 x i16> %op1, %op2
1404  ret <2 x i16> %res
1405}
1406
1407define <4 x i16> @udiv_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
1408; CHECK-LABEL: udiv_v4i16:
1409; CHECK:       // %bb.0:
1410; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1411; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1412; CHECK-NEXT:    ptrue p0.s, vl4
1413; CHECK-NEXT:    uunpklo z1.s, z1.h
1414; CHECK-NEXT:    uunpklo z0.s, z0.h
1415; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1416; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1417; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1418; CHECK-NEXT:    ret
1419;
1420; NONEON-NOSVE-LABEL: udiv_v4i16:
1421; NONEON-NOSVE:       // %bb.0:
1422; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1423; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1424; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1425; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1426; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1427; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1428; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1429; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
1430; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1431; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1432; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1433; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
1434; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1435; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1436; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1437; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
1438; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1439; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1440; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1441; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1442; NONEON-NOSVE-NEXT:    add sp, sp, #32
1443; NONEON-NOSVE-NEXT:    ret
1444  %res = udiv <4 x i16> %op1, %op2
1445  ret <4 x i16> %res
1446}
1447
1448define <8 x i16> @udiv_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
1449; CHECK-LABEL: udiv_v8i16:
1450; CHECK:       // %bb.0:
1451; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1452; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1453; CHECK-NEXT:    uunpklo z2.s, z1.h
1454; CHECK-NEXT:    uunpklo z3.s, z0.h
1455; CHECK-NEXT:    ptrue p0.s, vl4
1456; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1457; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1458; CHECK-NEXT:    uunpklo z1.s, z1.h
1459; CHECK-NEXT:    uunpklo z0.s, z0.h
1460; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s
1461; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1462; CHECK-NEXT:    ptrue p0.h, vl4
1463; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
1464; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
1465; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }
1466; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1467; CHECK-NEXT:    ret
1468;
1469; NONEON-NOSVE-LABEL: udiv_v8i16:
1470; NONEON-NOSVE:       // %bb.0:
1471; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1472; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1473; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1474; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1475; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1476; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1477; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1478; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1479; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1480; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1481; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1482; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1483; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1484; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1485; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1486; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1487; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1488; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1489; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1490; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1491; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1492; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1493; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1494; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1495; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1496; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1497; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1498; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1499; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1500; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1501; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1502; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1503; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1504; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1505; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1506; NONEON-NOSVE-NEXT:    add sp, sp, #48
1507; NONEON-NOSVE-NEXT:    ret
1508  %res = udiv <8 x i16> %op1, %op2
1509  ret <8 x i16> %res
1510}
1511
1512define void @udiv_v16i16(ptr %a, ptr %b) {
1513; CHECK-LABEL: udiv_v16i16:
1514; CHECK:       // %bb.0:
1515; CHECK-NEXT:    ldp q4, q1, [x1]
1516; CHECK-NEXT:    ptrue p0.s, vl4
1517; CHECK-NEXT:    ldr q0, [x0, #16]
1518; CHECK-NEXT:    uunpklo z2.s, z1.h
1519; CHECK-NEXT:    uunpklo z3.s, z0.h
1520; CHECK-NEXT:    uunpklo z5.s, z4.h
1521; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
1522; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1523; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1524; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s
1525; CHECK-NEXT:    ldr q3, [x0]
1526; CHECK-NEXT:    uunpklo z4.s, z4.h
1527; CHECK-NEXT:    uunpklo z1.s, z1.h
1528; CHECK-NEXT:    uunpklo z0.s, z0.h
1529; CHECK-NEXT:    uunpklo z6.s, z3.h
1530; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1531; CHECK-NEXT:    uunpklo z3.s, z3.h
1532; CHECK-NEXT:    udivr z5.s, p0/m, z5.s, z6.s
1533; CHECK-NEXT:    udiv z3.s, p0/m, z3.s, z4.s
1534; CHECK-NEXT:    uzp1 z4.h, z5.h, z5.h
1535; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1536; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h
1537; CHECK-NEXT:    ptrue p0.h, vl4
1538; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h
1539; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
1540; CHECK-NEXT:    splice z0.h, p0, { z4.h, z5.h }
1541; CHECK-NEXT:    splice z1.h, p0, { z1.h, z2.h }
1542; CHECK-NEXT:    stp q0, q1, [x0]
1543; CHECK-NEXT:    ret
1544;
1545; NONEON-NOSVE-LABEL: udiv_v16i16:
1546; NONEON-NOSVE:       // %bb.0:
1547; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1548; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1549; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1550; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1551; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1552; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1553; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
1554; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
1555; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1556; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
1557; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1558; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
1559; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1560; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
1561; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1562; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
1563; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1564; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
1565; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1566; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
1567; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1568; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
1569; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1570; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
1571; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1572; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
1573; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1574; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
1575; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1576; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
1577; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1578; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
1579; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1580; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
1581; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1582; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
1583; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1584; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1585; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1586; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1587; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1588; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1589; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1590; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1591; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1592; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1593; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1594; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1595; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1596; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1597; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1598; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1599; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1600; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1601; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1602; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1603; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1604; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1605; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1606; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1607; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1608; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1609; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1610; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1611; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1612; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1613; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1614; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1615; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1616; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1617; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1618; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1619; NONEON-NOSVE-NEXT:    add sp, sp, #96
1620; NONEON-NOSVE-NEXT:    ret
1621  %op1 = load <16 x i16>, ptr %a
1622  %op2 = load <16 x i16>, ptr %b
1623  %res = udiv <16 x i16> %op1, %op2
1624  store <16 x i16> %res, ptr %a
1625  ret void
1626}
1627
1628define <2 x i32> @udiv_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
1629; CHECK-LABEL: udiv_v2i32:
1630; CHECK:       // %bb.0:
1631; CHECK-NEXT:    ptrue p0.s, vl2
1632; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1633; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1634; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1635; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1636; CHECK-NEXT:    ret
1637;
1638; NONEON-NOSVE-LABEL: udiv_v2i32:
1639; NONEON-NOSVE:       // %bb.0:
1640; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1641; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1642; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1643; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1644; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1645; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1646; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1647; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1648; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
1649; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1650; NONEON-NOSVE-NEXT:    add sp, sp, #32
1651; NONEON-NOSVE-NEXT:    ret
1652  %res = udiv <2 x i32> %op1, %op2
1653  ret <2 x i32> %res
1654}
1655
1656define <4 x i32> @udiv_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
1657; CHECK-LABEL: udiv_v4i32:
1658; CHECK:       // %bb.0:
1659; CHECK-NEXT:    ptrue p0.s, vl4
1660; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1661; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1662; CHECK-NEXT:    udiv z0.s, p0/m, z0.s, z1.s
1663; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1664; CHECK-NEXT:    ret
1665;
1666; NONEON-NOSVE-LABEL: udiv_v4i32:
1667; NONEON-NOSVE:       // %bb.0:
1668; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1669; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1670; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1671; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1672; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1673; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1674; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1675; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1676; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #40]
1677; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1678; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1679; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1680; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1681; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
1682; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1683; NONEON-NOSVE-NEXT:    add sp, sp, #48
1684; NONEON-NOSVE-NEXT:    ret
1685  %res = udiv <4 x i32> %op1, %op2
1686  ret <4 x i32> %res
1687}
1688
1689define void @udiv_v8i32(ptr %a, ptr %b)  {
1690; CHECK-LABEL: udiv_v8i32:
1691; CHECK:       // %bb.0:
1692; CHECK-NEXT:    ldp q0, q3, [x1]
1693; CHECK-NEXT:    ptrue p0.s, vl4
1694; CHECK-NEXT:    ldp q1, q2, [x0]
1695; CHECK-NEXT:    udivr z0.s, p0/m, z0.s, z1.s
1696; CHECK-NEXT:    movprfx z1, z2
1697; CHECK-NEXT:    udiv z1.s, p0/m, z1.s, z3.s
1698; CHECK-NEXT:    stp q0, q1, [x0]
1699; CHECK-NEXT:    ret
1700;
1701; NONEON-NOSVE-LABEL: udiv_v8i32:
1702; NONEON-NOSVE:       // %bb.0:
1703; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1704; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1705; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1706; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1707; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1708; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1709; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
1710; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
1711; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1712; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
1713; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1714; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
1715; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #88]
1716; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
1717; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1718; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
1719; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1720; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1721; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #80]
1722; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1723; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1724; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1725; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1726; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1727; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #72]
1728; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1729; NONEON-NOSVE-NEXT:    udiv w11, w10, w8
1730; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1731; NONEON-NOSVE-NEXT:    udiv w8, w9, w8
1732; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]
1733; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1734; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1735; NONEON-NOSVE-NEXT:    add sp, sp, #96
1736; NONEON-NOSVE-NEXT:    ret
1737  %op1 = load <8 x i32>, ptr %a
1738  %op2 = load <8 x i32>, ptr %b
1739  %res = udiv <8 x i32> %op1, %op2
1740  store <8 x i32> %res, ptr %a
1741  ret void
1742}
1743
1744define <1 x i64> @udiv_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
1745; CHECK-LABEL: udiv_v1i64:
1746; CHECK:       // %bb.0:
1747; CHECK-NEXT:    ptrue p0.d, vl1
1748; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1749; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1750; CHECK-NEXT:    udiv z0.d, p0/m, z0.d, z1.d
1751; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1752; CHECK-NEXT:    ret
1753;
1754; NONEON-NOSVE-LABEL: udiv_v1i64:
1755; NONEON-NOSVE:       // %bb.0:
1756; NONEON-NOSVE-NEXT:    sub sp, sp, #16
1757; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1758; NONEON-NOSVE-NEXT:    fmov x8, d1
1759; NONEON-NOSVE-NEXT:    fmov x9, d0
1760; NONEON-NOSVE-NEXT:    udiv x8, x9, x8
1761; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
1762; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1763; NONEON-NOSVE-NEXT:    add sp, sp, #16
1764; NONEON-NOSVE-NEXT:    ret
1765  %res = udiv <1 x i64> %op1, %op2
1766  ret <1 x i64> %res
1767}
1768
1769define <2 x i64> @udiv_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
1770; CHECK-LABEL: udiv_v2i64:
1771; CHECK:       // %bb.0:
1772; CHECK-NEXT:    ptrue p0.d, vl2
1773; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1774; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1775; CHECK-NEXT:    udiv z0.d, p0/m, z0.d, z1.d
1776; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1777; CHECK-NEXT:    ret
1778;
1779; NONEON-NOSVE-LABEL: udiv_v2i64:
1780; NONEON-NOSVE:       // %bb.0:
1781; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1782; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1783; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1784; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1785; NONEON-NOSVE-NEXT:    udiv x11, x10, x8
1786; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1787; NONEON-NOSVE-NEXT:    udiv x8, x9, x8
1788; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
1789; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1790; NONEON-NOSVE-NEXT:    add sp, sp, #48
1791; NONEON-NOSVE-NEXT:    ret
1792  %res = udiv <2 x i64> %op1, %op2
1793  ret <2 x i64> %res
1794}
1795
1796define void @udiv_v4i64(ptr %a, ptr %b)  {
1797; CHECK-LABEL: udiv_v4i64:
1798; CHECK:       // %bb.0:
1799; CHECK-NEXT:    ldp q0, q3, [x1]
1800; CHECK-NEXT:    ptrue p0.d, vl2
1801; CHECK-NEXT:    ldp q1, q2, [x0]
1802; CHECK-NEXT:    udivr z0.d, p0/m, z0.d, z1.d
1803; CHECK-NEXT:    movprfx z1, z2
1804; CHECK-NEXT:    udiv z1.d, p0/m, z1.d, z3.d
1805; CHECK-NEXT:    stp q0, q1, [x0]
1806; CHECK-NEXT:    ret
1807;
1808; NONEON-NOSVE-LABEL: udiv_v4i64:
1809; NONEON-NOSVE:       // %bb.0:
1810; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1811; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1812; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1813; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1814; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1815; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1816; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
1817; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
1818; NONEON-NOSVE-NEXT:    udiv x11, x10, x8
1819; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
1820; NONEON-NOSVE-NEXT:    udiv x8, x9, x8
1821; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1822; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #80]
1823; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1824; NONEON-NOSVE-NEXT:    udiv x11, x10, x8
1825; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1826; NONEON-NOSVE-NEXT:    udiv x8, x9, x8
1827; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]
1828; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1829; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1830; NONEON-NOSVE-NEXT:    add sp, sp, #96
1831; NONEON-NOSVE-NEXT:    ret
1832  %op1 = load <4 x i64>, ptr %a
1833  %op2 = load <4 x i64>, ptr %b
1834  %res = udiv <4 x i64> %op1, %op2
1835  store <4 x i64> %res, ptr %a
1836  ret void
1837}
1838
1839define void @udiv_constantsplat_v8i32(ptr %a)  {
1840; CHECK-LABEL: udiv_constantsplat_v8i32:
1841; CHECK:       // %bb.0:
1842; CHECK-NEXT:    mov w8, #8969 // =0x2309
1843; CHECK-NEXT:    ldp q1, q2, [x0]
1844; CHECK-NEXT:    movk w8, #22765, lsl #16
1845; CHECK-NEXT:    mov z0.s, w8
1846; CHECK-NEXT:    umulh z3.s, z1.s, z0.s
1847; CHECK-NEXT:    umulh z0.s, z2.s, z0.s
1848; CHECK-NEXT:    sub z1.s, z1.s, z3.s
1849; CHECK-NEXT:    sub z2.s, z2.s, z0.s
1850; CHECK-NEXT:    usra z3.s, z1.s, #1
1851; CHECK-NEXT:    usra z0.s, z2.s, #1
1852; CHECK-NEXT:    lsr z1.s, z3.s, #6
1853; CHECK-NEXT:    lsr z0.s, z0.s, #6
1854; CHECK-NEXT:    stp q1, q0, [x0]
1855; CHECK-NEXT:    ret
1856;
1857; NONEON-NOSVE-LABEL: udiv_constantsplat_v8i32:
1858; NONEON-NOSVE:       // %bb.0:
1859; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1860; NONEON-NOSVE-NEXT:    mov w8, #8969 // =0x2309
1861; NONEON-NOSVE-NEXT:    movk w8, #22765, lsl #16
1862; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1863; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1864; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
1865; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1866; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1867; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1868; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1869; NONEON-NOSVE-NEXT:    lsr w11, w9, #6
1870; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
1871; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1872; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1873; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1874; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1875; NONEON-NOSVE-NEXT:    lsr w9, w9, #6
1876; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #56]
1877; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
1878; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1879; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1880; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1881; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1882; NONEON-NOSVE-NEXT:    lsr w11, w9, #6
1883; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
1884; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1885; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1886; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1887; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1888; NONEON-NOSVE-NEXT:    lsr w9, w9, #6
1889; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #48]
1890; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
1891; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1892; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1893; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1894; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1895; NONEON-NOSVE-NEXT:    lsr w11, w9, #6
1896; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
1897; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1898; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1899; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1900; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1901; NONEON-NOSVE-NEXT:    lsr w9, w9, #6
1902; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #40]
1903; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
1904; NONEON-NOSVE-NEXT:    umull x10, w9, w8
1905; NONEON-NOSVE-NEXT:    lsr x10, x10, #32
1906; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1907; NONEON-NOSVE-NEXT:    add w9, w10, w9, lsr #1
1908; NONEON-NOSVE-NEXT:    lsr w11, w9, #6
1909; NONEON-NOSVE-NEXT:    ldr w9, [sp]
1910; NONEON-NOSVE-NEXT:    umull x8, w9, w8
1911; NONEON-NOSVE-NEXT:    lsr x8, x8, #32
1912; NONEON-NOSVE-NEXT:    sub w9, w9, w8
1913; NONEON-NOSVE-NEXT:    add w8, w8, w9, lsr #1
1914; NONEON-NOSVE-NEXT:    lsr w8, w8, #6
1915; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
1916; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1917; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1918; NONEON-NOSVE-NEXT:    add sp, sp, #64
1919; NONEON-NOSVE-NEXT:    ret
1920  %op1 = load <8 x i32>, ptr %a
1921  %res = udiv <8 x i32> %op1, <i32 95, i32 95, i32 95, i32 95, i32 95, i32 95, i32 95, i32 95>
1922  store <8 x i32> %res, ptr %a
1923  ret void
1924}
1925