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