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