mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-25 03:51:26 +00:00
More information about assembler instructions
This commit is contained in:
parent
f76c1d2078
commit
f8f0cdf95d
1 changed files with 92 additions and 70 deletions
162
assembler.c
162
assembler.c
|
@ -26,73 +26,77 @@
|
|||
* not exactly sure how codegen would work for the C compiler as of yet
|
||||
* and also I plan to allow inline assembly for the compiler.
|
||||
*/
|
||||
static const char *const asm_instr[] = {
|
||||
[INSTR_DONE] = "DONE",
|
||||
[INSTR_MUL_F] = "MUL_F",
|
||||
[INSTR_MUL_V] = "MUL_V",
|
||||
[INSTR_MUL_FV] = "MUL_FV",
|
||||
[INSTR_MUL_VF] = "MUL_VF",
|
||||
[INSTR_DIV_F] = "DIV",
|
||||
[INSTR_ADD_F] = "ADD_F",
|
||||
[INSTR_ADD_V] = "ADD_V",
|
||||
[INSTR_SUB_F] = "SUB_F",
|
||||
[INSTR_SUB_V] = "DUB_V",
|
||||
[INSTR_EQ_F] = "EQ_F",
|
||||
[INSTR_EQ_V] = "EQ_V",
|
||||
[INSTR_EQ_S] = "EQ_S",
|
||||
[INSTR_EQ_E] = "EQ_E",
|
||||
[INSTR_EQ_FNC] = "ES_FNC",
|
||||
[INSTR_NE_F] = "NE_F",
|
||||
[INSTR_NE_V] = "NE_V",
|
||||
[INSTR_NE_S] = "NE_S",
|
||||
[INSTR_NE_E] = "NE_E",
|
||||
[INSTR_NE_FNC] = "NE_FNC",
|
||||
[INSTR_LE] = "LE",
|
||||
[INSTR_GE] = "GE",
|
||||
[INSTR_LT] = "LT",
|
||||
[INSTR_GT] = "GT",
|
||||
[INSTR_LOAD_F] = "FIELD_F",
|
||||
[INSTR_LOAD_V] = "FIELD_V",
|
||||
[INSTR_LOAD_S] = "FIELD_S",
|
||||
[INSTR_LOAD_ENT] = "FIELD_ENT",
|
||||
[INSTR_LOAD_FLD] = "FIELD_FLD",
|
||||
[INSTR_LOAD_FNC] = "FIELD_FNC",
|
||||
[INSTR_ADDRESS] = "ADDRESS",
|
||||
[INSTR_STORE_F] = "STORE_F",
|
||||
[INSTR_STORE_V] = "STORE_V",
|
||||
[INSTR_STORE_S] = "STORE_S",
|
||||
[INSTR_STORE_ENT] = "STORE_ENT",
|
||||
[INSTR_STORE_FLD] = "STORE_FLD",
|
||||
[INSTR_STORE_FNC] = "STORE_FNC",
|
||||
[INSTR_STOREP_F] = "STOREP_F",
|
||||
[INSTR_STOREP_V] = "STOREP_V",
|
||||
[INSTR_STOREP_S] = "STOREP_S",
|
||||
[INSTR_STOREP_ENT] = "STOREP_ENT",
|
||||
[INSTR_STOREP_FLD] = "STOREP_FLD",
|
||||
[INSTR_STOREP_FNC] = "STOREP_FNC",
|
||||
[INSTR_RETURN] = "RETURN",
|
||||
[INSTR_NOT_F] = "NOT_F",
|
||||
[INSTR_NOT_V] = "NOT_V",
|
||||
[INSTR_NOT_S] = "NOT_S",
|
||||
[INSTR_NOT_ENT] = "NOT_ENT",
|
||||
[INSTR_NOT_FNC] = "NOT_FNC",
|
||||
[INSTR_IF] = "IF",
|
||||
[INSTR_IFNOT] = "IFNOT",
|
||||
[INSTR_CALL0] = "CALL0",
|
||||
[INSTR_CALL1] = "CALL1",
|
||||
[INSTR_CALL2] = "CALL2",
|
||||
[INSTR_CALL3] = "CALL3",
|
||||
[INSTR_CALL4] = "CALL4",
|
||||
[INSTR_CALL5] = "CALL5",
|
||||
[INSTR_CALL6] = "CALL6",
|
||||
[INSTR_CALL7] = "CALL7",
|
||||
[INSTR_CALL8] = "CALL8",
|
||||
[INSTR_STATE] = "STATE",
|
||||
[INSTR_GOTO] = "GOTO",
|
||||
[INSTR_AND] = "AND",
|
||||
[INSTR_OR] = "OR",
|
||||
[INSTR_BITAND] = "AND",
|
||||
[INSTR_BITOR] = "OR"
|
||||
static const struct {
|
||||
const char *m; /* menomic */
|
||||
const size_t o; /* operands */
|
||||
const size_t l; /* menomic len */
|
||||
} const asm_instr[] = {
|
||||
[INSTR_DONE] = { "DONE" , 0, 4 },
|
||||
[INSTR_MUL_F] = { "MUL_F" , 0, 5 },
|
||||
[INSTR_MUL_V] = { "MUL_V" , 0, 5 },
|
||||
[INSTR_MUL_FV] = { "MUL_FV" , 0, 6 },
|
||||
[INSTR_MUL_VF] = { "MUL_VF" , 0, 6 },
|
||||
[INSTR_DIV_F] = { "DIV" , 0, 3 },
|
||||
[INSTR_ADD_F] = { "ADD_F" , 0, 5 },
|
||||
[INSTR_ADD_V] = { "ADD_V" , 0, 5 },
|
||||
[INSTR_SUB_F] = { "SUB_F" , 0, 5 },
|
||||
[INSTR_SUB_V] = { "DUB_V" , 0, 5 },
|
||||
[INSTR_EQ_F] = { "EQ_F" , 0, 4 },
|
||||
[INSTR_EQ_V] = { "EQ_V" , 0, 4 },
|
||||
[INSTR_EQ_S] = { "EQ_S" , 0, 4 },
|
||||
[INSTR_EQ_E] = { "EQ_E" , 0, 4 },
|
||||
[INSTR_EQ_FNC] = { "ES_FNC" , 0, 6 },
|
||||
[INSTR_NE_F] = { "NE_F" , 0, 4 },
|
||||
[INSTR_NE_V] = { "NE_V" , 0, 4 },
|
||||
[INSTR_NE_S] = { "NE_S" , 0, 4 },
|
||||
[INSTR_NE_E] = { "NE_E" , 0, 4 },
|
||||
[INSTR_NE_FNC] = { "NE_FNC" , 0, 6 },
|
||||
[INSTR_LE] = { "LE" , 0, 2 },
|
||||
[INSTR_GE] = { "GE" , 0, 2 },
|
||||
[INSTR_LT] = { "LT" , 0, 2 },
|
||||
[INSTR_GT] = { "GT" , 0, 2 },
|
||||
[INSTR_LOAD_F] = { "FIELD_F" , 0, 7 },
|
||||
[INSTR_LOAD_V] = { "FIELD_V" , 0, 7 },
|
||||
[INSTR_LOAD_S] = { "FIELD_S" , 0, 7 },
|
||||
[INSTR_LOAD_ENT] = { "FIELD_ENT" , 0, 9 },
|
||||
[INSTR_LOAD_FLD] = { "FIELD_FLD" , 0, 9 },
|
||||
[INSTR_LOAD_FNC] = { "FIELD_FNC" , 0, 9 },
|
||||
[INSTR_ADDRESS] = { "ADDRESS" , 0, 7 },
|
||||
[INSTR_STORE_F] = { "STORE_F" , 0, 7 },
|
||||
[INSTR_STORE_V] = { "STORE_V" , 0, 7 },
|
||||
[INSTR_STORE_S] = { "STORE_S" , 0, 7 },
|
||||
[INSTR_STORE_ENT] = { "STORE_ENT" , 0, 9 },
|
||||
[INSTR_STORE_FLD] = { "STORE_FLD" , 0, 9 },
|
||||
[INSTR_STORE_FNC] = { "STORE_FNC" , 0, 9 },
|
||||
[INSTR_STOREP_F] = { "STOREP_F" , 0, 8 },
|
||||
[INSTR_STOREP_V] = { "STOREP_V" , 0, 8 },
|
||||
[INSTR_STOREP_S] = { "STOREP_S" , 0, 8 },
|
||||
[INSTR_STOREP_ENT] = { "STOREP_ENT", 0, 10},
|
||||
[INSTR_STOREP_FLD] = { "STOREP_FLD", 0, 10},
|
||||
[INSTR_STOREP_FNC] = { "STOREP_FNC", 0, 10},
|
||||
[INSTR_RETURN] = { "RETURN" , 0, 6 },
|
||||
[INSTR_NOT_F] = { "NOT_F" , 0, 5 },
|
||||
[INSTR_NOT_V] = { "NOT_V" , 0, 5 },
|
||||
[INSTR_NOT_S] = { "NOT_S" , 0, 5 },
|
||||
[INSTR_NOT_ENT] = { "NOT_ENT" , 0, 7 },
|
||||
[INSTR_NOT_FNC] = { "NOT_FNC" , 0, 7 },
|
||||
[INSTR_IF] = { "IF" , 0, 2 },
|
||||
[INSTR_IFNOT] = { "IFNOT" , 0, 5 },
|
||||
[INSTR_CALL0] = { "CALL0" , 0, 5 },
|
||||
[INSTR_CALL1] = { "CALL1" , 0, 5 },
|
||||
[INSTR_CALL2] = { "CALL2" , 0, 5 },
|
||||
[INSTR_CALL3] = { "CALL3" , 0, 5 },
|
||||
[INSTR_CALL4] = { "CALL4" , 0, 5 },
|
||||
[INSTR_CALL5] = { "CALL5" , 0, 5 },
|
||||
[INSTR_CALL6] = { "CALL6" , 0, 5 },
|
||||
[INSTR_CALL7] = { "CALL7" , 0, 5 },
|
||||
[INSTR_CALL8] = { "CALL8" , 0, 5 },
|
||||
[INSTR_STATE] = { "STATE" , 0, 5 },
|
||||
[INSTR_GOTO] = { "GOTO" , 0, 4 },
|
||||
[INSTR_AND] = { "AND" , 0, 3 },
|
||||
[INSTR_OR] = { "OR" , 0, 2 },
|
||||
[INSTR_BITAND] = { "BITAND" , 0, 6 },
|
||||
[INSTR_BITOR] = { "BITOR" , 0, 5 }
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -114,7 +118,6 @@ static char *const asm_getline(size_t *byte, FILE *fp) {
|
|||
*byte = read;
|
||||
if (read == -1) {
|
||||
free (line);
|
||||
//exit (1);
|
||||
return NULL;
|
||||
}
|
||||
return line;
|
||||
|
@ -211,13 +214,32 @@ void asm_parse(FILE *fp) {
|
|||
.name = offset_chars /* location of name in string table (for name)*/
|
||||
});
|
||||
});
|
||||
/* FUNCTION */ DECLTYPE(asm_keys[5], {});
|
||||
/* FUNCTION */
|
||||
DECLTYPE(asm_keys[5], {
|
||||
/* TODO: parse */
|
||||
code_defs_add((prog_section_def){
|
||||
.type = TYPE_VOID,
|
||||
.offset = offset_globals,
|
||||
.name = offset_chars
|
||||
});
|
||||
code_globals_add(offset_functions);
|
||||
code_functions_add((prog_section_function){
|
||||
.entry = offset_code,
|
||||
.firstlocal = 0,
|
||||
.locals = 0,
|
||||
.profile = 0,
|
||||
.name = offset_chars,
|
||||
.file = 0,
|
||||
.nargs = 0,
|
||||
.argsize = {0}
|
||||
});
|
||||
});
|
||||
|
||||
/* if we make it this far then we have statements */
|
||||
{
|
||||
size_t i = 0;
|
||||
for (; i < sizeof(asm_instr)/sizeof(*asm_instr); i++) {
|
||||
if (!strncmp(skip, asm_instr[i], strlen(asm_instr[i]))) {
|
||||
if (!strncmp(skip, asm_instr[i].m, asm_instr[i].l)) {
|
||||
/* TODO */
|
||||
goto end;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue