asm {
//************************************
CMP_TEMPLATES::
DU32 @@05,@@10,@@15,@@25,@@30,
@@35,@@40,@@45,@@55,@@60,
@@75,@@80,@@85,@@90,@@95,
@@100,@@105,@@110,@@120,@@130;
@@05: //INC
PUSH RAX
FLD1
FADD ST0,U64 [RSP]
FSTP U64 [RSP]
POP RAX
@@10: //DEC
PUSH RAX
FLD1
FSUBR ST0,U64 [RSP]
FSTP U64 [RSP]
POP RAX
@@15: //MOD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U64 [RBX]
FLD U64 8[RBX]
@@20: FPREM
FSTSW
TEST AX,0x400
JNZ @@20
FSTP U64 [RBX]
FFREE ST0
FINCSTP
POP RAX
ADD RSP,8
@@25: //LESS
PUSH RDX
PUSH RAX
FLD U64 [RSP]
FLD U64 8[RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@30: //GREATER
PUSH RDX
PUSH RAX
FLD U64 8[RSP]
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@35: //LESS_EQU
PUSH RDX
PUSH RAX
FLD U64 8[RSP]
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@40: //GREATER_EQU
PUSH RDX
PUSH RAX
FLD U64 [RSP]
FLD U64 8[RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@45: //StrLen
MOV RDX,RAX
@@50: MOV BL,U8 [RAX]
INC RAX
TEST BL,BL
JNZ @@50
SUB RAX,RDX
DEC RAX
@@55: //RDTSC
RDTSC
SHL RDX,32
ADD RAX,RDX
@@60: //SignI64
TEST RAX,RAX
JZ @@70
JS @@65
MOV RAX,1
JMP @@70
@@65: MOV RAX,-1
@@70:
@@75:
@@80:
@@85: //Sqr
PUSH RAX
FLD U64 [RSP]
FMUL ST0,ST0
FSTP U64 [RSP]
POP RAX
@@90: //Abs
PUSH RAX
FLD U64 [RSP]
FABS
FSTP U64 [RSP]
POP RAX
@@95: //Sqrt
PUSH RAX
FLD U64 [RSP]
FSQRT
FSTP U64 [RSP]
POP RAX
@@100: //Sin
PUSH RAX
FLD U64 [RSP]
FSIN
FSTP U64 [RSP]
POP RAX
@@105: //Cos
PUSH RAX
FLD U64 [RSP]
FCOS
FSTP U64 [RSP]
POP RAX
@@110: //Tan
PUSH RAX
FLD U64 [RSP]
@@115: FPTAN
FSTSW
TEST AX,0x400
JNZ @@115
FFREE ST0
FINCSTP
FSTP U64 [RSP]
POP RAX
@@120: //Atan
PUSH RAX
FLD U64 [RSP]
FLD1
@@125: FPATAN
FSTSW
TEST AX,0x400
JNZ @@125
FSTP U64 [RSP]
POP RAX
@@130:
//************************************
CMP_TEMPLATES_DONT_POP::
DU32 @@05,@@10,@@15,@@20,@@25,
@@30,@@35,@@40,@@45,@@50,
@@55,@@60,@@65,@@70,@@75,
@@80,@@85,@@90,@@100,@@110;
@@05: //INC
PUSH RAX
FLD1
FADD ST0,U64 [RSP]
FST U64 [RSP]
POP RAX
@@10: //DEC
PUSH RAX
FLD1
FSUBR ST0,U64 [RSP]
FST U64 [RSP]
POP RAX
@@15:
@@20:
@@25:
@@30:
@@35:
@@40:
@@45:
@@50:
@@55:
@@60:
PUSH RAX
FLD U64 [RSP]
ADD RSP,8
@@65: //Sqr
PUSH RAX
FLD U64 [RSP]
FMUL ST0,ST0
ADD RSP,8
@@70: //Abs
PUSH RAX
FLD U64 [RSP]
FABS
ADD RSP,8
@@75: //Sqrt
PUSH RAX
FLD U64 [RSP]
FSQRT
ADD RSP,8
@@80: //Sin
PUSH RAX
FLD U64 [RSP]
FSIN
ADD RSP,8
@@85: //Cos
PUSH RAX
FLD U64 [RSP]
FCOS
ADD RSP,8
@@90: //Tan
PUSH RAX
FLD U64 [RSP]
@@95: FPTAN
FSTSW
TEST AX,0x400
JNZ @@95
FFREE ST0
FINCSTP
ADD RSP,8
@@100: //Atan
PUSH RAX
FLD U64 [RSP]
FLD1
@@105: FPATAN
FSTSW
TEST AX,0x400
JNZ @@105
ADD RSP,8
@@110:
//************************************
CMP_TEMPLATES_DONT_PUSH::
DU32 @@05,@@10,@@15,@@20,@@30,
@@35,@@40,@@50,@@55,@@60,
@@65,@@70,@@75,@@80,@@85,
@@90,@@95,@@100,@@110,@@120;
@@05: //INC
SUB RSP,8
FLD1
FADDP ST1,ST0
FSTP U64 [RSP]
POP RAX
@@10: //DEC
SUB RSP,8
FLD1
FSUBP ST1,ST0
FSTP U64 [RSP]
POP RAX
@@15:
@@20: //LESS
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
JZ @@25
MOV RAX,1
SBB RAX,0
@@25: FFREE ST0
FINCSTP
ADD RSP,8
@@30: //GREATER
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@35: //LESS_EQU
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@40: //GREATER_EQU
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
JZ @@45
MOV RAX,0
ADC RAX,0
@@45: FFREE ST0
FINCSTP
ADD RSP,8
@@50:
@@55:
@@60:
@@65: //FSTP
SUB RSP,8
FSTP U64 [RSP]
POP RAX
@@70:
@@75: //Sqr
SUB RSP,8
FMUL ST0,ST0
FSTP U64 [RSP]
POP RAX
@@80: //Abs
SUB RSP,8
FABS
FSTP U64 [RSP]
POP RAX
@@85: //Sqrt
SUB RSP,8
FSQRT
FSTP U64 [RSP]
POP RAX
@@90: //Sin
SUB RSP,8
FSIN
FSTP U64 [RSP]
POP RAX
@@95: //Cos
SUB RSP,8
FCOS
FSTP U64 [RSP]
POP RAX
@@100: //Tan
SUB RSP,8
@@105: FPTAN
FSTSW
TEST AX,0x400
JNZ @@105
FFREE ST0
FINCSTP
FSTP U64 [RSP]
POP RAX
@@110: //Atan
SUB RSP,8
FLD1
@@115: FPATAN
FSTSW
TEST AX,0x400
JNZ @@115
FSTP U64 [RSP]
POP RAX
@@120:
//************************************
CMP_TEMPLATES_DONT_PUSH_POP::
DU32 @@05,@@10,@@15,@@20,@@25,
@@30,@@35,@@40,@@45,@@50,
@@55,@@60,@@65,@@70,@@75,
@@80,@@85,@@90,@@95,@@105;
@@05: //INC
SUB RSP,8
FLD1
FADDP ST1,ST0
FST U64 [RSP]
POP RAX
@@10: //DEC
SUB RSP,8
FLD1
FSUBP ST1,ST0
FST U64 [RSP]
POP RAX
@@15:
@@20:
@@25:
@@30:
@@35:
@@40:
@@45:
@@50:
@@55:
@@60:
@@65: //Sqr
FMUL ST0,ST0
@@70: //Abs
FABS
@@75: //Sqrt
FSQRT
@@80: //Sin
FSIN
@@85: //Cos
FCOS
@@90: //Tan
FPTAN
FSTSW
TEST AX,0x400
JNZ @@90
FFREE ST0
FINCSTP
@@95: //Atan
FLD1
@@100: FPATAN
FSTSW
TEST AX,0x400
JNZ @@100
@@105:
//************************************
CMP_TEMPLATES_DONT_PUSH2::
DU32 @@05,@@10,@@15,@@20,@@25,
@@35,@@45,@@50,@@55,@@60,
@@65,@@70,@@75,@@80,@@85,
@@90,@@95,@@100,@@105,@@110;
@@05:
@@10:
@@15:
@@20: //LESS
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@25: //GREATER
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
JZ @@30
MOV RAX,1
SBB RAX,0
@@30: FFREE ST0
FINCSTP
ADD RSP,8
@@35: //LESS_EQU
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
JZ @@40
MOV RAX,0
ADC RAX,0
@@40: FFREE ST0
FINCSTP
ADD RSP,8
@@45: //GREATER_EQU
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@50:
@@55:
@@60:
@@65:
@@70:
@@75:
@@80:
@@85:
@@90:
@@95:
@@100:
@@105:
@@110:
}