
The `-target` impacts the CC for the builtins. HF targets (with either floating point ABI) always use AAPCS VFP for the builtins unless they are AEABI builtins, in which case they use AAPCS. Non-HF targets (with either floating point ABI) always use AAPCS for the builtins and AAPCS for the AEABI builtins. This introduces the thunks necessary to switch CC for the floating point operations. This is not currently enabled, and should be dependent on the target being used to build compiler-rt. However, as a stop-gap, a define can be added for ASFLAGS to get the thunks. llvm-svn: 291677
34 lines
1019 B
ArmAsm
34 lines
1019 B
ArmAsm
//===-- extendsfdf2vfp.S - Implement extendsfdf2vfp -----------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../assembly.h"
|
|
|
|
//
|
|
// extern double __extendsfdf2vfp(float a);
|
|
//
|
|
// Converts single precision float to double precision result.
|
|
// Uses Darwin calling convention where a single precision parameter is
|
|
// passed in a GPR and a double precision result is returned in R0/R1 pair.
|
|
//
|
|
.syntax unified
|
|
.p2align 2
|
|
DEFINE_COMPILERRT_FUNCTION(__extendsfdf2vfp)
|
|
#if defined(COMPILER_RT_ARMHF_TARGET)
|
|
vcvt.f64.f32 d0, s0
|
|
#else
|
|
vmov s15, r0 // load float register from R0
|
|
vcvt.f64.f32 d7, s15 // convert single to double
|
|
vmov r0, r1, d7 // return result in r0/r1 pair
|
|
#endif
|
|
bx lr
|
|
END_COMPILERRT_FUNCTION(__extendsfdf2vfp)
|
|
|
|
NO_EXEC_STACK_DIRECTIVE
|
|
|