reactos/sdk/lib/crt/math/amd64/ceil.S

56 lines
1.2 KiB
ArmAsm

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* PURPOSE: Implementation of ceil
* FILE: lib/sdk/crt/math/amd64/ceil.S
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include <asm.inc>
#include <ksamd64.inc>
/* CODE **********************************************************************/
.code64
/* ceil(x) = - floor(-x)
*/
PUBLIC ceil
.PROC ceil
sub rsp, 16
.ENDPROLOG
/* Duplicate the bits into rax */
movd rax, xmm0
/* Invert the sign bit */
rol rax, 1
xor al, 1
ror rax, 1
/* Copy back to xmm0 */
movd xmm0, rax
/* Truncate xmm0 to integer (double precision) */
cvttsd2si rcx, xmm0
/* Shift all bits to the right, keeping the sign bit */
shr rax, 63
/* Substract the sign bit from the truncated value, so that
we get the correct result for negative values. */
sub rcx, rax
/* Now compensate for the previous negation */
neg rcx
/* Convert the result back to xmm0 (double precision) */
cvtsi2sd xmm0, rcx
add rsp, 16
ret
.ENDP
END