#help_index "Compiler/Internal"
//Intermediate compiler codes
#define IS_0_ARG                0
#define IS_1_ARG                1
#define IS_2_ARG                2
#define IS_V_ARG                3 //Variable Arg Count

#define IST_NULL                0
#define IST_DEREF               1
#define IST_ASSIGN              2
#define IST_CMP                 3
 
class CIntermediateStruct
{
        U8               arg_count, res_count, type;
        Bool     fpop, not_const, pad[3];
        U8              *name;
};

#define IC_END                                  0x00
#define IC_NOP1                                 0x01
#define IC_END_EXP                              0x02
#define IC_NOP2                                 0x03
#define IC_LABEL                                0x04
#define IC_CALL_START                   0x05
#define IC_CALL_END                     0x06
#define IC_CALL_END2                    0x07
#define IC_RETURN_VAL                   0x08
#define IC_RETURN_VAL2                  0x09
#define IC_IMM_I64                              0x0A
#define IC_IMM_F64                              0x0B
#define IC_STR_CONST                    0x0C
#define IC_ABS_ADDR                     0x0D
#define IC_ADDR_IMPORT                  0x0E
#define IC_HEAP_GLOBAL                  0x0F
#define IC_SIZEOF                               0x10
#define IC_TYPE                                 0x11
#define IC_GET_LABEL                    0x12
#define IC_RBP                                  0x13
#define IC_REG                                  0x14
#define IC_FS                                   0x15
#define IC_MOV_FS                               0x16
#define IC_GS                                   0x17
#define IC_MOV_GS                               0x18

#define IC_LEA                                  0x19
#define IC_MOV                                  0x1A

#define IC_TO_I64                               0x1B
#define IC_TO_F64                               0x1C
#define IC_TO_BOOL                              0x1D
#define IC_TOUPPER                              0x1E
#define IC_HOLYC_TYPECAST               0x1F

#define IC_ADDR                                 0x20
#define IC_COM                                  0x21
#define IC_NOT                                  0x22
#define IC_UNARY_MINUS                  0x23

#define IC_DEREF                                0x24
#define IC_DEREF_PP                     0x25
#define IC_DEREF_MM                     0x26
#define IC__PP                                  0x27
#define IC__MM                                  0x28
#define IC_PP_                                  0x29
#define IC_MM_                                  0x2A

#define IC_SHL                                  0x2B
#define IC_SHR                                  0x2C
#define IC_SHL_CONST                    0x2D
#define IC_SHR_CONST                    0x2E
#define IC_POWER                                0x2F

#define IC_MUL                                  0x30
#define IC_DIV                                  0x31
#define IC_MOD                                  0x32

#define IC_AND                                  0x33

#define IC_OR                                   0x34
#define IC_XOR                                  0x35

#define IC_ADD                                  0x36
#define IC_SUB                                  0x37
#define IC_ADD_CONST                    0x38
#define IC_SUB_CONST                    0x39

#define IC_EQU_EQU                              0x3A
#define IC_NOT_EQU                              0x3B
#define IC_LESS                                 0x3C
#define IC_GREATER_EQU                  0x3D
#define IC_GREATER                              0x3E
#define IC_LESS_EQU                     0x3F
#define IC_PUSH_CMP                     0x40

#define IC_AND_AND                              0x41

#define IC_OR_OR                                0x42
#define IC_XOR_XOR                              0x43

#define IC_ASSIGN                               0x44
#define IC_ASSIGN_PP                    0x45
#define IC_ASSIGN_MM                    0x46

#define IC_SHL_EQU                              0x47
#define IC_SHR_EQU                              0x48
#define IC_MUL_EQU                              0x49
#define IC_DIV_EQU                              0x4A
#define IC_MOD_EQU                              0x4B
#define IC_AND_EQU                              0x4C
#define IC_OR_EQU                               0x4D
#define IC_XOR_EQU                              0x4E
#define IC_ADD_EQU                              0x4F
#define IC_SUB_EQU                              0x50

#define IC_JMP                                  0x51
#define IC_SUB_CALL                     0x52
#define IC_SWITCH                               0x53
#define IC_NOBOUND_SWITCH               0x54

#define IC_ADD_RSP                              0x55
#define IC_ADD_RSP1                     0x56
#define IC_ENTER                                0x57
#define IC_PUSH_REGS                    0x58
#define IC_POP_REGS                     0x59
#define IC_LEAVE                                0x5A
#define IC_RET                                  0x5B

#define IC_CALL                                 0x5C
#define IC_CALL_INDIRECT                0x5D
#define IC_CALL_INDIRECT2               0x5E
#define IC_CALL_IMPORT                  0x5F
#define IC_CALL_EXTERN                  0x60

#define IC_ASM                                  0x61
#define IC_PUSH                                 0x62
#define IC_POP                                  0x63

#define IC_CLFLUSH                              0x64
#define IC_INVLPG                               0x65

#define IC_IN_U8                                0x66
#define IC_IN_U16                               0x67
#define IC_IN_U32                               0x68
#define IC_OUT_U8                               0x69
#define IC_OUT_U16                              0x6A
#define IC_OUT_U32                              0x6B

#define IC_RFLAGS_GET                   0x6C
#define IC_CARRY                                0x6D
#define IC_RFLAGS_SET                   0x6E
#define IC_RAX_GET                              0x6F
#define IC_RAX_SET                              0x70
#define IC_RBP_GET                              0x71
#define IC_RBP_SET                              0x72
#define IC_RSP_GET                              0x73
#define IC_RSP_SET                              0x74
#define IC_RIP                                  0x75

#define IC_RDTSC                                0x76

#define IC_BT                                   0x77
#define IC_BTS                                  0x78
#define IC_BTR                                  0x79
#define IC_BTC                                  0x7A
#define IC_LBTS                                 0x7B
#define IC_LBTR                                 0x7C
#define IC_LBTC                                 0x7D
#define IC_BSF                                  0x7E
#define IC_BSR                                  0x7F

#define IC_QUEUE_INIT                   0x80
#define IC_QUEUE_INSERT                 0x81
#define IC_QUEUE_INSERT_REV     0x82
#define IC_QUEUE_REMOVE                 0x83

#define IC_STRLEN                               0x84

#define IC_BR_ZERO                              0x85
#define IC_BR_NOT_ZERO                  0x86
#define IC_BR_CARRY                     0x87
#define IC_BR_NOT_CARRY                 0x88

#define IC_BR_EQU_EQU                   0x89
#define IC_BR_NOT_EQU                   0x8A
#define IC_BR_LESS                              0x8B
#define IC_BR_GREATER_EQU               0x8C
#define IC_BR_GREATER                   0x8D
#define IC_BR_LESS_EQU                  0x8E

#define IC_BR_EQU_EQU2                  0x8F
#define IC_BR_NOT_EQU2                  0x90
#define IC_BR_LESS2                     0x91
#define IC_BR_GREATER_EQU2              0x92
#define IC_BR_GREATER2                  0x93
#define IC_BR_LESS_EQU2                 0x94

#define IC_BR_AND_ZERO                  0x95
#define IC_BR_AND_NOT_ZERO              0x96
#define IC_BR_MM_ZERO                   0x97
#define IC_BR_MM_NOT_ZERO               0x98
#define IC_BR_AND_AND_ZERO              0x99
#define IC_BR_AND_AND_NOT_ZERO  0x9A
#define IC_BR_OR_OR_ZERO                0x9B
#define IC_BR_OR_OR_NOT_ZERO    0x9C

#define IC_BR_BT                                0x9D
#define IC_BR_BTS                               0x9E
#define IC_BR_BTR                               0x9F
#define IC_BR_BTC                               0xA0
#define IC_BR_NOT_BT                    0xA1
#define IC_BR_NOT_BTS                   0xA2
#define IC_BR_NOT_BTR                   0xA3
#define IC_BR_NOT_BTC                   0xA4

#define IC_SWAP_U8                              0xA5
#define IC_SWAP_U16                     0xA6
#define IC_SWAP_U32                     0xA7
#define IC_SWAP_I64                     0xA8

#define IC_ABS_I64                              0xA9
#define IC_SIGN_I64                     0xAA
#define IC_MIN_I64                              0xAB
#define IC_MIN_U64                              0xAC
#define IC_MAX_I64                              0xAD
#define IC_MAX_U64                              0xAE
#define IC_MOD_U64                              0xAF
#define IC_SQR_I64                              0xB0
#define IC_SQR_U64                              0xB1
#define IC_SQR                                  0xB2
#define IC_ABS                                  0xB3
#define IC_SQRT                                 0xB4
#define IC_SIN                                  0xB5
#define IC_COS                                  0xB6
#define IC_TAN                                  0xB7
#define IC_ATAN                                 0xB8
#define IC_POPCNT                               0xB9
#define IC_ICS_NUM                              0xBA

#define KW_INCLUDE              0
#define KW_DEFINE               1
#define KW_UNION                2
#define KW_CATCH                3
#define KW_CLASS                4
#define KW_TRY                  5
#define KW_IF                   6
#define KW_ELSE                 7
#define KW_FOR                  8
#define KW_WHILE                9
#define KW_EXTERN               10
#define KW__EXTERN              11
#define KW_RETURN               12
#define KW_SIZEOF               13
#define KW__INTERN              14
#define KW_DO                   15
#define KW_ASM                  16
#define KW_GOTO                 17
#define KW_EXE                  18
#define KW_BREAK                19
#define KW_SWITCH               20
#define KW_START                21
#define KW_END                  22
#define KW_CASE                 23
#define KW_DEFAULT              24
#define KW_PUBLIC               25
#define KW_OFFSET               26
#define KW_IMPORT               27
#define KW__IMPORT              28
#define KW_IFDEF                29
#define KW_IFNDEF               30
#define KW_IFAOT                31
#define KW_IFJIT                32
#define KW_ENDIF                33
#define KW_ASSERT               34
#define KW_REG                  35
#define KW_NOREG                36
#define KW_LASTCLASS    37
#define KW_NO_WARN              38
#define KW_HELP_INDEX   39
#define KW_HELP_FILE    40
#define KW_STATIC               41
#define KW_LOCK                 42
#define KW_DEFINED              43
#define KW_INTERRUPT    44
#define KW_HASERRCODE   45
#define KW_ARGPOP               46
#define KW_NOARGPOP     47

#define AKW_ALIGN               64
#define AKW_ORG                 65
#define AKW_I0                  66
#define AKW_I8                  67
#define AKW_I16                 68
#define AKW_I32                 69
#define AKW_I64                 70
#define AKW_U0                  71
#define AKW_U8                  72
#define AKW_U16                 73
#define AKW_U32                 74
#define AKW_U64                 75
#define AKW_F64                 76
#define AKW_DU8                 77
#define AKW_DU16                78
#define AKW_DU32                79
#define AKW_DU64                80
#define AKW_DUP                 81
#define AKW_USE16               82
#define AKW_USE32               83
#define AKW_USE64               84
#define AKW_IMPORT              85
#define AKW_LIST                86
#define AKW_NOLIST              87
#define AKW_BINFILE     88
#define KW_KWS_NUM              89

#define CMP_TEMPLATE_INC                        0x00
#define CMP_TEMPLATE_DEC                        0x01
#define CMP_TEMPLATE_MOD                        0x02
#define CMP_TEMPLATE_LESS                       0x03
#define CMP_TEMPLATE_GREATER            0x04
#define CMP_TEMPLATE_LESS_EQU           0x05
#define CMP_TEMPLATE_GREATER_EQU        0x06
#define CMP_TEMPLATE_STRLEN             0x07
#define CMP_TEMPLATE_RDTSC                      0x08
#define CMP_TEMPLATE_SIGN_I64           0x09
#define CMP_TEMPLATE_FSTP                       0x0A
#define CMP_TEMPLATE_FLD                        0x0B
#define CMP_TEMPLATE_SQR                        0x0C
#define CMP_TEMPLATE_ABS                        0x0D
#define CMP_TEMPLATE_SQRT                       0x0E
#define CMP_TEMPLATE_SIN                        0x0F
#define CMP_TEMPLATE_COS                        0x10
#define CMP_TEMPLATE_TAN                        0x11
#define CMP_TEMPLATE_ATAN                       0x12

#define ASSOCF_LEFT     1
#define ASSOCF_RIGHT    2
#define ASSOC_MASK              3

#define PREC_NULL                       0x00
#define PREC_TERM                       0x04
#define PREC_UNARY_POST         0x08
#define PREC_UNARY_PRE          0x0C
#define PREC_EXP                        0x10
#define PREC_MUL                        0x14
#define PREC_AND                        0x18
#define PREC_XOR                        0x1C
#define PREC_OR                         0x20
#define PREC_ADD                        0x24
#define PREC_CMP                        0x28
#define PREC_CMP2                       0x2C
#define PREC_AND_AND            0x30
#define PREC_XOR_XOR            0x34
#define PREC_OR_OR                      0x38
#define PREC_ASSIGN             0x3C

#define PREC_MAX                        0x40

//Function/static/public flags
#define FSF_PUBLIC                      0x01
#define FSF_ASM                         0x02
#define FSF_STATIC                      0x04
#define FSF__                           0x08
#define FSF_INTERRUPT           (1 << Ff_INTERRUPT)
#define FSF_HASERRCODE          (1 << Ff_HASERRCODE)
#define FSF_ARGPOP                      (1 << Ff_ARGPOP)
#define FSF_NOARGPOP            (1 << Ff_NOARGPOP)
#define FSG_FUN_FLAGS1          (FSF_INTERRUPT | FSF_HASERRCODE | FSF_ARGPOP | FSF_NOARGPOP)
#define FSG_FUN_FLAGS2          (FSG_FUN_FLAGS1 | FSF_PUBLIC)

//Byte 0
#define PRS0_NULL               0x000000
#define PRS0__EXTERN    0x000001
#define PRS0__INTERN    0x000002
#define PRS0__IMPORT    0x000003
#define PRS0_EXTERN     0x000004
#define PRS0_IMPORT     0x000005
#define PRS0_TYPECAST   0x000006

//Byte 1
#define PRS1B_NULL                              0
#define PRS1_NULL                               0x000000
#define PRS1B_LOCAL_VAR                 1
#define PRS1_LOCAL_VAR                  0x000100
#define PRS1B_FUN_ARG                   2
#define PRS1_FUN_ARG                    0x000200
#define PRS1B_CLASS                     3
#define PRS1_CLASS                              0x000300
#define PRS1B_STATIC_LOCAL_VAR  4
#define PRS1_STATIC_LOCAL_VAR   0x000400
#define PRS1B__EXTERN_IMPORT    5
#define PRS1_NOT_REALLY__EXTERN 0x000500

#define PRSF_UNION      0x010000

class COptReg
{
        I64                      offset;
        CMemberList     *m;
};

#define CMPF_ASM_BLK            1
#define CMPF_ONE_ASM_INS        2
#define CMPF_LEX_FIRST          4
#define CMPF_PRS_SEMICOLON      8

#help_index ""