diff options
Diffstat (limited to 'lib/x86_64/floatundisf.S')
-rw-r--r-- | lib/x86_64/floatundisf.S | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/x86_64/floatundisf.S b/lib/x86_64/floatundisf.S new file mode 100644 index 000000000000..fe209632a38e --- /dev/null +++ b/lib/x86_64/floatundisf.S @@ -0,0 +1,33 @@ +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. + +#include "../assembly.h" + +// float __floatundisf(du_int a); + +#ifdef __x86_64__ + +#ifndef __ELF__ +.literal4 +#endif +two: .single 2.0 + +#define REL_ADDR(_a) (_a)(%rip) + +.text +.align 4 +DEFINE_COMPILERRT_FUNCTION(__floatundisf) + movq $1, %rsi + testq %rdi, %rdi + js 1f + cvtsi2ssq %rdi, %xmm0 + ret + +1: andq %rdi, %rsi + shrq %rdi + orq %rsi, %rdi + cvtsi2ssq %rdi, %xmm0 + mulss REL_ADDR(two), %xmm0 + ret + +#endif // __x86_64__ |