aindump/ainedit: F_GLOBALASSIGN macro

Instruction sequence for assigning to a global float variable.
This commit is contained in:
Nunuhara Cabbage
2020-05-05 16:36:43 -07:00
parent 3625f53b26
commit 7c9ad0e69e
3 changed files with 72 additions and 68 deletions
+35 -43
View File
@@ -123,11 +123,12 @@ static bool global_check(struct dasm_state *dasm, int32_t *args)
{
return is_global(dasm, args[0]);
}
#define GLOBALREF_check global_check
#define GLOBALREFREF_check global_check
#define GLOBALINC_check global_check
#define GLOBALDEC_check global_check
#define GLOBALASSIGN_check global_check
#define GLOBALREF_check global_check
#define GLOBALREFREF_check global_check
#define GLOBALINC_check global_check
#define GLOBALDEC_check global_check
#define GLOBALASSIGN_check global_check
#define F_GLOBALASSIGN_check global_check
static void global_emit(struct dasm_state *dasm, int32_t *args)
{
@@ -144,6 +145,13 @@ static void GLOBALASSIGN_emit(struct dasm_state *dasm, int32_t *args)
fprintf(dasm->out, " %d", args[1]);
}
static void F_GLOBALASSIGN_emit(struct dasm_state *dasm, int32_t *args)
{
union { int32_t i; float f; } v = { .i = args[1] };
dasm_print_identifier(dasm, dasm->ain->globals[args[0]].name);
fprintf(dasm->out, " %f", v.f);
}
static bool struct_check(struct dasm_state *dasm, int32_t *args)
{
return is_member(dasm, args[0]);
@@ -205,27 +213,28 @@ struct macrodef {
};
struct macrodef macrodefs[] = {
DEFMACRO(LOCALREF, PUSHLOCALPAGE, PUSH, REF),
DEFMACRO(LOCALREFREF, PUSHLOCALPAGE, PUSH, REFREF),
DEFMACRO(LOCALINC, PUSHLOCALPAGE, PUSH, INC),
DEFMACRO(LOCALDEC, PUSHLOCALPAGE, PUSH, DEC),
DEFMACRO(LOCALASSIGN, PUSHLOCALPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(LOCALASSIGN2, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN),
DEFMACRO(F_LOCALASSIGN, PUSHLOCALPAGE, PUSH, F_PUSH, F_ASSIGN, POP),
DEFMACRO(S_LOCALASSIGN, PUSHLOCALPAGE, PUSH, REF, DELETE, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN),
DEFMACRO(LOCALCREATE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, DUP2, NEW, ASSIGN, POP, POP, POP),
DEFMACRO(LOCALDELETE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, PUSH, ASSIGN, POP),
DEFMACRO(GLOBALREF, PUSHGLOBALPAGE, PUSH, REF),
DEFMACRO(GLOBALREFREF, PUSHGLOBALPAGE, PUSH, REFREF),
DEFMACRO(GLOBALINC, PUSHGLOBALPAGE, PUSH, INC),
DEFMACRO(GLOBALDEC, PUSHGLOBALPAGE, PUSH, DEC),
DEFMACRO(GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(STRUCTREF, PUSHSTRUCTPAGE, PUSH, REF),
DEFMACRO(STRUCTREFREF, PUSHSTRUCTPAGE, PUSH, REFREF),
DEFMACRO(STRUCTINC, PUSHSTRUCTPAGE, PUSH, INC),
DEFMACRO(STRUCTDEC, PUSHSTRUCTPAGE, PUSH, DEC),
DEFMACRO(STRUCTASSIGN, PUSHSTRUCTPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(PUSHVMETHOD, PUSHSTRUCTPAGE, PUSH, DUP_U2, PUSH, REF, SWAP, PUSH, ADD, REF),
DEFMACRO(LOCALREF, PUSHLOCALPAGE, PUSH, REF),
DEFMACRO(LOCALREFREF, PUSHLOCALPAGE, PUSH, REFREF),
DEFMACRO(LOCALINC, PUSHLOCALPAGE, PUSH, INC),
DEFMACRO(LOCALDEC, PUSHLOCALPAGE, PUSH, DEC),
DEFMACRO(LOCALASSIGN, PUSHLOCALPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(LOCALASSIGN2, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN),
DEFMACRO(F_LOCALASSIGN, PUSHLOCALPAGE, PUSH, F_PUSH, F_ASSIGN, POP),
DEFMACRO(S_LOCALASSIGN, PUSHLOCALPAGE, PUSH, REF, DELETE, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN),
DEFMACRO(LOCALCREATE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, DUP2, NEW, ASSIGN, POP, POP, POP),
DEFMACRO(LOCALDELETE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, PUSH, ASSIGN, POP),
DEFMACRO(GLOBALREF, PUSHGLOBALPAGE, PUSH, REF),
DEFMACRO(GLOBALREFREF, PUSHGLOBALPAGE, PUSH, REFREF),
DEFMACRO(GLOBALINC, PUSHGLOBALPAGE, PUSH, INC),
DEFMACRO(GLOBALDEC, PUSHGLOBALPAGE, PUSH, DEC),
DEFMACRO(GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(F_GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, F_PUSH, F_ASSIGN, POP),
DEFMACRO(STRUCTREF, PUSHSTRUCTPAGE, PUSH, REF),
DEFMACRO(STRUCTREFREF, PUSHSTRUCTPAGE, PUSH, REFREF),
DEFMACRO(STRUCTINC, PUSHSTRUCTPAGE, PUSH, INC),
DEFMACRO(STRUCTDEC, PUSHSTRUCTPAGE, PUSH, DEC),
DEFMACRO(STRUCTASSIGN, PUSHSTRUCTPAGE, PUSH, PUSH, ASSIGN, POP),
DEFMACRO(PUSHVMETHOD, PUSHSTRUCTPAGE, PUSH, DUP_U2, PUSH, REF, SWAP, PUSH, ADD, REF),
};
struct macro_node {
@@ -287,19 +296,6 @@ static void add_macro(struct macrodef *macro)
parent->emit = macro->emit;
}
static void print_node(struct macro_node *node, int indent)
{
for (int i = 0; i < indent; i++) {
fputc('\t', stderr);
}
fprintf(stderr, "%s\n", instructions[node->opcode].name);
for (int i = 0; i < node->nr_children; i++) {
print_node(&node->children[i], indent+1);
}
}
// Transform macro list into a tree.
static void create_macro_tree(void)
{
@@ -308,10 +304,6 @@ static void create_macro_tree(void)
for (size_t i = 0; i < sizeof(macrodefs)/sizeof(*macrodefs); i++) {
add_macro(&macrodefs[i]);
}
for (int i = 0; i < macros->nr_children; i++) {
print_node(&macros->children[i], 0);
}
}
static struct macro_node *match_rewind(struct dasm_state *dasm, struct macro_node *match)
+1
View File
@@ -47,6 +47,7 @@ enum asm_pseudo_opcode {
PO_GLOBALINC,
PO_GLOBALDEC,
PO_GLOBALASSIGN,
PO_F_GLOBALASSIGN,
PO_STRUCTREF,
PO_STRUCTREFREF,
PO_STRUCTINC,
+36 -25
View File
@@ -55,31 +55,32 @@ KHASH_MAP_INIT_STR(string_ht, size_t);
}
const struct instruction asm_pseudo_ops[NR_PSEUDO_OPS - PSEUDO_OP_OFFSET] = {
PSEUDO_OP(PO_CASE, ".CASE", 2),
PSEUDO_OP(PO_DEFAULT, ".DEFAULT", 1),
PSEUDO_OP(PO_STR, ".STR", 2),
PSEUDO_OP(PO_MSG, ".MSG", 2),
MACRO(PO_LOCALREF, ".LOCALREF", 1, 10),
MACRO(PO_LOCALREFREF, ".LOCALREFREF", 1, 10),
MACRO(PO_LOCALINC, ".LOCALINC", 1, 10),
MACRO(PO_LOCALDEC, ".LOCALDEC", 1, 10),
MACRO(PO_LOCALASSIGN, ".LOCALASSIGN", 2, 18),
MACRO(PO_LOCALASSIGN2, ".LOCALASSIGN2", 1, 14),
MACRO(PO_F_LOCALASSIGN, ".F_LOCALASSIGN", 2, 18),
MACRO(PO_S_LOCALASSIGN, ".S_LOCALASSIGN", 1, 26),
MACRO(PO_LOCALDELETE, ".LOCALDELETE", 1, 24),
MACRO(PO_LOCALCREATE, ".LOCALCREATE", 2, 34),
MACRO(PO_GLOBALREF, ".GLOBALREF", 1, 10),
MACRO(PO_GLOBALREFREF, ".GLOBALREFREF", 1, 10),
MACRO(PO_GLOBALINC, ".GLOBALINC", 1, 10),
MACRO(PO_GLOBALDEC, ".GLOBALDEC", 1, 10),
MACRO(PO_GLOBALASSIGN, ".GLOBALASSIGN", 2, 18),
MACRO(PO_STRUCTREF, ".STRUCTREF", 2, 10),
MACRO(PO_STRUCTREFREF, ".STRUCTREFREF", 2, 10),
MACRO(PO_STRUCTINC, ".STRUCTINC", 2, 10),
MACRO(PO_STRUCTDEC, ".STRUCTDEC", 2, 10),
MACRO(PO_STRUCTASSIGN, ".STRUCTASSIGN", 3, 18),
MACRO(PO_PUSHVMETHOD, ".PUSHVMETHOD", 2, 30),
PSEUDO_OP(PO_CASE, ".CASE", 2),
PSEUDO_OP(PO_DEFAULT, ".DEFAULT", 1),
PSEUDO_OP(PO_STR, ".STR", 2),
PSEUDO_OP(PO_MSG, ".MSG", 2),
MACRO(PO_LOCALREF, ".LOCALREF", 1, 10),
MACRO(PO_LOCALREFREF, ".LOCALREFREF", 1, 10),
MACRO(PO_LOCALINC, ".LOCALINC", 1, 10),
MACRO(PO_LOCALDEC, ".LOCALDEC", 1, 10),
MACRO(PO_LOCALASSIGN, ".LOCALASSIGN", 2, 18),
MACRO(PO_LOCALASSIGN2, ".LOCALASSIGN2", 1, 14),
MACRO(PO_F_LOCALASSIGN, ".F_LOCALASSIGN", 2, 18),
MACRO(PO_S_LOCALASSIGN, ".S_LOCALASSIGN", 1, 26),
MACRO(PO_LOCALDELETE, ".LOCALDELETE", 1, 24),
MACRO(PO_LOCALCREATE, ".LOCALCREATE", 2, 34),
MACRO(PO_GLOBALREF, ".GLOBALREF", 1, 10),
MACRO(PO_GLOBALREFREF, ".GLOBALREFREF", 1, 10),
MACRO(PO_GLOBALINC, ".GLOBALINC", 1, 10),
MACRO(PO_GLOBALDEC, ".GLOBALDEC", 1, 10),
MACRO(PO_GLOBALASSIGN, ".GLOBALASSIGN", 2, 18),
MACRO(PO_F_GLOBALASSIGN, ".F_GLOBALASSIGN", 2, 18),
MACRO(PO_STRUCTREF, ".STRUCTREF", 2, 10),
MACRO(PO_STRUCTREFREF, ".STRUCTREFREF", 2, 10),
MACRO(PO_STRUCTINC, ".STRUCTINC", 2, 10),
MACRO(PO_STRUCTDEC, ".STRUCTDEC", 2, 10),
MACRO(PO_STRUCTASSIGN, ".STRUCTASSIGN", 3, 18),
MACRO(PO_PUSHVMETHOD, ".PUSHVMETHOD", 2, 30),
};
struct string_table {
@@ -685,6 +686,16 @@ void handle_pseudo_op(struct asm_state *state, struct parse_instruction *instr)
asm_write_opcode(state, POP);
break;
}
case PO_F_GLOBALASSIGN: {
asm_write_opcode(state, PUSHGLOBALPAGE);
asm_write_opcode(state, PUSH);
asm_write_argument(state, asm_resolve_arg(state, PUSH, T_GLOBAL, kv_A(*instr->args, 0)->text));
asm_write_opcode(state, F_PUSH);
asm_write_argument(state, asm_resolve_arg(state, F_PUSH, T_FLOAT, kv_A(*instr->args, 1)->text));
asm_write_opcode(state, F_ASSIGN);
asm_write_opcode(state, POP);
break;
}
case PO_STRUCTREF: {
asm_write_opcode(state, PUSHSTRUCTPAGE);
asm_write_opcode(state, PUSH);