ZealOS/src/Kernel/KMathA.ZC
TomAwezome 3a33e6baaf Rename CosmiC to ZealC.
Rename all .CC files to .ZC extension.
2021-12-11 06:21:22 -05:00

684 lines
13 KiB
HolyC
Executable file

asm {
//************************************
_D3_NORM::
PUSH RBP
MOV RBP, RSP
MOV RDX, U64 SF_ARG1[RBP]
FLD U64 [RDX]
FMUL ST0, ST0
FLD U64 8[RDX]
FMUL ST0, ST0
FADDP ST1, ST0
FLD U64 16[RDX]
FMUL ST0, ST0
FADDP ST1, ST0
FSQRT
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_D3_NORM_SQR::
PUSH RBP
MOV RBP, RSP
MOV RDX, U64 SF_ARG1[RBP]
FLD U64 [RDX]
FMUL ST0, ST0
FLD U64 8[RDX]
FMUL ST0, ST0
FADDP ST1, ST0
FLD U64 16[RDX]
FMUL ST0, ST0
FADDP ST1, ST0
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_D3_DIST::
PUSH RBP
MOV RBP, RSP
MOV RDX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 [RDX]
FSUB ST0, U64 [RBX]
FMUL ST0, ST0
FLD U64 8[RDX]
FSUB ST0, U64 8[RBX]
FMUL ST0, ST0
FADDP ST1, ST0
FLD U64 16[RDX]
FSUB ST0, U64 16[RBX]
FMUL ST0, ST0
FADDP ST1, ST0
FSQRT
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 16
//************************************
_D3_DIST_SQR::
PUSH RBP
MOV RBP, RSP
MOV RDX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 [RDX]
FSUB ST0, U64 [RBX]
FMUL ST0, ST0
FLD U64 8[RDX]
FSUB ST0, U64 8[RBX]
FMUL ST0, ST0
FADDP ST1, ST0
FLD U64 16[RDX]
FSUB ST0, U64 16[RBX]
FMUL ST0, ST0
FADDP ST1, ST0
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 16
//************************************
_D3_CROSS::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RDX, U64 SF_ARG2[RBP]
MOV RBX, U64 SF_ARG3[RBP]
FLD U64 8[RDX]
FMUL ST0, U64 16[RBX]
FLD U64 16[RDX]
FMUL ST0, U64 8[RBX]
FSUBP ST1, ST0
FSTP U64 [RAX]
FLD U64 [RDX]
FMUL ST0, U64 16[RBX]
FLD U64 16[RDX]
FMUL ST0, U64 [RBX]
FSUBRP ST1, ST0
FSTP U64 8[RAX]
FLD U64 [RDX]
FMUL ST0, U64 8[RBX]
FLD U64 8[RDX]
FMUL ST0, U64 [RBX]
FSUBP ST1, ST0
FSTP U64 16[RAX]
POP RBP
RET1 24
//************************************
_D3_DOT::
PUSH RBP
MOV RBP, RSP
MOV RDX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 [RDX]
FMUL ST0, U64 [RBX]
FLD U64 8[RDX]
FMUL ST0, U64 8[RBX]
FADDP ST1, ST0
FLD U64 16[RDX]
FMUL ST0, U64 16[RBX]
FADDP ST1, ST0
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 16
//************************************
_D3_ADD::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RDX, U64 SF_ARG2[RBP]
MOV RBX, U64 SF_ARG3[RBP]
FLD U64 [RDX]
FADD ST0, U64 [RBX]
FSTP U64 [RAX]
FLD U64 8[RDX]
FADD ST0, U64 8[RBX]
FSTP U64 8[RAX]
FLD U64 16[RDX]
FADD ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 24
//************************************
_D3_SUB::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RDX, U64 SF_ARG2[RBP]
MOV RBX, U64 SF_ARG3[RBP]
FLD U64 [RDX]
FSUB ST0, U64 [RBX]
FSTP U64 [RAX]
FLD U64 8[RDX]
FSUB ST0, U64 8[RBX]
FSTP U64 8[RAX]
FLD U64 16[RDX]
FSUB ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 24
//************************************
_D3_MUL::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG3[RBP]
FLD U64 SF_ARG2[RBP]
FLD ST0
FMUL ST0, U64 [RBX]
FSTP U64 [RAX]
FLD ST0
FMUL ST0, U64 8[RBX]
FSTP U64 8[RAX]
FMUL ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 24
//************************************
_D3_DIV::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 SF_ARG3[RBP]
FLD ST0
FDIVR ST0, U64 [RBX]
FSTP U64 [RAX]
FLD ST0
FDIVR ST0, U64 8[RBX]
FSTP U64 8[RAX]
FDIVR ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 24
//************************************
_D3_ZERO::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
XOR RDX, RDX
MOV U64 [RAX], RDX
MOV U64 8[RAX], RDX
MOV U64 16[RAX], RDX
POP RBP
RET1 8
//************************************
_D3_COPY::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
MOV RDX, U64 [RBX]
MOV U64 [RAX], RDX
MOV RDX, U64 8[RBX]
MOV U64 8[RAX], RDX
MOV RDX, U64 16[RBX]
MOV U64 16[RAX], RDX
POP RBP
RET1 16
//************************************
_D3_EQU::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RDX, U64 SF_ARG2[RBP]
MOV U64 [RAX], RDX
MOV RDX, U64 SF_ARG3[RBP]
MOV U64 8[RAX], RDX
MOV RDX, U64 SF_ARG4[RBP]
MOV U64 16[RAX], RDX
POP RBP
RET1 32
//************************************
_D3_ADD_EQU::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 [RAX]
FADD ST0, U64 [RBX]
FSTP U64 [RAX]
FLD U64 8[RAX]
FADD ST0, U64 8[RBX]
FSTP U64 8[RAX]
FLD U64 16[RAX]
FADD ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 16
//************************************
_D3_SUB_EQU::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
MOV RBX, U64 SF_ARG2[RBP]
FLD U64 [RAX]
FSUB ST0, U64 [RBX]
FSTP U64 [RAX]
FLD U64 8[RAX]
FSUB ST0, U64 8[RBX]
FSTP U64 8[RAX]
FLD U64 16[RAX]
FSUB ST0, U64 16[RBX]
FSTP U64 16[RAX]
POP RBP
RET1 16
//************************************
_D3_MUL_EQU::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
FLD U64 SF_ARG2[RBP]
FLD ST0
FMUL ST0, U64 [RAX]
FSTP U64 [RAX]
FLD ST0
FMUL ST0, U64 8[RAX]
FSTP U64 8[RAX]
FMUL ST0, U64 16[RAX]
FSTP U64 16[RAX]
POP RBP
RET1 16
//************************************
_D3_DIV_EQU::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
FLD U64 SF_ARG2[RBP]
FLD ST0
FDIVR ST0, U64 [RAX]
FSTP U64 [RAX]
FLD ST0
FDIVR ST0, U64 8[RAX]
FSTP U64 8[RAX]
FDIVR ST0, U64 16[RAX]
FSTP U64 16[RAX]
POP RBP
RET1 16
//************************************
_D3_UNIT::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG1[RBP]
FLD U64 [RAX]
FMUL ST0, ST0
FLD U64 8[RAX]
FMUL ST0, ST0
FADDP ST1, ST0
FLD U64 16[RAX]
FMUL ST0, ST0
FADDP ST1, ST0
FSQRT
FST U64 SF_ARG1[RBP]
MOV RBX, SF_ARG1[RBP]
TEST RBX, RBX
JZ @@05
FLD ST0
FDIVR ST0, U64 [RAX]
FSTP U64 [RAX]
FLD ST0
FDIVR ST0, U64 8[RAX]
FSTP U64 8[RAX]
FDIVR ST0, U64 16[RAX]
FSTP U64 16[RAX]
POP RBP
RET1 8
@@05: FFREE ST0
FINCSTP
POP RBP
RET1 8
//************************************
_SQR::
PUSH RBP
MOV RBP, RSP
FLD U64 SF_ARG1[RBP]
FMUL ST0, ST0
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_SIGN::
PUSH RBP
MOV RBP, RSP
FLD U64 SF_ARG1[RBP]
FTST
FSTSW
FFREE ST0
FINCSTP
MOV RDX, RAX
XOR RAX, RAX
BT RDX, 14
JC @@05
MOV RAX, 1.0
BT RDX, 8
JNC @@05
MOV RAX, -1.0
@@05: POP RBP
RET1 8
//************************************
_ARG::
PUSH RBP
MOV RBP, RSP
FLD U64 SF_ARG2[RBP]
FLD U64 SF_ARG1[RBP]
@@05: FPATAN
FSTSW
TEST AX, 0x400
JNZ @@05
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 16
//************************************
_ROUND::
PUSH RBP
MOV RBP, RSP
SUB RSP, 8
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
AND AX,~0x0C00
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLD U64 SF_ARG1[RBP]
FRNDINT
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
FLDCW U16 -6[RBP]
LEAVE
RET1 8
//************************************
_TRUNC::
PUSH RBP
MOV RBP, RSP
SUB RSP, 8
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
OR AX, 0x0C00
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLD U64 SF_ARG1[RBP]
FRNDINT
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
FLDCW U16 -6[RBP]
LEAVE
RET1 8
//************************************
_FLOOR::
PUSH RBP
MOV RBP, RSP
SUB RSP, 8
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
AND AX, ~0x0C00
OR AX, 0x0400
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLD U64 SF_ARG1[RBP]
FRNDINT
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
FLDCW U16 -6[RBP]
LEAVE
RET1 8
//************************************
_CEIL::
PUSH RBP
MOV RBP, RSP
SUB RSP, 8
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
AND AX, ~0x0C00
OR AX, 0x0800
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLD U64 SF_ARG1[RBP]
FRNDINT
FSTP U64 SF_ARG1[RBP]
MOV RAX, SF_ARG1[RBP]
FLDCW U16 -6[RBP]
LEAVE
RET1 8
//************************************
SYS_POW::
// RAX=RDX`RAX
PUSH RBP
MOV RBP, RSP
SUB RSP, 24
TEST RAX, RAX //To power of zero?
JNZ @@05
MOV RAX, 1.0
JMP @@20
@@05: TEST RDX, RDX //zero to a power?
JNZ @@10
XOR RAX, RAX
JMP @@20
@@10: MOV RCX, RAX //RCX=pow
MOV U64 -8[RBP], RDX
MOV U64 -16[RBP], RAX
FSTCW U16 -24[RBP]
MOV AX, U16 -24[RBP]
MOV U16 -22[RBP], AX
OR AX, 0x0C00
MOV U16 -24[RBP], AX
FLDCW U16 -24[RBP]
FLD U64 -16[RBP]
FLD U64 -8[RBP]
FABS //base should be pos
FYL2X // y*log2(x)
FST U64 -8[RBP]
FRNDINT
FLD U64 -8[RBP]
FSUBRP ST1, ST0
F2XM1
FLD1
FADDP ST1, ST0
FSTP U64 -16[RBP]
FLD U64 -8[RBP]
FLD U64 -16[RBP]
FSCALE // ST0<<ST1
TEST RDX, RDX //was base neg?
JGE @@15
MOV U64 -16[RBP], RCX
FLD U64 -16[RBP]
FISTTP U64 -16[RBP]
TEST U64 -16[RBP], 1
JZ @@15 //was pow odd?
FCHS
@@15: FSTP U64 -8[RBP]
FFREE ST0
FINCSTP
FLDCW U16 -22[RBP]
MOV RAX, U64 -8[RBP]
@@20: LEAVE
RET
//************************************
_POW::
PUSH RBP
MOV RBP, RSP
MOV RAX, U64 SF_ARG2[RBP]
MOV RDX, U64 SF_ARG1[RBP]
CALL SYS_POW
POP RBP
RET1 16
//************************************
_POW10::
PUSH RBP
MOV RBP, RSP
SUB RSP, 16
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
OR AX, 0x0C00
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLDL2T
FLD U64 SF_ARG1[RBP]
FMULP ST1, ST0
FST U64 SF_ARG1[RBP]
FRNDINT
FLD U64 SF_ARG1[RBP]
FSUBRP ST1, ST0
F2XM1
FLD1
FADDP ST1, ST0
FSTP U64 -16[RBP]
FLD U64 SF_ARG1[RBP]
FLD U64 -16[RBP]
FSCALE // ST0<<ST1
FSTP U64 -16[RBP]
FFREE ST0
FINCSTP
FLDCW U16 -6[RBP]
MOV RAX, U64 -16[RBP]
LEAVE
RET1 8
//************************************
_EXP::
PUSH RBP
MOV RBP, RSP
SUB RSP, 16
FSTCW U16 -8[RBP]
MOV AX, U16 -8[RBP]
MOV U16 -6[RBP], AX
OR AX, 0x0C00
MOV U16 -8[RBP], AX
FLDCW U16 -8[RBP]
FLDL2E
FLD U64 SF_ARG1[RBP]
FMULP ST1, ST0
FST U64 SF_ARG1[RBP]
FRNDINT
FLD U64 SF_ARG1[RBP]
FSUBRP ST1, ST0
F2XM1
FLD1
FADDP ST1, ST0
FSTP U64 -16[RBP]
FLD U64 SF_ARG1[RBP]
FLD U64 -16[RBP]
FSCALE // ST0<<ST1
FSTP U64 -16[RBP]
FFREE ST0
FINCSTP
FLDCW U16 -6[RBP]
MOV RAX, U64 -16[RBP]
LEAVE
RET1 8
//************************************
_LOG10::
PUSH RBP
MOV RBP, RSP
FLDLG2
FLD U64 SF_ARG1[RBP]
FYL2X // y*log2(x)
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_LOG2::
PUSH RBP
MOV RBP, RSP
FLD1
FLD U64 SF_ARG1[RBP]
FYL2X // y*log2(x)
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_LN::
PUSH RBP
MOV RBP, RSP
FLDLN2
FLD U64 SF_ARG1[RBP]
FYL2X // y*log2(x)
FSTP U64 SF_ARG1[RBP]
MOV RAX, U64 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_FLDCW::
PUSH RBP
MOV RBP, RSP
FLDCW U16 SF_ARG1[RBP]
POP RBP
RET1 8
//************************************
_FSTCW::
PUSH RBP
MOV RBP, RSP
SUB RSP, 8
FSTCW U16 -8[RBP]
MOVZX RAX, U16 -8[RBP]
LEAVE
RET
//************************************
_FSTSW::
XOR RAX, RAX
FSTSW
RET
//************************************
_FCLEX::
FCLEX
RET
}