xref: /aosp_15_r20/external/llvm/test/CodeGen/Thumb2/float-intrinsics-float.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabi   -mcpu=cortex-m3                    | FileCheck %s -check-prefix=CHECK -check-prefix=SOFT -check-prefix=NONE
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m4                    | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=SP -check-prefix=VMLA
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7                    | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=VFP  -check-prefix=FP-ARMv8  -check-prefix=VMLA
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7 -mattr=+fp-only-sp | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=SP -check-prefix=FP-ARMv8 -check-prefix=VMLA
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a7                    | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=NEON -check-prefix=VFP4 -check-prefix=NO-VMLA
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a57                   | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=NEON -check-prefix=FP-ARMv8 -check-prefix=VMLA
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.sqrt.f32(float %Val)
9*9880d681SAndroid Build Coastguard Workerdefine float @sqrt_f(float %a) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_f:
11*9880d681SAndroid Build Coastguard Worker; SOFT: bl sqrtf
12*9880d681SAndroid Build Coastguard Worker; HARD: vsqrt.f32 s0, s0
13*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.sqrt.f32(float %a)
14*9880d681SAndroid Build Coastguard Worker  ret float %1
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.powi.f32(float %Val, i32 %power)
18*9880d681SAndroid Build Coastguard Workerdefine float @powi_f(float %a, i32 %b) {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: powi_f:
20*9880d681SAndroid Build Coastguard Worker; SOFT: bl __powisf2
21*9880d681SAndroid Build Coastguard Worker; HARD: b __powisf2
22*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.powi.f32(float %a, i32 %b)
23*9880d681SAndroid Build Coastguard Worker  ret float %1
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.sin.f32(float %Val)
27*9880d681SAndroid Build Coastguard Workerdefine float @sin_f(float %a) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sin_f:
29*9880d681SAndroid Build Coastguard Worker; SOFT: bl sinf
30*9880d681SAndroid Build Coastguard Worker; HARD: b sinf
31*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.sin.f32(float %a)
32*9880d681SAndroid Build Coastguard Worker  ret float %1
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.cos.f32(float %Val)
36*9880d681SAndroid Build Coastguard Workerdefine float @cos_f(float %a) {
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cos_f:
38*9880d681SAndroid Build Coastguard Worker; SOFT: bl cosf
39*9880d681SAndroid Build Coastguard Worker; HARD: b cosf
40*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.cos.f32(float %a)
41*9880d681SAndroid Build Coastguard Worker  ret float %1
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.pow.f32(float %Val, float %power)
45*9880d681SAndroid Build Coastguard Workerdefine float @pow_f(float %a, float %b) {
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pow_f:
47*9880d681SAndroid Build Coastguard Worker; SOFT: bl powf
48*9880d681SAndroid Build Coastguard Worker; HARD: b powf
49*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.pow.f32(float %a, float %b)
50*9880d681SAndroid Build Coastguard Worker  ret float %1
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.exp.f32(float %Val)
54*9880d681SAndroid Build Coastguard Workerdefine float @exp_f(float %a) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp_f:
56*9880d681SAndroid Build Coastguard Worker; SOFT: bl expf
57*9880d681SAndroid Build Coastguard Worker; HARD: b expf
58*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.exp.f32(float %a)
59*9880d681SAndroid Build Coastguard Worker  ret float %1
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.exp2.f32(float %Val)
63*9880d681SAndroid Build Coastguard Workerdefine float @exp2_f(float %a) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp2_f:
65*9880d681SAndroid Build Coastguard Worker; SOFT: bl exp2f
66*9880d681SAndroid Build Coastguard Worker; HARD: b exp2f
67*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.exp2.f32(float %a)
68*9880d681SAndroid Build Coastguard Worker  ret float %1
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.log.f32(float %Val)
72*9880d681SAndroid Build Coastguard Workerdefine float @log_f(float %a) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log_f:
74*9880d681SAndroid Build Coastguard Worker; SOFT: bl logf
75*9880d681SAndroid Build Coastguard Worker; HARD: b logf
76*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.log.f32(float %a)
77*9880d681SAndroid Build Coastguard Worker  ret float %1
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.log10.f32(float %Val)
81*9880d681SAndroid Build Coastguard Workerdefine float @log10_f(float %a) {
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log10_f:
83*9880d681SAndroid Build Coastguard Worker; SOFT: bl log10f
84*9880d681SAndroid Build Coastguard Worker; HARD: b log10f
85*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.log10.f32(float %a)
86*9880d681SAndroid Build Coastguard Worker  ret float %1
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.log2.f32(float %Val)
90*9880d681SAndroid Build Coastguard Workerdefine float @log2_f(float %a) {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log2_f:
92*9880d681SAndroid Build Coastguard Worker; SOFT: bl log2f
93*9880d681SAndroid Build Coastguard Worker; HARD: b log2f
94*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.log2.f32(float %a)
95*9880d681SAndroid Build Coastguard Worker  ret float %1
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.fma.f32(float %a, float %b, float %c)
99*9880d681SAndroid Build Coastguard Workerdefine float @fma_f(float %a, float %b, float %c) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma_f:
101*9880d681SAndroid Build Coastguard Worker; SOFT: bl fmaf
102*9880d681SAndroid Build Coastguard Worker; HARD: vfma.f32
103*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
104*9880d681SAndroid Build Coastguard Worker  ret float %1
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.fabs.f32(float %Val)
108*9880d681SAndroid Build Coastguard Workerdefine float @abs_f(float %a) {
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: abs_f:
110*9880d681SAndroid Build Coastguard Worker; SOFT: bic r0, r0, #-2147483648
111*9880d681SAndroid Build Coastguard Worker; HARD: vabs.f32
112*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.fabs.f32(float %a)
113*9880d681SAndroid Build Coastguard Worker  ret float %1
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.copysign.f32(float  %Mag, float  %Sgn)
117*9880d681SAndroid Build Coastguard Workerdefine float @copysign_f(float %a, float %b) {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copysign_f:
119*9880d681SAndroid Build Coastguard Worker; NONE: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
120*9880d681SAndroid Build Coastguard Worker; NONE: bfi r{{[0-9]+}}, [[REG]], #31, #1
121*9880d681SAndroid Build Coastguard Worker; SP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
122*9880d681SAndroid Build Coastguard Worker; SP: bfi r{{[0-9]+}}, [[REG]], #31, #1
123*9880d681SAndroid Build Coastguard Worker; VFP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
124*9880d681SAndroid Build Coastguard Worker; VFP: bfi r{{[0-9]+}}, [[REG]], #31, #1
125*9880d681SAndroid Build Coastguard Worker; NEON: vmov.i32 [[REG:d[0-9]+]], #0x80000000
126*9880d681SAndroid Build Coastguard Worker; NEON: vbsl [[REG]], d
127*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.copysign.f32(float %a, float %b)
128*9880d681SAndroid Build Coastguard Worker  ret float %1
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.floor.f32(float %Val)
132*9880d681SAndroid Build Coastguard Workerdefine float @floor_f(float %a) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floor_f:
134*9880d681SAndroid Build Coastguard Worker; SOFT: bl floorf
135*9880d681SAndroid Build Coastguard Worker; VFP4: b floorf
136*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintm.f32
137*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.floor.f32(float %a)
138*9880d681SAndroid Build Coastguard Worker  ret float %1
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.ceil.f32(float %Val)
142*9880d681SAndroid Build Coastguard Workerdefine float @ceil_f(float %a) {
143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ceil_f:
144*9880d681SAndroid Build Coastguard Worker; SOFT: bl ceilf
145*9880d681SAndroid Build Coastguard Worker; VFP4: b ceilf
146*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintp.f32
147*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.ceil.f32(float %a)
148*9880d681SAndroid Build Coastguard Worker  ret float %1
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.trunc.f32(float %Val)
152*9880d681SAndroid Build Coastguard Workerdefine float @trunc_f(float %a) {
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: trunc_f:
154*9880d681SAndroid Build Coastguard Worker; SOFT: bl truncf
155*9880d681SAndroid Build Coastguard Worker; VFP4: b truncf
156*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintz.f32
157*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.trunc.f32(float %a)
158*9880d681SAndroid Build Coastguard Worker  ret float %1
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.rint.f32(float %Val)
162*9880d681SAndroid Build Coastguard Workerdefine float @rint_f(float %a) {
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rint_f:
164*9880d681SAndroid Build Coastguard Worker; SOFT: bl rintf
165*9880d681SAndroid Build Coastguard Worker; VFP4: b rintf
166*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintx.f32
167*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.rint.f32(float %a)
168*9880d681SAndroid Build Coastguard Worker  ret float %1
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.nearbyint.f32(float %Val)
172*9880d681SAndroid Build Coastguard Workerdefine float @nearbyint_f(float %a) {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearbyint_f:
174*9880d681SAndroid Build Coastguard Worker; SOFT: bl nearbyintf
175*9880d681SAndroid Build Coastguard Worker; VFP4: b nearbyintf
176*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintr.f32
177*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.nearbyint.f32(float %a)
178*9880d681SAndroid Build Coastguard Worker  ret float %1
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.round.f32(float %Val)
182*9880d681SAndroid Build Coastguard Workerdefine float @round_f(float %a) {
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: round_f:
184*9880d681SAndroid Build Coastguard Worker; SOFT: bl roundf
185*9880d681SAndroid Build Coastguard Worker; VFP4: b roundf
186*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrinta.f32
187*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.round.f32(float %a)
188*9880d681SAndroid Build Coastguard Worker  ret float %1
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; FIXME: why does cortex-m4 use vmla, while cortex-a7 uses vmul+vadd?
192*9880d681SAndroid Build Coastguard Worker; (these should be equivalent, even the rounding is the same)
193*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.fmuladd.f32(float %a, float %b, float %c)
194*9880d681SAndroid Build Coastguard Workerdefine float @fmuladd_f(float %a, float %b, float %c) {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmuladd_f:
196*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_fmul
197*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_fadd
198*9880d681SAndroid Build Coastguard Worker; VMLA: vmla.f32
199*9880d681SAndroid Build Coastguard Worker; NO-VMLA: vmul.f32
200*9880d681SAndroid Build Coastguard Worker; NO-VMLA: vadd.f32
201*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
202*9880d681SAndroid Build Coastguard Worker  ret float %1
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f32(float %a)
206*9880d681SAndroid Build Coastguard Workerdefine i16 @f_to_h(float %a) {
207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_h:
208*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_f2h
209*9880d681SAndroid Build Coastguard Worker; HARD: vcvt{{[bt]}}.f16.f32
210*9880d681SAndroid Build Coastguard Worker  %1 = call i16 @llvm.convert.to.fp16.f32(float %a)
211*9880d681SAndroid Build Coastguard Worker  ret i16 %1
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.convert.from.fp16.f32(i16 %a)
215*9880d681SAndroid Build Coastguard Workerdefine float @h_to_f(i16 %a) {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h_to_f:
217*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_h2f
218*9880d681SAndroid Build Coastguard Worker; HARD: vcvt{{[bt]}}.f32.f16
219*9880d681SAndroid Build Coastguard Worker  %1 = call float @llvm.convert.from.fp16.f32(i16 %a)
220*9880d681SAndroid Build Coastguard Worker  ret float %1
221*9880d681SAndroid Build Coastguard Worker}
222