xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-vcmp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine void @fcmltz_4s(<4 x float> %a, <4 x i16>* %p) nounwind {
5*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: fcmltz_4s:
6*9880d681SAndroid Build Coastguard Worker;CHECK: fcmlt.4s [[REG:v[0-9]+]], v0, #0
7*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: xtn.4h v[[REG_1:[0-9]+]], [[REG]]
8*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: str d[[REG_1]], [x0]
9*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: ret
10*9880d681SAndroid Build Coastguard Worker  %tmp = fcmp olt <4 x float> %a, zeroinitializer
11*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext <4 x i1> %tmp to <4 x i16>
12*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %tmp2, <4 x i16>* %p, align 8
13*9880d681SAndroid Build Coastguard Worker  ret void
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @facge_2s(<2 x float>* %A, <2 x float>* %B) nounwind {
17*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facge_2s:
18*9880d681SAndroid Build Coastguard Worker;CHECK: facge.2s
19*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
20*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
21*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i32> @llvm.aarch64.neon.facge.v2i32.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
22*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp3
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @facge_4s(<4 x float>* %A, <4 x float>* %B) nounwind {
26*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facge_4s:
27*9880d681SAndroid Build Coastguard Worker;CHECK: facge.4s
28*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x float>, <4 x float>* %A
29*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x float>, <4 x float>* %B
30*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i32> @llvm.aarch64.neon.facge.v4i32.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
31*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @facge_2d(<2 x double>* %A, <2 x double>* %B) nounwind {
35*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facge_2d:
36*9880d681SAndroid Build Coastguard Worker;CHECK: facge.2d
37*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x double>, <2 x double>* %A
38*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x double>, <2 x double>* %B
39*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i64> @llvm.aarch64.neon.facge.v2i64.v2f64(<2 x double> %tmp1, <2 x double> %tmp2)
40*9880d681SAndroid Build Coastguard Worker	ret <2 x i64> %tmp3
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.facge.v2i32.v2f32(<2 x float>, <2 x float>) nounwind readnone
44*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.facge.v4i32.v4f32(<4 x float>, <4 x float>) nounwind readnone
45*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.facge.v2i64.v2f64(<2 x double>, <2 x double>) nounwind readnone
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @facgt_2s(<2 x float>* %A, <2 x float>* %B) nounwind {
48*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facgt_2s:
49*9880d681SAndroid Build Coastguard Worker;CHECK: facgt.2s
50*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
51*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
52*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i32> @llvm.aarch64.neon.facgt.v2i32.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
53*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp3
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @facgt_4s(<4 x float>* %A, <4 x float>* %B) nounwind {
57*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facgt_4s:
58*9880d681SAndroid Build Coastguard Worker;CHECK: facgt.4s
59*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x float>, <4 x float>* %A
60*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x float>, <4 x float>* %B
61*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i32> @llvm.aarch64.neon.facgt.v4i32.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
62*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @facgt_2d(<2 x double>* %A, <2 x double>* %B) nounwind {
66*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: facgt_2d:
67*9880d681SAndroid Build Coastguard Worker;CHECK: facgt.2d
68*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x double>, <2 x double>* %A
69*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x double>, <2 x double>* %B
70*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i64> @llvm.aarch64.neon.facgt.v2i64.v2f64(<2 x double> %tmp1, <2 x double> %tmp2)
71*9880d681SAndroid Build Coastguard Worker	ret <2 x i64> %tmp3
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.facgt.v2i32.v2f32(<2 x float>, <2 x float>) nounwind readnone
75*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.facgt.v4i32.v4f32(<4 x float>, <4 x float>) nounwind readnone
76*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.facgt.v2i64.v2f64(<2 x double>, <2 x double>) nounwind readnone
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i32 @facge_s(float %A, float %B) nounwind {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: facge_s:
80*9880d681SAndroid Build Coastguard Worker; CHECK: facge {{s[0-9]+}}, s0, s1
81*9880d681SAndroid Build Coastguard Worker  %mask = call i32 @llvm.aarch64.neon.facge.i32.f32(float %A, float %B)
82*9880d681SAndroid Build Coastguard Worker  ret i32 %mask
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i64 @facge_d(double %A, double %B) nounwind {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: facge_d:
87*9880d681SAndroid Build Coastguard Worker; CHECK: facge {{d[0-9]+}}, d0, d1
88*9880d681SAndroid Build Coastguard Worker  %mask = call i64 @llvm.aarch64.neon.facge.i64.f64(double %A, double %B)
89*9880d681SAndroid Build Coastguard Worker  ret i64 %mask
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.facge.i64.f64(double, double)
93*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.facge.i32.f32(float, float)
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine i32 @facgt_s(float %A, float %B) nounwind {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: facgt_s:
97*9880d681SAndroid Build Coastguard Worker; CHECK: facgt {{s[0-9]+}}, s0, s1
98*9880d681SAndroid Build Coastguard Worker  %mask = call i32 @llvm.aarch64.neon.facgt.i32.f32(float %A, float %B)
99*9880d681SAndroid Build Coastguard Worker  ret i32 %mask
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine i64 @facgt_d(double %A, double %B) nounwind {
103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: facgt_d:
104*9880d681SAndroid Build Coastguard Worker; CHECK: facgt {{d[0-9]+}}, d0, d1
105*9880d681SAndroid Build Coastguard Worker  %mask = call i64 @llvm.aarch64.neon.facgt.i64.f64(double %A, double %B)
106*9880d681SAndroid Build Coastguard Worker  ret i64 %mask
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.facgt.i64.f64(double, double)
110*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.facgt.i32.f32(float, float)
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @cmtst_8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
113*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_8b:
114*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.8b
115*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i8>, <8 x i8>* %A
116*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <8 x i8>, <8 x i8>* %B
117*9880d681SAndroid Build Coastguard Worker  %commonbits = and <8 x i8> %tmp1, %tmp2
118*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <8 x i8> %commonbits, zeroinitializer
119*9880d681SAndroid Build Coastguard Worker  %res = sext <8 x i1> %mask to <8 x i8>
120*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %res
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @cmtst_16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
124*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_16b:
125*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.16b
126*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <16 x i8>, <16 x i8>* %A
127*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <16 x i8>, <16 x i8>* %B
128*9880d681SAndroid Build Coastguard Worker  %commonbits = and <16 x i8> %tmp1, %tmp2
129*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <16 x i8> %commonbits, zeroinitializer
130*9880d681SAndroid Build Coastguard Worker  %res = sext <16 x i1> %mask to <16 x i8>
131*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @cmtst_4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
135*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_4h:
136*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.4h
137*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i16>, <4 x i16>* %A
138*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <4 x i16>, <4 x i16>* %B
139*9880d681SAndroid Build Coastguard Worker  %commonbits = and <4 x i16> %tmp1, %tmp2
140*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i16> %commonbits, zeroinitializer
141*9880d681SAndroid Build Coastguard Worker  %res = sext <4 x i1> %mask to <4 x i16>
142*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %res
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @cmtst_8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
146*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_8h:
147*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.8h
148*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i16>, <8 x i16>* %A
149*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <8 x i16>, <8 x i16>* %B
150*9880d681SAndroid Build Coastguard Worker  %commonbits = and <8 x i16> %tmp1, %tmp2
151*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <8 x i16> %commonbits, zeroinitializer
152*9880d681SAndroid Build Coastguard Worker  %res = sext <8 x i1> %mask to <8 x i16>
153*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @cmtst_2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
157*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_2s:
158*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.2s
159*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i32>, <2 x i32>* %A
160*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <2 x i32>, <2 x i32>* %B
161*9880d681SAndroid Build Coastguard Worker  %commonbits = and <2 x i32> %tmp1, %tmp2
162*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <2 x i32> %commonbits, zeroinitializer
163*9880d681SAndroid Build Coastguard Worker  %res = sext <2 x i1> %mask to <2 x i32>
164*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %res
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @cmtst_4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
168*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_4s:
169*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.4s
170*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i32>, <4 x i32>* %A
171*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <4 x i32>, <4 x i32>* %B
172*9880d681SAndroid Build Coastguard Worker  %commonbits = and <4 x i32> %tmp1, %tmp2
173*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i32> %commonbits, zeroinitializer
174*9880d681SAndroid Build Coastguard Worker  %res = sext <4 x i1> %mask to <4 x i32>
175*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @cmtst_2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
179*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: cmtst_2d:
180*9880d681SAndroid Build Coastguard Worker;CHECK: cmtst.2d
181*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i64>, <2 x i64>* %A
182*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <2 x i64>, <2 x i64>* %B
183*9880d681SAndroid Build Coastguard Worker  %commonbits = and <2 x i64> %tmp1, %tmp2
184*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <2 x i64> %commonbits, zeroinitializer
185*9880d681SAndroid Build Coastguard Worker  %res = sext <2 x i1> %mask to <2 x i64>
186*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %res
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fcmeq_d(<1 x double> %A, <1 x double> %B) nounwind {
190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmeq_d:
191*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq {{d[0-9]+}}, d0, d1
192*9880d681SAndroid Build Coastguard Worker  %tst = fcmp oeq <1 x double> %A, %B
193*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
194*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fcmge_d(<1 x double> %A, <1 x double> %B) nounwind {
198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmge_d:
199*9880d681SAndroid Build Coastguard Worker; CHECK: fcmge {{d[0-9]+}}, d0, d1
200*9880d681SAndroid Build Coastguard Worker  %tst = fcmp oge <1 x double> %A, %B
201*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
202*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fcmle_d(<1 x double> %A, <1 x double> %B) nounwind {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmle_d:
207*9880d681SAndroid Build Coastguard Worker; CHECK: fcmge {{d[0-9]+}}, d1, d0
208*9880d681SAndroid Build Coastguard Worker  %tst = fcmp ole <1 x double> %A, %B
209*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
210*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fcmgt_d(<1 x double> %A, <1 x double> %B) nounwind {
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmgt_d:
215*9880d681SAndroid Build Coastguard Worker; CHECK: fcmgt {{d[0-9]+}}, d0, d1
216*9880d681SAndroid Build Coastguard Worker  %tst = fcmp ogt <1 x double> %A, %B
217*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
218*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fcmlt_d(<1 x double> %A, <1 x double> %B) nounwind {
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmlt_d:
223*9880d681SAndroid Build Coastguard Worker; CHECK: fcmgt {{d[0-9]+}}, d1, d0
224*9880d681SAndroid Build Coastguard Worker  %tst = fcmp olt <1 x double> %A, %B
225*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
226*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @cmnez_d(<1 x i64> %A) nounwind {
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cmnez_d:
231*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq d[[EQ:[0-9]+]], d0, #0
232*9880d681SAndroid Build Coastguard Worker; CHECK: mvn.8b v0, v[[EQ]]
233*9880d681SAndroid Build Coastguard Worker  %tst = icmp ne <1 x i64> %A, zeroinitializer
234*9880d681SAndroid Build Coastguard Worker  %mask = sext <1 x i1> %tst to <1 x i64>
235*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %mask
236*9880d681SAndroid Build Coastguard Worker}
237