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 }