xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vfcmp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; This tests fcmp operations that do not map directly to NEON instructions.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; une is implemented with VCEQ/VMVN
6*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcunef32(<2 x float>* %A, <2 x float>* %B) nounwind {
7*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcunef32:
8*9880d681SAndroid Build Coastguard Worker;CHECK: vceq.f32
9*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
10*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
11*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
12*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp une <2 x float> %tmp1, %tmp2
13*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
14*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; olt is implemented with VCGT
18*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcoltf32(<2 x float>* %A, <2 x float>* %B) nounwind {
19*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcoltf32:
20*9880d681SAndroid Build Coastguard Worker;CHECK: vcgt.f32
21*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
22*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
23*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp olt <2 x float> %tmp1, %tmp2
24*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
25*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; ole is implemented with VCGE
29*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcolef32(<2 x float>* %A, <2 x float>* %B) nounwind {
30*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcolef32:
31*9880d681SAndroid Build Coastguard Worker;CHECK: vcge.f32
32*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
33*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
34*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ole <2 x float> %tmp1, %tmp2
35*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
36*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; uge is implemented with VCGT/VMVN
40*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcugef32(<2 x float>* %A, <2 x float>* %B) nounwind {
41*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcugef32:
42*9880d681SAndroid Build Coastguard Worker;CHECK: vcgt.f32
43*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
44*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
45*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
46*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp uge <2 x float> %tmp1, %tmp2
47*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
48*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; ule is implemented with VCGT/VMVN
52*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vculef32(<2 x float>* %A, <2 x float>* %B) nounwind {
53*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vculef32:
54*9880d681SAndroid Build Coastguard Worker;CHECK: vcgt.f32
55*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
56*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
57*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
58*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ule <2 x float> %tmp1, %tmp2
59*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
60*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; ugt is implemented with VCGE/VMVN
64*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcugtf32(<2 x float>* %A, <2 x float>* %B) nounwind {
65*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcugtf32:
66*9880d681SAndroid Build Coastguard Worker;CHECK: vcge.f32
67*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
68*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
69*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
70*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ugt <2 x float> %tmp1, %tmp2
71*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
72*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; ult is implemented with VCGE/VMVN
76*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcultf32(<2 x float>* %A, <2 x float>* %B) nounwind {
77*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcultf32:
78*9880d681SAndroid Build Coastguard Worker;CHECK: vcge.f32
79*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
80*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
81*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
82*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ult <2 x float> %tmp1, %tmp2
83*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
84*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; ueq is implemented with VCGT/VCGT/VORR/VMVN
88*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcueqf32(<2 x float>* %A, <2 x float>* %B) nounwind {
89*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcueqf32:
90*9880d681SAndroid Build Coastguard Worker;CHECK: vcgt.f32
91*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vcgt.f32
92*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vorr
93*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
94*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
95*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
96*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ueq <2 x float> %tmp1, %tmp2
97*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
98*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; one is implemented with VCGT/VCGT/VORR
102*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vconef32(<2 x float>* %A, <2 x float>* %B) nounwind {
103*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vconef32:
104*9880d681SAndroid Build Coastguard Worker;CHECK: vcgt.f32
105*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vcgt.f32
106*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vorr
107*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
108*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
109*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp one <2 x float> %tmp1, %tmp2
110*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
111*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; uno is implemented with VCGT/VCGE/VORR/VMVN
115*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcunof32(<2 x float>* %A, <2 x float>* %B) nounwind {
116*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcunof32:
117*9880d681SAndroid Build Coastguard Worker;CHECK: vcge.f32
118*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vcgt.f32
119*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vorr
120*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vmvn
121*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
122*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
123*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp uno <2 x float> %tmp1, %tmp2
124*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
125*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; ord is implemented with VCGT/VCGE/VORR
129*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vcordf32(<2 x float>* %A, <2 x float>* %B) nounwind {
130*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vcordf32:
131*9880d681SAndroid Build Coastguard Worker;CHECK: vcge.f32
132*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vcgt.f32
133*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vorr
134*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
135*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
136*9880d681SAndroid Build Coastguard Worker	%tmp3 = fcmp ord <2 x float> %tmp1, %tmp2
137*9880d681SAndroid Build Coastguard Worker        %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
138*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp4
139*9880d681SAndroid Build Coastguard Worker}
140