xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-compares.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;
9; ICMP EQ
10;
11
12define <8 x i8> @icmp_eq_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
13; CHECK-LABEL: icmp_eq_v8i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    ptrue p0.b, vl8
16; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
17; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
18; CHECK-NEXT:    cmpeq p0.b, p0/z, z0.b, z1.b
19; CHECK-NEXT:    mov z0.b, p0/z, #-1 // =0xffffffffffffffff
20; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
21; CHECK-NEXT:    ret
22;
23; NONEON-NOSVE-LABEL: icmp_eq_v8i8:
24; NONEON-NOSVE:       // %bb.0:
25; NONEON-NOSVE-NEXT:    sub sp, sp, #32
26; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
27; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
28; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
29; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
30; NONEON-NOSVE-NEXT:    cmp w9, w8
31; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
32; NONEON-NOSVE-NEXT:    csetm w8, eq
33; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
34; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
35; NONEON-NOSVE-NEXT:    cmp w9, w8
36; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
37; NONEON-NOSVE-NEXT:    csetm w8, eq
38; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
39; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
40; NONEON-NOSVE-NEXT:    cmp w9, w8
41; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
42; NONEON-NOSVE-NEXT:    csetm w8, eq
43; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
44; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
45; NONEON-NOSVE-NEXT:    cmp w9, w8
46; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
47; NONEON-NOSVE-NEXT:    csetm w8, eq
48; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
49; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
50; NONEON-NOSVE-NEXT:    cmp w9, w8
51; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
52; NONEON-NOSVE-NEXT:    csetm w8, eq
53; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
54; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
55; NONEON-NOSVE-NEXT:    cmp w9, w8
56; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
57; NONEON-NOSVE-NEXT:    csetm w8, eq
58; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
59; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
60; NONEON-NOSVE-NEXT:    cmp w9, w8
61; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
62; NONEON-NOSVE-NEXT:    csetm w8, eq
63; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
64; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
65; NONEON-NOSVE-NEXT:    cmp w9, w8
66; NONEON-NOSVE-NEXT:    csetm w8, eq
67; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
68; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
69; NONEON-NOSVE-NEXT:    add sp, sp, #32
70; NONEON-NOSVE-NEXT:    ret
71  %cmp = icmp eq <8 x i8> %op1, %op2
72  %sext = sext <8 x i1> %cmp to <8 x i8>
73  ret <8 x i8> %sext
74}
75
76define <16 x i8> @icmp_eq_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
77; CHECK-LABEL: icmp_eq_v16i8:
78; CHECK:       // %bb.0:
79; CHECK-NEXT:    ptrue p0.b, vl16
80; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
81; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
82; CHECK-NEXT:    cmpeq p0.b, p0/z, z0.b, z1.b
83; CHECK-NEXT:    mov z0.b, p0/z, #-1 // =0xffffffffffffffff
84; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
85; CHECK-NEXT:    ret
86;
87; NONEON-NOSVE-LABEL: icmp_eq_v16i8:
88; NONEON-NOSVE:       // %bb.0:
89; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
90; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
91; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
92; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
93; NONEON-NOSVE-NEXT:    cmp w9, w8
94; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
95; NONEON-NOSVE-NEXT:    csetm w8, eq
96; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
97; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
98; NONEON-NOSVE-NEXT:    cmp w9, w8
99; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
100; NONEON-NOSVE-NEXT:    csetm w8, eq
101; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
102; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
103; NONEON-NOSVE-NEXT:    cmp w9, w8
104; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
105; NONEON-NOSVE-NEXT:    csetm w8, eq
106; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
107; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
108; NONEON-NOSVE-NEXT:    cmp w9, w8
109; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
110; NONEON-NOSVE-NEXT:    csetm w8, eq
111; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
112; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
113; NONEON-NOSVE-NEXT:    cmp w9, w8
114; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
115; NONEON-NOSVE-NEXT:    csetm w8, eq
116; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
117; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
118; NONEON-NOSVE-NEXT:    cmp w9, w8
119; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
120; NONEON-NOSVE-NEXT:    csetm w8, eq
121; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
122; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
123; NONEON-NOSVE-NEXT:    cmp w9, w8
124; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
125; NONEON-NOSVE-NEXT:    csetm w8, eq
126; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
127; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
128; NONEON-NOSVE-NEXT:    cmp w9, w8
129; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
130; NONEON-NOSVE-NEXT:    csetm w8, eq
131; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
132; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
133; NONEON-NOSVE-NEXT:    cmp w9, w8
134; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
135; NONEON-NOSVE-NEXT:    csetm w8, eq
136; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
138; NONEON-NOSVE-NEXT:    cmp w9, w8
139; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
140; NONEON-NOSVE-NEXT:    csetm w8, eq
141; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
142; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
143; NONEON-NOSVE-NEXT:    cmp w9, w8
144; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
145; NONEON-NOSVE-NEXT:    csetm w8, eq
146; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
147; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
148; NONEON-NOSVE-NEXT:    cmp w9, w8
149; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
150; NONEON-NOSVE-NEXT:    csetm w8, eq
151; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
152; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
153; NONEON-NOSVE-NEXT:    cmp w9, w8
154; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
155; NONEON-NOSVE-NEXT:    csetm w8, eq
156; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
157; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
158; NONEON-NOSVE-NEXT:    cmp w9, w8
159; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
160; NONEON-NOSVE-NEXT:    csetm w8, eq
161; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
162; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
163; NONEON-NOSVE-NEXT:    cmp w9, w8
164; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
165; NONEON-NOSVE-NEXT:    csetm w8, eq
166; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
167; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
168; NONEON-NOSVE-NEXT:    cmp w9, w8
169; NONEON-NOSVE-NEXT:    csetm w8, eq
170; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
171; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
172; NONEON-NOSVE-NEXT:    add sp, sp, #48
173; NONEON-NOSVE-NEXT:    ret
174  %cmp = icmp eq <16 x i8> %op1, %op2
175  %sext = sext <16 x i1> %cmp to <16 x i8>
176  ret <16 x i8> %sext
177}
178
179define void @icmp_eq_v32i8(ptr %a, ptr %b) {
180; CHECK-LABEL: icmp_eq_v32i8:
181; CHECK:       // %bb.0:
182; CHECK-NEXT:    ldp q0, q3, [x1]
183; CHECK-NEXT:    ptrue p0.b, vl16
184; CHECK-NEXT:    ldp q1, q2, [x0]
185; CHECK-NEXT:    cmpeq p1.b, p0/z, z1.b, z0.b
186; CHECK-NEXT:    cmpeq p0.b, p0/z, z2.b, z3.b
187; CHECK-NEXT:    mov z0.b, p1/z, #-1 // =0xffffffffffffffff
188; CHECK-NEXT:    mov z1.b, p0/z, #-1 // =0xffffffffffffffff
189; CHECK-NEXT:    stp q0, q1, [x0]
190; CHECK-NEXT:    ret
191;
192; NONEON-NOSVE-LABEL: icmp_eq_v32i8:
193; NONEON-NOSVE:       // %bb.0:
194; NONEON-NOSVE-NEXT:    sub sp, sp, #96
195; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
196; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
197; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
198; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
199; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
200; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
201; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
202; NONEON-NOSVE-NEXT:    cmp w9, w8
203; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
204; NONEON-NOSVE-NEXT:    csetm w8, eq
205; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
206; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
207; NONEON-NOSVE-NEXT:    cmp w9, w8
208; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
209; NONEON-NOSVE-NEXT:    csetm w8, eq
210; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
211; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
212; NONEON-NOSVE-NEXT:    cmp w9, w8
213; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
214; NONEON-NOSVE-NEXT:    csetm w8, eq
215; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
216; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
217; NONEON-NOSVE-NEXT:    cmp w9, w8
218; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
219; NONEON-NOSVE-NEXT:    csetm w8, eq
220; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
221; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
222; NONEON-NOSVE-NEXT:    cmp w9, w8
223; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
224; NONEON-NOSVE-NEXT:    csetm w8, eq
225; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
226; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
227; NONEON-NOSVE-NEXT:    cmp w9, w8
228; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
229; NONEON-NOSVE-NEXT:    csetm w8, eq
230; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
231; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
232; NONEON-NOSVE-NEXT:    cmp w9, w8
233; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
234; NONEON-NOSVE-NEXT:    csetm w8, eq
235; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
236; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
237; NONEON-NOSVE-NEXT:    cmp w9, w8
238; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
239; NONEON-NOSVE-NEXT:    csetm w8, eq
240; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
241; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
242; NONEON-NOSVE-NEXT:    cmp w9, w8
243; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
244; NONEON-NOSVE-NEXT:    csetm w8, eq
245; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
246; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
247; NONEON-NOSVE-NEXT:    cmp w9, w8
248; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
249; NONEON-NOSVE-NEXT:    csetm w8, eq
250; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
251; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
252; NONEON-NOSVE-NEXT:    cmp w9, w8
253; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
254; NONEON-NOSVE-NEXT:    csetm w8, eq
255; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
256; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
257; NONEON-NOSVE-NEXT:    cmp w9, w8
258; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
259; NONEON-NOSVE-NEXT:    csetm w8, eq
260; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
261; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
262; NONEON-NOSVE-NEXT:    cmp w9, w8
263; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
264; NONEON-NOSVE-NEXT:    csetm w8, eq
265; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
266; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
267; NONEON-NOSVE-NEXT:    cmp w9, w8
268; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
269; NONEON-NOSVE-NEXT:    csetm w8, eq
270; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
271; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
272; NONEON-NOSVE-NEXT:    cmp w9, w8
273; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
274; NONEON-NOSVE-NEXT:    csetm w8, eq
275; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
276; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
277; NONEON-NOSVE-NEXT:    cmp w9, w8
278; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
279; NONEON-NOSVE-NEXT:    csetm w8, eq
280; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
281; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
282; NONEON-NOSVE-NEXT:    cmp w9, w8
283; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
284; NONEON-NOSVE-NEXT:    csetm w8, eq
285; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
286; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
287; NONEON-NOSVE-NEXT:    cmp w9, w8
288; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
289; NONEON-NOSVE-NEXT:    csetm w8, eq
290; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
291; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
292; NONEON-NOSVE-NEXT:    cmp w9, w8
293; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
294; NONEON-NOSVE-NEXT:    csetm w8, eq
295; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
296; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
297; NONEON-NOSVE-NEXT:    cmp w9, w8
298; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
299; NONEON-NOSVE-NEXT:    csetm w8, eq
300; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
301; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
302; NONEON-NOSVE-NEXT:    cmp w9, w8
303; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
304; NONEON-NOSVE-NEXT:    csetm w8, eq
305; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
306; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
307; NONEON-NOSVE-NEXT:    cmp w9, w8
308; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
309; NONEON-NOSVE-NEXT:    csetm w8, eq
310; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
311; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
312; NONEON-NOSVE-NEXT:    cmp w9, w8
313; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
314; NONEON-NOSVE-NEXT:    csetm w8, eq
315; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
316; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
317; NONEON-NOSVE-NEXT:    cmp w9, w8
318; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
319; NONEON-NOSVE-NEXT:    csetm w8, eq
320; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
321; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
322; NONEON-NOSVE-NEXT:    cmp w9, w8
323; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
324; NONEON-NOSVE-NEXT:    csetm w8, eq
325; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
326; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
327; NONEON-NOSVE-NEXT:    cmp w9, w8
328; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
329; NONEON-NOSVE-NEXT:    csetm w8, eq
330; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
331; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
332; NONEON-NOSVE-NEXT:    cmp w9, w8
333; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
334; NONEON-NOSVE-NEXT:    csetm w8, eq
335; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
336; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
337; NONEON-NOSVE-NEXT:    cmp w9, w8
338; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
339; NONEON-NOSVE-NEXT:    csetm w8, eq
340; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
341; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
342; NONEON-NOSVE-NEXT:    cmp w9, w8
343; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
344; NONEON-NOSVE-NEXT:    csetm w8, eq
345; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
346; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
347; NONEON-NOSVE-NEXT:    cmp w9, w8
348; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
349; NONEON-NOSVE-NEXT:    csetm w8, eq
350; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
351; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
352; NONEON-NOSVE-NEXT:    cmp w9, w8
353; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
354; NONEON-NOSVE-NEXT:    csetm w8, eq
355; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
356; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
357; NONEON-NOSVE-NEXT:    cmp w9, w8
358; NONEON-NOSVE-NEXT:    csetm w8, eq
359; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
360; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
361; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
362; NONEON-NOSVE-NEXT:    add sp, sp, #96
363; NONEON-NOSVE-NEXT:    ret
364  %op1 = load <32 x i8>, ptr %a
365  %op2 = load <32 x i8>, ptr %b
366  %cmp = icmp eq <32 x i8> %op1, %op2
367  %sext = sext <32 x i1> %cmp to <32 x i8>
368  store <32 x i8> %sext, ptr %a
369  ret void
370}
371
372define <4 x i16> @icmp_eq_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
373; CHECK-LABEL: icmp_eq_v4i16:
374; CHECK:       // %bb.0:
375; CHECK-NEXT:    ptrue p0.h, vl4
376; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
377; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
378; CHECK-NEXT:    cmpeq p0.h, p0/z, z0.h, z1.h
379; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
380; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
381; CHECK-NEXT:    ret
382;
383; NONEON-NOSVE-LABEL: icmp_eq_v4i16:
384; NONEON-NOSVE:       // %bb.0:
385; NONEON-NOSVE-NEXT:    sub sp, sp, #32
386; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
387; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
388; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
389; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
390; NONEON-NOSVE-NEXT:    cmp w9, w8
391; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
392; NONEON-NOSVE-NEXT:    csetm w8, eq
393; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
394; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
395; NONEON-NOSVE-NEXT:    cmp w9, w8
396; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
397; NONEON-NOSVE-NEXT:    csetm w8, eq
398; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
399; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
400; NONEON-NOSVE-NEXT:    cmp w9, w8
401; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
402; NONEON-NOSVE-NEXT:    csetm w8, eq
403; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
404; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
405; NONEON-NOSVE-NEXT:    cmp w9, w8
406; NONEON-NOSVE-NEXT:    csetm w8, eq
407; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
408; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
409; NONEON-NOSVE-NEXT:    add sp, sp, #32
410; NONEON-NOSVE-NEXT:    ret
411  %cmp = icmp eq <4 x i16> %op1, %op2
412  %sext = sext <4 x i1> %cmp to <4 x i16>
413  ret <4 x i16> %sext
414}
415
416define <8 x i16> @icmp_eq_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
417; CHECK-LABEL: icmp_eq_v8i16:
418; CHECK:       // %bb.0:
419; CHECK-NEXT:    ptrue p0.h, vl8
420; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
421; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
422; CHECK-NEXT:    cmpeq p0.h, p0/z, z0.h, z1.h
423; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
424; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
425; CHECK-NEXT:    ret
426;
427; NONEON-NOSVE-LABEL: icmp_eq_v8i16:
428; NONEON-NOSVE:       // %bb.0:
429; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
430; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
431; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
432; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
433; NONEON-NOSVE-NEXT:    cmp w9, w8
434; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
435; NONEON-NOSVE-NEXT:    csetm w8, eq
436; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
437; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
438; NONEON-NOSVE-NEXT:    cmp w9, w8
439; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
440; NONEON-NOSVE-NEXT:    csetm w8, eq
441; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
442; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
443; NONEON-NOSVE-NEXT:    cmp w9, w8
444; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
445; NONEON-NOSVE-NEXT:    csetm w8, eq
446; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
447; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
448; NONEON-NOSVE-NEXT:    cmp w9, w8
449; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
450; NONEON-NOSVE-NEXT:    csetm w8, eq
451; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
452; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
453; NONEON-NOSVE-NEXT:    cmp w9, w8
454; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
455; NONEON-NOSVE-NEXT:    csetm w8, eq
456; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
457; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
458; NONEON-NOSVE-NEXT:    cmp w9, w8
459; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
460; NONEON-NOSVE-NEXT:    csetm w8, eq
461; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
462; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
463; NONEON-NOSVE-NEXT:    cmp w9, w8
464; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
465; NONEON-NOSVE-NEXT:    csetm w8, eq
466; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
467; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
468; NONEON-NOSVE-NEXT:    cmp w9, w8
469; NONEON-NOSVE-NEXT:    csetm w8, eq
470; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
471; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
472; NONEON-NOSVE-NEXT:    add sp, sp, #48
473; NONEON-NOSVE-NEXT:    ret
474  %cmp = icmp eq <8 x i16> %op1, %op2
475  %sext = sext <8 x i1> %cmp to <8 x i16>
476  ret <8 x i16> %sext
477}
478
479define void @icmp_eq_v16i16(ptr %a, ptr %b) {
480; CHECK-LABEL: icmp_eq_v16i16:
481; CHECK:       // %bb.0:
482; CHECK-NEXT:    ldp q0, q3, [x1]
483; CHECK-NEXT:    ptrue p0.h, vl8
484; CHECK-NEXT:    ldp q1, q2, [x0]
485; CHECK-NEXT:    cmpeq p1.h, p0/z, z1.h, z0.h
486; CHECK-NEXT:    cmpeq p0.h, p0/z, z2.h, z3.h
487; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
488; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
489; CHECK-NEXT:    stp q0, q1, [x0]
490; CHECK-NEXT:    ret
491;
492; NONEON-NOSVE-LABEL: icmp_eq_v16i16:
493; NONEON-NOSVE:       // %bb.0:
494; NONEON-NOSVE-NEXT:    sub sp, sp, #96
495; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
496; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
497; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
498; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
499; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
500; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
501; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
502; NONEON-NOSVE-NEXT:    cmp w9, w8
503; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
504; NONEON-NOSVE-NEXT:    csetm w8, eq
505; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
506; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
507; NONEON-NOSVE-NEXT:    cmp w9, w8
508; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
509; NONEON-NOSVE-NEXT:    csetm w8, eq
510; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
511; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
512; NONEON-NOSVE-NEXT:    cmp w9, w8
513; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
514; NONEON-NOSVE-NEXT:    csetm w8, eq
515; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
516; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
517; NONEON-NOSVE-NEXT:    cmp w9, w8
518; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
519; NONEON-NOSVE-NEXT:    csetm w8, eq
520; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
521; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
522; NONEON-NOSVE-NEXT:    cmp w9, w8
523; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
524; NONEON-NOSVE-NEXT:    csetm w8, eq
525; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
526; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
527; NONEON-NOSVE-NEXT:    cmp w9, w8
528; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
529; NONEON-NOSVE-NEXT:    csetm w8, eq
530; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
531; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
532; NONEON-NOSVE-NEXT:    cmp w9, w8
533; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
534; NONEON-NOSVE-NEXT:    csetm w8, eq
535; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
536; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
537; NONEON-NOSVE-NEXT:    cmp w9, w8
538; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
539; NONEON-NOSVE-NEXT:    csetm w8, eq
540; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
541; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
542; NONEON-NOSVE-NEXT:    cmp w9, w8
543; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
544; NONEON-NOSVE-NEXT:    csetm w8, eq
545; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
546; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
547; NONEON-NOSVE-NEXT:    cmp w9, w8
548; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
549; NONEON-NOSVE-NEXT:    csetm w8, eq
550; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
551; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
552; NONEON-NOSVE-NEXT:    cmp w9, w8
553; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
554; NONEON-NOSVE-NEXT:    csetm w8, eq
555; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
556; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
557; NONEON-NOSVE-NEXT:    cmp w9, w8
558; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
559; NONEON-NOSVE-NEXT:    csetm w8, eq
560; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
561; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
562; NONEON-NOSVE-NEXT:    cmp w9, w8
563; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
564; NONEON-NOSVE-NEXT:    csetm w8, eq
565; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
566; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
567; NONEON-NOSVE-NEXT:    cmp w9, w8
568; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
569; NONEON-NOSVE-NEXT:    csetm w8, eq
570; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
571; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
572; NONEON-NOSVE-NEXT:    cmp w9, w8
573; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
574; NONEON-NOSVE-NEXT:    csetm w8, eq
575; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
576; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
577; NONEON-NOSVE-NEXT:    cmp w9, w8
578; NONEON-NOSVE-NEXT:    csetm w8, eq
579; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
580; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
581; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
582; NONEON-NOSVE-NEXT:    add sp, sp, #96
583; NONEON-NOSVE-NEXT:    ret
584  %op1 = load <16 x i16>, ptr %a
585  %op2 = load <16 x i16>, ptr %b
586  %cmp = icmp eq <16 x i16> %op1, %op2
587  %sext = sext <16 x i1> %cmp to <16 x i16>
588  store <16 x i16> %sext, ptr %a
589  ret void
590}
591
592define <2 x i32> @icmp_eq_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
593; CHECK-LABEL: icmp_eq_v2i32:
594; CHECK:       // %bb.0:
595; CHECK-NEXT:    ptrue p0.s, vl2
596; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
597; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
598; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
599; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
600; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
601; CHECK-NEXT:    ret
602;
603; NONEON-NOSVE-LABEL: icmp_eq_v2i32:
604; NONEON-NOSVE:       // %bb.0:
605; NONEON-NOSVE-NEXT:    sub sp, sp, #32
606; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
607; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
608; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
609; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
610; NONEON-NOSVE-NEXT:    cmp w10, w8
611; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
612; NONEON-NOSVE-NEXT:    csetm w10, eq
613; NONEON-NOSVE-NEXT:    cmp w9, w8
614; NONEON-NOSVE-NEXT:    csetm w8, eq
615; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #24]
616; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
617; NONEON-NOSVE-NEXT:    add sp, sp, #32
618; NONEON-NOSVE-NEXT:    ret
619  %cmp = icmp eq <2 x i32> %op1, %op2
620  %sext = sext <2 x i1> %cmp to <2 x i32>
621  ret <2 x i32> %sext
622}
623
624define <4 x i32> @icmp_eq_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
625; CHECK-LABEL: icmp_eq_v4i32:
626; CHECK:       // %bb.0:
627; CHECK-NEXT:    ptrue p0.s, vl4
628; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
629; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
630; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
631; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
632; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
633; CHECK-NEXT:    ret
634;
635; NONEON-NOSVE-LABEL: icmp_eq_v4i32:
636; NONEON-NOSVE:       // %bb.0:
637; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
638; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
639; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
640; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
641; NONEON-NOSVE-NEXT:    cmp w10, w8
642; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
643; NONEON-NOSVE-NEXT:    csetm w10, eq
644; NONEON-NOSVE-NEXT:    cmp w9, w8
645; NONEON-NOSVE-NEXT:    csetm w8, eq
646; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #40]
647; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
648; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
649; NONEON-NOSVE-NEXT:    cmp w10, w8
650; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
651; NONEON-NOSVE-NEXT:    csetm w10, eq
652; NONEON-NOSVE-NEXT:    cmp w9, w8
653; NONEON-NOSVE-NEXT:    csetm w8, eq
654; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
655; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
656; NONEON-NOSVE-NEXT:    add sp, sp, #48
657; NONEON-NOSVE-NEXT:    ret
658  %cmp = icmp eq <4 x i32> %op1, %op2
659  %sext = sext <4 x i1> %cmp to <4 x i32>
660  ret <4 x i32> %sext
661}
662
663define void @icmp_eq_v8i32(ptr %a, ptr %b) {
664; CHECK-LABEL: icmp_eq_v8i32:
665; CHECK:       // %bb.0:
666; CHECK-NEXT:    ldp q0, q3, [x1]
667; CHECK-NEXT:    ptrue p0.s, vl4
668; CHECK-NEXT:    ldp q1, q2, [x0]
669; CHECK-NEXT:    cmpeq p1.s, p0/z, z1.s, z0.s
670; CHECK-NEXT:    cmpeq p0.s, p0/z, z2.s, z3.s
671; CHECK-NEXT:    mov z0.s, p1/z, #-1 // =0xffffffffffffffff
672; CHECK-NEXT:    mov z1.s, p0/z, #-1 // =0xffffffffffffffff
673; CHECK-NEXT:    stp q0, q1, [x0]
674; CHECK-NEXT:    ret
675;
676; NONEON-NOSVE-LABEL: icmp_eq_v8i32:
677; NONEON-NOSVE:       // %bb.0:
678; NONEON-NOSVE-NEXT:    sub sp, sp, #96
679; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
680; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
681; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
682; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
683; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
684; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
685; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
686; NONEON-NOSVE-NEXT:    cmp w10, w8
687; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
688; NONEON-NOSVE-NEXT:    csetm w10, eq
689; NONEON-NOSVE-NEXT:    cmp w9, w8
690; NONEON-NOSVE-NEXT:    csetm w8, eq
691; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #88]
692; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
693; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
694; NONEON-NOSVE-NEXT:    cmp w10, w8
695; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
696; NONEON-NOSVE-NEXT:    csetm w10, eq
697; NONEON-NOSVE-NEXT:    cmp w9, w8
698; NONEON-NOSVE-NEXT:    csetm w8, eq
699; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #80]
700; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
701; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
702; NONEON-NOSVE-NEXT:    cmp w10, w8
703; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
704; NONEON-NOSVE-NEXT:    csetm w10, eq
705; NONEON-NOSVE-NEXT:    cmp w9, w8
706; NONEON-NOSVE-NEXT:    csetm w8, eq
707; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #72]
708; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
709; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
710; NONEON-NOSVE-NEXT:    cmp w10, w8
711; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
712; NONEON-NOSVE-NEXT:    csetm w10, eq
713; NONEON-NOSVE-NEXT:    cmp w9, w8
714; NONEON-NOSVE-NEXT:    csetm w8, eq
715; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #64]
716; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
717; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
718; NONEON-NOSVE-NEXT:    add sp, sp, #96
719; NONEON-NOSVE-NEXT:    ret
720  %op1 = load <8 x i32>, ptr %a
721  %op2 = load <8 x i32>, ptr %b
722  %cmp = icmp eq <8 x i32> %op1, %op2
723  %sext = sext <8 x i1> %cmp to <8 x i32>
724  store <8 x i32> %sext, ptr %a
725  ret void
726}
727
728define <1 x i64> @icmp_eq_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
729; CHECK-LABEL: icmp_eq_v1i64:
730; CHECK:       // %bb.0:
731; CHECK-NEXT:    ptrue p0.d, vl1
732; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
733; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
734; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
735; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
736; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
737; CHECK-NEXT:    ret
738;
739; NONEON-NOSVE-LABEL: icmp_eq_v1i64:
740; NONEON-NOSVE:       // %bb.0:
741; NONEON-NOSVE-NEXT:    sub sp, sp, #16
742; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
743; NONEON-NOSVE-NEXT:    fmov x8, d1
744; NONEON-NOSVE-NEXT:    fmov x9, d0
745; NONEON-NOSVE-NEXT:    cmp x9, x8
746; NONEON-NOSVE-NEXT:    csetm x8, eq
747; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
748; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
749; NONEON-NOSVE-NEXT:    add sp, sp, #16
750; NONEON-NOSVE-NEXT:    ret
751  %cmp = icmp eq <1 x i64> %op1, %op2
752  %sext = sext <1 x i1> %cmp to <1 x i64>
753  ret <1 x i64> %sext
754}
755
756define <2 x i64> @icmp_eq_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
757; CHECK-LABEL: icmp_eq_v2i64:
758; CHECK:       // %bb.0:
759; CHECK-NEXT:    ptrue p0.d, vl2
760; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
761; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
762; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
763; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
764; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
765; CHECK-NEXT:    ret
766;
767; NONEON-NOSVE-LABEL: icmp_eq_v2i64:
768; NONEON-NOSVE:       // %bb.0:
769; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
770; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
771; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
772; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
773; NONEON-NOSVE-NEXT:    cmp x10, x8
774; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
775; NONEON-NOSVE-NEXT:    csetm x10, eq
776; NONEON-NOSVE-NEXT:    cmp x9, x8
777; NONEON-NOSVE-NEXT:    csetm x8, eq
778; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
779; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
780; NONEON-NOSVE-NEXT:    add sp, sp, #48
781; NONEON-NOSVE-NEXT:    ret
782  %cmp = icmp eq <2 x i64> %op1, %op2
783  %sext = sext <2 x i1> %cmp to <2 x i64>
784  ret <2 x i64> %sext
785}
786
787define void @icmp_eq_v4i64(ptr %a, ptr %b) {
788; CHECK-LABEL: icmp_eq_v4i64:
789; CHECK:       // %bb.0:
790; CHECK-NEXT:    ldp q0, q3, [x1]
791; CHECK-NEXT:    ptrue p0.d, vl2
792; CHECK-NEXT:    ldp q1, q2, [x0]
793; CHECK-NEXT:    cmpeq p1.d, p0/z, z1.d, z0.d
794; CHECK-NEXT:    cmpeq p0.d, p0/z, z2.d, z3.d
795; CHECK-NEXT:    mov z0.d, p1/z, #-1 // =0xffffffffffffffff
796; CHECK-NEXT:    mov z1.d, p0/z, #-1 // =0xffffffffffffffff
797; CHECK-NEXT:    stp q0, q1, [x0]
798; CHECK-NEXT:    ret
799;
800; NONEON-NOSVE-LABEL: icmp_eq_v4i64:
801; NONEON-NOSVE:       // %bb.0:
802; NONEON-NOSVE-NEXT:    sub sp, sp, #96
803; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
804; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
805; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
806; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
807; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
808; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
809; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
810; NONEON-NOSVE-NEXT:    cmp x10, x8
811; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
812; NONEON-NOSVE-NEXT:    csetm x10, eq
813; NONEON-NOSVE-NEXT:    cmp x9, x8
814; NONEON-NOSVE-NEXT:    csetm x8, eq
815; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #80]
816; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
817; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
818; NONEON-NOSVE-NEXT:    cmp x10, x8
819; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
820; NONEON-NOSVE-NEXT:    csetm x10, eq
821; NONEON-NOSVE-NEXT:    cmp x9, x8
822; NONEON-NOSVE-NEXT:    csetm x8, eq
823; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #64]
824; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
825; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
826; NONEON-NOSVE-NEXT:    add sp, sp, #96
827; NONEON-NOSVE-NEXT:    ret
828  %op1 = load <4 x i64>, ptr %a
829  %op2 = load <4 x i64>, ptr %b
830  %cmp = icmp eq <4 x i64> %op1, %op2
831  %sext = sext <4 x i1> %cmp to <4 x i64>
832  store <4 x i64> %sext, ptr %a
833  ret void
834}
835
836;
837; ICMP NE
838;
839
840define void @icmp_ne_v32i8(ptr %a, ptr %b) {
841; CHECK-LABEL: icmp_ne_v32i8:
842; CHECK:       // %bb.0:
843; CHECK-NEXT:    ldp q0, q3, [x1]
844; CHECK-NEXT:    ptrue p0.b, vl16
845; CHECK-NEXT:    ldp q1, q2, [x0]
846; CHECK-NEXT:    cmpne p1.b, p0/z, z1.b, z0.b
847; CHECK-NEXT:    cmpne p0.b, p0/z, z2.b, z3.b
848; CHECK-NEXT:    mov z0.b, p1/z, #-1 // =0xffffffffffffffff
849; CHECK-NEXT:    mov z1.b, p0/z, #-1 // =0xffffffffffffffff
850; CHECK-NEXT:    stp q0, q1, [x0]
851; CHECK-NEXT:    ret
852;
853; NONEON-NOSVE-LABEL: icmp_ne_v32i8:
854; NONEON-NOSVE:       // %bb.0:
855; NONEON-NOSVE-NEXT:    sub sp, sp, #96
856; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
857; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
858; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
859; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
860; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
861; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
862; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
863; NONEON-NOSVE-NEXT:    cmp w9, w8
864; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
865; NONEON-NOSVE-NEXT:    csetm w8, ne
866; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
867; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
868; NONEON-NOSVE-NEXT:    cmp w9, w8
869; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
870; NONEON-NOSVE-NEXT:    csetm w8, ne
871; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
872; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
873; NONEON-NOSVE-NEXT:    cmp w9, w8
874; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
875; NONEON-NOSVE-NEXT:    csetm w8, ne
876; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
877; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
878; NONEON-NOSVE-NEXT:    cmp w9, w8
879; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
880; NONEON-NOSVE-NEXT:    csetm w8, ne
881; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
882; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
883; NONEON-NOSVE-NEXT:    cmp w9, w8
884; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
885; NONEON-NOSVE-NEXT:    csetm w8, ne
886; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
887; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
888; NONEON-NOSVE-NEXT:    cmp w9, w8
889; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
890; NONEON-NOSVE-NEXT:    csetm w8, ne
891; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
892; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
893; NONEON-NOSVE-NEXT:    cmp w9, w8
894; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
895; NONEON-NOSVE-NEXT:    csetm w8, ne
896; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
897; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
898; NONEON-NOSVE-NEXT:    cmp w9, w8
899; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
900; NONEON-NOSVE-NEXT:    csetm w8, ne
901; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
902; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
903; NONEON-NOSVE-NEXT:    cmp w9, w8
904; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
905; NONEON-NOSVE-NEXT:    csetm w8, ne
906; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
907; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
908; NONEON-NOSVE-NEXT:    cmp w9, w8
909; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
910; NONEON-NOSVE-NEXT:    csetm w8, ne
911; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
912; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
913; NONEON-NOSVE-NEXT:    cmp w9, w8
914; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
915; NONEON-NOSVE-NEXT:    csetm w8, ne
916; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
917; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
918; NONEON-NOSVE-NEXT:    cmp w9, w8
919; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
920; NONEON-NOSVE-NEXT:    csetm w8, ne
921; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
922; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
923; NONEON-NOSVE-NEXT:    cmp w9, w8
924; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
925; NONEON-NOSVE-NEXT:    csetm w8, ne
926; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
927; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
928; NONEON-NOSVE-NEXT:    cmp w9, w8
929; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
930; NONEON-NOSVE-NEXT:    csetm w8, ne
931; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
932; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
933; NONEON-NOSVE-NEXT:    cmp w9, w8
934; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
935; NONEON-NOSVE-NEXT:    csetm w8, ne
936; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
937; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
938; NONEON-NOSVE-NEXT:    cmp w9, w8
939; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
940; NONEON-NOSVE-NEXT:    csetm w8, ne
941; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
942; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
943; NONEON-NOSVE-NEXT:    cmp w9, w8
944; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
945; NONEON-NOSVE-NEXT:    csetm w8, ne
946; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
947; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
948; NONEON-NOSVE-NEXT:    cmp w9, w8
949; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
950; NONEON-NOSVE-NEXT:    csetm w8, ne
951; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
952; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
953; NONEON-NOSVE-NEXT:    cmp w9, w8
954; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
955; NONEON-NOSVE-NEXT:    csetm w8, ne
956; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
957; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
958; NONEON-NOSVE-NEXT:    cmp w9, w8
959; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
960; NONEON-NOSVE-NEXT:    csetm w8, ne
961; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
962; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
963; NONEON-NOSVE-NEXT:    cmp w9, w8
964; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
965; NONEON-NOSVE-NEXT:    csetm w8, ne
966; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
967; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
968; NONEON-NOSVE-NEXT:    cmp w9, w8
969; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
970; NONEON-NOSVE-NEXT:    csetm w8, ne
971; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
972; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
973; NONEON-NOSVE-NEXT:    cmp w9, w8
974; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
975; NONEON-NOSVE-NEXT:    csetm w8, ne
976; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
977; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
978; NONEON-NOSVE-NEXT:    cmp w9, w8
979; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
980; NONEON-NOSVE-NEXT:    csetm w8, ne
981; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
982; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
983; NONEON-NOSVE-NEXT:    cmp w9, w8
984; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
985; NONEON-NOSVE-NEXT:    csetm w8, ne
986; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
987; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
988; NONEON-NOSVE-NEXT:    cmp w9, w8
989; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
990; NONEON-NOSVE-NEXT:    csetm w8, ne
991; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
992; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
993; NONEON-NOSVE-NEXT:    cmp w9, w8
994; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
995; NONEON-NOSVE-NEXT:    csetm w8, ne
996; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
997; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
998; NONEON-NOSVE-NEXT:    cmp w9, w8
999; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1000; NONEON-NOSVE-NEXT:    csetm w8, ne
1001; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1002; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1003; NONEON-NOSVE-NEXT:    cmp w9, w8
1004; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1005; NONEON-NOSVE-NEXT:    csetm w8, ne
1006; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
1007; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1008; NONEON-NOSVE-NEXT:    cmp w9, w8
1009; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1010; NONEON-NOSVE-NEXT:    csetm w8, ne
1011; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1012; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1013; NONEON-NOSVE-NEXT:    cmp w9, w8
1014; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1015; NONEON-NOSVE-NEXT:    csetm w8, ne
1016; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
1017; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1018; NONEON-NOSVE-NEXT:    cmp w9, w8
1019; NONEON-NOSVE-NEXT:    csetm w8, ne
1020; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1021; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1022; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1023; NONEON-NOSVE-NEXT:    add sp, sp, #96
1024; NONEON-NOSVE-NEXT:    ret
1025  %op1 = load <32 x i8>, ptr %a
1026  %op2 = load <32 x i8>, ptr %b
1027  %cmp = icmp ne <32 x i8> %op1, %op2
1028  %sext = sext <32 x i1> %cmp to <32 x i8>
1029  store <32 x i8> %sext, ptr %a
1030  ret void
1031}
1032
1033;
1034; ICMP SGE
1035;
1036
1037define void @icmp_sge_v8i16(ptr %a, ptr %b) {
1038; CHECK-LABEL: icmp_sge_v8i16:
1039; CHECK:       // %bb.0:
1040; CHECK-NEXT:    ptrue p0.h, vl8
1041; CHECK-NEXT:    ldr q0, [x0]
1042; CHECK-NEXT:    ldr q1, [x1]
1043; CHECK-NEXT:    cmpge p0.h, p0/z, z0.h, z1.h
1044; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
1045; CHECK-NEXT:    str q0, [x0]
1046; CHECK-NEXT:    ret
1047;
1048; NONEON-NOSVE-LABEL: icmp_sge_v8i16:
1049; NONEON-NOSVE:       // %bb.0:
1050; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1051; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1052; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1053; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1054; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
1055; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
1056; NONEON-NOSVE-NEXT:    cmp w9, w8
1057; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
1058; NONEON-NOSVE-NEXT:    csetm w8, ge
1059; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1060; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1061; NONEON-NOSVE-NEXT:    cmp w9, w8
1062; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
1063; NONEON-NOSVE-NEXT:    csetm w8, ge
1064; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1065; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
1066; NONEON-NOSVE-NEXT:    cmp w9, w8
1067; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
1068; NONEON-NOSVE-NEXT:    csetm w8, ge
1069; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1070; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1071; NONEON-NOSVE-NEXT:    cmp w9, w8
1072; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
1073; NONEON-NOSVE-NEXT:    csetm w8, ge
1074; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1075; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
1076; NONEON-NOSVE-NEXT:    cmp w9, w8
1077; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
1078; NONEON-NOSVE-NEXT:    csetm w8, ge
1079; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1080; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1081; NONEON-NOSVE-NEXT:    cmp w9, w8
1082; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
1083; NONEON-NOSVE-NEXT:    csetm w8, ge
1084; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1085; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
1086; NONEON-NOSVE-NEXT:    cmp w9, w8
1087; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
1088; NONEON-NOSVE-NEXT:    csetm w8, ge
1089; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1090; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1091; NONEON-NOSVE-NEXT:    cmp w9, w8
1092; NONEON-NOSVE-NEXT:    csetm w8, ge
1093; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1094; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1095; NONEON-NOSVE-NEXT:    str q0, [x0]
1096; NONEON-NOSVE-NEXT:    add sp, sp, #48
1097; NONEON-NOSVE-NEXT:    ret
1098  %op1 = load <8 x i16>, ptr %a
1099  %op2 = load <8 x i16>, ptr %b
1100  %cmp = icmp sge <8 x i16> %op1, %op2
1101  %sext = sext <8 x i1> %cmp to <8 x i16>
1102  store <8 x i16> %sext, ptr %a
1103  ret void
1104}
1105
1106;
1107; ICMP SGT
1108;
1109
1110define void @icmp_sgt_v16i16(ptr %a, ptr %b) {
1111; CHECK-LABEL: icmp_sgt_v16i16:
1112; CHECK:       // %bb.0:
1113; CHECK-NEXT:    ldp q0, q3, [x1]
1114; CHECK-NEXT:    ptrue p0.h, vl8
1115; CHECK-NEXT:    ldp q1, q2, [x0]
1116; CHECK-NEXT:    cmpgt p1.h, p0/z, z1.h, z0.h
1117; CHECK-NEXT:    cmpgt p0.h, p0/z, z2.h, z3.h
1118; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1119; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1120; CHECK-NEXT:    stp q0, q1, [x0]
1121; CHECK-NEXT:    ret
1122;
1123; NONEON-NOSVE-LABEL: icmp_sgt_v16i16:
1124; NONEON-NOSVE:       // %bb.0:
1125; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1126; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1127; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1128; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1129; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1130; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1131; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #62]
1132; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]
1133; NONEON-NOSVE-NEXT:    cmp w9, w8
1134; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #44]
1135; NONEON-NOSVE-NEXT:    csetm w8, gt
1136; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1137; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #60]
1138; NONEON-NOSVE-NEXT:    cmp w9, w8
1139; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]
1140; NONEON-NOSVE-NEXT:    csetm w8, gt
1141; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1142; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #58]
1143; NONEON-NOSVE-NEXT:    cmp w9, w8
1144; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #40]
1145; NONEON-NOSVE-NEXT:    csetm w8, gt
1146; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1147; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #56]
1148; NONEON-NOSVE-NEXT:    cmp w9, w8
1149; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #38]
1150; NONEON-NOSVE-NEXT:    csetm w8, gt
1151; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1152; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #54]
1153; NONEON-NOSVE-NEXT:    cmp w9, w8
1154; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #36]
1155; NONEON-NOSVE-NEXT:    csetm w8, gt
1156; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1157; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #52]
1158; NONEON-NOSVE-NEXT:    cmp w9, w8
1159; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #34]
1160; NONEON-NOSVE-NEXT:    csetm w8, gt
1161; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1162; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #50]
1163; NONEON-NOSVE-NEXT:    cmp w9, w8
1164; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #32]
1165; NONEON-NOSVE-NEXT:    csetm w8, gt
1166; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1167; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #48]
1168; NONEON-NOSVE-NEXT:    cmp w9, w8
1169; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
1170; NONEON-NOSVE-NEXT:    csetm w8, gt
1171; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1172; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
1173; NONEON-NOSVE-NEXT:    cmp w9, w8
1174; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
1175; NONEON-NOSVE-NEXT:    csetm w8, gt
1176; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1177; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1178; NONEON-NOSVE-NEXT:    cmp w9, w8
1179; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
1180; NONEON-NOSVE-NEXT:    csetm w8, gt
1181; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1182; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
1183; NONEON-NOSVE-NEXT:    cmp w9, w8
1184; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
1185; NONEON-NOSVE-NEXT:    csetm w8, gt
1186; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1187; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1188; NONEON-NOSVE-NEXT:    cmp w9, w8
1189; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
1190; NONEON-NOSVE-NEXT:    csetm w8, gt
1191; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1192; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
1193; NONEON-NOSVE-NEXT:    cmp w9, w8
1194; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
1195; NONEON-NOSVE-NEXT:    csetm w8, gt
1196; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1197; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1198; NONEON-NOSVE-NEXT:    cmp w9, w8
1199; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
1200; NONEON-NOSVE-NEXT:    csetm w8, gt
1201; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1202; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
1203; NONEON-NOSVE-NEXT:    cmp w9, w8
1204; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
1205; NONEON-NOSVE-NEXT:    csetm w8, gt
1206; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1207; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1208; NONEON-NOSVE-NEXT:    cmp w9, w8
1209; NONEON-NOSVE-NEXT:    csetm w8, gt
1210; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1211; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1212; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1213; NONEON-NOSVE-NEXT:    add sp, sp, #96
1214; NONEON-NOSVE-NEXT:    ret
1215  %op1 = load <16 x i16>, ptr %a
1216  %op2 = load <16 x i16>, ptr %b
1217  %cmp = icmp sgt <16 x i16> %op1, %op2
1218  %sext = sext <16 x i1> %cmp to <16 x i16>
1219  store <16 x i16> %sext, ptr %a
1220  ret void
1221}
1222
1223;
1224; ICMP SLE
1225;
1226
1227define void @icmp_sle_v4i32(ptr %a, ptr %b) {
1228; CHECK-LABEL: icmp_sle_v4i32:
1229; CHECK:       // %bb.0:
1230; CHECK-NEXT:    ptrue p0.s, vl4
1231; CHECK-NEXT:    ldr q0, [x0]
1232; CHECK-NEXT:    ldr q1, [x1]
1233; CHECK-NEXT:    cmpge p0.s, p0/z, z1.s, z0.s
1234; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
1235; CHECK-NEXT:    str q0, [x0]
1236; CHECK-NEXT:    ret
1237;
1238; NONEON-NOSVE-LABEL: icmp_sle_v4i32:
1239; NONEON-NOSVE:       // %bb.0:
1240; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1241; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1242; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1243; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1244; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1245; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1246; NONEON-NOSVE-NEXT:    cmp w10, w8
1247; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1248; NONEON-NOSVE-NEXT:    csetm w10, le
1249; NONEON-NOSVE-NEXT:    cmp w9, w8
1250; NONEON-NOSVE-NEXT:    csetm w8, le
1251; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #40]
1252; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1253; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1254; NONEON-NOSVE-NEXT:    cmp w10, w8
1255; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1256; NONEON-NOSVE-NEXT:    csetm w10, le
1257; NONEON-NOSVE-NEXT:    cmp w9, w8
1258; NONEON-NOSVE-NEXT:    csetm w8, le
1259; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]
1260; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1261; NONEON-NOSVE-NEXT:    str q0, [x0]
1262; NONEON-NOSVE-NEXT:    add sp, sp, #48
1263; NONEON-NOSVE-NEXT:    ret
1264  %op1 = load <4 x i32>, ptr %a
1265  %op2 = load <4 x i32>, ptr %b
1266  %cmp = icmp sle <4 x i32> %op1, %op2
1267  %sext = sext <4 x i1> %cmp to <4 x i32>
1268  store <4 x i32> %sext, ptr %a
1269  ret void
1270}
1271
1272;
1273; ICMP SLT
1274;
1275
1276define void @icmp_slt_v8i32(ptr %a, ptr %b) {
1277; CHECK-LABEL: icmp_slt_v8i32:
1278; CHECK:       // %bb.0:
1279; CHECK-NEXT:    ldp q0, q3, [x1]
1280; CHECK-NEXT:    ptrue p0.s, vl4
1281; CHECK-NEXT:    ldp q1, q2, [x0]
1282; CHECK-NEXT:    cmpgt p1.s, p0/z, z0.s, z1.s
1283; CHECK-NEXT:    cmpgt p0.s, p0/z, z3.s, z2.s
1284; CHECK-NEXT:    mov z0.s, p1/z, #-1 // =0xffffffffffffffff
1285; CHECK-NEXT:    mov z1.s, p0/z, #-1 // =0xffffffffffffffff
1286; CHECK-NEXT:    stp q0, q1, [x0]
1287; CHECK-NEXT:    ret
1288;
1289; NONEON-NOSVE-LABEL: icmp_slt_v8i32:
1290; NONEON-NOSVE:       // %bb.0:
1291; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1292; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1293; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1294; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1295; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1296; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1297; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
1298; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
1299; NONEON-NOSVE-NEXT:    cmp w10, w8
1300; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
1301; NONEON-NOSVE-NEXT:    csetm w10, lt
1302; NONEON-NOSVE-NEXT:    cmp w9, w8
1303; NONEON-NOSVE-NEXT:    csetm w8, lt
1304; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #88]
1305; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
1306; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
1307; NONEON-NOSVE-NEXT:    cmp w10, w8
1308; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
1309; NONEON-NOSVE-NEXT:    csetm w10, lt
1310; NONEON-NOSVE-NEXT:    cmp w9, w8
1311; NONEON-NOSVE-NEXT:    csetm w8, lt
1312; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #80]
1313; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1314; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1315; NONEON-NOSVE-NEXT:    cmp w10, w8
1316; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1317; NONEON-NOSVE-NEXT:    csetm w10, lt
1318; NONEON-NOSVE-NEXT:    cmp w9, w8
1319; NONEON-NOSVE-NEXT:    csetm w8, lt
1320; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #72]
1321; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1322; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1323; NONEON-NOSVE-NEXT:    cmp w10, w8
1324; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1325; NONEON-NOSVE-NEXT:    csetm w10, lt
1326; NONEON-NOSVE-NEXT:    cmp w9, w8
1327; NONEON-NOSVE-NEXT:    csetm w8, lt
1328; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #64]
1329; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1330; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1331; NONEON-NOSVE-NEXT:    add sp, sp, #96
1332; NONEON-NOSVE-NEXT:    ret
1333  %op1 = load <8 x i32>, ptr %a
1334  %op2 = load <8 x i32>, ptr %b
1335  %cmp = icmp slt <8 x i32> %op1, %op2
1336  %sext = sext <8 x i1> %cmp to <8 x i32>
1337  store <8 x i32> %sext, ptr %a
1338  ret void
1339}
1340
1341;
1342; ICMP UGE
1343;
1344
1345define void @icmp_uge_v2i64(ptr %a, ptr %b) {
1346; CHECK-LABEL: icmp_uge_v2i64:
1347; CHECK:       // %bb.0:
1348; CHECK-NEXT:    ptrue p0.d, vl2
1349; CHECK-NEXT:    ldr q0, [x0]
1350; CHECK-NEXT:    ldr q1, [x1]
1351; CHECK-NEXT:    cmphs p0.d, p0/z, z0.d, z1.d
1352; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
1353; CHECK-NEXT:    str q0, [x0]
1354; CHECK-NEXT:    ret
1355;
1356; NONEON-NOSVE-LABEL: icmp_uge_v2i64:
1357; NONEON-NOSVE:       // %bb.0:
1358; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1359; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1360; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1361; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1362; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1363; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1364; NONEON-NOSVE-NEXT:    cmp x10, x8
1365; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1366; NONEON-NOSVE-NEXT:    csetm x10, hs
1367; NONEON-NOSVE-NEXT:    cmp x9, x8
1368; NONEON-NOSVE-NEXT:    csetm x8, hs
1369; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
1370; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1371; NONEON-NOSVE-NEXT:    str q0, [x0]
1372; NONEON-NOSVE-NEXT:    add sp, sp, #48
1373; NONEON-NOSVE-NEXT:    ret
1374  %op1 = load <2 x i64>, ptr %a
1375  %op2 = load <2 x i64>, ptr %b
1376  %cmp = icmp uge <2 x i64> %op1, %op2
1377  %sext = sext <2 x i1> %cmp to <2 x i64>
1378  store <2 x i64> %sext, ptr %a
1379  ret void
1380}
1381
1382;
1383; ICMP UGT
1384;
1385
1386define void @icmp_ugt_v2i64(ptr %a, ptr %b) {
1387; CHECK-LABEL: icmp_ugt_v2i64:
1388; CHECK:       // %bb.0:
1389; CHECK-NEXT:    ptrue p0.d, vl2
1390; CHECK-NEXT:    ldr q0, [x0]
1391; CHECK-NEXT:    ldr q1, [x1]
1392; CHECK-NEXT:    cmphi p0.d, p0/z, z0.d, z1.d
1393; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
1394; CHECK-NEXT:    str q0, [x0]
1395; CHECK-NEXT:    ret
1396;
1397; NONEON-NOSVE-LABEL: icmp_ugt_v2i64:
1398; NONEON-NOSVE:       // %bb.0:
1399; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1400; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1401; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1402; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1403; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1404; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1405; NONEON-NOSVE-NEXT:    cmp x10, x8
1406; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1407; NONEON-NOSVE-NEXT:    csetm x10, hi
1408; NONEON-NOSVE-NEXT:    cmp x9, x8
1409; NONEON-NOSVE-NEXT:    csetm x8, hi
1410; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
1411; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1412; NONEON-NOSVE-NEXT:    str q0, [x0]
1413; NONEON-NOSVE-NEXT:    add sp, sp, #48
1414; NONEON-NOSVE-NEXT:    ret
1415  %op1 = load <2 x i64>, ptr %a
1416  %op2 = load <2 x i64>, ptr %b
1417  %cmp = icmp ugt <2 x i64> %op1, %op2
1418  %sext = sext <2 x i1> %cmp to <2 x i64>
1419  store <2 x i64> %sext, ptr %a
1420  ret void
1421}
1422
1423;
1424; ICMP ULE
1425;
1426
1427define void @icmp_ule_v2i64(ptr %a, ptr %b) {
1428; CHECK-LABEL: icmp_ule_v2i64:
1429; CHECK:       // %bb.0:
1430; CHECK-NEXT:    ptrue p0.d, vl2
1431; CHECK-NEXT:    ldr q0, [x0]
1432; CHECK-NEXT:    ldr q1, [x1]
1433; CHECK-NEXT:    cmphs p0.d, p0/z, z1.d, z0.d
1434; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
1435; CHECK-NEXT:    str q0, [x0]
1436; CHECK-NEXT:    ret
1437;
1438; NONEON-NOSVE-LABEL: icmp_ule_v2i64:
1439; NONEON-NOSVE:       // %bb.0:
1440; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1441; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1442; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1443; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1444; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1445; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1446; NONEON-NOSVE-NEXT:    cmp x10, x8
1447; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1448; NONEON-NOSVE-NEXT:    csetm x10, ls
1449; NONEON-NOSVE-NEXT:    cmp x9, x8
1450; NONEON-NOSVE-NEXT:    csetm x8, ls
1451; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
1452; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1453; NONEON-NOSVE-NEXT:    str q0, [x0]
1454; NONEON-NOSVE-NEXT:    add sp, sp, #48
1455; NONEON-NOSVE-NEXT:    ret
1456  %op1 = load <2 x i64>, ptr %a
1457  %op2 = load <2 x i64>, ptr %b
1458  %cmp = icmp ule <2 x i64> %op1, %op2
1459  %sext = sext <2 x i1> %cmp to <2 x i64>
1460  store <2 x i64> %sext, ptr %a
1461  ret void
1462}
1463
1464;
1465; ICMP ULT
1466;
1467
1468define void @icmp_ult_v2i64(ptr %a, ptr %b) {
1469; CHECK-LABEL: icmp_ult_v2i64:
1470; CHECK:       // %bb.0:
1471; CHECK-NEXT:    ptrue p0.d, vl2
1472; CHECK-NEXT:    ldr q0, [x0]
1473; CHECK-NEXT:    ldr q1, [x1]
1474; CHECK-NEXT:    cmphi p0.d, p0/z, z1.d, z0.d
1475; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
1476; CHECK-NEXT:    str q0, [x0]
1477; CHECK-NEXT:    ret
1478;
1479; NONEON-NOSVE-LABEL: icmp_ult_v2i64:
1480; NONEON-NOSVE:       // %bb.0:
1481; NONEON-NOSVE-NEXT:    ldr q0, [x1]
1482; NONEON-NOSVE-NEXT:    ldr q1, [x0]
1483; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1484; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1485; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1486; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1487; NONEON-NOSVE-NEXT:    cmp x10, x8
1488; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1489; NONEON-NOSVE-NEXT:    csetm x10, lo
1490; NONEON-NOSVE-NEXT:    cmp x9, x8
1491; NONEON-NOSVE-NEXT:    csetm x8, lo
1492; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
1493; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1494; NONEON-NOSVE-NEXT:    str q0, [x0]
1495; NONEON-NOSVE-NEXT:    add sp, sp, #48
1496; NONEON-NOSVE-NEXT:    ret
1497  %op1 = load <2 x i64>, ptr %a
1498  %op2 = load <2 x i64>, ptr %b
1499  %cmp = icmp ult <2 x i64> %op1, %op2
1500  %sext = sext <2 x i1> %cmp to <2 x i64>
1501  store <2 x i64> %sext, ptr %a
1502  ret void
1503}
1504