blob: 8ee2af03eca7d45139e80707670a73bbc8785dab [file] [log] [blame]
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +00001; RUN: llc < %s -mtriple=thumbv7-none-eabi -mcpu=cortex-m3 | FileCheck %s -check-prefix=CHECK -check-prefix=SOFT -check-prefix=NONE
Sjoerd Meijerd986ede2018-09-24 12:02:50 +00002; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m4 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=SP -check-prefix=NO-VMLA
3; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m33 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=SP -check-prefix=NO-VMLA
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +00004; 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
5; 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
6; 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
7; 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
Oliver Stannard51b1d462014-08-21 12:50:31 +00008
9declare float @llvm.sqrt.f32(float %Val)
10define float @sqrt_f(float %a) {
11; CHECK-LABEL: sqrt_f:
12; SOFT: bl sqrtf
13; HARD: vsqrt.f32 s0, s0
14 %1 = call float @llvm.sqrt.f32(float %a)
15 ret float %1
16}
17
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000018declare float @llvm.powi.f32(float %Val, i32 %power)
Oliver Stannard51b1d462014-08-21 12:50:31 +000019define float @powi_f(float %a, i32 %b) {
20; CHECK-LABEL: powi_f:
21; SOFT: bl __powisf2
Saleem Abdulrasool6ef45912017-01-13 16:25:33 +000022; HARD: b __powisf2
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000023 %1 = call float @llvm.powi.f32(float %a, i32 %b)
Oliver Stannard51b1d462014-08-21 12:50:31 +000024 ret float %1
25}
26
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000027declare float @llvm.sin.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000028define float @sin_f(float %a) {
29; CHECK-LABEL: sin_f:
30; SOFT: bl sinf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000031; HARD: b sinf
32 %1 = call float @llvm.sin.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000033 ret float %1
34}
35
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000036declare float @llvm.cos.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000037define float @cos_f(float %a) {
38; CHECK-LABEL: cos_f:
39; SOFT: bl cosf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000040; HARD: b cosf
41 %1 = call float @llvm.cos.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000042 ret float %1
43}
44
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000045declare float @llvm.pow.f32(float %Val, float %power)
Oliver Stannard51b1d462014-08-21 12:50:31 +000046define float @pow_f(float %a, float %b) {
47; CHECK-LABEL: pow_f:
48; SOFT: bl powf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000049; HARD: b powf
50 %1 = call float @llvm.pow.f32(float %a, float %b)
Oliver Stannard51b1d462014-08-21 12:50:31 +000051 ret float %1
52}
53
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000054declare float @llvm.exp.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000055define float @exp_f(float %a) {
56; CHECK-LABEL: exp_f:
57; SOFT: bl expf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000058; HARD: b expf
59 %1 = call float @llvm.exp.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000060 ret float %1
61}
62
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000063declare float @llvm.exp2.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000064define float @exp2_f(float %a) {
65; CHECK-LABEL: exp2_f:
66; SOFT: bl exp2f
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000067; HARD: b exp2f
68 %1 = call float @llvm.exp2.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000069 ret float %1
70}
71
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000072declare float @llvm.log.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000073define float @log_f(float %a) {
74; CHECK-LABEL: log_f:
75; SOFT: bl logf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000076; HARD: b logf
77 %1 = call float @llvm.log.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000078 ret float %1
79}
80
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000081declare float @llvm.log10.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000082define float @log10_f(float %a) {
83; CHECK-LABEL: log10_f:
84; SOFT: bl log10f
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000085; HARD: b log10f
86 %1 = call float @llvm.log10.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000087 ret float %1
88}
89
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000090declare float @llvm.log2.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +000091define float @log2_f(float %a) {
92; CHECK-LABEL: log2_f:
93; SOFT: bl log2f
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000094; HARD: b log2f
95 %1 = call float @llvm.log2.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +000096 ret float %1
97}
98
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +000099declare float @llvm.fma.f32(float %a, float %b, float %c)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000100define float @fma_f(float %a, float %b, float %c) {
101; CHECK-LABEL: fma_f:
102; SOFT: bl fmaf
103; HARD: vfma.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000104 %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000105 ret float %1
106}
107
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000108declare float @llvm.fabs.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000109define float @abs_f(float %a) {
110; CHECK-LABEL: abs_f:
111; SOFT: bic r0, r0, #-2147483648
112; HARD: vabs.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000113 %1 = call float @llvm.fabs.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000114 ret float %1
115}
116
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000117declare float @llvm.copysign.f32(float %Mag, float %Sgn)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000118define float @copysign_f(float %a, float %b) {
119; CHECK-LABEL: copysign_f:
120; NONE: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
121; NONE: bfi r{{[0-9]+}}, [[REG]], #31, #1
122; SP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
123; SP: bfi r{{[0-9]+}}, [[REG]], #31, #1
Oliver Stannard37e4daa2014-10-01 09:02:17 +0000124; VFP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31
125; VFP: bfi r{{[0-9]+}}, [[REG]], #31, #1
126; NEON: vmov.i32 [[REG:d[0-9]+]], #0x80000000
127; NEON: vbsl [[REG]], d
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000128 %1 = call float @llvm.copysign.f32(float %a, float %b)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000129 ret float %1
130}
131
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000132declare float @llvm.floor.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000133define float @floor_f(float %a) {
134; CHECK-LABEL: floor_f:
135; SOFT: bl floorf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000136; VFP4: b floorf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000137; FP-ARMv8: vrintm.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000138 %1 = call float @llvm.floor.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000139 ret float %1
140}
141
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000142declare float @llvm.ceil.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000143define float @ceil_f(float %a) {
144; CHECK-LABEL: ceil_f:
145; SOFT: bl ceilf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000146; VFP4: b ceilf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000147; FP-ARMv8: vrintp.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000148 %1 = call float @llvm.ceil.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000149 ret float %1
150}
151
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000152declare float @llvm.trunc.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000153define float @trunc_f(float %a) {
154; CHECK-LABEL: trunc_f:
155; SOFT: bl truncf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000156; VFP4: b truncf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000157; FP-ARMv8: vrintz.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000158 %1 = call float @llvm.trunc.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000159 ret float %1
160}
161
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000162declare float @llvm.rint.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000163define float @rint_f(float %a) {
164; CHECK-LABEL: rint_f:
165; SOFT: bl rintf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000166; VFP4: b rintf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000167; FP-ARMv8: vrintx.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000168 %1 = call float @llvm.rint.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000169 ret float %1
170}
171
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000172declare float @llvm.nearbyint.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000173define float @nearbyint_f(float %a) {
174; CHECK-LABEL: nearbyint_f:
175; SOFT: bl nearbyintf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000176; VFP4: b nearbyintf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000177; FP-ARMv8: vrintr.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000178 %1 = call float @llvm.nearbyint.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000179 ret float %1
180}
181
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000182declare float @llvm.round.f32(float %Val)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000183define float @round_f(float %a) {
184; CHECK-LABEL: round_f:
185; SOFT: bl roundf
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000186; VFP4: b roundf
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000187; FP-ARMv8: vrinta.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000188 %1 = call float @llvm.round.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000189 ret float %1
190}
191
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000192declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000193define float @fmuladd_f(float %a, float %b, float %c) {
194; CHECK-LABEL: fmuladd_f:
195; SOFT: bl __aeabi_fmul
196; SOFT: bl __aeabi_fadd
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000197; VMLA: vmla.f32
198; NO-VMLA: vmul.f32
199; NO-VMLA: vadd.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000200 %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000201 ret float %1
202}
203
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000204declare i16 @llvm.convert.to.fp16.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000205define i16 @f_to_h(float %a) {
206; CHECK-LABEL: f_to_h:
Oliver Stannardd3d114b2015-10-07 16:58:49 +0000207; SOFT: bl __aeabi_f2h
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000208; HARD: vcvt{{[bt]}}.f16.f32
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000209 %1 = call i16 @llvm.convert.to.fp16.f32(float %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000210 ret i16 %1
211}
212
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000213declare float @llvm.convert.from.fp16.f32(i16 %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000214define float @h_to_f(i16 %a) {
215; CHECK-LABEL: h_to_f:
Oliver Stannardd3d114b2015-10-07 16:58:49 +0000216; SOFT: bl __aeabi_h2f
Oliver Stannardd4e0a4f2014-10-01 13:13:18 +0000217; HARD: vcvt{{[bt]}}.f32.f16
Saleem Abdulrasoola7ade332016-09-07 03:17:19 +0000218 %1 = call float @llvm.convert.from.fp16.f32(i16 %a)
Oliver Stannard51b1d462014-08-21 12:50:31 +0000219 ret float %1
220}