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
}