[OptTable] Fix typo VALUE => VALUES (NFCI) (#121523)
[llvm-project.git] / compiler-rt / lib / builtins / x86_64 / floatundixf.S
blobcf7286f0d6c0efca4245da1e5967d6c5a647a517
1 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2 // See https://llvm.org/LICENSE.txt for license information.
3 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5 #include "../assembly.h"
7 // xf_float __floatundixf(du_int a);
9 #ifdef __x86_64__
11 CONST_SECTION
13         .balign 16
14 twop64:
15         .quad 0x43f0000000000000
17 #define REL_ADDR(_a)    (_a)(%rip)
19         .text
21         .balign 4
22 DEFINE_COMPILERRT_FUNCTION(__floatundixf)
23         movq    %rdi,    -8(%rsp)
24         fildq   -8(%rsp)
25         test    %rdi,           %rdi
26         js              1f
27         ret
28 1:      faddl   REL_ADDR(twop64)
29         ret
30 END_COMPILERRT_FUNCTION(__floatundixf)
32 #endif // __x86_64__
35 /* Branch-free implementation is ever so slightly slower, but more beautiful.
36    It is likely superior for inlining, so I kept it around for future reference.
38 #ifdef __x86_64__
40 CONST_SECTION
42         .balign 4
43 twop52:
44         .quad 0x4330000000000000
45 twop84_plus_twop52_neg:
46         .quad 0xc530000000100000
47 twop84:
48         .quad 0x4530000000000000
50 #define REL_ADDR(_a)    (_a)(%rip)
52 .text
53 .balign 4
54 DEFINE_COMPILERRT_FUNCTION(__floatundixf)
55         movl    %edi,                           %esi                    // low 32 bits of input
56         shrq    $32,                            %rdi                    // hi 32 bits of input
57         orq             REL_ADDR(twop84),       %rdi                    // 2^84 + hi (as a double)
58         orq             REL_ADDR(twop52),       %rsi                    // 2^52 + lo (as a double)
59         movq    %rdi,                    -8(%rsp)
60         movq    %rsi,                   -16(%rsp)
61         fldl    REL_ADDR(twop84_plus_twop52_neg)
62         faddl   -8(%rsp)        // hi - 2^52 (as double extended, no rounding occurs)
63         faddl   -16(%rsp)       // hi + lo (as double extended)
64         ret
65 END_COMPILERRT_FUNCTION(__floatundixf)
67 #endif // __x86_64__
71 NO_EXEC_STACK_DIRECTIVE