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
}