mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-30 19:08:12 +03:00
aindump/ainedit: F_GLOBALASSIGN macro
Instruction sequence for assigning to a global float variable.
This commit is contained in:
+35
-43
@@ -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(¯odefs[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < macros->nr_children; i++) {
|
||||
print_node(¯os->children[i], 0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct macro_node *match_rewind(struct dasm_state *dasm, struct macro_node *match)
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user