floatdixf.S 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  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
  4. #include "../assembly.h"
  5. // xf_float __floatdixf(di_int a);
  6. #ifdef __i386__
  7. // This routine has some extra memory traffic, loading the 64-bit input via two
  8. // 32-bit loads, then immediately storing it back to the stack via a single 64-bit
  9. // store. This is to avoid a write-small, read-large stall.
  10. // However, if callers of this routine can be safely assumed to store the argument
  11. // via a 64-bt store, this is unnecessary memory traffic, and should be avoided.
  12. // It can be turned off by defining the TRUST_CALLERS_USE_64_BIT_STORES macro.
  13. .text
  14. .balign 4
  15. DEFINE_COMPILERRT_FUNCTION(__floatdixf)
  16. #ifndef TRUST_CALLERS_USE_64_BIT_STORES
  17. movd 4(%esp), %xmm0
  18. movd 8(%esp), %xmm1
  19. punpckldq %xmm1, %xmm0
  20. movq %xmm0, 4(%esp)
  21. #endif
  22. fildll 4(%esp)
  23. ret
  24. END_COMPILERRT_FUNCTION(__floatdixf)
  25. #endif // __i386__
  26. NO_EXEC_STACK_DIRECTIVE