
Use of long double can be error-prone since it could be one of 80-bit extended precision float, IEEE 128-bit float, or IBM 128-bit float. Instead use an explicit xf_float typedef for the remaining cases where long double is being used in the implementation. This patch does not touch the PPC specializations which still use long double.
35 lines
1.0 KiB
ArmAsm
35 lines
1.0 KiB
ArmAsm
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#include "../assembly.h"
|
|
|
|
// xf_float __floatdixf(di_int a);
|
|
|
|
#ifdef __i386__
|
|
|
|
// This routine has some extra memory traffic, loading the 64-bit input via two
|
|
// 32-bit loads, then immediately storing it back to the stack via a single 64-bit
|
|
// store. This is to avoid a write-small, read-large stall.
|
|
// However, if callers of this routine can be safely assumed to store the argument
|
|
// via a 64-bt store, this is unnecessary memory traffic, and should be avoided.
|
|
// It can be turned off by defining the TRUST_CALLERS_USE_64_BIT_STORES macro.
|
|
|
|
.text
|
|
.balign 4
|
|
DEFINE_COMPILERRT_FUNCTION(__floatdixf)
|
|
#ifndef TRUST_CALLERS_USE_64_BIT_STORES
|
|
movd 4(%esp), %xmm0
|
|
movd 8(%esp), %xmm1
|
|
punpckldq %xmm1, %xmm0
|
|
movq %xmm0, 4(%esp)
|
|
#endif
|
|
fildll 4(%esp)
|
|
ret
|
|
END_COMPILERRT_FUNCTION(__floatdixf)
|
|
|
|
#endif // __i386__
|
|
|
|
NO_EXEC_STACK_DIRECTIVE
|
|
|