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