#define INTERNAL_TYPES_NUM	17

class CInternalType
{
	U8 type, size, name[8];
} internal_types_table[INTERNAL_TYPES_NUM] = {
	{RT_I0,  0, "I0i"},
	{RT_I0,  0, "I0"},
	{RT_U0,  0, "U0i"},
	{RT_U0,  0, "U0"},
	{RT_I8,  1, "I8i"},
	{RT_I8,  1, "I8"},
	{RT_I8,  1, "Bool"},
	{RT_U8,  1, "U8i"},
	{RT_U8,  1, "U8"},
	{RT_I16, 2, "I16i"},
	{RT_U16, 2, "U16i"},
	{RT_I32, 4, "I32i"},
	{RT_U32, 4, "U32i"},
	{RT_I64, 8, "I64i"},
	{RT_U64, 8, "U64i"},
	{RT_F64, 8, "F64i"},
	{RT_F64, 8, "F64"},
};

CIntermediateStruct intermediate_code_table[IC_ICS_NUM] = {
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "END"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "NOP1"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "END_EXP"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "NOP2"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "LABEL"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "CALL_START"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "CALL_END"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "CALL_END2"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "RETURN_VAL"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "RETURN_VAL2"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "IMM_I64"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "IMM_F64"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "STR_CONST"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "ABS_ADDR"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "ADDR_IMPORT"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "HEAP_GLOBAL"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SIZEOF"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "TYPE"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GET_LABEL"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "RBP"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "REG"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "FS"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "MOV_FS"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GS"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "MOV_GS"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "LEA"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "MOV"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "TO_I64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "TO_F64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "TO_BOOL"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "TOUPPER"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "POSTFIX_TYPECAST"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "ADDR"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "COM"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "NOT"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "UNARY_MINUS"},
	{IS_1_ARG, 1, IST_DEREF,	FALSE,	TRUE,	0, 0, 0, "DEREF"},
	{IS_1_ARG, 1, IST_DEREF,	FALSE,	TRUE,	0, 0, 0, "DEREF_PP"},
	{IS_1_ARG, 1, IST_DEREF,	FALSE,	TRUE,	0, 0, 0, "DEREF_MM"},
	{IS_1_ARG, 1, IST_DEREF,	TRUE,	TRUE,	0, 0, 0, "_PP"},
	{IS_1_ARG, 1, IST_DEREF,	TRUE,	TRUE,	0, 0, 0, "_MM"},
	{IS_1_ARG, 1, IST_DEREF,	TRUE,	TRUE,	0, 0, 0, "PP_"},
	{IS_1_ARG, 1, IST_DEREF,	TRUE,	TRUE,	0, 0, 0, "MM_"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SHL"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SHR"},
	{IS_1_ARG, 1, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "SHL_CONST"},
	{IS_1_ARG, 1, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "SHR_CONST"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "POWER"},
	{IS_2_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "MUL"},
	{IS_2_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "DIV"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "MOD"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "AND"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "OR"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "XOR"},
	{IS_2_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "ADD"},
	{IS_2_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "SUB"},
	{IS_1_ARG, 1, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "ADD_CONST"},
	{IS_1_ARG, 1, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "SUB_CONST"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "EQU_EQU"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "NOT_EQU"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "LESS"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "GREATER_EQU"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "GREATER"},
	{IS_2_ARG, 1, IST_CMP,		FALSE,	FALSE,	0, 0, 0, "LESS_EQU"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "PUSH_CMP"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "AND_AND"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "OR_OR"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "XOR_XOR"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "ASSIGN"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "ASSIGN_PP"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "ASSIGN_MM"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "SHL_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "SHR_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "MUL_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "DIV_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "MOD_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "AND_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "OR_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "XOR_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "ADD_EQU"},
	{IS_2_ARG, 1, IST_ASSIGN,	FALSE,	TRUE,	0, 0, 0, "SUB_EQU"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "JMP"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SUB_CALL"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SWITCH"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "NOBOUND_SWITCH"},
	{IS_V_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "ADD_RSP"},
	{IS_V_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "ADD_RSP1"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "ENTER"},
	{IS_0_ARG, 0, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "PUSH_REGS"},
	{IS_0_ARG, 0, IST_ASSIGN,	FALSE,	FALSE,	0, 0, 0, "POP_REGS"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "LEAVE"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "RET"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CALL"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CALL_INDIRECT"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CALL_INDIRECT2"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CALL_IMPORT"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CALL_EXTERN"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "ASM"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "PUSH"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "POP"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CLFLUSH"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "INVLPG"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "IN_U8"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "IN_U16"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "IN_U32"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "OUT_U8"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "OUT_U16"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "OUT_U32"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GET_RFLAGS"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "CARRY"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SET_RFLAGS"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GET_RAX"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SET_RAX"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GET_RBP"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SET_RBP"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "GET_RSP"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SET_RSP"},
	{IS_0_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "RIP"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "RDTSC"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BT"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BTS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BTR"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BTC"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "LBTS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "LBTR"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "LBTC"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BSF"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BSR"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "QUE_INIT"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "QUE_INS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "QUE_INS_REV"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "QUE_REM"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "STRLEN"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_ZERO"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_NOT_ZERO"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_CARRY"},
	{IS_0_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_NOT_CARRY"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_EQU_EQU"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_NOT_EQU"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_LESS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_GREATER_EQU"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_GREATER"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_LESS_EQU"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2EQU_EQU"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2NOT_EQU"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2LESS"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2GREATER_EQU"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2GREATER"},
	{IS_2_ARG, 1, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_2LESS_EQU"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_AND_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_AND_NOT_ZERO"},
	{IS_1_ARG, 0, IST_DEREF,	FALSE,	TRUE,	0, 0, 0, "BR_MM_ZERO"},
	{IS_1_ARG, 0, IST_DEREF,	FALSE,	TRUE,	0, 0, 0, "BR_MM_NOT_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_AND_AND_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_AND_AND_NOT_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_OR_OR_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "BR_OR_OR_NOT_ZERO"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_BT"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_BTS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_BTR"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_BTC"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_NOT_BT"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_NOT_BTS"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_NOT_BTR"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "BR_NOT_BTC"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SWAP_U8"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SWAP_U16"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SWAP_U32"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "SWAP_U64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "ABS_I64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SIGN_I64"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "I64_MIN"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "U64_MIN"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "I64_MAX"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "U64_MAX"},
	{IS_2_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "MOD_U64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SQRI64"},
	{IS_1_ARG, 0, IST_NULL,		FALSE,	FALSE,	0, 0, 0, "SQRU64"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "SQR"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "ABS"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "SQRT"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "SIN"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "COS"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "TAN"},
	{IS_1_ARG, 1, IST_NULL,		TRUE,	FALSE,	0, 0, 0, "ATAN"},
	{IS_1_ARG, 1, IST_NULL,		FALSE,	TRUE,	0, 0, 0, "POPCNT"},
};

U0 CompLoadDefines()
{
	DefineListLoad("ST_RAW_TYPES",
					" \0"
					" \0"
					"I0\0"
					"U0\0"
					"I8\0"
					"U8\0"
					"I16\0"
					"U16\0"
					"I32\0"
					"U32\0"
					"I64\0"
					"U64\0"
					"F32\0"
					"UF32\0"
					"F64\0"
					"UF64\0");

	DefineListLoad("ST_NATURAL_TYPES",
					"I8\0"
					"U8\0"
					"I16\0"
					"U16\0"
					"I32\0"
					"U32\0"
					"I64\0"
					"U64\0"
					"F64\0"
					"String\0");

	DefineListLoad("ST_INT_SIZE_TYPES",
					"I8\0"
					"U8\0"
					"I16\0"
					"U16\0"
					"I32\0"
					"U32\0"
					"I64\0"
					"U64\0");

	DefineListLoad("ST_TY_TYPES",
					"NULL\0"
					"STACK\0"
					"IMM\0"
					"REG\0"
					"DISP\0"
					"SIB\0"
					"RIP\0");

	DefineListLoad("ST_U8_REGS",
					"AL\0"
					"CL\0"
					"DL\0"
					"BL\0"
					"AH\0"
					"CH\0"
					"DH\0"
					"BH\0"
					"R8u8\0"
					"R9u8\0"
					"R10u8\0"
					"R11u8\0"
					"R12u8\0"
					"R13u8\0"
					"R14u8\0"
					"R15u8\0");

	DefineListLoad("ST_U8_REX_REGS",
					"AL\0"
					"CL\0"
					"DL\0"
					"BL\0"
					"RSPu8\0"
					"RBPu8\0"
					"RSIu8\0"
					"RDIu8\0"
					"R8u8\0"
					"R9u8\0"
					"R10u8\0"
					"R11u8\0"
					"R12u8\0"
					"R13u8\0"
					"R14u8\0"
					"R15u8\0");

	DefineListLoad("ST_U16_REGS",
					"AX\0"
					"CX\0"
					"DX\0"
					"BX\0"
					"SP\0"
					"BP\0"
					"SI\0"
					"DI\0"
					"R8u16\0"
					"R9u16\0"
					"R10u16\0"
					"R11u16\0"
					"R12u16\0"
					"R13u16\0"
					"R14u16\0"
					"R15u16\0");

	DefineListLoad("ST_U32_REGS",
					"EAX\0"
					"ECX\0"
					"EDX\0"
					"EBX\0"
					"ESP\0"
					"EBP\0"
					"ESI\0"
					"EDI\0"
					"R8u32\0"
					"R9u32\0"
					"R10u32\0"
					"R11u32\0"
					"R12u32\0"
					"R13u32\0"
					"R14u32\0"
					"R15u32\0");

	DefineListLoad("ST_U64_REGS",
					"RAX\0"
					"RCX\0"
					"RDX\0"
					"RBX\0"
					"RSP\0"
					"RBP\0"
					"RSI\0"
					"RDI\0"
					"R8\0"
					"R9\0"
					"R10\0"
					"R11\0"
					"R12\0"
					"R13\0"
					"R14\0"
					"R15\0");

	DefineListLoad("ST_MM_REGS",
					"MM0\0"
					"MM1\0"
					"MM2\0"
					"MM3\0"
					"MM4\0"
					"MM5\0"
					"MM6\0"
					"MM7\0");

	DefineListLoad("ST_XMM_REGS",
					"XMM0\0"
					"XMM1\0"
					"XMM2\0"
					"XMM3\0"
					"XMM4\0"
					"XMM5\0"
					"XMM6\0"
					"XMM7\0"
					"XMM8\0"
					"XMM9\0"
					"XMM10\0"
					"XMM11\0"
					"XMM12\0"
					"XMM13\0"
					"XMM14\0"
					"XMM15\0");

	DefineListLoad("ST_ARG_TYPES",
					"NONE\0"
					"REL8\0"
					"REL16\0"
					"REL32\0"
					"IMM8\0"
					"IMM16\0"
					"IMM32\0"
					"IMM64\0"
					"UIMM8\0"
					"UIMM16\0"
					"UIMM32\0"
					"UIMM64\0"
					"R8\0"
					"R16\0"
					"R32\0"
					"R64\0"
					"RM8\0"
					"RM16\0"
					"RM32\0"
					"RM64\0"
					"M8\0"
					"M16\0"
					"M32\0"
					"M64\0"
					"M1632\0"
					"M16N32\0"
					"M16N16\0"
					"M32N32\0"
					"MOFFS8\0"
					"MOFFS16\0"
					"MOFFS32\0"
					"MOFFS64\0"
					"AL\0"
					"AX\0"
					"EAX\0"
					"RAX\0"
					"CL\0"
					"DX\0"
					" \0"
					"SREG\0"
					"SS\0"
					"DS\0"
					"ES\0"
					"FS\0"
					"GS\0"
					"CS\0"
					"ST0\0"
					"STI\0"
					"MM\0"
					"MM32\0"
					"MM64\0"
					"XMM\0"
					"XMM32\0"
					"XMM64\0"
					"XMM128\0"
					"XMM0\0");

	DefineListLoad("ST_SEG_REGS",
					"ES\0"
					"CS\0"
					"SS\0"
					"DS\0"
					"FS\0"
					"GS\0");

	DefineListLoad("ST_FSTACK_REGS",
					"ST0\0"
					"ST1\0"
					"ST2\0"
					"ST3\0"
					"ST4\0"
					"ST5\0"
					"ST6\0"
					"ST7\0");
}

U0 CompFillTables()
{
	I64  i;
	U32 *d;

	cmp.to_reg_vars_map = CAlloc(REG_REGS_NUM * sizeof(U8));
	cmp.num_reg_vars = 0;
	cmp.reg_vars_mask = REGG_LOCAL_VARS;
	for (i = 0; i < REG_REGS_NUM; i++)
		if (Bt(&cmp.reg_vars_mask, i))
			cmp.to_reg_vars_map[cmp.num_reg_vars++] = i;

	cmp.non_ptr_vars_map = CAlloc(REG_REGS_NUM * sizeof(U8));
	cmp.num_non_ptr_vars = 0;
	cmp.non_ptr_vars_mask = REGG_LOCAL_NON_PTR_VARS;
	for (i = 0; i < REG_REGS_NUM; i++)
		if (Bt(&cmp.non_ptr_vars_mask, i))
			cmp.non_ptr_vars_map[cmp.num_non_ptr_vars++] = i;

	cmp.dual_U16_tokens1 = d = CAlloc(sizeof(U32) * TK_TKS_NUM);
	d['!'] = TK_NOT_EQU		<< 16 + '=';
	d['&'] = TK_AND_AND		<< 16 + '&';
	d['*'] = TK_MUL_EQU		<< 16 + '=';
	d['+'] = TK_PLUS_PLUS	<< 16 + '+';
	d['-'] = TK_DEREFERENCE	<< 16 + '>';
	d['/'] = '*';
	d[':'] = TK_DBL_COLON	<< 16 + ':';
	d['<'] = TK_LESS_EQU	<< 16 + '=';
	d['='] = TK_EQU_EQU		<< 16 + '=';
	d['>'] = TK_GREATER_EQU	<< 16 + '=';
	d['^'] = TK_XOR_EQU		<< 16 + '=';
	d['|'] = TK_OR_OR		<< 16 + '|';
	d['%'] = TK_MOD_EQU		<< 16 + '=';

	cmp.dual_U16_tokens2 = d = CAlloc(sizeof(U32) * TK_TKS_NUM);
	d['&'] = TK_AND_EQU		<< 16 + '=';
	d['+'] = TK_ADD_EQU		<< 16 + '=';
	d['-'] = TK_MINUS_MINUS	<< 16 + '-';
	d['/'] = '/';
	d['<'] = TK_SHL			<< 16 + '<';
	d['>'] = TK_SHR			<< 16 + '>';
	d['^'] = TK_XOR_XOR		<< 16 + '^';
	d['|'] = TK_OR_EQU		<< 16 + '=';

	cmp.dual_U16_tokens3 = d = CAlloc(sizeof(U32) * TK_TKS_NUM);
	d['-'] = TK_SUB_EQU << 16 + '=';
	d['/'] = TK_DIV_EQU << 16 + '=';

	cmp.binary_ops = d = CAlloc(sizeof(U32) * TK_TKS_NUM);
	d['`']    = (PREC_EXP + ASSOCF_RIGHT) << 16 + IC_POWER;
	d[TK_SHL] = (PREC_EXP + ASSOCF_LEFT)  << 16 + IC_SHL;
	d[TK_SHR] = (PREC_EXP + ASSOCF_LEFT)  << 16 + IC_SHR;

	d['*'] = PREC_MUL << 16 + IC_MUL;
	d['/'] = (PREC_MUL + ASSOCF_LEFT) << 16 + IC_DIV;
	d['%'] = (PREC_MUL + ASSOCF_LEFT) << 16 + IC_MOD;

	d['&'] = PREC_AND << 16 + IC_AND;

	d['^'] = PREC_XOR << 16 + IC_XOR;

	d['|'] = PREC_OR  << 16 + IC_OR;

	d['+'] = PREC_ADD << 16 + IC_ADD;
	d['-'] = (PREC_ADD + ASSOCF_LEFT) << 16 + IC_SUB;

	d['<']			  = PREC_CMP << 16 + IC_LESS;
	d['>']			  = PREC_CMP << 16 + IC_GREATER;
	d[TK_LESS_EQU]	  = PREC_CMP << 16 + IC_LESS_EQU;
	d[TK_GREATER_EQU] = PREC_CMP << 16 + IC_GREATER_EQU;

	d[TK_EQU_EQU] = PREC_CMP2 << 16 + IC_EQU_EQU;
	d[TK_NOT_EQU] = PREC_CMP2 << 16 + IC_NOT_EQU;

	d[TK_AND_AND] = PREC_AND_AND << 16 + IC_AND_AND;

	d[TK_XOR_XOR] = PREC_XOR_XOR << 16 + IC_XOR_XOR;

	d[TK_OR_OR]   = PREC_OR_OR   << 16 + IC_OR_OR;

	d['=']		  = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_ASSIGN;
	d[TK_SHL_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_SHL_EQU;
	d[TK_SHR_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_SHR_EQU;
	d[TK_MUL_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_MUL_EQU;
	d[TK_DIV_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_DIV_EQU;
	d[TK_MOD_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_MOD_EQU;
	d[TK_AND_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_AND_EQU;
	d[TK_OR_EQU]  = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_OR_EQU;
	d[TK_XOR_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_XOR_EQU;
	d[TK_ADD_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_ADD_EQU;
	d[TK_SUB_EQU] = (PREC_ASSIGN + ASSOCF_RIGHT) << 16 + IC_SUB_EQU;
}