singrdk/base/Kernel/Native/ix64/halmath.asm

296 lines
7.7 KiB
NASM

;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
.code
include hal.inc
IRC_CHOP equ 0c00h ; chop
;;;__declspec(naked) uint16 __fastcall g_ClearFp()
?g_ClearFp@@YAGXZ proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
;;// Save the old SW
fnstsw [esp-4];
fnclex
mov eax, [esp-4];
and eax, 0ffffh;
pop rbp;
ret; // Returns result in EAX
?g_ClearFp@@YAGXZ endp
;;;__declspec(naked) uint16 __fastcall g_ControlFp(uint16 newctrl, uint16 mask)
?g_ControlFp@@YAGGG@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
;;// Save the old CW
fstcw [esp-4];
mov eax, [esp-4];
and eax, 0ffffh;
;;// Load the new CW
and ecx,edx;
not edx;
and edx,eax;
or edx,ecx;
mov [esp-4], edx;
fldcw [esp-4];
pop rbp
ret;
?g_ControlFp@@YAGGG@Z endp
;;;__declspec(naked) void __fastcall g_RestoreFp(uint16 newctrl)
?g_RestoreFp@@YAXG@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
;;// Load the new CW
and ecx, 0ffffh;
mov [esp-4], ecx;
fldcw [esp-4];
pop rbp
ret;
?g_RestoreFp@@YAXG@Z endp
ifdef GARBAGE
;;;static float64 __fastcall _frnd(float64 v)
?_frnd@@YANN@Z PROC frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
frndint;
pop rbp;
ret
?_frnd@@YANN@Z endp
;;;static int32 __fastcall _ftoi(float64 v)
?_ftoi@@YAHN@Z PROC frame
PrologPush rbp
SetFramePointer rbp
.endprolog
ifdef NYI
sub rsp, 24;
;;int32 intval; +0
;;int32 oldcw; +8
;;int32 newcw; +16
fstcw DWORD PTR [rsp+8] ; // get control word
mov eax, r9d; // round mode saved
or eax,; // set chop rounding mode
mov r10d, eax; // back to memory
fldcw r10d; // reset rounding
fld rcx;
fistp r8d; // store chopped integer
fwait;
fldcw r9d; // restore rounding
add rsp, 24
endif
or rax,rax
mov eax,r9d
pop rbp;
ret
?_ftoi@@YAHN@Z endp
;;;float64 Class_System_Math::g_Log(float64 v)
?g_Log@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fldln2;
fxch ST(1);
fyl2x; // Returns result in ST(0)
pop rbp;
ret
?g_Log@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Sin(float64 v)
?g_Sin@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fsin; // Returns result in ST(0)
pop rbp;
ret
?g_Sin@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Cos(float64 v)
?g_Cos@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fcos; // Returns result in ST(0)
pop rbp;
ret
?g_Cos@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Tan(float64 v)
?g_Tan@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fptan;
fstp ST(0); // Returns result in ST(0)
pop rbp;
ret
?g_Tan@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Atan(float64 v)
?g_Atan@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fld1;
fpatan;
pop rbp;
ret
?g_Atan@Class_System_Math@@SANN@Z endp
endif
;;;float64 Class_System_Math::g_Atan2(float64 v, float64 w)
?g_Atan2@Class_System_Math@@SANNN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fld QWORD PTR [rsp +16];
fpatan;
pop rbp;
ret
?g_Atan2@Class_System_Math@@SANNN@Z endp
;;;float64 Class_System_Math::g_Abs(float64 v)
?g_Abs@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fabs;
pop rbp
ret
?g_Abs@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Sqrt(float64 v)
?g_Sqrt@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fsqrt;
pop rbp;
ret
?g_Sqrt@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Log10(float64 v)
?g_Log10@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld QWORD PTR [rsp +8];
fldlg2;
fxch ST(1);
fyl2x; // Returns result in ST(0)
pop rbp;
ret
?g_Log10@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Exp(float64 v)
?g_Exp@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fldl2e;
fmul QWORD PTR [rsp +8];
fld ST(0);
frndint;
fxch ST(1);
fsub ST(0), ST(1);
f2xm1;
fld1;
faddp ST(1), ST(0);
fscale;
fstp ST(1); // Returns result in ST(0)
pop rbp;
ret
?g_Exp@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Acos(float64 v)
?g_Acos@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld real8 PTR [rsp+8] ;
fld1; // load 1.0
fadd st, st(1); // 1+x
fld1; // load 1.0
fsub st, st(2); // 1-x
fmul; // (1+x)(1-x)
fsqrt; // sqrt((1+x)(1-x))
fxch;
fpatan; // fpatan(x,sqrt((1+x)(1-x)))
pop rbp;
ret
?g_Acos@Class_System_Math@@SANN@Z endp
;;;float64 Class_System_Math::g_Asin(float64 v)
?g_Asin@Class_System_Math@@SANN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
fld real8 PTR [rsp+8] ;
fld1; // load 1.0
fadd st, st(1); // 1+x
fld1; // load 1.0
fsub st, st(2); // 1-x
fmul; // (1+x)(1-x)
fsqrt; // sqrt((1+x)(1-x))
fpatan; // fpatan(x,sqrt((1+x)(1-x)))
pop rbp;
ret
?g_Asin@Class_System_Math@@SANN@Z endp
;;;static float64 _fastpow(float64 v, float64 w)
?g_Pow@Class_System_Math@@SANNN@Z proc frame
PrologPush rbp
SetFramePointer rbp
.endprolog
;;fld w; // neither v or w can be a boundary cases.
;;fld v;
fld real8 PTR [rsp+16] ;
fld real8 PTR [rsp+8] ;
fyl2x; // compute y*log2(x)
fld st(0); // duplicate stack top
frndint; // N = round(y)
fsubr st(1), st;
fxch;
fchs; // g = y - N where abs(g) < 1
f2xm1; // 2**g - 1
fld1;
fadd; // 2**g
fscale; // (2**g) * (2**N) - gives 2**y
fstp st(1); // pop extra stuff from fp stack
pop rbp;
ret
?g_Pow@Class_System_Math@@SANNN@Z endp
end