]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | // This file is dual licensed under the MIT and the University of Illinois Open |
2 | // Source Licenses. See LICENSE.TXT for details. | |
3 | ||
4 | #include "../assembly.h" | |
5 | ||
6 | // float __floatdisf(di_int a); | |
7 | ||
8 | // This routine has some extra memory traffic, loading the 64-bit input via two | |
9 | // 32-bit loads, then immediately storing it back to the stack via a single 64-bit | |
10 | // store. This is to avoid a write-small, read-large stall. | |
11 | // However, if callers of this routine can be safely assumed to store the argument | |
12 | // via a 64-bt store, this is unnecessary memory traffic, and should be avoided. | |
13 | // It can be turned off by defining the TRUST_CALLERS_USE_64_BIT_STORES macro. | |
14 | ||
15 | #ifdef __i386__ | |
16 | ||
17 | .text | |
18 | .align 4 | |
19 | DEFINE_COMPILERRT_FUNCTION(__floatdisf) | |
20 | #ifndef TRUST_CALLERS_USE_64_BIT_STORES | |
21 | movd 4(%esp), %xmm0 | |
22 | movd 8(%esp), %xmm1 | |
23 | punpckldq %xmm1, %xmm0 | |
24 | movq %xmm0, 4(%esp) | |
25 | #endif | |
26 | fildll 4(%esp) | |
27 | fstps 4(%esp) | |
28 | flds 4(%esp) | |
29 | ret | |
30 | ||
31 | #endif // __i386__ |