ZealOS/src/Compiler/CInit.CC
TomAwezome 827f4d16df Rename CosmiC to ZealC.
Rename IC_HOLYC_TYPECAST to IC_POSTFIX_TYPECAST.
Add some compiler documentation.
2021-12-11 04:58:01 -05:00

552 lines
18 KiB
HolyC
Executable file

#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;
}