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:
}
