asm {
USE64
//************************************
_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	RDX,U64 SF_ARG1[RBP]
	MOV	RBX,U64 SF_ARG2[RBP]
	MOV	RAX,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	RDX,U64 SF_ARG1[RBP]
	MOV	RBX,U64 SF_ARG2[RBP]
	MOV	RAX,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	RDX,U64 SF_ARG1[RBP]
	MOV	RBX,U64 SF_ARG2[RBP]
	MOV	RAX,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	RBX,U64 SF_ARG2[RBP]
	MOV	RAX,U64 SF_ARG3[RBP]
	FLD	U64 SF_ARG1[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	RBX,U64 SF_ARG2[RBP]
	MOV	RAX,U64 SF_ARG3[RBP]
	FLD	U64 SF_ARG1[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	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
	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
//************************************
_FXSAVE::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,U64 SF_ARG1[RBP]
	FXSAVE	U64 [RAX]
	POP	RBP
	RET1	8
//************************************
_FXRSTOR::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,U64 SF_ARG1[RBP]
	FXRSTOR	U64 [RAX]
	POP	RBP
	RET1	8
}
