2010-07-21 16:03:44 +00:00
|
|
|
/*
|
2021-05-29 17:40:30 +00:00
|
|
|
* PROJECT: ReactOS CRT library
|
|
|
|
* LICENSE: MIT (https://spdx.org/licenses/MIT)
|
|
|
|
* PURPOSE: x64 asm implementation of fabs
|
|
|
|
* COPYRIGHT: Copyright 2021 Timo Kreuzer <timo.kreuzer@reactos.org>
|
2010-07-21 16:03:44 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2010-11-27 22:12:15 +00:00
|
|
|
#include <asm.inc>
|
2010-07-21 16:03:44 +00:00
|
|
|
|
2011-02-10 10:30:43 +00:00
|
|
|
/* CODE **********************************************************************/
|
2010-07-21 16:03:44 +00:00
|
|
|
.code64
|
|
|
|
|
2021-02-01 18:53:13 +00:00
|
|
|
#ifdef _USE_ML
|
2021-05-29 17:40:30 +00:00
|
|
|
/* fabs is not allowed as label name, so create _fabs instead and alias fabs to it */
|
|
|
|
ALIAS <fabs> = <_fabs>
|
2011-02-10 10:30:43 +00:00
|
|
|
PUBLIC _fabs
|
|
|
|
_fabs:
|
2021-02-01 18:53:13 +00:00
|
|
|
#else
|
|
|
|
PUBLIC fabs
|
|
|
|
fabs:
|
|
|
|
#endif
|
2021-05-29 17:40:30 +00:00
|
|
|
/* Copy parameter into rcx */
|
|
|
|
#if !defined(_MSC_VER) || (_MSC_VER >= 1916)
|
|
|
|
movq rcx, xmm0
|
|
|
|
#else
|
|
|
|
/* Old ML64 version does not understand this form of movq and uses movd instead */
|
|
|
|
movd rcx, xmm0
|
|
|
|
#endif
|
2010-07-21 16:03:44 +00:00
|
|
|
|
2021-05-29 17:40:30 +00:00
|
|
|
/* Copy into rax */
|
|
|
|
mov rax, rcx
|
|
|
|
|
|
|
|
/* Clear sign bit in rax */
|
|
|
|
btr rax, 63
|
|
|
|
|
|
|
|
/* Check for NAN */
|
|
|
|
mov r8, HEX(7FF0000000000000)
|
|
|
|
cmp rax, r8
|
|
|
|
|
|
|
|
/* If it is NAN, copy original value back to rax */
|
|
|
|
cmova rax, rcx
|
|
|
|
|
|
|
|
#if !defined(_MSC_VER) || (_MSC_VER >= 1916)
|
|
|
|
movq xmm0, rax
|
|
|
|
#else
|
|
|
|
/* Old ML64 version does not understand this form of movq and uses movd instead */
|
|
|
|
movd xmm0, rax
|
2011-06-27 10:50:09 +00:00
|
|
|
#endif
|
|
|
|
|
2021-05-29 17:40:30 +00:00
|
|
|
ret
|
|
|
|
|
2011-02-10 10:30:43 +00:00
|
|
|
END
|