mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-03-31 21:35:09 +01:00
552 lines
18 KiB
HolyC
Executable file
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;
|
|
}
|