xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-fp-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; FCMP OEQ
10;
11
12define <2 x i16> @fcmp_oeq_v2f16(<2 x half> %op1, <2 x half> %op2) {
13; CHECK-LABEL: fcmp_oeq_v2f16:
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:    fcmeq p0.h, p0/z, z0.h, z1.h
19; CHECK-NEXT:    punpklo p0.h, p0.b
20; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
21; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
22; CHECK-NEXT:    ret
23;
24; NONEON-NOSVE-LABEL: fcmp_oeq_v2f16:
25; NONEON-NOSVE:       // %bb.0:
26; NONEON-NOSVE-NEXT:    sub sp, sp, #32
27; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
28; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
29; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
30; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
31; NONEON-NOSVE-NEXT:    fcvt s0, h0
32; NONEON-NOSVE-NEXT:    fcvt s1, h1
33; NONEON-NOSVE-NEXT:    fcmp s1, s0
34; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
35; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
36; NONEON-NOSVE-NEXT:    fcvt s0, h0
37; NONEON-NOSVE-NEXT:    fcvt s1, h1
38; NONEON-NOSVE-NEXT:    csetm w9, eq
39; NONEON-NOSVE-NEXT:    fcmp s1, s0
40; NONEON-NOSVE-NEXT:    csetm w8, eq
41; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
42; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
43; NONEON-NOSVE-NEXT:    add sp, sp, #32
44; NONEON-NOSVE-NEXT:    ret
45  %cmp = fcmp oeq <2 x half> %op1, %op2
46  %sext = sext <2 x i1> %cmp to <2 x i16>
47  ret <2 x i16> %sext
48}
49
50define <4 x i16> @fcmp_oeq_v4f16(<4 x half> %op1, <4 x half> %op2) {
51; CHECK-LABEL: fcmp_oeq_v4f16:
52; CHECK:       // %bb.0:
53; CHECK-NEXT:    ptrue p0.h, vl4
54; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
55; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
56; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
57; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
58; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
59; CHECK-NEXT:    ret
60;
61; NONEON-NOSVE-LABEL: fcmp_oeq_v4f16:
62; NONEON-NOSVE:       // %bb.0:
63; NONEON-NOSVE-NEXT:    sub sp, sp, #32
64; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
65; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
66; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
67; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
68; NONEON-NOSVE-NEXT:    fcvt s0, h0
69; NONEON-NOSVE-NEXT:    fcvt s1, h1
70; NONEON-NOSVE-NEXT:    fcmp s1, s0
71; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
72; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
73; NONEON-NOSVE-NEXT:    fcvt s0, h0
74; NONEON-NOSVE-NEXT:    fcvt s1, h1
75; NONEON-NOSVE-NEXT:    csetm w8, eq
76; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
77; NONEON-NOSVE-NEXT:    fcmp s1, s0
78; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
79; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
80; NONEON-NOSVE-NEXT:    fcvt s0, h0
81; NONEON-NOSVE-NEXT:    fcvt s1, h1
82; NONEON-NOSVE-NEXT:    csetm w8, eq
83; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
84; NONEON-NOSVE-NEXT:    fcmp s1, s0
85; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
86; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
87; NONEON-NOSVE-NEXT:    fcvt s0, h0
88; NONEON-NOSVE-NEXT:    fcvt s1, h1
89; NONEON-NOSVE-NEXT:    csetm w8, eq
90; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
91; NONEON-NOSVE-NEXT:    fcmp s1, s0
92; NONEON-NOSVE-NEXT:    csetm w8, eq
93; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
94; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
95; NONEON-NOSVE-NEXT:    add sp, sp, #32
96; NONEON-NOSVE-NEXT:    ret
97  %cmp = fcmp oeq <4 x half> %op1, %op2
98  %sext = sext <4 x i1> %cmp to <4 x i16>
99  ret <4 x i16> %sext
100}
101
102define <8 x i16> @fcmp_oeq_v8f16(<8 x half> %op1, <8 x half> %op2) {
103; CHECK-LABEL: fcmp_oeq_v8f16:
104; CHECK:       // %bb.0:
105; CHECK-NEXT:    ptrue p0.h, vl8
106; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
107; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
108; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
109; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
110; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
111; CHECK-NEXT:    ret
112;
113; NONEON-NOSVE-LABEL: fcmp_oeq_v8f16:
114; NONEON-NOSVE:       // %bb.0:
115; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
116; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
117; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
118; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
119; NONEON-NOSVE-NEXT:    fcvt s0, h0
120; NONEON-NOSVE-NEXT:    fcvt s1, h1
121; NONEON-NOSVE-NEXT:    fcmp s1, s0
122; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
123; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
124; NONEON-NOSVE-NEXT:    fcvt s0, h0
125; NONEON-NOSVE-NEXT:    fcvt s1, h1
126; NONEON-NOSVE-NEXT:    csetm w8, eq
127; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
128; NONEON-NOSVE-NEXT:    fcmp s1, s0
129; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
130; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
131; NONEON-NOSVE-NEXT:    fcvt s0, h0
132; NONEON-NOSVE-NEXT:    fcvt s1, h1
133; NONEON-NOSVE-NEXT:    csetm w8, eq
134; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
135; NONEON-NOSVE-NEXT:    fcmp s1, s0
136; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
137; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
138; NONEON-NOSVE-NEXT:    fcvt s0, h0
139; NONEON-NOSVE-NEXT:    fcvt s1, h1
140; NONEON-NOSVE-NEXT:    csetm w8, eq
141; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
142; NONEON-NOSVE-NEXT:    fcmp s1, s0
143; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
144; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
145; NONEON-NOSVE-NEXT:    fcvt s0, h0
146; NONEON-NOSVE-NEXT:    fcvt s1, h1
147; NONEON-NOSVE-NEXT:    csetm w8, eq
148; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
149; NONEON-NOSVE-NEXT:    fcmp s1, s0
150; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
151; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
152; NONEON-NOSVE-NEXT:    fcvt s0, h0
153; NONEON-NOSVE-NEXT:    fcvt s1, h1
154; NONEON-NOSVE-NEXT:    csetm w8, eq
155; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
156; NONEON-NOSVE-NEXT:    fcmp s1, s0
157; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
158; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
159; NONEON-NOSVE-NEXT:    fcvt s0, h0
160; NONEON-NOSVE-NEXT:    fcvt s1, h1
161; NONEON-NOSVE-NEXT:    csetm w8, eq
162; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
163; NONEON-NOSVE-NEXT:    fcmp s1, s0
164; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
165; NONEON-NOSVE-NEXT:    ldr h1, [sp]
166; NONEON-NOSVE-NEXT:    fcvt s0, h0
167; NONEON-NOSVE-NEXT:    fcvt s1, h1
168; NONEON-NOSVE-NEXT:    csetm w8, eq
169; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
170; NONEON-NOSVE-NEXT:    fcmp s1, s0
171; NONEON-NOSVE-NEXT:    csetm w8, eq
172; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
173; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
174; NONEON-NOSVE-NEXT:    add sp, sp, #48
175; NONEON-NOSVE-NEXT:    ret
176  %cmp = fcmp oeq <8 x half> %op1, %op2
177  %sext = sext <8 x i1> %cmp to <8 x i16>
178  ret <8 x i16> %sext
179}
180
181define void @fcmp_oeq_v16f16(ptr %a, ptr %b, ptr %c) {
182; CHECK-LABEL: fcmp_oeq_v16f16:
183; CHECK:       // %bb.0:
184; CHECK-NEXT:    ldp q0, q3, [x1]
185; CHECK-NEXT:    ptrue p0.h, vl8
186; CHECK-NEXT:    ldp q1, q2, [x0]
187; CHECK-NEXT:    fcmeq p1.h, p0/z, z1.h, z0.h
188; CHECK-NEXT:    fcmeq p0.h, p0/z, z2.h, z3.h
189; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
190; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
191; CHECK-NEXT:    stp q0, q1, [x2]
192; CHECK-NEXT:    ret
193;
194; NONEON-NOSVE-LABEL: fcmp_oeq_v16f16:
195; NONEON-NOSVE:       // %bb.0:
196; NONEON-NOSVE-NEXT:    sub sp, sp, #96
197; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
198; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
199; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
200; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
201; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
202; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
203; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
204; NONEON-NOSVE-NEXT:    fcvt s0, h0
205; NONEON-NOSVE-NEXT:    fcvt s1, h1
206; NONEON-NOSVE-NEXT:    fcmp s1, s0
207; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
208; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
209; NONEON-NOSVE-NEXT:    fcvt s0, h0
210; NONEON-NOSVE-NEXT:    fcvt s1, h1
211; NONEON-NOSVE-NEXT:    csetm w8, eq
212; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
213; NONEON-NOSVE-NEXT:    fcmp s1, s0
214; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
215; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
216; NONEON-NOSVE-NEXT:    fcvt s0, h0
217; NONEON-NOSVE-NEXT:    fcvt s1, h1
218; NONEON-NOSVE-NEXT:    csetm w8, eq
219; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
220; NONEON-NOSVE-NEXT:    fcmp s1, s0
221; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
222; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
223; NONEON-NOSVE-NEXT:    fcvt s0, h0
224; NONEON-NOSVE-NEXT:    fcvt s1, h1
225; NONEON-NOSVE-NEXT:    csetm w8, eq
226; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
227; NONEON-NOSVE-NEXT:    fcmp s1, s0
228; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
229; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
230; NONEON-NOSVE-NEXT:    fcvt s0, h0
231; NONEON-NOSVE-NEXT:    fcvt s1, h1
232; NONEON-NOSVE-NEXT:    csetm w8, eq
233; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
234; NONEON-NOSVE-NEXT:    fcmp s1, s0
235; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
236; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
237; NONEON-NOSVE-NEXT:    fcvt s0, h0
238; NONEON-NOSVE-NEXT:    fcvt s1, h1
239; NONEON-NOSVE-NEXT:    csetm w8, eq
240; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
241; NONEON-NOSVE-NEXT:    fcmp s1, s0
242; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
243; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
244; NONEON-NOSVE-NEXT:    fcvt s0, h0
245; NONEON-NOSVE-NEXT:    fcvt s1, h1
246; NONEON-NOSVE-NEXT:    csetm w8, eq
247; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
248; NONEON-NOSVE-NEXT:    fcmp s1, s0
249; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
250; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
251; NONEON-NOSVE-NEXT:    fcvt s0, h0
252; NONEON-NOSVE-NEXT:    fcvt s1, h1
253; NONEON-NOSVE-NEXT:    csetm w8, eq
254; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
255; NONEON-NOSVE-NEXT:    fcmp s1, s0
256; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
257; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
258; NONEON-NOSVE-NEXT:    fcvt s0, h0
259; NONEON-NOSVE-NEXT:    fcvt s1, h1
260; NONEON-NOSVE-NEXT:    csetm w8, eq
261; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
262; NONEON-NOSVE-NEXT:    fcmp s1, s0
263; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
264; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
265; NONEON-NOSVE-NEXT:    fcvt s0, h0
266; NONEON-NOSVE-NEXT:    fcvt s1, h1
267; NONEON-NOSVE-NEXT:    csetm w8, eq
268; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
269; NONEON-NOSVE-NEXT:    fcmp s1, s0
270; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
271; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
272; NONEON-NOSVE-NEXT:    fcvt s0, h0
273; NONEON-NOSVE-NEXT:    fcvt s1, h1
274; NONEON-NOSVE-NEXT:    csetm w8, eq
275; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
276; NONEON-NOSVE-NEXT:    fcmp s1, s0
277; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
278; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
279; NONEON-NOSVE-NEXT:    fcvt s0, h0
280; NONEON-NOSVE-NEXT:    fcvt s1, h1
281; NONEON-NOSVE-NEXT:    csetm w8, eq
282; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
283; NONEON-NOSVE-NEXT:    fcmp s1, s0
284; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
285; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
286; NONEON-NOSVE-NEXT:    fcvt s0, h0
287; NONEON-NOSVE-NEXT:    fcvt s1, h1
288; NONEON-NOSVE-NEXT:    csetm w8, eq
289; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
290; NONEON-NOSVE-NEXT:    fcmp s1, s0
291; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
292; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
293; NONEON-NOSVE-NEXT:    fcvt s0, h0
294; NONEON-NOSVE-NEXT:    fcvt s1, h1
295; NONEON-NOSVE-NEXT:    csetm w8, eq
296; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
297; NONEON-NOSVE-NEXT:    fcmp s1, s0
298; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
299; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
300; NONEON-NOSVE-NEXT:    fcvt s0, h0
301; NONEON-NOSVE-NEXT:    fcvt s1, h1
302; NONEON-NOSVE-NEXT:    csetm w8, eq
303; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
304; NONEON-NOSVE-NEXT:    fcmp s1, s0
305; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
306; NONEON-NOSVE-NEXT:    ldr h1, [sp]
307; NONEON-NOSVE-NEXT:    fcvt s0, h0
308; NONEON-NOSVE-NEXT:    fcvt s1, h1
309; NONEON-NOSVE-NEXT:    csetm w8, eq
310; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
311; NONEON-NOSVE-NEXT:    fcmp s1, s0
312; NONEON-NOSVE-NEXT:    csetm w8, eq
313; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
314; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
315; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
316; NONEON-NOSVE-NEXT:    add sp, sp, #96
317; NONEON-NOSVE-NEXT:    ret
318  %op1 = load <16 x half>, ptr %a
319  %op2 = load <16 x half>, ptr %b
320  %cmp = fcmp oeq <16 x half> %op1, %op2
321  %sext = sext <16 x i1> %cmp to <16 x i16>
322  store <16 x i16> %sext, ptr %c
323  ret void
324}
325
326define <2 x i32> @fcmp_oeq_v2f32(<2 x float> %op1, <2 x float> %op2) {
327; CHECK-LABEL: fcmp_oeq_v2f32:
328; CHECK:       // %bb.0:
329; CHECK-NEXT:    ptrue p0.s, vl2
330; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
331; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
332; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
333; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
334; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
335; CHECK-NEXT:    ret
336;
337; NONEON-NOSVE-LABEL: fcmp_oeq_v2f32:
338; NONEON-NOSVE:       // %bb.0:
339; NONEON-NOSVE-NEXT:    sub sp, sp, #32
340; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
341; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
342; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #16]
343; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp, #8]
344; NONEON-NOSVE-NEXT:    fcmp s3, s2
345; NONEON-NOSVE-NEXT:    csetm w9, eq
346; NONEON-NOSVE-NEXT:    fcmp s1, s0
347; NONEON-NOSVE-NEXT:    csetm w8, eq
348; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
349; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
350; NONEON-NOSVE-NEXT:    add sp, sp, #32
351; NONEON-NOSVE-NEXT:    ret
352  %cmp = fcmp oeq <2 x float> %op1, %op2
353  %sext = sext <2 x i1> %cmp to <2 x i32>
354  ret <2 x i32> %sext
355}
356
357define <4 x i32> @fcmp_oeq_v4f32(<4 x float> %op1, <4 x float> %op2) {
358; CHECK-LABEL: fcmp_oeq_v4f32:
359; CHECK:       // %bb.0:
360; CHECK-NEXT:    ptrue p0.s, vl4
361; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
362; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
363; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
364; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
365; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
366; CHECK-NEXT:    ret
367;
368; NONEON-NOSVE-LABEL: fcmp_oeq_v4f32:
369; NONEON-NOSVE:       // %bb.0:
370; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
371; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
372; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #24]
373; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp, #8]
374; NONEON-NOSVE-NEXT:    fcmp s3, s2
375; NONEON-NOSVE-NEXT:    csetm w9, eq
376; NONEON-NOSVE-NEXT:    fcmp s1, s0
377; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #16]
378; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp]
379; NONEON-NOSVE-NEXT:    csetm w8, eq
380; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
381; NONEON-NOSVE-NEXT:    fcmp s3, s2
382; NONEON-NOSVE-NEXT:    csetm w9, eq
383; NONEON-NOSVE-NEXT:    fcmp s1, s0
384; NONEON-NOSVE-NEXT:    csetm w8, eq
385; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
386; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
387; NONEON-NOSVE-NEXT:    add sp, sp, #48
388; NONEON-NOSVE-NEXT:    ret
389  %cmp = fcmp oeq <4 x float> %op1, %op2
390  %sext = sext <4 x i1> %cmp to <4 x i32>
391  ret <4 x i32> %sext
392}
393
394define void @fcmp_oeq_v8f32(ptr %a, ptr %b, ptr %c) {
395; CHECK-LABEL: fcmp_oeq_v8f32:
396; CHECK:       // %bb.0:
397; CHECK-NEXT:    ldp q0, q3, [x1]
398; CHECK-NEXT:    ptrue p0.s, vl4
399; CHECK-NEXT:    ldp q1, q2, [x0]
400; CHECK-NEXT:    fcmeq p1.s, p0/z, z1.s, z0.s
401; CHECK-NEXT:    fcmeq p0.s, p0/z, z2.s, z3.s
402; CHECK-NEXT:    mov z0.s, p1/z, #-1 // =0xffffffffffffffff
403; CHECK-NEXT:    mov z1.s, p0/z, #-1 // =0xffffffffffffffff
404; CHECK-NEXT:    stp q0, q1, [x2]
405; CHECK-NEXT:    ret
406;
407; NONEON-NOSVE-LABEL: fcmp_oeq_v8f32:
408; NONEON-NOSVE:       // %bb.0:
409; NONEON-NOSVE-NEXT:    sub sp, sp, #96
410; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
411; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
412; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
413; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
414; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
415; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #56]
416; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp, #40]
417; NONEON-NOSVE-NEXT:    fcmp s3, s2
418; NONEON-NOSVE-NEXT:    csetm w9, eq
419; NONEON-NOSVE-NEXT:    fcmp s1, s0
420; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #48]
421; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp, #32]
422; NONEON-NOSVE-NEXT:    csetm w8, eq
423; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]
424; NONEON-NOSVE-NEXT:    fcmp s3, s2
425; NONEON-NOSVE-NEXT:    csetm w9, eq
426; NONEON-NOSVE-NEXT:    fcmp s1, s0
427; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #24]
428; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp, #8]
429; NONEON-NOSVE-NEXT:    csetm w8, eq
430; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]
431; NONEON-NOSVE-NEXT:    fcmp s3, s2
432; NONEON-NOSVE-NEXT:    csetm w9, eq
433; NONEON-NOSVE-NEXT:    fcmp s1, s0
434; NONEON-NOSVE-NEXT:    ldp s0, s2, [sp, #16]
435; NONEON-NOSVE-NEXT:    ldp s1, s3, [sp]
436; NONEON-NOSVE-NEXT:    csetm w8, eq
437; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]
438; NONEON-NOSVE-NEXT:    fcmp s3, s2
439; NONEON-NOSVE-NEXT:    csetm w9, eq
440; NONEON-NOSVE-NEXT:    fcmp s1, s0
441; NONEON-NOSVE-NEXT:    csetm w8, eq
442; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]
443; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
444; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
445; NONEON-NOSVE-NEXT:    add sp, sp, #96
446; NONEON-NOSVE-NEXT:    ret
447  %op1 = load <8 x float>, ptr %a
448  %op2 = load <8 x float>, ptr %b
449  %cmp = fcmp oeq <8 x float> %op1, %op2
450  %sext = sext <8 x i1> %cmp to <8 x i32>
451  store <8 x i32> %sext, ptr %c
452  ret void
453}
454
455define <1 x i64> @fcmp_oeq_v1f64(<1 x double> %op1, <1 x double> %op2) {
456; CHECK-LABEL: fcmp_oeq_v1f64:
457; CHECK:       // %bb.0:
458; CHECK-NEXT:    fcmp d0, d1
459; CHECK-NEXT:    csetm x8, eq
460; CHECK-NEXT:    mov z0.d, x8
461; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
462; CHECK-NEXT:    ret
463;
464; NONEON-NOSVE-LABEL: fcmp_oeq_v1f64:
465; NONEON-NOSVE:       // %bb.0:
466; NONEON-NOSVE-NEXT:    sub sp, sp, #16
467; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
468; NONEON-NOSVE-NEXT:    fcmp d0, d1
469; NONEON-NOSVE-NEXT:    csetm x8, eq
470; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
471; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
472; NONEON-NOSVE-NEXT:    add sp, sp, #16
473; NONEON-NOSVE-NEXT:    ret
474  %cmp = fcmp oeq <1 x double> %op1, %op2
475  %sext = sext <1 x i1> %cmp to <1 x i64>
476  ret <1 x i64> %sext
477}
478
479define <2 x i64> @fcmp_oeq_v2f64(<2 x double> %op1, <2 x double> %op2) {
480; CHECK-LABEL: fcmp_oeq_v2f64:
481; CHECK:       // %bb.0:
482; CHECK-NEXT:    ptrue p0.d, vl2
483; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
484; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
485; CHECK-NEXT:    fcmeq p0.d, p0/z, z0.d, z1.d
486; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
487; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
488; CHECK-NEXT:    ret
489;
490; NONEON-NOSVE-LABEL: fcmp_oeq_v2f64:
491; NONEON-NOSVE:       // %bb.0:
492; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
493; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
494; NONEON-NOSVE-NEXT:    ldp d0, d2, [sp, #16]
495; NONEON-NOSVE-NEXT:    ldp d1, d3, [sp]
496; NONEON-NOSVE-NEXT:    fcmp d3, d2
497; NONEON-NOSVE-NEXT:    csetm x9, eq
498; NONEON-NOSVE-NEXT:    fcmp d1, d0
499; NONEON-NOSVE-NEXT:    csetm x8, eq
500; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
501; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
502; NONEON-NOSVE-NEXT:    add sp, sp, #48
503; NONEON-NOSVE-NEXT:    ret
504  %cmp = fcmp oeq <2 x double> %op1, %op2
505  %sext = sext <2 x i1> %cmp to <2 x i64>
506  ret <2 x i64> %sext
507}
508
509define void @fcmp_oeq_v4f64(ptr %a, ptr %b, ptr %c) {
510; CHECK-LABEL: fcmp_oeq_v4f64:
511; CHECK:       // %bb.0:
512; CHECK-NEXT:    ldp q0, q3, [x1]
513; CHECK-NEXT:    ptrue p0.d, vl2
514; CHECK-NEXT:    ldp q1, q2, [x0]
515; CHECK-NEXT:    fcmeq p1.d, p0/z, z1.d, z0.d
516; CHECK-NEXT:    fcmeq p0.d, p0/z, z2.d, z3.d
517; CHECK-NEXT:    mov z0.d, p1/z, #-1 // =0xffffffffffffffff
518; CHECK-NEXT:    mov z1.d, p0/z, #-1 // =0xffffffffffffffff
519; CHECK-NEXT:    stp q0, q1, [x2]
520; CHECK-NEXT:    ret
521;
522; NONEON-NOSVE-LABEL: fcmp_oeq_v4f64:
523; NONEON-NOSVE:       // %bb.0:
524; NONEON-NOSVE-NEXT:    sub sp, sp, #96
525; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
526; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
527; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
528; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
529; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
530; NONEON-NOSVE-NEXT:    ldp d0, d2, [sp, #48]
531; NONEON-NOSVE-NEXT:    ldp d1, d3, [sp, #32]
532; NONEON-NOSVE-NEXT:    fcmp d3, d2
533; NONEON-NOSVE-NEXT:    csetm x9, eq
534; NONEON-NOSVE-NEXT:    fcmp d1, d0
535; NONEON-NOSVE-NEXT:    ldp d0, d2, [sp, #16]
536; NONEON-NOSVE-NEXT:    ldp d1, d3, [sp]
537; NONEON-NOSVE-NEXT:    csetm x8, eq
538; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #80]
539; NONEON-NOSVE-NEXT:    fcmp d3, d2
540; NONEON-NOSVE-NEXT:    csetm x9, eq
541; NONEON-NOSVE-NEXT:    fcmp d1, d0
542; NONEON-NOSVE-NEXT:    csetm x8, eq
543; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]
544; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
545; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
546; NONEON-NOSVE-NEXT:    add sp, sp, #96
547; NONEON-NOSVE-NEXT:    ret
548  %op1 = load <4 x double>, ptr %a
549  %op2 = load <4 x double>, ptr %b
550  %cmp = fcmp oeq <4 x double> %op1, %op2
551  %sext = sext <4 x i1> %cmp to <4 x i64>
552  store <4 x i64> %sext, ptr %c
553  ret void
554}
555
556;
557; FCMP UEQ
558;
559
560define void @fcmp_ueq_v16f16(ptr %a, ptr %b, ptr %c) {
561; CHECK-LABEL: fcmp_ueq_v16f16:
562; CHECK:       // %bb.0:
563; CHECK-NEXT:    ldp q0, q3, [x1]
564; CHECK-NEXT:    ptrue p0.h, vl8
565; CHECK-NEXT:    ldp q1, q2, [x0]
566; CHECK-NEXT:    fcmuo p1.h, p0/z, z1.h, z0.h
567; CHECK-NEXT:    fcmeq p2.h, p0/z, z1.h, z0.h
568; CHECK-NEXT:    fcmuo p3.h, p0/z, z2.h, z3.h
569; CHECK-NEXT:    fcmeq p0.h, p0/z, z2.h, z3.h
570; CHECK-NEXT:    mov p1.b, p2/m, p2.b
571; CHECK-NEXT:    sel p0.b, p0, p0.b, p3.b
572; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
573; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
574; CHECK-NEXT:    stp q0, q1, [x2]
575; CHECK-NEXT:    ret
576;
577; NONEON-NOSVE-LABEL: fcmp_ueq_v16f16:
578; NONEON-NOSVE:       // %bb.0:
579; NONEON-NOSVE-NEXT:    sub sp, sp, #96
580; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
581; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
582; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
583; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
584; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
585; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
586; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
587; NONEON-NOSVE-NEXT:    fcvt s0, h0
588; NONEON-NOSVE-NEXT:    fcvt s1, h1
589; NONEON-NOSVE-NEXT:    fcmp s1, s0
590; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
591; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
592; NONEON-NOSVE-NEXT:    fcvt s0, h0
593; NONEON-NOSVE-NEXT:    fcvt s1, h1
594; NONEON-NOSVE-NEXT:    csetm w8, eq
595; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
596; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
597; NONEON-NOSVE-NEXT:    fcmp s1, s0
598; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
599; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
600; NONEON-NOSVE-NEXT:    fcvt s0, h0
601; NONEON-NOSVE-NEXT:    fcvt s1, h1
602; NONEON-NOSVE-NEXT:    csetm w8, eq
603; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
604; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
605; NONEON-NOSVE-NEXT:    fcmp s1, s0
606; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
607; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
608; NONEON-NOSVE-NEXT:    fcvt s0, h0
609; NONEON-NOSVE-NEXT:    fcvt s1, h1
610; NONEON-NOSVE-NEXT:    csetm w8, eq
611; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
612; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
613; NONEON-NOSVE-NEXT:    fcmp s1, s0
614; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
615; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
616; NONEON-NOSVE-NEXT:    fcvt s0, h0
617; NONEON-NOSVE-NEXT:    fcvt s1, h1
618; NONEON-NOSVE-NEXT:    csetm w8, eq
619; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
620; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
621; NONEON-NOSVE-NEXT:    fcmp s1, s0
622; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
623; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
624; NONEON-NOSVE-NEXT:    fcvt s0, h0
625; NONEON-NOSVE-NEXT:    fcvt s1, h1
626; NONEON-NOSVE-NEXT:    csetm w8, eq
627; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
628; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
629; NONEON-NOSVE-NEXT:    fcmp s1, s0
630; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
631; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
632; NONEON-NOSVE-NEXT:    fcvt s0, h0
633; NONEON-NOSVE-NEXT:    fcvt s1, h1
634; NONEON-NOSVE-NEXT:    csetm w8, eq
635; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
636; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
637; NONEON-NOSVE-NEXT:    fcmp s1, s0
638; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
639; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
640; NONEON-NOSVE-NEXT:    fcvt s0, h0
641; NONEON-NOSVE-NEXT:    fcvt s1, h1
642; NONEON-NOSVE-NEXT:    csetm w8, eq
643; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
644; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
645; NONEON-NOSVE-NEXT:    fcmp s1, s0
646; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
647; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
648; NONEON-NOSVE-NEXT:    fcvt s0, h0
649; NONEON-NOSVE-NEXT:    fcvt s1, h1
650; NONEON-NOSVE-NEXT:    csetm w8, eq
651; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
652; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
653; NONEON-NOSVE-NEXT:    fcmp s1, s0
654; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
655; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
656; NONEON-NOSVE-NEXT:    fcvt s0, h0
657; NONEON-NOSVE-NEXT:    fcvt s1, h1
658; NONEON-NOSVE-NEXT:    csetm w8, eq
659; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
660; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
661; NONEON-NOSVE-NEXT:    fcmp s1, s0
662; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
663; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
664; NONEON-NOSVE-NEXT:    fcvt s0, h0
665; NONEON-NOSVE-NEXT:    fcvt s1, h1
666; NONEON-NOSVE-NEXT:    csetm w8, eq
667; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
668; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
669; NONEON-NOSVE-NEXT:    fcmp s1, s0
670; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
671; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
672; NONEON-NOSVE-NEXT:    fcvt s0, h0
673; NONEON-NOSVE-NEXT:    fcvt s1, h1
674; NONEON-NOSVE-NEXT:    csetm w8, eq
675; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
676; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
677; NONEON-NOSVE-NEXT:    fcmp s1, s0
678; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
679; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
680; NONEON-NOSVE-NEXT:    fcvt s0, h0
681; NONEON-NOSVE-NEXT:    fcvt s1, h1
682; NONEON-NOSVE-NEXT:    csetm w8, eq
683; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
684; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
685; NONEON-NOSVE-NEXT:    fcmp s1, s0
686; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
687; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
688; NONEON-NOSVE-NEXT:    fcvt s0, h0
689; NONEON-NOSVE-NEXT:    fcvt s1, h1
690; NONEON-NOSVE-NEXT:    csetm w8, eq
691; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
692; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
693; NONEON-NOSVE-NEXT:    fcmp s1, s0
694; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
695; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
696; NONEON-NOSVE-NEXT:    fcvt s0, h0
697; NONEON-NOSVE-NEXT:    fcvt s1, h1
698; NONEON-NOSVE-NEXT:    csetm w8, eq
699; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
700; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
701; NONEON-NOSVE-NEXT:    fcmp s1, s0
702; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
703; NONEON-NOSVE-NEXT:    ldr h1, [sp]
704; NONEON-NOSVE-NEXT:    fcvt s0, h0
705; NONEON-NOSVE-NEXT:    fcvt s1, h1
706; NONEON-NOSVE-NEXT:    csetm w8, eq
707; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
708; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
709; NONEON-NOSVE-NEXT:    fcmp s1, s0
710; NONEON-NOSVE-NEXT:    csetm w8, eq
711; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, vc
712; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
713; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
714; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
715; NONEON-NOSVE-NEXT:    add sp, sp, #96
716; NONEON-NOSVE-NEXT:    ret
717  %op1 = load <16 x half>, ptr %a
718  %op2 = load <16 x half>, ptr %b
719  %cmp = fcmp ueq <16 x half> %op1, %op2
720  %sext = sext <16 x i1> %cmp to <16 x i16>
721  store <16 x i16> %sext, ptr %c
722  ret void
723}
724
725;
726; FCMP ONE
727;
728
729define void @fcmp_one_v16f16(ptr %a, ptr %b, ptr %c) {
730; CHECK-LABEL: fcmp_one_v16f16:
731; CHECK:       // %bb.0:
732; CHECK-NEXT:    ldp q0, q3, [x1]
733; CHECK-NEXT:    ptrue p0.h, vl8
734; CHECK-NEXT:    ldp q1, q2, [x0]
735; CHECK-NEXT:    fcmgt p1.h, p0/z, z0.h, z1.h
736; CHECK-NEXT:    fcmgt p2.h, p0/z, z1.h, z0.h
737; CHECK-NEXT:    fcmgt p3.h, p0/z, z3.h, z2.h
738; CHECK-NEXT:    fcmgt p0.h, p0/z, z2.h, z3.h
739; CHECK-NEXT:    mov p1.b, p2/m, p2.b
740; CHECK-NEXT:    sel p0.b, p0, p0.b, p3.b
741; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
742; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
743; CHECK-NEXT:    stp q0, q1, [x2]
744; CHECK-NEXT:    ret
745;
746; NONEON-NOSVE-LABEL: fcmp_one_v16f16:
747; NONEON-NOSVE:       // %bb.0:
748; NONEON-NOSVE-NEXT:    sub sp, sp, #96
749; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
750; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
751; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
752; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
753; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
754; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
755; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
756; NONEON-NOSVE-NEXT:    fcvt s0, h0
757; NONEON-NOSVE-NEXT:    fcvt s1, h1
758; NONEON-NOSVE-NEXT:    fcmp s1, s0
759; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
760; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
761; NONEON-NOSVE-NEXT:    fcvt s0, h0
762; NONEON-NOSVE-NEXT:    fcvt s1, h1
763; NONEON-NOSVE-NEXT:    csetm w8, mi
764; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
765; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
766; NONEON-NOSVE-NEXT:    fcmp s1, s0
767; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
768; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
769; NONEON-NOSVE-NEXT:    fcvt s0, h0
770; NONEON-NOSVE-NEXT:    fcvt s1, h1
771; NONEON-NOSVE-NEXT:    csetm w8, mi
772; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
773; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
774; NONEON-NOSVE-NEXT:    fcmp s1, s0
775; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
776; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
777; NONEON-NOSVE-NEXT:    fcvt s0, h0
778; NONEON-NOSVE-NEXT:    fcvt s1, h1
779; NONEON-NOSVE-NEXT:    csetm w8, mi
780; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
781; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
782; NONEON-NOSVE-NEXT:    fcmp s1, s0
783; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
784; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
785; NONEON-NOSVE-NEXT:    fcvt s0, h0
786; NONEON-NOSVE-NEXT:    fcvt s1, h1
787; NONEON-NOSVE-NEXT:    csetm w8, mi
788; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
789; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
790; NONEON-NOSVE-NEXT:    fcmp s1, s0
791; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
792; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
793; NONEON-NOSVE-NEXT:    fcvt s0, h0
794; NONEON-NOSVE-NEXT:    fcvt s1, h1
795; NONEON-NOSVE-NEXT:    csetm w8, mi
796; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
797; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
798; NONEON-NOSVE-NEXT:    fcmp s1, s0
799; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
800; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
801; NONEON-NOSVE-NEXT:    fcvt s0, h0
802; NONEON-NOSVE-NEXT:    fcvt s1, h1
803; NONEON-NOSVE-NEXT:    csetm w8, mi
804; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
805; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
806; NONEON-NOSVE-NEXT:    fcmp s1, s0
807; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
808; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
809; NONEON-NOSVE-NEXT:    fcvt s0, h0
810; NONEON-NOSVE-NEXT:    fcvt s1, h1
811; NONEON-NOSVE-NEXT:    csetm w8, mi
812; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
813; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
814; NONEON-NOSVE-NEXT:    fcmp s1, s0
815; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
816; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
817; NONEON-NOSVE-NEXT:    fcvt s0, h0
818; NONEON-NOSVE-NEXT:    fcvt s1, h1
819; NONEON-NOSVE-NEXT:    csetm w8, mi
820; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
821; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
822; NONEON-NOSVE-NEXT:    fcmp s1, s0
823; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
824; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
825; NONEON-NOSVE-NEXT:    fcvt s0, h0
826; NONEON-NOSVE-NEXT:    fcvt s1, h1
827; NONEON-NOSVE-NEXT:    csetm w8, mi
828; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
829; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
830; NONEON-NOSVE-NEXT:    fcmp s1, s0
831; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
832; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
833; NONEON-NOSVE-NEXT:    fcvt s0, h0
834; NONEON-NOSVE-NEXT:    fcvt s1, h1
835; NONEON-NOSVE-NEXT:    csetm w8, mi
836; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
837; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
838; NONEON-NOSVE-NEXT:    fcmp s1, s0
839; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
840; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
841; NONEON-NOSVE-NEXT:    fcvt s0, h0
842; NONEON-NOSVE-NEXT:    fcvt s1, h1
843; NONEON-NOSVE-NEXT:    csetm w8, mi
844; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
845; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
846; NONEON-NOSVE-NEXT:    fcmp s1, s0
847; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
848; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
849; NONEON-NOSVE-NEXT:    fcvt s0, h0
850; NONEON-NOSVE-NEXT:    fcvt s1, h1
851; NONEON-NOSVE-NEXT:    csetm w8, mi
852; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
853; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
854; NONEON-NOSVE-NEXT:    fcmp s1, s0
855; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
856; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
857; NONEON-NOSVE-NEXT:    fcvt s0, h0
858; NONEON-NOSVE-NEXT:    fcvt s1, h1
859; NONEON-NOSVE-NEXT:    csetm w8, mi
860; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
861; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
862; NONEON-NOSVE-NEXT:    fcmp s1, s0
863; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
864; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
865; NONEON-NOSVE-NEXT:    fcvt s0, h0
866; NONEON-NOSVE-NEXT:    fcvt s1, h1
867; NONEON-NOSVE-NEXT:    csetm w8, mi
868; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
869; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
870; NONEON-NOSVE-NEXT:    fcmp s1, s0
871; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
872; NONEON-NOSVE-NEXT:    ldr h1, [sp]
873; NONEON-NOSVE-NEXT:    fcvt s0, h0
874; NONEON-NOSVE-NEXT:    fcvt s1, h1
875; NONEON-NOSVE-NEXT:    csetm w8, mi
876; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
877; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
878; NONEON-NOSVE-NEXT:    fcmp s1, s0
879; NONEON-NOSVE-NEXT:    csetm w8, mi
880; NONEON-NOSVE-NEXT:    csinv w8, w8, wzr, le
881; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
882; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
883; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
884; NONEON-NOSVE-NEXT:    add sp, sp, #96
885; NONEON-NOSVE-NEXT:    ret
886  %op1 = load <16 x half>, ptr %a
887  %op2 = load <16 x half>, ptr %b
888  %cmp = fcmp one <16 x half> %op1, %op2
889  %sext = sext <16 x i1> %cmp to <16 x i16>
890  store <16 x i16> %sext, ptr %c
891  ret void
892}
893
894;
895; FCMP UNE
896;
897
898define void @fcmp_une_v16f16(ptr %a, ptr %b, ptr %c) {
899; CHECK-LABEL: fcmp_une_v16f16:
900; CHECK:       // %bb.0:
901; CHECK-NEXT:    ldp q0, q3, [x1]
902; CHECK-NEXT:    ptrue p0.h, vl8
903; CHECK-NEXT:    ldp q1, q2, [x0]
904; CHECK-NEXT:    fcmne p1.h, p0/z, z1.h, z0.h
905; CHECK-NEXT:    fcmne p0.h, p0/z, z2.h, z3.h
906; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
907; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
908; CHECK-NEXT:    stp q0, q1, [x2]
909; CHECK-NEXT:    ret
910;
911; NONEON-NOSVE-LABEL: fcmp_une_v16f16:
912; NONEON-NOSVE:       // %bb.0:
913; NONEON-NOSVE-NEXT:    sub sp, sp, #96
914; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
915; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
916; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
917; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
918; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
919; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
920; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
921; NONEON-NOSVE-NEXT:    fcvt s0, h0
922; NONEON-NOSVE-NEXT:    fcvt s1, h1
923; NONEON-NOSVE-NEXT:    fcmp s1, s0
924; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
925; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
926; NONEON-NOSVE-NEXT:    fcvt s0, h0
927; NONEON-NOSVE-NEXT:    fcvt s1, h1
928; NONEON-NOSVE-NEXT:    csetm w8, ne
929; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
930; NONEON-NOSVE-NEXT:    fcmp s1, s0
931; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
932; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
933; NONEON-NOSVE-NEXT:    fcvt s0, h0
934; NONEON-NOSVE-NEXT:    fcvt s1, h1
935; NONEON-NOSVE-NEXT:    csetm w8, ne
936; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
937; NONEON-NOSVE-NEXT:    fcmp s1, s0
938; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
939; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
940; NONEON-NOSVE-NEXT:    fcvt s0, h0
941; NONEON-NOSVE-NEXT:    fcvt s1, h1
942; NONEON-NOSVE-NEXT:    csetm w8, ne
943; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
944; NONEON-NOSVE-NEXT:    fcmp s1, s0
945; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
946; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
947; NONEON-NOSVE-NEXT:    fcvt s0, h0
948; NONEON-NOSVE-NEXT:    fcvt s1, h1
949; NONEON-NOSVE-NEXT:    csetm w8, ne
950; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
951; NONEON-NOSVE-NEXT:    fcmp s1, s0
952; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
953; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
954; NONEON-NOSVE-NEXT:    fcvt s0, h0
955; NONEON-NOSVE-NEXT:    fcvt s1, h1
956; NONEON-NOSVE-NEXT:    csetm w8, ne
957; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
958; NONEON-NOSVE-NEXT:    fcmp s1, s0
959; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
960; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
961; NONEON-NOSVE-NEXT:    fcvt s0, h0
962; NONEON-NOSVE-NEXT:    fcvt s1, h1
963; NONEON-NOSVE-NEXT:    csetm w8, ne
964; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
965; NONEON-NOSVE-NEXT:    fcmp s1, s0
966; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
967; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
968; NONEON-NOSVE-NEXT:    fcvt s0, h0
969; NONEON-NOSVE-NEXT:    fcvt s1, h1
970; NONEON-NOSVE-NEXT:    csetm w8, ne
971; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
972; NONEON-NOSVE-NEXT:    fcmp s1, s0
973; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
974; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
975; NONEON-NOSVE-NEXT:    fcvt s0, h0
976; NONEON-NOSVE-NEXT:    fcvt s1, h1
977; NONEON-NOSVE-NEXT:    csetm w8, ne
978; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
979; NONEON-NOSVE-NEXT:    fcmp s1, s0
980; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
981; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
982; NONEON-NOSVE-NEXT:    fcvt s0, h0
983; NONEON-NOSVE-NEXT:    fcvt s1, h1
984; NONEON-NOSVE-NEXT:    csetm w8, ne
985; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
986; NONEON-NOSVE-NEXT:    fcmp s1, s0
987; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
988; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
989; NONEON-NOSVE-NEXT:    fcvt s0, h0
990; NONEON-NOSVE-NEXT:    fcvt s1, h1
991; NONEON-NOSVE-NEXT:    csetm w8, ne
992; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
993; NONEON-NOSVE-NEXT:    fcmp s1, s0
994; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
995; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
996; NONEON-NOSVE-NEXT:    fcvt s0, h0
997; NONEON-NOSVE-NEXT:    fcvt s1, h1
998; NONEON-NOSVE-NEXT:    csetm w8, ne
999; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1000; NONEON-NOSVE-NEXT:    fcmp s1, s0
1001; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1002; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1003; NONEON-NOSVE-NEXT:    fcvt s0, h0
1004; NONEON-NOSVE-NEXT:    fcvt s1, h1
1005; NONEON-NOSVE-NEXT:    csetm w8, ne
1006; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1007; NONEON-NOSVE-NEXT:    fcmp s1, s0
1008; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1009; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1010; NONEON-NOSVE-NEXT:    fcvt s0, h0
1011; NONEON-NOSVE-NEXT:    fcvt s1, h1
1012; NONEON-NOSVE-NEXT:    csetm w8, ne
1013; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1014; NONEON-NOSVE-NEXT:    fcmp s1, s0
1015; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1016; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1017; NONEON-NOSVE-NEXT:    fcvt s0, h0
1018; NONEON-NOSVE-NEXT:    fcvt s1, h1
1019; NONEON-NOSVE-NEXT:    csetm w8, ne
1020; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1021; NONEON-NOSVE-NEXT:    fcmp s1, s0
1022; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1023; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1024; NONEON-NOSVE-NEXT:    fcvt s0, h0
1025; NONEON-NOSVE-NEXT:    fcvt s1, h1
1026; NONEON-NOSVE-NEXT:    csetm w8, ne
1027; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1028; NONEON-NOSVE-NEXT:    fcmp s1, s0
1029; NONEON-NOSVE-NEXT:    csetm w8, ne
1030; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1031; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1032; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1033; NONEON-NOSVE-NEXT:    add sp, sp, #96
1034; NONEON-NOSVE-NEXT:    ret
1035  %op1 = load <16 x half>, ptr %a
1036  %op2 = load <16 x half>, ptr %b
1037  %cmp = fcmp une <16 x half> %op1, %op2
1038  %sext = sext <16 x i1> %cmp to <16 x i16>
1039  store <16 x i16> %sext, ptr %c
1040  ret void
1041}
1042
1043;
1044; FCMP OGT
1045;
1046
1047define void @fcmp_ogt_v16f16(ptr %a, ptr %b, ptr %c) {
1048; CHECK-LABEL: fcmp_ogt_v16f16:
1049; CHECK:       // %bb.0:
1050; CHECK-NEXT:    ldp q0, q3, [x1]
1051; CHECK-NEXT:    ptrue p0.h, vl8
1052; CHECK-NEXT:    ldp q1, q2, [x0]
1053; CHECK-NEXT:    fcmgt p1.h, p0/z, z1.h, z0.h
1054; CHECK-NEXT:    fcmgt p0.h, p0/z, z2.h, z3.h
1055; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1056; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1057; CHECK-NEXT:    stp q0, q1, [x2]
1058; CHECK-NEXT:    ret
1059;
1060; NONEON-NOSVE-LABEL: fcmp_ogt_v16f16:
1061; NONEON-NOSVE:       // %bb.0:
1062; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1063; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1064; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1065; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1066; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1067; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1068; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1069; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1070; NONEON-NOSVE-NEXT:    fcvt s0, h0
1071; NONEON-NOSVE-NEXT:    fcvt s1, h1
1072; NONEON-NOSVE-NEXT:    fcmp s1, s0
1073; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1074; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1075; NONEON-NOSVE-NEXT:    fcvt s0, h0
1076; NONEON-NOSVE-NEXT:    fcvt s1, h1
1077; NONEON-NOSVE-NEXT:    csetm w8, gt
1078; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1079; NONEON-NOSVE-NEXT:    fcmp s1, s0
1080; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1081; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1082; NONEON-NOSVE-NEXT:    fcvt s0, h0
1083; NONEON-NOSVE-NEXT:    fcvt s1, h1
1084; NONEON-NOSVE-NEXT:    csetm w8, gt
1085; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1086; NONEON-NOSVE-NEXT:    fcmp s1, s0
1087; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1088; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1089; NONEON-NOSVE-NEXT:    fcvt s0, h0
1090; NONEON-NOSVE-NEXT:    fcvt s1, h1
1091; NONEON-NOSVE-NEXT:    csetm w8, gt
1092; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1093; NONEON-NOSVE-NEXT:    fcmp s1, s0
1094; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1095; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1096; NONEON-NOSVE-NEXT:    fcvt s0, h0
1097; NONEON-NOSVE-NEXT:    fcvt s1, h1
1098; NONEON-NOSVE-NEXT:    csetm w8, gt
1099; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1100; NONEON-NOSVE-NEXT:    fcmp s1, s0
1101; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1102; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1103; NONEON-NOSVE-NEXT:    fcvt s0, h0
1104; NONEON-NOSVE-NEXT:    fcvt s1, h1
1105; NONEON-NOSVE-NEXT:    csetm w8, gt
1106; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1107; NONEON-NOSVE-NEXT:    fcmp s1, s0
1108; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1109; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1110; NONEON-NOSVE-NEXT:    fcvt s0, h0
1111; NONEON-NOSVE-NEXT:    fcvt s1, h1
1112; NONEON-NOSVE-NEXT:    csetm w8, gt
1113; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1114; NONEON-NOSVE-NEXT:    fcmp s1, s0
1115; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1116; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1117; NONEON-NOSVE-NEXT:    fcvt s0, h0
1118; NONEON-NOSVE-NEXT:    fcvt s1, h1
1119; NONEON-NOSVE-NEXT:    csetm w8, gt
1120; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1121; NONEON-NOSVE-NEXT:    fcmp s1, s0
1122; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1123; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1124; NONEON-NOSVE-NEXT:    fcvt s0, h0
1125; NONEON-NOSVE-NEXT:    fcvt s1, h1
1126; NONEON-NOSVE-NEXT:    csetm w8, gt
1127; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1128; NONEON-NOSVE-NEXT:    fcmp s1, s0
1129; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1130; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1131; NONEON-NOSVE-NEXT:    fcvt s0, h0
1132; NONEON-NOSVE-NEXT:    fcvt s1, h1
1133; NONEON-NOSVE-NEXT:    csetm w8, gt
1134; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1135; NONEON-NOSVE-NEXT:    fcmp s1, s0
1136; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1137; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1138; NONEON-NOSVE-NEXT:    fcvt s0, h0
1139; NONEON-NOSVE-NEXT:    fcvt s1, h1
1140; NONEON-NOSVE-NEXT:    csetm w8, gt
1141; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1142; NONEON-NOSVE-NEXT:    fcmp s1, s0
1143; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1144; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1145; NONEON-NOSVE-NEXT:    fcvt s0, h0
1146; NONEON-NOSVE-NEXT:    fcvt s1, h1
1147; NONEON-NOSVE-NEXT:    csetm w8, gt
1148; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1149; NONEON-NOSVE-NEXT:    fcmp s1, s0
1150; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1151; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1152; NONEON-NOSVE-NEXT:    fcvt s0, h0
1153; NONEON-NOSVE-NEXT:    fcvt s1, h1
1154; NONEON-NOSVE-NEXT:    csetm w8, gt
1155; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1156; NONEON-NOSVE-NEXT:    fcmp s1, s0
1157; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1158; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1159; NONEON-NOSVE-NEXT:    fcvt s0, h0
1160; NONEON-NOSVE-NEXT:    fcvt s1, h1
1161; NONEON-NOSVE-NEXT:    csetm w8, gt
1162; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1163; NONEON-NOSVE-NEXT:    fcmp s1, s0
1164; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1165; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1166; NONEON-NOSVE-NEXT:    fcvt s0, h0
1167; NONEON-NOSVE-NEXT:    fcvt s1, h1
1168; NONEON-NOSVE-NEXT:    csetm w8, gt
1169; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1170; NONEON-NOSVE-NEXT:    fcmp s1, s0
1171; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1172; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1173; NONEON-NOSVE-NEXT:    fcvt s0, h0
1174; NONEON-NOSVE-NEXT:    fcvt s1, h1
1175; NONEON-NOSVE-NEXT:    csetm w8, gt
1176; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1177; NONEON-NOSVE-NEXT:    fcmp s1, s0
1178; NONEON-NOSVE-NEXT:    csetm w8, gt
1179; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1180; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1181; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1182; NONEON-NOSVE-NEXT:    add sp, sp, #96
1183; NONEON-NOSVE-NEXT:    ret
1184  %op1 = load <16 x half>, ptr %a
1185  %op2 = load <16 x half>, ptr %b
1186  %cmp = fcmp ogt <16 x half> %op1, %op2
1187  %sext = sext <16 x i1> %cmp to <16 x i16>
1188  store <16 x i16> %sext, ptr %c
1189  ret void
1190}
1191
1192;
1193; FCMP UGT
1194;
1195
1196define void @fcmp_ugt_v16f16(ptr %a, ptr %b, ptr %c) {
1197; CHECK-LABEL: fcmp_ugt_v16f16:
1198; CHECK:       // %bb.0:
1199; CHECK-NEXT:    ldp q0, q3, [x1]
1200; CHECK-NEXT:    ptrue p0.h, vl8
1201; CHECK-NEXT:    ldp q1, q2, [x0]
1202; CHECK-NEXT:    fcmge p1.h, p0/z, z0.h, z1.h
1203; CHECK-NEXT:    fcmge p0.h, p0/z, z3.h, z2.h
1204; CHECK-NEXT:    mov z0.h, #-1 // =0xffffffffffffffff
1205; CHECK-NEXT:    mov z1.h, p1/z, #-1 // =0xffffffffffffffff
1206; CHECK-NEXT:    mov z2.h, p0/z, #-1 // =0xffffffffffffffff
1207; CHECK-NEXT:    eor z1.d, z1.d, z0.d
1208; CHECK-NEXT:    eor z0.d, z2.d, z0.d
1209; CHECK-NEXT:    stp q1, q0, [x2]
1210; CHECK-NEXT:    ret
1211;
1212; NONEON-NOSVE-LABEL: fcmp_ugt_v16f16:
1213; NONEON-NOSVE:       // %bb.0:
1214; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1215; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1216; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1217; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1218; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1219; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1220; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1221; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1222; NONEON-NOSVE-NEXT:    fcvt s0, h0
1223; NONEON-NOSVE-NEXT:    fcvt s1, h1
1224; NONEON-NOSVE-NEXT:    fcmp s1, s0
1225; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1226; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1227; NONEON-NOSVE-NEXT:    fcvt s0, h0
1228; NONEON-NOSVE-NEXT:    fcvt s1, h1
1229; NONEON-NOSVE-NEXT:    csetm w8, hi
1230; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1231; NONEON-NOSVE-NEXT:    fcmp s1, s0
1232; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1233; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1234; NONEON-NOSVE-NEXT:    fcvt s0, h0
1235; NONEON-NOSVE-NEXT:    fcvt s1, h1
1236; NONEON-NOSVE-NEXT:    csetm w8, hi
1237; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1238; NONEON-NOSVE-NEXT:    fcmp s1, s0
1239; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1240; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1241; NONEON-NOSVE-NEXT:    fcvt s0, h0
1242; NONEON-NOSVE-NEXT:    fcvt s1, h1
1243; NONEON-NOSVE-NEXT:    csetm w8, hi
1244; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1245; NONEON-NOSVE-NEXT:    fcmp s1, s0
1246; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1247; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1248; NONEON-NOSVE-NEXT:    fcvt s0, h0
1249; NONEON-NOSVE-NEXT:    fcvt s1, h1
1250; NONEON-NOSVE-NEXT:    csetm w8, hi
1251; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1252; NONEON-NOSVE-NEXT:    fcmp s1, s0
1253; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1254; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1255; NONEON-NOSVE-NEXT:    fcvt s0, h0
1256; NONEON-NOSVE-NEXT:    fcvt s1, h1
1257; NONEON-NOSVE-NEXT:    csetm w8, hi
1258; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1259; NONEON-NOSVE-NEXT:    fcmp s1, s0
1260; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1261; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1262; NONEON-NOSVE-NEXT:    fcvt s0, h0
1263; NONEON-NOSVE-NEXT:    fcvt s1, h1
1264; NONEON-NOSVE-NEXT:    csetm w8, hi
1265; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1266; NONEON-NOSVE-NEXT:    fcmp s1, s0
1267; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1268; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1269; NONEON-NOSVE-NEXT:    fcvt s0, h0
1270; NONEON-NOSVE-NEXT:    fcvt s1, h1
1271; NONEON-NOSVE-NEXT:    csetm w8, hi
1272; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1273; NONEON-NOSVE-NEXT:    fcmp s1, s0
1274; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1275; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1276; NONEON-NOSVE-NEXT:    fcvt s0, h0
1277; NONEON-NOSVE-NEXT:    fcvt s1, h1
1278; NONEON-NOSVE-NEXT:    csetm w8, hi
1279; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1280; NONEON-NOSVE-NEXT:    fcmp s1, s0
1281; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1282; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1283; NONEON-NOSVE-NEXT:    fcvt s0, h0
1284; NONEON-NOSVE-NEXT:    fcvt s1, h1
1285; NONEON-NOSVE-NEXT:    csetm w8, hi
1286; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1287; NONEON-NOSVE-NEXT:    fcmp s1, s0
1288; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1289; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1290; NONEON-NOSVE-NEXT:    fcvt s0, h0
1291; NONEON-NOSVE-NEXT:    fcvt s1, h1
1292; NONEON-NOSVE-NEXT:    csetm w8, hi
1293; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1294; NONEON-NOSVE-NEXT:    fcmp s1, s0
1295; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1296; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1297; NONEON-NOSVE-NEXT:    fcvt s0, h0
1298; NONEON-NOSVE-NEXT:    fcvt s1, h1
1299; NONEON-NOSVE-NEXT:    csetm w8, hi
1300; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1301; NONEON-NOSVE-NEXT:    fcmp s1, s0
1302; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1303; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1304; NONEON-NOSVE-NEXT:    fcvt s0, h0
1305; NONEON-NOSVE-NEXT:    fcvt s1, h1
1306; NONEON-NOSVE-NEXT:    csetm w8, hi
1307; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1308; NONEON-NOSVE-NEXT:    fcmp s1, s0
1309; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1310; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1311; NONEON-NOSVE-NEXT:    fcvt s0, h0
1312; NONEON-NOSVE-NEXT:    fcvt s1, h1
1313; NONEON-NOSVE-NEXT:    csetm w8, hi
1314; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1315; NONEON-NOSVE-NEXT:    fcmp s1, s0
1316; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1317; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1318; NONEON-NOSVE-NEXT:    fcvt s0, h0
1319; NONEON-NOSVE-NEXT:    fcvt s1, h1
1320; NONEON-NOSVE-NEXT:    csetm w8, hi
1321; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1322; NONEON-NOSVE-NEXT:    fcmp s1, s0
1323; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1324; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1325; NONEON-NOSVE-NEXT:    fcvt s0, h0
1326; NONEON-NOSVE-NEXT:    fcvt s1, h1
1327; NONEON-NOSVE-NEXT:    csetm w8, hi
1328; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1329; NONEON-NOSVE-NEXT:    fcmp s1, s0
1330; NONEON-NOSVE-NEXT:    csetm w8, hi
1331; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1332; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1333; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1334; NONEON-NOSVE-NEXT:    add sp, sp, #96
1335; NONEON-NOSVE-NEXT:    ret
1336  %op1 = load <16 x half>, ptr %a
1337  %op2 = load <16 x half>, ptr %b
1338  %cmp = fcmp ugt <16 x half> %op1, %op2
1339  %sext = sext <16 x i1> %cmp to <16 x i16>
1340  store <16 x i16> %sext, ptr %c
1341  ret void
1342}
1343
1344;
1345; FCMP OLT
1346;
1347
1348define void @fcmp_olt_v16f16(ptr %a, ptr %b, ptr %c) {
1349; CHECK-LABEL: fcmp_olt_v16f16:
1350; CHECK:       // %bb.0:
1351; CHECK-NEXT:    ldp q0, q3, [x1]
1352; CHECK-NEXT:    ptrue p0.h, vl8
1353; CHECK-NEXT:    ldp q1, q2, [x0]
1354; CHECK-NEXT:    fcmgt p1.h, p0/z, z0.h, z1.h
1355; CHECK-NEXT:    fcmgt p0.h, p0/z, z3.h, z2.h
1356; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1357; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1358; CHECK-NEXT:    stp q0, q1, [x2]
1359; CHECK-NEXT:    ret
1360;
1361; NONEON-NOSVE-LABEL: fcmp_olt_v16f16:
1362; NONEON-NOSVE:       // %bb.0:
1363; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1364; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1365; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1366; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1367; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1368; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1369; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1370; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1371; NONEON-NOSVE-NEXT:    fcvt s0, h0
1372; NONEON-NOSVE-NEXT:    fcvt s1, h1
1373; NONEON-NOSVE-NEXT:    fcmp s1, s0
1374; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1375; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1376; NONEON-NOSVE-NEXT:    fcvt s0, h0
1377; NONEON-NOSVE-NEXT:    fcvt s1, h1
1378; NONEON-NOSVE-NEXT:    csetm w8, mi
1379; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1380; NONEON-NOSVE-NEXT:    fcmp s1, s0
1381; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1382; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1383; NONEON-NOSVE-NEXT:    fcvt s0, h0
1384; NONEON-NOSVE-NEXT:    fcvt s1, h1
1385; NONEON-NOSVE-NEXT:    csetm w8, mi
1386; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1387; NONEON-NOSVE-NEXT:    fcmp s1, s0
1388; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1389; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1390; NONEON-NOSVE-NEXT:    fcvt s0, h0
1391; NONEON-NOSVE-NEXT:    fcvt s1, h1
1392; NONEON-NOSVE-NEXT:    csetm w8, mi
1393; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1394; NONEON-NOSVE-NEXT:    fcmp s1, s0
1395; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1396; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1397; NONEON-NOSVE-NEXT:    fcvt s0, h0
1398; NONEON-NOSVE-NEXT:    fcvt s1, h1
1399; NONEON-NOSVE-NEXT:    csetm w8, mi
1400; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1401; NONEON-NOSVE-NEXT:    fcmp s1, s0
1402; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1403; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1404; NONEON-NOSVE-NEXT:    fcvt s0, h0
1405; NONEON-NOSVE-NEXT:    fcvt s1, h1
1406; NONEON-NOSVE-NEXT:    csetm w8, mi
1407; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1408; NONEON-NOSVE-NEXT:    fcmp s1, s0
1409; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1410; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1411; NONEON-NOSVE-NEXT:    fcvt s0, h0
1412; NONEON-NOSVE-NEXT:    fcvt s1, h1
1413; NONEON-NOSVE-NEXT:    csetm w8, mi
1414; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1415; NONEON-NOSVE-NEXT:    fcmp s1, s0
1416; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1417; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1418; NONEON-NOSVE-NEXT:    fcvt s0, h0
1419; NONEON-NOSVE-NEXT:    fcvt s1, h1
1420; NONEON-NOSVE-NEXT:    csetm w8, mi
1421; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1422; NONEON-NOSVE-NEXT:    fcmp s1, s0
1423; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1424; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1425; NONEON-NOSVE-NEXT:    fcvt s0, h0
1426; NONEON-NOSVE-NEXT:    fcvt s1, h1
1427; NONEON-NOSVE-NEXT:    csetm w8, mi
1428; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1429; NONEON-NOSVE-NEXT:    fcmp s1, s0
1430; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1431; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1432; NONEON-NOSVE-NEXT:    fcvt s0, h0
1433; NONEON-NOSVE-NEXT:    fcvt s1, h1
1434; NONEON-NOSVE-NEXT:    csetm w8, mi
1435; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1436; NONEON-NOSVE-NEXT:    fcmp s1, s0
1437; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1438; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1439; NONEON-NOSVE-NEXT:    fcvt s0, h0
1440; NONEON-NOSVE-NEXT:    fcvt s1, h1
1441; NONEON-NOSVE-NEXT:    csetm w8, mi
1442; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1443; NONEON-NOSVE-NEXT:    fcmp s1, s0
1444; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1445; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1446; NONEON-NOSVE-NEXT:    fcvt s0, h0
1447; NONEON-NOSVE-NEXT:    fcvt s1, h1
1448; NONEON-NOSVE-NEXT:    csetm w8, mi
1449; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1450; NONEON-NOSVE-NEXT:    fcmp s1, s0
1451; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1452; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1453; NONEON-NOSVE-NEXT:    fcvt s0, h0
1454; NONEON-NOSVE-NEXT:    fcvt s1, h1
1455; NONEON-NOSVE-NEXT:    csetm w8, mi
1456; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1457; NONEON-NOSVE-NEXT:    fcmp s1, s0
1458; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1459; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1460; NONEON-NOSVE-NEXT:    fcvt s0, h0
1461; NONEON-NOSVE-NEXT:    fcvt s1, h1
1462; NONEON-NOSVE-NEXT:    csetm w8, mi
1463; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1464; NONEON-NOSVE-NEXT:    fcmp s1, s0
1465; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1466; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1467; NONEON-NOSVE-NEXT:    fcvt s0, h0
1468; NONEON-NOSVE-NEXT:    fcvt s1, h1
1469; NONEON-NOSVE-NEXT:    csetm w8, mi
1470; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1471; NONEON-NOSVE-NEXT:    fcmp s1, s0
1472; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1473; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1474; NONEON-NOSVE-NEXT:    fcvt s0, h0
1475; NONEON-NOSVE-NEXT:    fcvt s1, h1
1476; NONEON-NOSVE-NEXT:    csetm w8, mi
1477; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1478; NONEON-NOSVE-NEXT:    fcmp s1, s0
1479; NONEON-NOSVE-NEXT:    csetm w8, mi
1480; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1481; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1482; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1483; NONEON-NOSVE-NEXT:    add sp, sp, #96
1484; NONEON-NOSVE-NEXT:    ret
1485  %op1 = load <16 x half>, ptr %a
1486  %op2 = load <16 x half>, ptr %b
1487  %cmp = fcmp olt <16 x half> %op1, %op2
1488  %sext = sext <16 x i1> %cmp to <16 x i16>
1489  store <16 x i16> %sext, ptr %c
1490  ret void
1491}
1492
1493;
1494; FCMP ULT
1495;
1496
1497define void @fcmp_ult_v16f16(ptr %a, ptr %b, ptr %c) {
1498; CHECK-LABEL: fcmp_ult_v16f16:
1499; CHECK:       // %bb.0:
1500; CHECK-NEXT:    ldp q0, q3, [x1]
1501; CHECK-NEXT:    ptrue p0.h, vl8
1502; CHECK-NEXT:    ldp q1, q2, [x0]
1503; CHECK-NEXT:    fcmge p1.h, p0/z, z1.h, z0.h
1504; CHECK-NEXT:    fcmge p0.h, p0/z, z2.h, z3.h
1505; CHECK-NEXT:    mov z0.h, #-1 // =0xffffffffffffffff
1506; CHECK-NEXT:    mov z1.h, p1/z, #-1 // =0xffffffffffffffff
1507; CHECK-NEXT:    mov z2.h, p0/z, #-1 // =0xffffffffffffffff
1508; CHECK-NEXT:    eor z1.d, z1.d, z0.d
1509; CHECK-NEXT:    eor z0.d, z2.d, z0.d
1510; CHECK-NEXT:    stp q1, q0, [x2]
1511; CHECK-NEXT:    ret
1512;
1513; NONEON-NOSVE-LABEL: fcmp_ult_v16f16:
1514; NONEON-NOSVE:       // %bb.0:
1515; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1516; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1517; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1518; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1519; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1520; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1521; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1522; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1523; NONEON-NOSVE-NEXT:    fcvt s0, h0
1524; NONEON-NOSVE-NEXT:    fcvt s1, h1
1525; NONEON-NOSVE-NEXT:    fcmp s1, s0
1526; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1527; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1528; NONEON-NOSVE-NEXT:    fcvt s0, h0
1529; NONEON-NOSVE-NEXT:    fcvt s1, h1
1530; NONEON-NOSVE-NEXT:    csetm w8, lt
1531; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1532; NONEON-NOSVE-NEXT:    fcmp s1, s0
1533; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1534; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1535; NONEON-NOSVE-NEXT:    fcvt s0, h0
1536; NONEON-NOSVE-NEXT:    fcvt s1, h1
1537; NONEON-NOSVE-NEXT:    csetm w8, lt
1538; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1539; NONEON-NOSVE-NEXT:    fcmp s1, s0
1540; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1541; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1542; NONEON-NOSVE-NEXT:    fcvt s0, h0
1543; NONEON-NOSVE-NEXT:    fcvt s1, h1
1544; NONEON-NOSVE-NEXT:    csetm w8, lt
1545; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1546; NONEON-NOSVE-NEXT:    fcmp s1, s0
1547; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1548; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1549; NONEON-NOSVE-NEXT:    fcvt s0, h0
1550; NONEON-NOSVE-NEXT:    fcvt s1, h1
1551; NONEON-NOSVE-NEXT:    csetm w8, lt
1552; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1553; NONEON-NOSVE-NEXT:    fcmp s1, s0
1554; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1555; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1556; NONEON-NOSVE-NEXT:    fcvt s0, h0
1557; NONEON-NOSVE-NEXT:    fcvt s1, h1
1558; NONEON-NOSVE-NEXT:    csetm w8, lt
1559; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1560; NONEON-NOSVE-NEXT:    fcmp s1, s0
1561; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1562; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1563; NONEON-NOSVE-NEXT:    fcvt s0, h0
1564; NONEON-NOSVE-NEXT:    fcvt s1, h1
1565; NONEON-NOSVE-NEXT:    csetm w8, lt
1566; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1567; NONEON-NOSVE-NEXT:    fcmp s1, s0
1568; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1569; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1570; NONEON-NOSVE-NEXT:    fcvt s0, h0
1571; NONEON-NOSVE-NEXT:    fcvt s1, h1
1572; NONEON-NOSVE-NEXT:    csetm w8, lt
1573; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1574; NONEON-NOSVE-NEXT:    fcmp s1, s0
1575; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1576; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1577; NONEON-NOSVE-NEXT:    fcvt s0, h0
1578; NONEON-NOSVE-NEXT:    fcvt s1, h1
1579; NONEON-NOSVE-NEXT:    csetm w8, lt
1580; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1581; NONEON-NOSVE-NEXT:    fcmp s1, s0
1582; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1583; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1584; NONEON-NOSVE-NEXT:    fcvt s0, h0
1585; NONEON-NOSVE-NEXT:    fcvt s1, h1
1586; NONEON-NOSVE-NEXT:    csetm w8, lt
1587; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1588; NONEON-NOSVE-NEXT:    fcmp s1, s0
1589; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1590; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1591; NONEON-NOSVE-NEXT:    fcvt s0, h0
1592; NONEON-NOSVE-NEXT:    fcvt s1, h1
1593; NONEON-NOSVE-NEXT:    csetm w8, lt
1594; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1595; NONEON-NOSVE-NEXT:    fcmp s1, s0
1596; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1597; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1598; NONEON-NOSVE-NEXT:    fcvt s0, h0
1599; NONEON-NOSVE-NEXT:    fcvt s1, h1
1600; NONEON-NOSVE-NEXT:    csetm w8, lt
1601; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1602; NONEON-NOSVE-NEXT:    fcmp s1, s0
1603; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1604; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1605; NONEON-NOSVE-NEXT:    fcvt s0, h0
1606; NONEON-NOSVE-NEXT:    fcvt s1, h1
1607; NONEON-NOSVE-NEXT:    csetm w8, lt
1608; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1609; NONEON-NOSVE-NEXT:    fcmp s1, s0
1610; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1611; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1612; NONEON-NOSVE-NEXT:    fcvt s0, h0
1613; NONEON-NOSVE-NEXT:    fcvt s1, h1
1614; NONEON-NOSVE-NEXT:    csetm w8, lt
1615; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1616; NONEON-NOSVE-NEXT:    fcmp s1, s0
1617; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1618; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1619; NONEON-NOSVE-NEXT:    fcvt s0, h0
1620; NONEON-NOSVE-NEXT:    fcvt s1, h1
1621; NONEON-NOSVE-NEXT:    csetm w8, lt
1622; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1623; NONEON-NOSVE-NEXT:    fcmp s1, s0
1624; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1625; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1626; NONEON-NOSVE-NEXT:    fcvt s0, h0
1627; NONEON-NOSVE-NEXT:    fcvt s1, h1
1628; NONEON-NOSVE-NEXT:    csetm w8, lt
1629; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1630; NONEON-NOSVE-NEXT:    fcmp s1, s0
1631; NONEON-NOSVE-NEXT:    csetm w8, lt
1632; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1633; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1634; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1635; NONEON-NOSVE-NEXT:    add sp, sp, #96
1636; NONEON-NOSVE-NEXT:    ret
1637  %op1 = load <16 x half>, ptr %a
1638  %op2 = load <16 x half>, ptr %b
1639  %cmp = fcmp ult <16 x half> %op1, %op2
1640  %sext = sext <16 x i1> %cmp to <16 x i16>
1641  store <16 x i16> %sext, ptr %c
1642  ret void
1643}
1644
1645;
1646; FCMP OGE
1647;
1648
1649define void @fcmp_oge_v16f16(ptr %a, ptr %b, ptr %c) {
1650; CHECK-LABEL: fcmp_oge_v16f16:
1651; CHECK:       // %bb.0:
1652; CHECK-NEXT:    ldp q0, q3, [x1]
1653; CHECK-NEXT:    ptrue p0.h, vl8
1654; CHECK-NEXT:    ldp q1, q2, [x0]
1655; CHECK-NEXT:    fcmge p1.h, p0/z, z1.h, z0.h
1656; CHECK-NEXT:    fcmge p0.h, p0/z, z2.h, z3.h
1657; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1658; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1659; CHECK-NEXT:    stp q0, q1, [x2]
1660; CHECK-NEXT:    ret
1661;
1662; NONEON-NOSVE-LABEL: fcmp_oge_v16f16:
1663; NONEON-NOSVE:       // %bb.0:
1664; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1665; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1666; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1667; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1668; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1669; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1670; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1671; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1672; NONEON-NOSVE-NEXT:    fcvt s0, h0
1673; NONEON-NOSVE-NEXT:    fcvt s1, h1
1674; NONEON-NOSVE-NEXT:    fcmp s1, s0
1675; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1676; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1677; NONEON-NOSVE-NEXT:    fcvt s0, h0
1678; NONEON-NOSVE-NEXT:    fcvt s1, h1
1679; NONEON-NOSVE-NEXT:    csetm w8, ge
1680; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1681; NONEON-NOSVE-NEXT:    fcmp s1, s0
1682; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1683; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1684; NONEON-NOSVE-NEXT:    fcvt s0, h0
1685; NONEON-NOSVE-NEXT:    fcvt s1, h1
1686; NONEON-NOSVE-NEXT:    csetm w8, ge
1687; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1688; NONEON-NOSVE-NEXT:    fcmp s1, s0
1689; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1690; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1691; NONEON-NOSVE-NEXT:    fcvt s0, h0
1692; NONEON-NOSVE-NEXT:    fcvt s1, h1
1693; NONEON-NOSVE-NEXT:    csetm w8, ge
1694; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1695; NONEON-NOSVE-NEXT:    fcmp s1, s0
1696; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1697; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1698; NONEON-NOSVE-NEXT:    fcvt s0, h0
1699; NONEON-NOSVE-NEXT:    fcvt s1, h1
1700; NONEON-NOSVE-NEXT:    csetm w8, ge
1701; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1702; NONEON-NOSVE-NEXT:    fcmp s1, s0
1703; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1704; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1705; NONEON-NOSVE-NEXT:    fcvt s0, h0
1706; NONEON-NOSVE-NEXT:    fcvt s1, h1
1707; NONEON-NOSVE-NEXT:    csetm w8, ge
1708; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1709; NONEON-NOSVE-NEXT:    fcmp s1, s0
1710; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1711; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1712; NONEON-NOSVE-NEXT:    fcvt s0, h0
1713; NONEON-NOSVE-NEXT:    fcvt s1, h1
1714; NONEON-NOSVE-NEXT:    csetm w8, ge
1715; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1716; NONEON-NOSVE-NEXT:    fcmp s1, s0
1717; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1718; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1719; NONEON-NOSVE-NEXT:    fcvt s0, h0
1720; NONEON-NOSVE-NEXT:    fcvt s1, h1
1721; NONEON-NOSVE-NEXT:    csetm w8, ge
1722; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1723; NONEON-NOSVE-NEXT:    fcmp s1, s0
1724; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1725; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1726; NONEON-NOSVE-NEXT:    fcvt s0, h0
1727; NONEON-NOSVE-NEXT:    fcvt s1, h1
1728; NONEON-NOSVE-NEXT:    csetm w8, ge
1729; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1730; NONEON-NOSVE-NEXT:    fcmp s1, s0
1731; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1732; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1733; NONEON-NOSVE-NEXT:    fcvt s0, h0
1734; NONEON-NOSVE-NEXT:    fcvt s1, h1
1735; NONEON-NOSVE-NEXT:    csetm w8, ge
1736; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1737; NONEON-NOSVE-NEXT:    fcmp s1, s0
1738; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1739; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1740; NONEON-NOSVE-NEXT:    fcvt s0, h0
1741; NONEON-NOSVE-NEXT:    fcvt s1, h1
1742; NONEON-NOSVE-NEXT:    csetm w8, ge
1743; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1744; NONEON-NOSVE-NEXT:    fcmp s1, s0
1745; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1746; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1747; NONEON-NOSVE-NEXT:    fcvt s0, h0
1748; NONEON-NOSVE-NEXT:    fcvt s1, h1
1749; NONEON-NOSVE-NEXT:    csetm w8, ge
1750; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1751; NONEON-NOSVE-NEXT:    fcmp s1, s0
1752; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1753; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1754; NONEON-NOSVE-NEXT:    fcvt s0, h0
1755; NONEON-NOSVE-NEXT:    fcvt s1, h1
1756; NONEON-NOSVE-NEXT:    csetm w8, ge
1757; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1758; NONEON-NOSVE-NEXT:    fcmp s1, s0
1759; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1760; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1761; NONEON-NOSVE-NEXT:    fcvt s0, h0
1762; NONEON-NOSVE-NEXT:    fcvt s1, h1
1763; NONEON-NOSVE-NEXT:    csetm w8, ge
1764; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1765; NONEON-NOSVE-NEXT:    fcmp s1, s0
1766; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1767; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1768; NONEON-NOSVE-NEXT:    fcvt s0, h0
1769; NONEON-NOSVE-NEXT:    fcvt s1, h1
1770; NONEON-NOSVE-NEXT:    csetm w8, ge
1771; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1772; NONEON-NOSVE-NEXT:    fcmp s1, s0
1773; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1774; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1775; NONEON-NOSVE-NEXT:    fcvt s0, h0
1776; NONEON-NOSVE-NEXT:    fcvt s1, h1
1777; NONEON-NOSVE-NEXT:    csetm w8, ge
1778; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1779; NONEON-NOSVE-NEXT:    fcmp s1, s0
1780; NONEON-NOSVE-NEXT:    csetm w8, ge
1781; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1782; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1783; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1784; NONEON-NOSVE-NEXT:    add sp, sp, #96
1785; NONEON-NOSVE-NEXT:    ret
1786  %op1 = load <16 x half>, ptr %a
1787  %op2 = load <16 x half>, ptr %b
1788  %cmp = fcmp oge <16 x half> %op1, %op2
1789  %sext = sext <16 x i1> %cmp to <16 x i16>
1790  store <16 x i16> %sext, ptr %c
1791  ret void
1792}
1793
1794;
1795; FCMP UGE
1796;
1797
1798define void @fcmp_uge_v16f16(ptr %a, ptr %b, ptr %c) {
1799; CHECK-LABEL: fcmp_uge_v16f16:
1800; CHECK:       // %bb.0:
1801; CHECK-NEXT:    ldp q0, q3, [x1]
1802; CHECK-NEXT:    ptrue p0.h, vl8
1803; CHECK-NEXT:    ldp q1, q2, [x0]
1804; CHECK-NEXT:    fcmgt p1.h, p0/z, z0.h, z1.h
1805; CHECK-NEXT:    fcmgt p0.h, p0/z, z3.h, z2.h
1806; CHECK-NEXT:    mov z0.h, #-1 // =0xffffffffffffffff
1807; CHECK-NEXT:    mov z1.h, p1/z, #-1 // =0xffffffffffffffff
1808; CHECK-NEXT:    mov z2.h, p0/z, #-1 // =0xffffffffffffffff
1809; CHECK-NEXT:    eor z1.d, z1.d, z0.d
1810; CHECK-NEXT:    eor z0.d, z2.d, z0.d
1811; CHECK-NEXT:    stp q1, q0, [x2]
1812; CHECK-NEXT:    ret
1813;
1814; NONEON-NOSVE-LABEL: fcmp_uge_v16f16:
1815; NONEON-NOSVE:       // %bb.0:
1816; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1817; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1818; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1819; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1820; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1821; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1822; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1823; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1824; NONEON-NOSVE-NEXT:    fcvt s0, h0
1825; NONEON-NOSVE-NEXT:    fcvt s1, h1
1826; NONEON-NOSVE-NEXT:    fcmp s1, s0
1827; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1828; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1829; NONEON-NOSVE-NEXT:    fcvt s0, h0
1830; NONEON-NOSVE-NEXT:    fcvt s1, h1
1831; NONEON-NOSVE-NEXT:    csetm w8, pl
1832; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1833; NONEON-NOSVE-NEXT:    fcmp s1, s0
1834; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1835; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1836; NONEON-NOSVE-NEXT:    fcvt s0, h0
1837; NONEON-NOSVE-NEXT:    fcvt s1, h1
1838; NONEON-NOSVE-NEXT:    csetm w8, pl
1839; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1840; NONEON-NOSVE-NEXT:    fcmp s1, s0
1841; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1842; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1843; NONEON-NOSVE-NEXT:    fcvt s0, h0
1844; NONEON-NOSVE-NEXT:    fcvt s1, h1
1845; NONEON-NOSVE-NEXT:    csetm w8, pl
1846; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1847; NONEON-NOSVE-NEXT:    fcmp s1, s0
1848; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1849; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1850; NONEON-NOSVE-NEXT:    fcvt s0, h0
1851; NONEON-NOSVE-NEXT:    fcvt s1, h1
1852; NONEON-NOSVE-NEXT:    csetm w8, pl
1853; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1854; NONEON-NOSVE-NEXT:    fcmp s1, s0
1855; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
1856; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
1857; NONEON-NOSVE-NEXT:    fcvt s0, h0
1858; NONEON-NOSVE-NEXT:    fcvt s1, h1
1859; NONEON-NOSVE-NEXT:    csetm w8, pl
1860; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1861; NONEON-NOSVE-NEXT:    fcmp s1, s0
1862; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
1863; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
1864; NONEON-NOSVE-NEXT:    fcvt s0, h0
1865; NONEON-NOSVE-NEXT:    fcvt s1, h1
1866; NONEON-NOSVE-NEXT:    csetm w8, pl
1867; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1868; NONEON-NOSVE-NEXT:    fcmp s1, s0
1869; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
1870; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
1871; NONEON-NOSVE-NEXT:    fcvt s0, h0
1872; NONEON-NOSVE-NEXT:    fcvt s1, h1
1873; NONEON-NOSVE-NEXT:    csetm w8, pl
1874; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1875; NONEON-NOSVE-NEXT:    fcmp s1, s0
1876; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
1877; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
1878; NONEON-NOSVE-NEXT:    fcvt s0, h0
1879; NONEON-NOSVE-NEXT:    fcvt s1, h1
1880; NONEON-NOSVE-NEXT:    csetm w8, pl
1881; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1882; NONEON-NOSVE-NEXT:    fcmp s1, s0
1883; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
1884; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
1885; NONEON-NOSVE-NEXT:    fcvt s0, h0
1886; NONEON-NOSVE-NEXT:    fcvt s1, h1
1887; NONEON-NOSVE-NEXT:    csetm w8, pl
1888; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1889; NONEON-NOSVE-NEXT:    fcmp s1, s0
1890; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
1891; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
1892; NONEON-NOSVE-NEXT:    fcvt s0, h0
1893; NONEON-NOSVE-NEXT:    fcvt s1, h1
1894; NONEON-NOSVE-NEXT:    csetm w8, pl
1895; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1896; NONEON-NOSVE-NEXT:    fcmp s1, s0
1897; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
1898; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
1899; NONEON-NOSVE-NEXT:    fcvt s0, h0
1900; NONEON-NOSVE-NEXT:    fcvt s1, h1
1901; NONEON-NOSVE-NEXT:    csetm w8, pl
1902; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1903; NONEON-NOSVE-NEXT:    fcmp s1, s0
1904; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
1905; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
1906; NONEON-NOSVE-NEXT:    fcvt s0, h0
1907; NONEON-NOSVE-NEXT:    fcvt s1, h1
1908; NONEON-NOSVE-NEXT:    csetm w8, pl
1909; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1910; NONEON-NOSVE-NEXT:    fcmp s1, s0
1911; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
1912; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
1913; NONEON-NOSVE-NEXT:    fcvt s0, h0
1914; NONEON-NOSVE-NEXT:    fcvt s1, h1
1915; NONEON-NOSVE-NEXT:    csetm w8, pl
1916; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1917; NONEON-NOSVE-NEXT:    fcmp s1, s0
1918; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
1919; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
1920; NONEON-NOSVE-NEXT:    fcvt s0, h0
1921; NONEON-NOSVE-NEXT:    fcvt s1, h1
1922; NONEON-NOSVE-NEXT:    csetm w8, pl
1923; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1924; NONEON-NOSVE-NEXT:    fcmp s1, s0
1925; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
1926; NONEON-NOSVE-NEXT:    ldr h1, [sp]
1927; NONEON-NOSVE-NEXT:    fcvt s0, h0
1928; NONEON-NOSVE-NEXT:    fcvt s1, h1
1929; NONEON-NOSVE-NEXT:    csetm w8, pl
1930; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1931; NONEON-NOSVE-NEXT:    fcmp s1, s0
1932; NONEON-NOSVE-NEXT:    csetm w8, pl
1933; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1934; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1935; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
1936; NONEON-NOSVE-NEXT:    add sp, sp, #96
1937; NONEON-NOSVE-NEXT:    ret
1938  %op1 = load <16 x half>, ptr %a
1939  %op2 = load <16 x half>, ptr %b
1940  %cmp = fcmp uge <16 x half> %op1, %op2
1941  %sext = sext <16 x i1> %cmp to <16 x i16>
1942  store <16 x i16> %sext, ptr %c
1943  ret void
1944}
1945
1946;
1947; FCMP OLE
1948;
1949
1950define void @fcmp_ole_v16f16(ptr %a, ptr %b, ptr %c) {
1951; CHECK-LABEL: fcmp_ole_v16f16:
1952; CHECK:       // %bb.0:
1953; CHECK-NEXT:    ldp q0, q3, [x1]
1954; CHECK-NEXT:    ptrue p0.h, vl8
1955; CHECK-NEXT:    ldp q1, q2, [x0]
1956; CHECK-NEXT:    fcmge p1.h, p0/z, z0.h, z1.h
1957; CHECK-NEXT:    fcmge p0.h, p0/z, z3.h, z2.h
1958; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
1959; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
1960; CHECK-NEXT:    stp q0, q1, [x2]
1961; CHECK-NEXT:    ret
1962;
1963; NONEON-NOSVE-LABEL: fcmp_ole_v16f16:
1964; NONEON-NOSVE:       // %bb.0:
1965; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1966; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1967; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1968; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1969; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1970; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1971; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
1972; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
1973; NONEON-NOSVE-NEXT:    fcvt s0, h0
1974; NONEON-NOSVE-NEXT:    fcvt s1, h1
1975; NONEON-NOSVE-NEXT:    fcmp s1, s0
1976; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
1977; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
1978; NONEON-NOSVE-NEXT:    fcvt s0, h0
1979; NONEON-NOSVE-NEXT:    fcvt s1, h1
1980; NONEON-NOSVE-NEXT:    csetm w8, ls
1981; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1982; NONEON-NOSVE-NEXT:    fcmp s1, s0
1983; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
1984; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
1985; NONEON-NOSVE-NEXT:    fcvt s0, h0
1986; NONEON-NOSVE-NEXT:    fcvt s1, h1
1987; NONEON-NOSVE-NEXT:    csetm w8, ls
1988; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1989; NONEON-NOSVE-NEXT:    fcmp s1, s0
1990; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
1991; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
1992; NONEON-NOSVE-NEXT:    fcvt s0, h0
1993; NONEON-NOSVE-NEXT:    fcvt s1, h1
1994; NONEON-NOSVE-NEXT:    csetm w8, ls
1995; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1996; NONEON-NOSVE-NEXT:    fcmp s1, s0
1997; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
1998; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
1999; NONEON-NOSVE-NEXT:    fcvt s0, h0
2000; NONEON-NOSVE-NEXT:    fcvt s1, h1
2001; NONEON-NOSVE-NEXT:    csetm w8, ls
2002; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2003; NONEON-NOSVE-NEXT:    fcmp s1, s0
2004; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2005; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2006; NONEON-NOSVE-NEXT:    fcvt s0, h0
2007; NONEON-NOSVE-NEXT:    fcvt s1, h1
2008; NONEON-NOSVE-NEXT:    csetm w8, ls
2009; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2010; NONEON-NOSVE-NEXT:    fcmp s1, s0
2011; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2012; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2013; NONEON-NOSVE-NEXT:    fcvt s0, h0
2014; NONEON-NOSVE-NEXT:    fcvt s1, h1
2015; NONEON-NOSVE-NEXT:    csetm w8, ls
2016; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2017; NONEON-NOSVE-NEXT:    fcmp s1, s0
2018; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2019; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2020; NONEON-NOSVE-NEXT:    fcvt s0, h0
2021; NONEON-NOSVE-NEXT:    fcvt s1, h1
2022; NONEON-NOSVE-NEXT:    csetm w8, ls
2023; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2024; NONEON-NOSVE-NEXT:    fcmp s1, s0
2025; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2026; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2027; NONEON-NOSVE-NEXT:    fcvt s0, h0
2028; NONEON-NOSVE-NEXT:    fcvt s1, h1
2029; NONEON-NOSVE-NEXT:    csetm w8, ls
2030; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2031; NONEON-NOSVE-NEXT:    fcmp s1, s0
2032; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2033; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2034; NONEON-NOSVE-NEXT:    fcvt s0, h0
2035; NONEON-NOSVE-NEXT:    fcvt s1, h1
2036; NONEON-NOSVE-NEXT:    csetm w8, ls
2037; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2038; NONEON-NOSVE-NEXT:    fcmp s1, s0
2039; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2040; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2041; NONEON-NOSVE-NEXT:    fcvt s0, h0
2042; NONEON-NOSVE-NEXT:    fcvt s1, h1
2043; NONEON-NOSVE-NEXT:    csetm w8, ls
2044; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2045; NONEON-NOSVE-NEXT:    fcmp s1, s0
2046; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2047; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2048; NONEON-NOSVE-NEXT:    fcvt s0, h0
2049; NONEON-NOSVE-NEXT:    fcvt s1, h1
2050; NONEON-NOSVE-NEXT:    csetm w8, ls
2051; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2052; NONEON-NOSVE-NEXT:    fcmp s1, s0
2053; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2054; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2055; NONEON-NOSVE-NEXT:    fcvt s0, h0
2056; NONEON-NOSVE-NEXT:    fcvt s1, h1
2057; NONEON-NOSVE-NEXT:    csetm w8, ls
2058; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2059; NONEON-NOSVE-NEXT:    fcmp s1, s0
2060; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2061; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2062; NONEON-NOSVE-NEXT:    fcvt s0, h0
2063; NONEON-NOSVE-NEXT:    fcvt s1, h1
2064; NONEON-NOSVE-NEXT:    csetm w8, ls
2065; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2066; NONEON-NOSVE-NEXT:    fcmp s1, s0
2067; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2068; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2069; NONEON-NOSVE-NEXT:    fcvt s0, h0
2070; NONEON-NOSVE-NEXT:    fcvt s1, h1
2071; NONEON-NOSVE-NEXT:    csetm w8, ls
2072; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2073; NONEON-NOSVE-NEXT:    fcmp s1, s0
2074; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2075; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2076; NONEON-NOSVE-NEXT:    fcvt s0, h0
2077; NONEON-NOSVE-NEXT:    fcvt s1, h1
2078; NONEON-NOSVE-NEXT:    csetm w8, ls
2079; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2080; NONEON-NOSVE-NEXT:    fcmp s1, s0
2081; NONEON-NOSVE-NEXT:    csetm w8, ls
2082; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2083; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2084; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2085; NONEON-NOSVE-NEXT:    add sp, sp, #96
2086; NONEON-NOSVE-NEXT:    ret
2087  %op1 = load <16 x half>, ptr %a
2088  %op2 = load <16 x half>, ptr %b
2089  %cmp = fcmp ole <16 x half> %op1, %op2
2090  %sext = sext <16 x i1> %cmp to <16 x i16>
2091  store <16 x i16> %sext, ptr %c
2092  ret void
2093}
2094
2095;
2096; FCMP ULE
2097;
2098
2099define void @fcmp_ule_v16f16(ptr %a, ptr %b, ptr %c) {
2100; CHECK-LABEL: fcmp_ule_v16f16:
2101; CHECK:       // %bb.0:
2102; CHECK-NEXT:    ldp q0, q3, [x1]
2103; CHECK-NEXT:    ptrue p0.h, vl8
2104; CHECK-NEXT:    ldp q1, q2, [x0]
2105; CHECK-NEXT:    fcmgt p1.h, p0/z, z1.h, z0.h
2106; CHECK-NEXT:    fcmgt p0.h, p0/z, z2.h, z3.h
2107; CHECK-NEXT:    mov z0.h, #-1 // =0xffffffffffffffff
2108; CHECK-NEXT:    mov z1.h, p1/z, #-1 // =0xffffffffffffffff
2109; CHECK-NEXT:    mov z2.h, p0/z, #-1 // =0xffffffffffffffff
2110; CHECK-NEXT:    eor z1.d, z1.d, z0.d
2111; CHECK-NEXT:    eor z0.d, z2.d, z0.d
2112; CHECK-NEXT:    stp q1, q0, [x2]
2113; CHECK-NEXT:    ret
2114;
2115; NONEON-NOSVE-LABEL: fcmp_ule_v16f16:
2116; NONEON-NOSVE:       // %bb.0:
2117; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2118; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2119; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2120; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2121; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2122; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2123; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2124; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2125; NONEON-NOSVE-NEXT:    fcvt s0, h0
2126; NONEON-NOSVE-NEXT:    fcvt s1, h1
2127; NONEON-NOSVE-NEXT:    fcmp s1, s0
2128; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2129; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2130; NONEON-NOSVE-NEXT:    fcvt s0, h0
2131; NONEON-NOSVE-NEXT:    fcvt s1, h1
2132; NONEON-NOSVE-NEXT:    csetm w8, le
2133; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2134; NONEON-NOSVE-NEXT:    fcmp s1, s0
2135; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2136; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2137; NONEON-NOSVE-NEXT:    fcvt s0, h0
2138; NONEON-NOSVE-NEXT:    fcvt s1, h1
2139; NONEON-NOSVE-NEXT:    csetm w8, le
2140; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2141; NONEON-NOSVE-NEXT:    fcmp s1, s0
2142; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2143; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2144; NONEON-NOSVE-NEXT:    fcvt s0, h0
2145; NONEON-NOSVE-NEXT:    fcvt s1, h1
2146; NONEON-NOSVE-NEXT:    csetm w8, le
2147; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2148; NONEON-NOSVE-NEXT:    fcmp s1, s0
2149; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2150; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2151; NONEON-NOSVE-NEXT:    fcvt s0, h0
2152; NONEON-NOSVE-NEXT:    fcvt s1, h1
2153; NONEON-NOSVE-NEXT:    csetm w8, le
2154; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2155; NONEON-NOSVE-NEXT:    fcmp s1, s0
2156; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2157; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2158; NONEON-NOSVE-NEXT:    fcvt s0, h0
2159; NONEON-NOSVE-NEXT:    fcvt s1, h1
2160; NONEON-NOSVE-NEXT:    csetm w8, le
2161; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2162; NONEON-NOSVE-NEXT:    fcmp s1, s0
2163; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2164; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2165; NONEON-NOSVE-NEXT:    fcvt s0, h0
2166; NONEON-NOSVE-NEXT:    fcvt s1, h1
2167; NONEON-NOSVE-NEXT:    csetm w8, le
2168; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2169; NONEON-NOSVE-NEXT:    fcmp s1, s0
2170; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2171; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2172; NONEON-NOSVE-NEXT:    fcvt s0, h0
2173; NONEON-NOSVE-NEXT:    fcvt s1, h1
2174; NONEON-NOSVE-NEXT:    csetm w8, le
2175; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2176; NONEON-NOSVE-NEXT:    fcmp s1, s0
2177; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2178; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2179; NONEON-NOSVE-NEXT:    fcvt s0, h0
2180; NONEON-NOSVE-NEXT:    fcvt s1, h1
2181; NONEON-NOSVE-NEXT:    csetm w8, le
2182; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2183; NONEON-NOSVE-NEXT:    fcmp s1, s0
2184; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2185; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2186; NONEON-NOSVE-NEXT:    fcvt s0, h0
2187; NONEON-NOSVE-NEXT:    fcvt s1, h1
2188; NONEON-NOSVE-NEXT:    csetm w8, le
2189; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2190; NONEON-NOSVE-NEXT:    fcmp s1, s0
2191; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2192; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2193; NONEON-NOSVE-NEXT:    fcvt s0, h0
2194; NONEON-NOSVE-NEXT:    fcvt s1, h1
2195; NONEON-NOSVE-NEXT:    csetm w8, le
2196; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2197; NONEON-NOSVE-NEXT:    fcmp s1, s0
2198; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2199; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2200; NONEON-NOSVE-NEXT:    fcvt s0, h0
2201; NONEON-NOSVE-NEXT:    fcvt s1, h1
2202; NONEON-NOSVE-NEXT:    csetm w8, le
2203; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2204; NONEON-NOSVE-NEXT:    fcmp s1, s0
2205; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2206; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2207; NONEON-NOSVE-NEXT:    fcvt s0, h0
2208; NONEON-NOSVE-NEXT:    fcvt s1, h1
2209; NONEON-NOSVE-NEXT:    csetm w8, le
2210; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2211; NONEON-NOSVE-NEXT:    fcmp s1, s0
2212; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2213; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2214; NONEON-NOSVE-NEXT:    fcvt s0, h0
2215; NONEON-NOSVE-NEXT:    fcvt s1, h1
2216; NONEON-NOSVE-NEXT:    csetm w8, le
2217; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2218; NONEON-NOSVE-NEXT:    fcmp s1, s0
2219; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2220; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2221; NONEON-NOSVE-NEXT:    fcvt s0, h0
2222; NONEON-NOSVE-NEXT:    fcvt s1, h1
2223; NONEON-NOSVE-NEXT:    csetm w8, le
2224; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2225; NONEON-NOSVE-NEXT:    fcmp s1, s0
2226; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2227; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2228; NONEON-NOSVE-NEXT:    fcvt s0, h0
2229; NONEON-NOSVE-NEXT:    fcvt s1, h1
2230; NONEON-NOSVE-NEXT:    csetm w8, le
2231; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2232; NONEON-NOSVE-NEXT:    fcmp s1, s0
2233; NONEON-NOSVE-NEXT:    csetm w8, le
2234; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2235; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2236; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2237; NONEON-NOSVE-NEXT:    add sp, sp, #96
2238; NONEON-NOSVE-NEXT:    ret
2239  %op1 = load <16 x half>, ptr %a
2240  %op2 = load <16 x half>, ptr %b
2241  %cmp = fcmp ule <16 x half> %op1, %op2
2242  %sext = sext <16 x i1> %cmp to <16 x i16>
2243  store <16 x i16> %sext, ptr %c
2244  ret void
2245}
2246
2247;
2248; FCMP UNO
2249;
2250
2251define void @fcmp_uno_v16f16(ptr %a, ptr %b, ptr %c) {
2252; CHECK-LABEL: fcmp_uno_v16f16:
2253; CHECK:       // %bb.0:
2254; CHECK-NEXT:    ldp q0, q3, [x1]
2255; CHECK-NEXT:    ptrue p0.h, vl8
2256; CHECK-NEXT:    ldp q1, q2, [x0]
2257; CHECK-NEXT:    fcmuo p1.h, p0/z, z1.h, z0.h
2258; CHECK-NEXT:    fcmuo p0.h, p0/z, z2.h, z3.h
2259; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
2260; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
2261; CHECK-NEXT:    stp q0, q1, [x2]
2262; CHECK-NEXT:    ret
2263;
2264; NONEON-NOSVE-LABEL: fcmp_uno_v16f16:
2265; NONEON-NOSVE:       // %bb.0:
2266; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2267; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2268; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2269; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2270; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2271; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2272; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2273; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2274; NONEON-NOSVE-NEXT:    fcvt s0, h0
2275; NONEON-NOSVE-NEXT:    fcvt s1, h1
2276; NONEON-NOSVE-NEXT:    fcmp s1, s0
2277; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2278; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2279; NONEON-NOSVE-NEXT:    fcvt s0, h0
2280; NONEON-NOSVE-NEXT:    fcvt s1, h1
2281; NONEON-NOSVE-NEXT:    csetm w8, vs
2282; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2283; NONEON-NOSVE-NEXT:    fcmp s1, s0
2284; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2285; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2286; NONEON-NOSVE-NEXT:    fcvt s0, h0
2287; NONEON-NOSVE-NEXT:    fcvt s1, h1
2288; NONEON-NOSVE-NEXT:    csetm w8, vs
2289; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2290; NONEON-NOSVE-NEXT:    fcmp s1, s0
2291; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2292; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2293; NONEON-NOSVE-NEXT:    fcvt s0, h0
2294; NONEON-NOSVE-NEXT:    fcvt s1, h1
2295; NONEON-NOSVE-NEXT:    csetm w8, vs
2296; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2297; NONEON-NOSVE-NEXT:    fcmp s1, s0
2298; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2299; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2300; NONEON-NOSVE-NEXT:    fcvt s0, h0
2301; NONEON-NOSVE-NEXT:    fcvt s1, h1
2302; NONEON-NOSVE-NEXT:    csetm w8, vs
2303; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2304; NONEON-NOSVE-NEXT:    fcmp s1, s0
2305; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2306; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2307; NONEON-NOSVE-NEXT:    fcvt s0, h0
2308; NONEON-NOSVE-NEXT:    fcvt s1, h1
2309; NONEON-NOSVE-NEXT:    csetm w8, vs
2310; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2311; NONEON-NOSVE-NEXT:    fcmp s1, s0
2312; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2313; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2314; NONEON-NOSVE-NEXT:    fcvt s0, h0
2315; NONEON-NOSVE-NEXT:    fcvt s1, h1
2316; NONEON-NOSVE-NEXT:    csetm w8, vs
2317; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2318; NONEON-NOSVE-NEXT:    fcmp s1, s0
2319; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2320; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2321; NONEON-NOSVE-NEXT:    fcvt s0, h0
2322; NONEON-NOSVE-NEXT:    fcvt s1, h1
2323; NONEON-NOSVE-NEXT:    csetm w8, vs
2324; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2325; NONEON-NOSVE-NEXT:    fcmp s1, s0
2326; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2327; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2328; NONEON-NOSVE-NEXT:    fcvt s0, h0
2329; NONEON-NOSVE-NEXT:    fcvt s1, h1
2330; NONEON-NOSVE-NEXT:    csetm w8, vs
2331; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2332; NONEON-NOSVE-NEXT:    fcmp s1, s0
2333; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2334; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2335; NONEON-NOSVE-NEXT:    fcvt s0, h0
2336; NONEON-NOSVE-NEXT:    fcvt s1, h1
2337; NONEON-NOSVE-NEXT:    csetm w8, vs
2338; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2339; NONEON-NOSVE-NEXT:    fcmp s1, s0
2340; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2341; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2342; NONEON-NOSVE-NEXT:    fcvt s0, h0
2343; NONEON-NOSVE-NEXT:    fcvt s1, h1
2344; NONEON-NOSVE-NEXT:    csetm w8, vs
2345; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2346; NONEON-NOSVE-NEXT:    fcmp s1, s0
2347; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2348; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2349; NONEON-NOSVE-NEXT:    fcvt s0, h0
2350; NONEON-NOSVE-NEXT:    fcvt s1, h1
2351; NONEON-NOSVE-NEXT:    csetm w8, vs
2352; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2353; NONEON-NOSVE-NEXT:    fcmp s1, s0
2354; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2355; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2356; NONEON-NOSVE-NEXT:    fcvt s0, h0
2357; NONEON-NOSVE-NEXT:    fcvt s1, h1
2358; NONEON-NOSVE-NEXT:    csetm w8, vs
2359; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2360; NONEON-NOSVE-NEXT:    fcmp s1, s0
2361; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2362; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2363; NONEON-NOSVE-NEXT:    fcvt s0, h0
2364; NONEON-NOSVE-NEXT:    fcvt s1, h1
2365; NONEON-NOSVE-NEXT:    csetm w8, vs
2366; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2367; NONEON-NOSVE-NEXT:    fcmp s1, s0
2368; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2369; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2370; NONEON-NOSVE-NEXT:    fcvt s0, h0
2371; NONEON-NOSVE-NEXT:    fcvt s1, h1
2372; NONEON-NOSVE-NEXT:    csetm w8, vs
2373; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2374; NONEON-NOSVE-NEXT:    fcmp s1, s0
2375; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2376; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2377; NONEON-NOSVE-NEXT:    fcvt s0, h0
2378; NONEON-NOSVE-NEXT:    fcvt s1, h1
2379; NONEON-NOSVE-NEXT:    csetm w8, vs
2380; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2381; NONEON-NOSVE-NEXT:    fcmp s1, s0
2382; NONEON-NOSVE-NEXT:    csetm w8, vs
2383; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2384; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2385; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2386; NONEON-NOSVE-NEXT:    add sp, sp, #96
2387; NONEON-NOSVE-NEXT:    ret
2388  %op1 = load <16 x half>, ptr %a
2389  %op2 = load <16 x half>, ptr %b
2390  %cmp = fcmp uno <16 x half> %op1, %op2
2391  %sext = sext <16 x i1> %cmp to <16 x i16>
2392  store <16 x i16> %sext, ptr %c
2393  ret void
2394}
2395
2396;
2397; FCMP ORD
2398;
2399
2400define void @fcmp_ord_v16f16(ptr %a, ptr %b, ptr %c) {
2401; CHECK-LABEL: fcmp_ord_v16f16:
2402; CHECK:       // %bb.0:
2403; CHECK-NEXT:    ldp q0, q3, [x1]
2404; CHECK-NEXT:    ptrue p0.h, vl8
2405; CHECK-NEXT:    ldp q1, q2, [x0]
2406; CHECK-NEXT:    fcmuo p1.h, p0/z, z1.h, z0.h
2407; CHECK-NEXT:    fcmuo p0.h, p0/z, z2.h, z3.h
2408; CHECK-NEXT:    mov z0.h, #-1 // =0xffffffffffffffff
2409; CHECK-NEXT:    mov z1.h, p1/z, #-1 // =0xffffffffffffffff
2410; CHECK-NEXT:    mov z2.h, p0/z, #-1 // =0xffffffffffffffff
2411; CHECK-NEXT:    eor z1.d, z1.d, z0.d
2412; CHECK-NEXT:    eor z0.d, z2.d, z0.d
2413; CHECK-NEXT:    stp q1, q0, [x2]
2414; CHECK-NEXT:    ret
2415;
2416; NONEON-NOSVE-LABEL: fcmp_ord_v16f16:
2417; NONEON-NOSVE:       // %bb.0:
2418; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2419; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2420; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2421; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2422; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2423; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2424; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2425; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2426; NONEON-NOSVE-NEXT:    fcvt s0, h0
2427; NONEON-NOSVE-NEXT:    fcvt s1, h1
2428; NONEON-NOSVE-NEXT:    fcmp s1, s0
2429; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2430; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2431; NONEON-NOSVE-NEXT:    fcvt s0, h0
2432; NONEON-NOSVE-NEXT:    fcvt s1, h1
2433; NONEON-NOSVE-NEXT:    csetm w8, vc
2434; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2435; NONEON-NOSVE-NEXT:    fcmp s1, s0
2436; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2437; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2438; NONEON-NOSVE-NEXT:    fcvt s0, h0
2439; NONEON-NOSVE-NEXT:    fcvt s1, h1
2440; NONEON-NOSVE-NEXT:    csetm w8, vc
2441; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2442; NONEON-NOSVE-NEXT:    fcmp s1, s0
2443; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2444; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2445; NONEON-NOSVE-NEXT:    fcvt s0, h0
2446; NONEON-NOSVE-NEXT:    fcvt s1, h1
2447; NONEON-NOSVE-NEXT:    csetm w8, vc
2448; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2449; NONEON-NOSVE-NEXT:    fcmp s1, s0
2450; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2451; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2452; NONEON-NOSVE-NEXT:    fcvt s0, h0
2453; NONEON-NOSVE-NEXT:    fcvt s1, h1
2454; NONEON-NOSVE-NEXT:    csetm w8, vc
2455; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2456; NONEON-NOSVE-NEXT:    fcmp s1, s0
2457; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2458; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2459; NONEON-NOSVE-NEXT:    fcvt s0, h0
2460; NONEON-NOSVE-NEXT:    fcvt s1, h1
2461; NONEON-NOSVE-NEXT:    csetm w8, vc
2462; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2463; NONEON-NOSVE-NEXT:    fcmp s1, s0
2464; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2465; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2466; NONEON-NOSVE-NEXT:    fcvt s0, h0
2467; NONEON-NOSVE-NEXT:    fcvt s1, h1
2468; NONEON-NOSVE-NEXT:    csetm w8, vc
2469; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2470; NONEON-NOSVE-NEXT:    fcmp s1, s0
2471; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2472; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2473; NONEON-NOSVE-NEXT:    fcvt s0, h0
2474; NONEON-NOSVE-NEXT:    fcvt s1, h1
2475; NONEON-NOSVE-NEXT:    csetm w8, vc
2476; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2477; NONEON-NOSVE-NEXT:    fcmp s1, s0
2478; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2479; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2480; NONEON-NOSVE-NEXT:    fcvt s0, h0
2481; NONEON-NOSVE-NEXT:    fcvt s1, h1
2482; NONEON-NOSVE-NEXT:    csetm w8, vc
2483; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2484; NONEON-NOSVE-NEXT:    fcmp s1, s0
2485; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2486; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2487; NONEON-NOSVE-NEXT:    fcvt s0, h0
2488; NONEON-NOSVE-NEXT:    fcvt s1, h1
2489; NONEON-NOSVE-NEXT:    csetm w8, vc
2490; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2491; NONEON-NOSVE-NEXT:    fcmp s1, s0
2492; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2493; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2494; NONEON-NOSVE-NEXT:    fcvt s0, h0
2495; NONEON-NOSVE-NEXT:    fcvt s1, h1
2496; NONEON-NOSVE-NEXT:    csetm w8, vc
2497; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2498; NONEON-NOSVE-NEXT:    fcmp s1, s0
2499; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2500; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2501; NONEON-NOSVE-NEXT:    fcvt s0, h0
2502; NONEON-NOSVE-NEXT:    fcvt s1, h1
2503; NONEON-NOSVE-NEXT:    csetm w8, vc
2504; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2505; NONEON-NOSVE-NEXT:    fcmp s1, s0
2506; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2507; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2508; NONEON-NOSVE-NEXT:    fcvt s0, h0
2509; NONEON-NOSVE-NEXT:    fcvt s1, h1
2510; NONEON-NOSVE-NEXT:    csetm w8, vc
2511; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2512; NONEON-NOSVE-NEXT:    fcmp s1, s0
2513; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2514; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2515; NONEON-NOSVE-NEXT:    fcvt s0, h0
2516; NONEON-NOSVE-NEXT:    fcvt s1, h1
2517; NONEON-NOSVE-NEXT:    csetm w8, vc
2518; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2519; NONEON-NOSVE-NEXT:    fcmp s1, s0
2520; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2521; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2522; NONEON-NOSVE-NEXT:    fcvt s0, h0
2523; NONEON-NOSVE-NEXT:    fcvt s1, h1
2524; NONEON-NOSVE-NEXT:    csetm w8, vc
2525; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2526; NONEON-NOSVE-NEXT:    fcmp s1, s0
2527; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2528; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2529; NONEON-NOSVE-NEXT:    fcvt s0, h0
2530; NONEON-NOSVE-NEXT:    fcvt s1, h1
2531; NONEON-NOSVE-NEXT:    csetm w8, vc
2532; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2533; NONEON-NOSVE-NEXT:    fcmp s1, s0
2534; NONEON-NOSVE-NEXT:    csetm w8, vc
2535; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2536; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2537; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2538; NONEON-NOSVE-NEXT:    add sp, sp, #96
2539; NONEON-NOSVE-NEXT:    ret
2540  %op1 = load <16 x half>, ptr %a
2541  %op2 = load <16 x half>, ptr %b
2542  %cmp = fcmp ord <16 x half> %op1, %op2
2543  %sext = sext <16 x i1> %cmp to <16 x i16>
2544  store <16 x i16> %sext, ptr %c
2545  ret void
2546}
2547
2548;
2549; FCMP EQ
2550;
2551
2552define void @fcmp_eq_v16f16(ptr %a, ptr %b, ptr %c) {
2553; CHECK-LABEL: fcmp_eq_v16f16:
2554; CHECK:       // %bb.0:
2555; CHECK-NEXT:    ldp q0, q3, [x1]
2556; CHECK-NEXT:    ptrue p0.h, vl8
2557; CHECK-NEXT:    ldp q1, q2, [x0]
2558; CHECK-NEXT:    fcmeq p1.h, p0/z, z1.h, z0.h
2559; CHECK-NEXT:    fcmeq p0.h, p0/z, z2.h, z3.h
2560; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
2561; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
2562; CHECK-NEXT:    stp q0, q1, [x2]
2563; CHECK-NEXT:    ret
2564;
2565; NONEON-NOSVE-LABEL: fcmp_eq_v16f16:
2566; NONEON-NOSVE:       // %bb.0:
2567; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2568; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2569; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2570; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2571; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2572; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2573; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2574; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2575; NONEON-NOSVE-NEXT:    fcvt s0, h0
2576; NONEON-NOSVE-NEXT:    fcvt s1, h1
2577; NONEON-NOSVE-NEXT:    fcmp s1, s0
2578; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2579; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2580; NONEON-NOSVE-NEXT:    fcvt s0, h0
2581; NONEON-NOSVE-NEXT:    fcvt s1, h1
2582; NONEON-NOSVE-NEXT:    csetm w8, eq
2583; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2584; NONEON-NOSVE-NEXT:    fcmp s1, s0
2585; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2586; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2587; NONEON-NOSVE-NEXT:    fcvt s0, h0
2588; NONEON-NOSVE-NEXT:    fcvt s1, h1
2589; NONEON-NOSVE-NEXT:    csetm w8, eq
2590; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2591; NONEON-NOSVE-NEXT:    fcmp s1, s0
2592; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2593; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2594; NONEON-NOSVE-NEXT:    fcvt s0, h0
2595; NONEON-NOSVE-NEXT:    fcvt s1, h1
2596; NONEON-NOSVE-NEXT:    csetm w8, eq
2597; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2598; NONEON-NOSVE-NEXT:    fcmp s1, s0
2599; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2600; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2601; NONEON-NOSVE-NEXT:    fcvt s0, h0
2602; NONEON-NOSVE-NEXT:    fcvt s1, h1
2603; NONEON-NOSVE-NEXT:    csetm w8, eq
2604; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2605; NONEON-NOSVE-NEXT:    fcmp s1, s0
2606; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2607; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2608; NONEON-NOSVE-NEXT:    fcvt s0, h0
2609; NONEON-NOSVE-NEXT:    fcvt s1, h1
2610; NONEON-NOSVE-NEXT:    csetm w8, eq
2611; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2612; NONEON-NOSVE-NEXT:    fcmp s1, s0
2613; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2614; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2615; NONEON-NOSVE-NEXT:    fcvt s0, h0
2616; NONEON-NOSVE-NEXT:    fcvt s1, h1
2617; NONEON-NOSVE-NEXT:    csetm w8, eq
2618; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2619; NONEON-NOSVE-NEXT:    fcmp s1, s0
2620; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2621; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2622; NONEON-NOSVE-NEXT:    fcvt s0, h0
2623; NONEON-NOSVE-NEXT:    fcvt s1, h1
2624; NONEON-NOSVE-NEXT:    csetm w8, eq
2625; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2626; NONEON-NOSVE-NEXT:    fcmp s1, s0
2627; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2628; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2629; NONEON-NOSVE-NEXT:    fcvt s0, h0
2630; NONEON-NOSVE-NEXT:    fcvt s1, h1
2631; NONEON-NOSVE-NEXT:    csetm w8, eq
2632; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2633; NONEON-NOSVE-NEXT:    fcmp s1, s0
2634; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2635; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2636; NONEON-NOSVE-NEXT:    fcvt s0, h0
2637; NONEON-NOSVE-NEXT:    fcvt s1, h1
2638; NONEON-NOSVE-NEXT:    csetm w8, eq
2639; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2640; NONEON-NOSVE-NEXT:    fcmp s1, s0
2641; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2642; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2643; NONEON-NOSVE-NEXT:    fcvt s0, h0
2644; NONEON-NOSVE-NEXT:    fcvt s1, h1
2645; NONEON-NOSVE-NEXT:    csetm w8, eq
2646; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2647; NONEON-NOSVE-NEXT:    fcmp s1, s0
2648; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2649; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2650; NONEON-NOSVE-NEXT:    fcvt s0, h0
2651; NONEON-NOSVE-NEXT:    fcvt s1, h1
2652; NONEON-NOSVE-NEXT:    csetm w8, eq
2653; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2654; NONEON-NOSVE-NEXT:    fcmp s1, s0
2655; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2656; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2657; NONEON-NOSVE-NEXT:    fcvt s0, h0
2658; NONEON-NOSVE-NEXT:    fcvt s1, h1
2659; NONEON-NOSVE-NEXT:    csetm w8, eq
2660; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2661; NONEON-NOSVE-NEXT:    fcmp s1, s0
2662; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2663; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2664; NONEON-NOSVE-NEXT:    fcvt s0, h0
2665; NONEON-NOSVE-NEXT:    fcvt s1, h1
2666; NONEON-NOSVE-NEXT:    csetm w8, eq
2667; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2668; NONEON-NOSVE-NEXT:    fcmp s1, s0
2669; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2670; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2671; NONEON-NOSVE-NEXT:    fcvt s0, h0
2672; NONEON-NOSVE-NEXT:    fcvt s1, h1
2673; NONEON-NOSVE-NEXT:    csetm w8, eq
2674; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2675; NONEON-NOSVE-NEXT:    fcmp s1, s0
2676; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2677; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2678; NONEON-NOSVE-NEXT:    fcvt s0, h0
2679; NONEON-NOSVE-NEXT:    fcvt s1, h1
2680; NONEON-NOSVE-NEXT:    csetm w8, eq
2681; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2682; NONEON-NOSVE-NEXT:    fcmp s1, s0
2683; NONEON-NOSVE-NEXT:    csetm w8, eq
2684; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2685; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2686; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2687; NONEON-NOSVE-NEXT:    add sp, sp, #96
2688; NONEON-NOSVE-NEXT:    ret
2689  %op1 = load <16 x half>, ptr %a
2690  %op2 = load <16 x half>, ptr %b
2691  %cmp = fcmp fast oeq <16 x half> %op1, %op2
2692  %sext = sext <16 x i1> %cmp to <16 x i16>
2693  store <16 x i16> %sext, ptr %c
2694  ret void
2695}
2696
2697;
2698; FCMP NE
2699;
2700
2701define void @fcmp_ne_v16f16(ptr %a, ptr %b, ptr %c) {
2702; CHECK-LABEL: fcmp_ne_v16f16:
2703; CHECK:       // %bb.0:
2704; CHECK-NEXT:    ldp q0, q3, [x1]
2705; CHECK-NEXT:    ptrue p0.h, vl8
2706; CHECK-NEXT:    ldp q1, q2, [x0]
2707; CHECK-NEXT:    fcmne p1.h, p0/z, z1.h, z0.h
2708; CHECK-NEXT:    fcmne p0.h, p0/z, z2.h, z3.h
2709; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
2710; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
2711; CHECK-NEXT:    stp q0, q1, [x2]
2712; CHECK-NEXT:    ret
2713;
2714; NONEON-NOSVE-LABEL: fcmp_ne_v16f16:
2715; NONEON-NOSVE:       // %bb.0:
2716; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2717; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2718; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2719; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2720; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2721; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2722; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2723; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2724; NONEON-NOSVE-NEXT:    fcvt s0, h0
2725; NONEON-NOSVE-NEXT:    fcvt s1, h1
2726; NONEON-NOSVE-NEXT:    fcmp s1, s0
2727; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2728; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2729; NONEON-NOSVE-NEXT:    fcvt s0, h0
2730; NONEON-NOSVE-NEXT:    fcvt s1, h1
2731; NONEON-NOSVE-NEXT:    csetm w8, ne
2732; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2733; NONEON-NOSVE-NEXT:    fcmp s1, s0
2734; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2735; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2736; NONEON-NOSVE-NEXT:    fcvt s0, h0
2737; NONEON-NOSVE-NEXT:    fcvt s1, h1
2738; NONEON-NOSVE-NEXT:    csetm w8, ne
2739; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2740; NONEON-NOSVE-NEXT:    fcmp s1, s0
2741; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2742; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2743; NONEON-NOSVE-NEXT:    fcvt s0, h0
2744; NONEON-NOSVE-NEXT:    fcvt s1, h1
2745; NONEON-NOSVE-NEXT:    csetm w8, ne
2746; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2747; NONEON-NOSVE-NEXT:    fcmp s1, s0
2748; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2749; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2750; NONEON-NOSVE-NEXT:    fcvt s0, h0
2751; NONEON-NOSVE-NEXT:    fcvt s1, h1
2752; NONEON-NOSVE-NEXT:    csetm w8, ne
2753; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2754; NONEON-NOSVE-NEXT:    fcmp s1, s0
2755; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2756; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2757; NONEON-NOSVE-NEXT:    fcvt s0, h0
2758; NONEON-NOSVE-NEXT:    fcvt s1, h1
2759; NONEON-NOSVE-NEXT:    csetm w8, ne
2760; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2761; NONEON-NOSVE-NEXT:    fcmp s1, s0
2762; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2763; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2764; NONEON-NOSVE-NEXT:    fcvt s0, h0
2765; NONEON-NOSVE-NEXT:    fcvt s1, h1
2766; NONEON-NOSVE-NEXT:    csetm w8, ne
2767; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2768; NONEON-NOSVE-NEXT:    fcmp s1, s0
2769; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2770; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2771; NONEON-NOSVE-NEXT:    fcvt s0, h0
2772; NONEON-NOSVE-NEXT:    fcvt s1, h1
2773; NONEON-NOSVE-NEXT:    csetm w8, ne
2774; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2775; NONEON-NOSVE-NEXT:    fcmp s1, s0
2776; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2777; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2778; NONEON-NOSVE-NEXT:    fcvt s0, h0
2779; NONEON-NOSVE-NEXT:    fcvt s1, h1
2780; NONEON-NOSVE-NEXT:    csetm w8, ne
2781; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2782; NONEON-NOSVE-NEXT:    fcmp s1, s0
2783; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2784; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2785; NONEON-NOSVE-NEXT:    fcvt s0, h0
2786; NONEON-NOSVE-NEXT:    fcvt s1, h1
2787; NONEON-NOSVE-NEXT:    csetm w8, ne
2788; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2789; NONEON-NOSVE-NEXT:    fcmp s1, s0
2790; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2791; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2792; NONEON-NOSVE-NEXT:    fcvt s0, h0
2793; NONEON-NOSVE-NEXT:    fcvt s1, h1
2794; NONEON-NOSVE-NEXT:    csetm w8, ne
2795; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2796; NONEON-NOSVE-NEXT:    fcmp s1, s0
2797; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2798; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2799; NONEON-NOSVE-NEXT:    fcvt s0, h0
2800; NONEON-NOSVE-NEXT:    fcvt s1, h1
2801; NONEON-NOSVE-NEXT:    csetm w8, ne
2802; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2803; NONEON-NOSVE-NEXT:    fcmp s1, s0
2804; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2805; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2806; NONEON-NOSVE-NEXT:    fcvt s0, h0
2807; NONEON-NOSVE-NEXT:    fcvt s1, h1
2808; NONEON-NOSVE-NEXT:    csetm w8, ne
2809; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2810; NONEON-NOSVE-NEXT:    fcmp s1, s0
2811; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2812; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2813; NONEON-NOSVE-NEXT:    fcvt s0, h0
2814; NONEON-NOSVE-NEXT:    fcvt s1, h1
2815; NONEON-NOSVE-NEXT:    csetm w8, ne
2816; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2817; NONEON-NOSVE-NEXT:    fcmp s1, s0
2818; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2819; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2820; NONEON-NOSVE-NEXT:    fcvt s0, h0
2821; NONEON-NOSVE-NEXT:    fcvt s1, h1
2822; NONEON-NOSVE-NEXT:    csetm w8, ne
2823; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2824; NONEON-NOSVE-NEXT:    fcmp s1, s0
2825; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2826; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2827; NONEON-NOSVE-NEXT:    fcvt s0, h0
2828; NONEON-NOSVE-NEXT:    fcvt s1, h1
2829; NONEON-NOSVE-NEXT:    csetm w8, ne
2830; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2831; NONEON-NOSVE-NEXT:    fcmp s1, s0
2832; NONEON-NOSVE-NEXT:    csetm w8, ne
2833; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2834; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2835; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2836; NONEON-NOSVE-NEXT:    add sp, sp, #96
2837; NONEON-NOSVE-NEXT:    ret
2838  %op1 = load <16 x half>, ptr %a
2839  %op2 = load <16 x half>, ptr %b
2840  %cmp = fcmp fast one <16 x half> %op1, %op2
2841  %sext = sext <16 x i1> %cmp to <16 x i16>
2842  store <16 x i16> %sext, ptr %c
2843  ret void
2844}
2845
2846;
2847; FCMP GT
2848;
2849
2850define void @fcmp_gt_v16f16(ptr %a, ptr %b, ptr %c) {
2851; CHECK-LABEL: fcmp_gt_v16f16:
2852; CHECK:       // %bb.0:
2853; CHECK-NEXT:    ldp q0, q3, [x1]
2854; CHECK-NEXT:    ptrue p0.h, vl8
2855; CHECK-NEXT:    ldp q1, q2, [x0]
2856; CHECK-NEXT:    fcmgt p1.h, p0/z, z1.h, z0.h
2857; CHECK-NEXT:    fcmgt p0.h, p0/z, z2.h, z3.h
2858; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
2859; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
2860; CHECK-NEXT:    stp q0, q1, [x2]
2861; CHECK-NEXT:    ret
2862;
2863; NONEON-NOSVE-LABEL: fcmp_gt_v16f16:
2864; NONEON-NOSVE:       // %bb.0:
2865; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2866; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2867; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2868; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2869; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2870; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2871; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
2872; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
2873; NONEON-NOSVE-NEXT:    fcvt s0, h0
2874; NONEON-NOSVE-NEXT:    fcvt s1, h1
2875; NONEON-NOSVE-NEXT:    fcmp s1, s0
2876; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
2877; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
2878; NONEON-NOSVE-NEXT:    fcvt s0, h0
2879; NONEON-NOSVE-NEXT:    fcvt s1, h1
2880; NONEON-NOSVE-NEXT:    csetm w8, gt
2881; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2882; NONEON-NOSVE-NEXT:    fcmp s1, s0
2883; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
2884; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
2885; NONEON-NOSVE-NEXT:    fcvt s0, h0
2886; NONEON-NOSVE-NEXT:    fcvt s1, h1
2887; NONEON-NOSVE-NEXT:    csetm w8, gt
2888; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2889; NONEON-NOSVE-NEXT:    fcmp s1, s0
2890; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
2891; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
2892; NONEON-NOSVE-NEXT:    fcvt s0, h0
2893; NONEON-NOSVE-NEXT:    fcvt s1, h1
2894; NONEON-NOSVE-NEXT:    csetm w8, gt
2895; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2896; NONEON-NOSVE-NEXT:    fcmp s1, s0
2897; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
2898; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
2899; NONEON-NOSVE-NEXT:    fcvt s0, h0
2900; NONEON-NOSVE-NEXT:    fcvt s1, h1
2901; NONEON-NOSVE-NEXT:    csetm w8, gt
2902; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2903; NONEON-NOSVE-NEXT:    fcmp s1, s0
2904; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
2905; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
2906; NONEON-NOSVE-NEXT:    fcvt s0, h0
2907; NONEON-NOSVE-NEXT:    fcvt s1, h1
2908; NONEON-NOSVE-NEXT:    csetm w8, gt
2909; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2910; NONEON-NOSVE-NEXT:    fcmp s1, s0
2911; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
2912; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
2913; NONEON-NOSVE-NEXT:    fcvt s0, h0
2914; NONEON-NOSVE-NEXT:    fcvt s1, h1
2915; NONEON-NOSVE-NEXT:    csetm w8, gt
2916; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2917; NONEON-NOSVE-NEXT:    fcmp s1, s0
2918; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
2919; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
2920; NONEON-NOSVE-NEXT:    fcvt s0, h0
2921; NONEON-NOSVE-NEXT:    fcvt s1, h1
2922; NONEON-NOSVE-NEXT:    csetm w8, gt
2923; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2924; NONEON-NOSVE-NEXT:    fcmp s1, s0
2925; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
2926; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
2927; NONEON-NOSVE-NEXT:    fcvt s0, h0
2928; NONEON-NOSVE-NEXT:    fcvt s1, h1
2929; NONEON-NOSVE-NEXT:    csetm w8, gt
2930; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2931; NONEON-NOSVE-NEXT:    fcmp s1, s0
2932; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
2933; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
2934; NONEON-NOSVE-NEXT:    fcvt s0, h0
2935; NONEON-NOSVE-NEXT:    fcvt s1, h1
2936; NONEON-NOSVE-NEXT:    csetm w8, gt
2937; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2938; NONEON-NOSVE-NEXT:    fcmp s1, s0
2939; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
2940; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
2941; NONEON-NOSVE-NEXT:    fcvt s0, h0
2942; NONEON-NOSVE-NEXT:    fcvt s1, h1
2943; NONEON-NOSVE-NEXT:    csetm w8, gt
2944; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2945; NONEON-NOSVE-NEXT:    fcmp s1, s0
2946; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
2947; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
2948; NONEON-NOSVE-NEXT:    fcvt s0, h0
2949; NONEON-NOSVE-NEXT:    fcvt s1, h1
2950; NONEON-NOSVE-NEXT:    csetm w8, gt
2951; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2952; NONEON-NOSVE-NEXT:    fcmp s1, s0
2953; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
2954; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
2955; NONEON-NOSVE-NEXT:    fcvt s0, h0
2956; NONEON-NOSVE-NEXT:    fcvt s1, h1
2957; NONEON-NOSVE-NEXT:    csetm w8, gt
2958; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2959; NONEON-NOSVE-NEXT:    fcmp s1, s0
2960; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
2961; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
2962; NONEON-NOSVE-NEXT:    fcvt s0, h0
2963; NONEON-NOSVE-NEXT:    fcvt s1, h1
2964; NONEON-NOSVE-NEXT:    csetm w8, gt
2965; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2966; NONEON-NOSVE-NEXT:    fcmp s1, s0
2967; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
2968; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
2969; NONEON-NOSVE-NEXT:    fcvt s0, h0
2970; NONEON-NOSVE-NEXT:    fcvt s1, h1
2971; NONEON-NOSVE-NEXT:    csetm w8, gt
2972; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2973; NONEON-NOSVE-NEXT:    fcmp s1, s0
2974; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
2975; NONEON-NOSVE-NEXT:    ldr h1, [sp]
2976; NONEON-NOSVE-NEXT:    fcvt s0, h0
2977; NONEON-NOSVE-NEXT:    fcvt s1, h1
2978; NONEON-NOSVE-NEXT:    csetm w8, gt
2979; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2980; NONEON-NOSVE-NEXT:    fcmp s1, s0
2981; NONEON-NOSVE-NEXT:    csetm w8, gt
2982; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2983; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2984; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
2985; NONEON-NOSVE-NEXT:    add sp, sp, #96
2986; NONEON-NOSVE-NEXT:    ret
2987  %op1 = load <16 x half>, ptr %a
2988  %op2 = load <16 x half>, ptr %b
2989  %cmp = fcmp fast ogt <16 x half> %op1, %op2
2990  %sext = sext <16 x i1> %cmp to <16 x i16>
2991  store <16 x i16> %sext, ptr %c
2992  ret void
2993}
2994
2995;
2996; FCMP LT
2997;
2998
2999define void @fcmp_lt_v16f16(ptr %a, ptr %b, ptr %c) {
3000; CHECK-LABEL: fcmp_lt_v16f16:
3001; CHECK:       // %bb.0:
3002; CHECK-NEXT:    ldp q0, q3, [x1]
3003; CHECK-NEXT:    ptrue p0.h, vl8
3004; CHECK-NEXT:    ldp q1, q2, [x0]
3005; CHECK-NEXT:    fcmgt p1.h, p0/z, z0.h, z1.h
3006; CHECK-NEXT:    fcmgt p0.h, p0/z, z3.h, z2.h
3007; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
3008; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
3009; CHECK-NEXT:    stp q0, q1, [x2]
3010; CHECK-NEXT:    ret
3011;
3012; NONEON-NOSVE-LABEL: fcmp_lt_v16f16:
3013; NONEON-NOSVE:       // %bb.0:
3014; NONEON-NOSVE-NEXT:    sub sp, sp, #96
3015; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
3016; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
3017; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
3018; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
3019; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
3020; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
3021; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
3022; NONEON-NOSVE-NEXT:    fcvt s0, h0
3023; NONEON-NOSVE-NEXT:    fcvt s1, h1
3024; NONEON-NOSVE-NEXT:    fcmp s1, s0
3025; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
3026; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
3027; NONEON-NOSVE-NEXT:    fcvt s0, h0
3028; NONEON-NOSVE-NEXT:    fcvt s1, h1
3029; NONEON-NOSVE-NEXT:    csetm w8, lt
3030; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
3031; NONEON-NOSVE-NEXT:    fcmp s1, s0
3032; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
3033; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
3034; NONEON-NOSVE-NEXT:    fcvt s0, h0
3035; NONEON-NOSVE-NEXT:    fcvt s1, h1
3036; NONEON-NOSVE-NEXT:    csetm w8, lt
3037; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
3038; NONEON-NOSVE-NEXT:    fcmp s1, s0
3039; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
3040; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
3041; NONEON-NOSVE-NEXT:    fcvt s0, h0
3042; NONEON-NOSVE-NEXT:    fcvt s1, h1
3043; NONEON-NOSVE-NEXT:    csetm w8, lt
3044; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
3045; NONEON-NOSVE-NEXT:    fcmp s1, s0
3046; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
3047; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
3048; NONEON-NOSVE-NEXT:    fcvt s0, h0
3049; NONEON-NOSVE-NEXT:    fcvt s1, h1
3050; NONEON-NOSVE-NEXT:    csetm w8, lt
3051; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
3052; NONEON-NOSVE-NEXT:    fcmp s1, s0
3053; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
3054; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
3055; NONEON-NOSVE-NEXT:    fcvt s0, h0
3056; NONEON-NOSVE-NEXT:    fcvt s1, h1
3057; NONEON-NOSVE-NEXT:    csetm w8, lt
3058; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
3059; NONEON-NOSVE-NEXT:    fcmp s1, s0
3060; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
3061; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
3062; NONEON-NOSVE-NEXT:    fcvt s0, h0
3063; NONEON-NOSVE-NEXT:    fcvt s1, h1
3064; NONEON-NOSVE-NEXT:    csetm w8, lt
3065; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
3066; NONEON-NOSVE-NEXT:    fcmp s1, s0
3067; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
3068; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
3069; NONEON-NOSVE-NEXT:    fcvt s0, h0
3070; NONEON-NOSVE-NEXT:    fcvt s1, h1
3071; NONEON-NOSVE-NEXT:    csetm w8, lt
3072; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
3073; NONEON-NOSVE-NEXT:    fcmp s1, s0
3074; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
3075; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
3076; NONEON-NOSVE-NEXT:    fcvt s0, h0
3077; NONEON-NOSVE-NEXT:    fcvt s1, h1
3078; NONEON-NOSVE-NEXT:    csetm w8, lt
3079; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
3080; NONEON-NOSVE-NEXT:    fcmp s1, s0
3081; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
3082; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
3083; NONEON-NOSVE-NEXT:    fcvt s0, h0
3084; NONEON-NOSVE-NEXT:    fcvt s1, h1
3085; NONEON-NOSVE-NEXT:    csetm w8, lt
3086; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
3087; NONEON-NOSVE-NEXT:    fcmp s1, s0
3088; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
3089; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
3090; NONEON-NOSVE-NEXT:    fcvt s0, h0
3091; NONEON-NOSVE-NEXT:    fcvt s1, h1
3092; NONEON-NOSVE-NEXT:    csetm w8, lt
3093; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
3094; NONEON-NOSVE-NEXT:    fcmp s1, s0
3095; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
3096; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
3097; NONEON-NOSVE-NEXT:    fcvt s0, h0
3098; NONEON-NOSVE-NEXT:    fcvt s1, h1
3099; NONEON-NOSVE-NEXT:    csetm w8, lt
3100; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
3101; NONEON-NOSVE-NEXT:    fcmp s1, s0
3102; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
3103; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
3104; NONEON-NOSVE-NEXT:    fcvt s0, h0
3105; NONEON-NOSVE-NEXT:    fcvt s1, h1
3106; NONEON-NOSVE-NEXT:    csetm w8, lt
3107; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
3108; NONEON-NOSVE-NEXT:    fcmp s1, s0
3109; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
3110; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
3111; NONEON-NOSVE-NEXT:    fcvt s0, h0
3112; NONEON-NOSVE-NEXT:    fcvt s1, h1
3113; NONEON-NOSVE-NEXT:    csetm w8, lt
3114; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
3115; NONEON-NOSVE-NEXT:    fcmp s1, s0
3116; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
3117; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
3118; NONEON-NOSVE-NEXT:    fcvt s0, h0
3119; NONEON-NOSVE-NEXT:    fcvt s1, h1
3120; NONEON-NOSVE-NEXT:    csetm w8, lt
3121; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
3122; NONEON-NOSVE-NEXT:    fcmp s1, s0
3123; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
3124; NONEON-NOSVE-NEXT:    ldr h1, [sp]
3125; NONEON-NOSVE-NEXT:    fcvt s0, h0
3126; NONEON-NOSVE-NEXT:    fcvt s1, h1
3127; NONEON-NOSVE-NEXT:    csetm w8, lt
3128; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
3129; NONEON-NOSVE-NEXT:    fcmp s1, s0
3130; NONEON-NOSVE-NEXT:    csetm w8, lt
3131; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
3132; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
3133; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
3134; NONEON-NOSVE-NEXT:    add sp, sp, #96
3135; NONEON-NOSVE-NEXT:    ret
3136  %op1 = load <16 x half>, ptr %a
3137  %op2 = load <16 x half>, ptr %b
3138  %cmp = fcmp fast olt <16 x half> %op1, %op2
3139  %sext = sext <16 x i1> %cmp to <16 x i16>
3140  store <16 x i16> %sext, ptr %c
3141  ret void
3142}
3143
3144;
3145; FCMP GE
3146;
3147
3148define void @fcmp_ge_v16f16(ptr %a, ptr %b, ptr %c) {
3149; CHECK-LABEL: fcmp_ge_v16f16:
3150; CHECK:       // %bb.0:
3151; CHECK-NEXT:    ldp q0, q3, [x1]
3152; CHECK-NEXT:    ptrue p0.h, vl8
3153; CHECK-NEXT:    ldp q1, q2, [x0]
3154; CHECK-NEXT:    fcmge p1.h, p0/z, z1.h, z0.h
3155; CHECK-NEXT:    fcmge p0.h, p0/z, z2.h, z3.h
3156; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
3157; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
3158; CHECK-NEXT:    stp q0, q1, [x2]
3159; CHECK-NEXT:    ret
3160;
3161; NONEON-NOSVE-LABEL: fcmp_ge_v16f16:
3162; NONEON-NOSVE:       // %bb.0:
3163; NONEON-NOSVE-NEXT:    sub sp, sp, #96
3164; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
3165; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
3166; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
3167; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
3168; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
3169; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
3170; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
3171; NONEON-NOSVE-NEXT:    fcvt s0, h0
3172; NONEON-NOSVE-NEXT:    fcvt s1, h1
3173; NONEON-NOSVE-NEXT:    fcmp s1, s0
3174; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
3175; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
3176; NONEON-NOSVE-NEXT:    fcvt s0, h0
3177; NONEON-NOSVE-NEXT:    fcvt s1, h1
3178; NONEON-NOSVE-NEXT:    csetm w8, ge
3179; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
3180; NONEON-NOSVE-NEXT:    fcmp s1, s0
3181; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
3182; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
3183; NONEON-NOSVE-NEXT:    fcvt s0, h0
3184; NONEON-NOSVE-NEXT:    fcvt s1, h1
3185; NONEON-NOSVE-NEXT:    csetm w8, ge
3186; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
3187; NONEON-NOSVE-NEXT:    fcmp s1, s0
3188; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
3189; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
3190; NONEON-NOSVE-NEXT:    fcvt s0, h0
3191; NONEON-NOSVE-NEXT:    fcvt s1, h1
3192; NONEON-NOSVE-NEXT:    csetm w8, ge
3193; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
3194; NONEON-NOSVE-NEXT:    fcmp s1, s0
3195; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
3196; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
3197; NONEON-NOSVE-NEXT:    fcvt s0, h0
3198; NONEON-NOSVE-NEXT:    fcvt s1, h1
3199; NONEON-NOSVE-NEXT:    csetm w8, ge
3200; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
3201; NONEON-NOSVE-NEXT:    fcmp s1, s0
3202; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
3203; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
3204; NONEON-NOSVE-NEXT:    fcvt s0, h0
3205; NONEON-NOSVE-NEXT:    fcvt s1, h1
3206; NONEON-NOSVE-NEXT:    csetm w8, ge
3207; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
3208; NONEON-NOSVE-NEXT:    fcmp s1, s0
3209; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
3210; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
3211; NONEON-NOSVE-NEXT:    fcvt s0, h0
3212; NONEON-NOSVE-NEXT:    fcvt s1, h1
3213; NONEON-NOSVE-NEXT:    csetm w8, ge
3214; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
3215; NONEON-NOSVE-NEXT:    fcmp s1, s0
3216; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
3217; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
3218; NONEON-NOSVE-NEXT:    fcvt s0, h0
3219; NONEON-NOSVE-NEXT:    fcvt s1, h1
3220; NONEON-NOSVE-NEXT:    csetm w8, ge
3221; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
3222; NONEON-NOSVE-NEXT:    fcmp s1, s0
3223; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
3224; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
3225; NONEON-NOSVE-NEXT:    fcvt s0, h0
3226; NONEON-NOSVE-NEXT:    fcvt s1, h1
3227; NONEON-NOSVE-NEXT:    csetm w8, ge
3228; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
3229; NONEON-NOSVE-NEXT:    fcmp s1, s0
3230; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
3231; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
3232; NONEON-NOSVE-NEXT:    fcvt s0, h0
3233; NONEON-NOSVE-NEXT:    fcvt s1, h1
3234; NONEON-NOSVE-NEXT:    csetm w8, ge
3235; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
3236; NONEON-NOSVE-NEXT:    fcmp s1, s0
3237; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
3238; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
3239; NONEON-NOSVE-NEXT:    fcvt s0, h0
3240; NONEON-NOSVE-NEXT:    fcvt s1, h1
3241; NONEON-NOSVE-NEXT:    csetm w8, ge
3242; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
3243; NONEON-NOSVE-NEXT:    fcmp s1, s0
3244; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
3245; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
3246; NONEON-NOSVE-NEXT:    fcvt s0, h0
3247; NONEON-NOSVE-NEXT:    fcvt s1, h1
3248; NONEON-NOSVE-NEXT:    csetm w8, ge
3249; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
3250; NONEON-NOSVE-NEXT:    fcmp s1, s0
3251; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
3252; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
3253; NONEON-NOSVE-NEXT:    fcvt s0, h0
3254; NONEON-NOSVE-NEXT:    fcvt s1, h1
3255; NONEON-NOSVE-NEXT:    csetm w8, ge
3256; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
3257; NONEON-NOSVE-NEXT:    fcmp s1, s0
3258; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
3259; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
3260; NONEON-NOSVE-NEXT:    fcvt s0, h0
3261; NONEON-NOSVE-NEXT:    fcvt s1, h1
3262; NONEON-NOSVE-NEXT:    csetm w8, ge
3263; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
3264; NONEON-NOSVE-NEXT:    fcmp s1, s0
3265; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
3266; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
3267; NONEON-NOSVE-NEXT:    fcvt s0, h0
3268; NONEON-NOSVE-NEXT:    fcvt s1, h1
3269; NONEON-NOSVE-NEXT:    csetm w8, ge
3270; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
3271; NONEON-NOSVE-NEXT:    fcmp s1, s0
3272; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
3273; NONEON-NOSVE-NEXT:    ldr h1, [sp]
3274; NONEON-NOSVE-NEXT:    fcvt s0, h0
3275; NONEON-NOSVE-NEXT:    fcvt s1, h1
3276; NONEON-NOSVE-NEXT:    csetm w8, ge
3277; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
3278; NONEON-NOSVE-NEXT:    fcmp s1, s0
3279; NONEON-NOSVE-NEXT:    csetm w8, ge
3280; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
3281; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
3282; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
3283; NONEON-NOSVE-NEXT:    add sp, sp, #96
3284; NONEON-NOSVE-NEXT:    ret
3285  %op1 = load <16 x half>, ptr %a
3286  %op2 = load <16 x half>, ptr %b
3287  %cmp = fcmp fast oge <16 x half> %op1, %op2
3288  %sext = sext <16 x i1> %cmp to <16 x i16>
3289  store <16 x i16> %sext, ptr %c
3290  ret void
3291}
3292
3293;
3294; FCMP LE
3295;
3296
3297define void @fcmp_le_v16f16(ptr %a, ptr %b, ptr %c) {
3298; CHECK-LABEL: fcmp_le_v16f16:
3299; CHECK:       // %bb.0:
3300; CHECK-NEXT:    ldp q0, q3, [x1]
3301; CHECK-NEXT:    ptrue p0.h, vl8
3302; CHECK-NEXT:    ldp q1, q2, [x0]
3303; CHECK-NEXT:    fcmge p1.h, p0/z, z0.h, z1.h
3304; CHECK-NEXT:    fcmge p0.h, p0/z, z3.h, z2.h
3305; CHECK-NEXT:    mov z0.h, p1/z, #-1 // =0xffffffffffffffff
3306; CHECK-NEXT:    mov z1.h, p0/z, #-1 // =0xffffffffffffffff
3307; CHECK-NEXT:    stp q0, q1, [x2]
3308; CHECK-NEXT:    ret
3309;
3310; NONEON-NOSVE-LABEL: fcmp_le_v16f16:
3311; NONEON-NOSVE:       // %bb.0:
3312; NONEON-NOSVE-NEXT:    sub sp, sp, #96
3313; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
3314; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
3315; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
3316; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
3317; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
3318; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
3319; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]
3320; NONEON-NOSVE-NEXT:    fcvt s0, h0
3321; NONEON-NOSVE-NEXT:    fcvt s1, h1
3322; NONEON-NOSVE-NEXT:    fcmp s1, s0
3323; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
3324; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]
3325; NONEON-NOSVE-NEXT:    fcvt s0, h0
3326; NONEON-NOSVE-NEXT:    fcvt s1, h1
3327; NONEON-NOSVE-NEXT:    csetm w8, le
3328; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
3329; NONEON-NOSVE-NEXT:    fcmp s1, s0
3330; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
3331; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]
3332; NONEON-NOSVE-NEXT:    fcvt s0, h0
3333; NONEON-NOSVE-NEXT:    fcvt s1, h1
3334; NONEON-NOSVE-NEXT:    csetm w8, le
3335; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
3336; NONEON-NOSVE-NEXT:    fcmp s1, s0
3337; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
3338; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]
3339; NONEON-NOSVE-NEXT:    fcvt s0, h0
3340; NONEON-NOSVE-NEXT:    fcvt s1, h1
3341; NONEON-NOSVE-NEXT:    csetm w8, le
3342; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
3343; NONEON-NOSVE-NEXT:    fcmp s1, s0
3344; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
3345; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]
3346; NONEON-NOSVE-NEXT:    fcvt s0, h0
3347; NONEON-NOSVE-NEXT:    fcvt s1, h1
3348; NONEON-NOSVE-NEXT:    csetm w8, le
3349; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
3350; NONEON-NOSVE-NEXT:    fcmp s1, s0
3351; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
3352; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]
3353; NONEON-NOSVE-NEXT:    fcvt s0, h0
3354; NONEON-NOSVE-NEXT:    fcvt s1, h1
3355; NONEON-NOSVE-NEXT:    csetm w8, le
3356; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
3357; NONEON-NOSVE-NEXT:    fcmp s1, s0
3358; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
3359; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]
3360; NONEON-NOSVE-NEXT:    fcvt s0, h0
3361; NONEON-NOSVE-NEXT:    fcvt s1, h1
3362; NONEON-NOSVE-NEXT:    csetm w8, le
3363; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
3364; NONEON-NOSVE-NEXT:    fcmp s1, s0
3365; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
3366; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]
3367; NONEON-NOSVE-NEXT:    fcvt s0, h0
3368; NONEON-NOSVE-NEXT:    fcvt s1, h1
3369; NONEON-NOSVE-NEXT:    csetm w8, le
3370; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
3371; NONEON-NOSVE-NEXT:    fcmp s1, s0
3372; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
3373; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]
3374; NONEON-NOSVE-NEXT:    fcvt s0, h0
3375; NONEON-NOSVE-NEXT:    fcvt s1, h1
3376; NONEON-NOSVE-NEXT:    csetm w8, le
3377; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
3378; NONEON-NOSVE-NEXT:    fcmp s1, s0
3379; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
3380; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
3381; NONEON-NOSVE-NEXT:    fcvt s0, h0
3382; NONEON-NOSVE-NEXT:    fcvt s1, h1
3383; NONEON-NOSVE-NEXT:    csetm w8, le
3384; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
3385; NONEON-NOSVE-NEXT:    fcmp s1, s0
3386; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
3387; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]
3388; NONEON-NOSVE-NEXT:    fcvt s0, h0
3389; NONEON-NOSVE-NEXT:    fcvt s1, h1
3390; NONEON-NOSVE-NEXT:    csetm w8, le
3391; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
3392; NONEON-NOSVE-NEXT:    fcmp s1, s0
3393; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
3394; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]
3395; NONEON-NOSVE-NEXT:    fcvt s0, h0
3396; NONEON-NOSVE-NEXT:    fcvt s1, h1
3397; NONEON-NOSVE-NEXT:    csetm w8, le
3398; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
3399; NONEON-NOSVE-NEXT:    fcmp s1, s0
3400; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
3401; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]
3402; NONEON-NOSVE-NEXT:    fcvt s0, h0
3403; NONEON-NOSVE-NEXT:    fcvt s1, h1
3404; NONEON-NOSVE-NEXT:    csetm w8, le
3405; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
3406; NONEON-NOSVE-NEXT:    fcmp s1, s0
3407; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
3408; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]
3409; NONEON-NOSVE-NEXT:    fcvt s0, h0
3410; NONEON-NOSVE-NEXT:    fcvt s1, h1
3411; NONEON-NOSVE-NEXT:    csetm w8, le
3412; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
3413; NONEON-NOSVE-NEXT:    fcmp s1, s0
3414; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
3415; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]
3416; NONEON-NOSVE-NEXT:    fcvt s0, h0
3417; NONEON-NOSVE-NEXT:    fcvt s1, h1
3418; NONEON-NOSVE-NEXT:    csetm w8, le
3419; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
3420; NONEON-NOSVE-NEXT:    fcmp s1, s0
3421; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
3422; NONEON-NOSVE-NEXT:    ldr h1, [sp]
3423; NONEON-NOSVE-NEXT:    fcvt s0, h0
3424; NONEON-NOSVE-NEXT:    fcvt s1, h1
3425; NONEON-NOSVE-NEXT:    csetm w8, le
3426; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
3427; NONEON-NOSVE-NEXT:    fcmp s1, s0
3428; NONEON-NOSVE-NEXT:    csetm w8, le
3429; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
3430; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
3431; NONEON-NOSVE-NEXT:    stp q0, q1, [x2]
3432; NONEON-NOSVE-NEXT:    add sp, sp, #96
3433; NONEON-NOSVE-NEXT:    ret
3434  %op1 = load <16 x half>, ptr %a
3435  %op2 = load <16 x half>, ptr %b
3436  %cmp = fcmp fast ole <16 x half> %op1, %op2
3437  %sext = sext <16 x i1> %cmp to <16 x i16>
3438  store <16 x i16> %sext, ptr %c
3439  ret void
3440}
3441