emit/__emit: New argument type: local variable (name or offset)

This commit is contained in:
Daniel_Cortez 2017-11-14 19:34:00 +07:00
parent e55f6a213a
commit c58fce34cb

View File

@ -5927,6 +5927,39 @@ static void emit_param_data(ucell *p,int size)
} while (++curp<size); } while (++curp<size);
} }
static void emit_param_local(ucell *p,int size)
{
cell val;
char *str;
symbol *sym;
int curp=0;
int tok;
do {
tok=lex(&val,&str);
switch (tok) {
case tNUMBER:
p[curp]=val;
break;
case tSYMBOL:
sym=findloc(str);
if (sym==NULL) {
sym=findglb(str,sSTATEVAR);
if (sym==NULL || sym->ident!=iCONSTEXPR)
error(17,str); /* undefined symbol */
} else if (sym->vclass==sSTATIC) {
error(17,str); /* undefined symbol */
break;
} /* if */
markusage(sym,uREAD|uWRITTEN);
p[curp]=sym->addr;
break;
default:
emit_invalid_token(tSYMBOL,tok);
} /* switch */
} while (++curp<size);
}
static void emit_param_label(ucell *p) static void emit_param_label(ucell *p)
{ {
cell val; cell val;
@ -5968,6 +6001,14 @@ static void OPHANDLER_CALL emit_parm1_gvar(char *name)
outinstr(name,(sizeof p / sizeof p[0]),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm1_local(char *name)
{
ucell p[1];
emit_param_local(p,(sizeof p / sizeof p[0]));
outinstr(name,(sizeof p / sizeof p[0]),p);
}
static void OPHANDLER_CALL emit_parm1_lbl(char *name) static void OPHANDLER_CALL emit_parm1_lbl(char *name)
{ {
ucell p[1]; ucell p[1];
@ -5992,6 +6033,14 @@ static void OPHANDLER_CALL emit_parm2_gvar(char *name)
outinstr(name,(sizeof p / sizeof p[0]),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm2_local(char *name)
{
ucell p[2];
emit_param_local(p,(sizeof p / sizeof p[0]));
outinstr(name,(sizeof p / sizeof p[0]),p);
}
static void OPHANDLER_CALL emit_parm2_gvar_num(char *name) static void OPHANDLER_CALL emit_parm2_gvar_num(char *name)
{ {
ucell p[2]; ucell p[2];
@ -6017,6 +6066,14 @@ static void OPHANDLER_CALL emit_parm3_gvar(char *name)
outinstr(name,(sizeof p / sizeof p[0]),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm3_local(char *name)
{
ucell p[3];
emit_param_local(p,(sizeof p / sizeof p[0]));
outinstr(name,(sizeof p / sizeof p[0]),p);
}
static void OPHANDLER_CALL emit_parm4_num(char *name) static void OPHANDLER_CALL emit_parm4_num(char *name)
{ {
ucell p[4]; ucell p[4];
@ -6033,6 +6090,14 @@ static void OPHANDLER_CALL emit_parm4_gvar(char *name)
outinstr(name,(sizeof p / sizeof p[0]),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm4_local(char *name)
{
ucell p[4];
emit_param_local(p,(sizeof p / sizeof p[0]));
outinstr(name,(sizeof p / sizeof p[0]),p);
}
static void OPHANDLER_CALL emit_parm5_num(char *name) static void OPHANDLER_CALL emit_parm5_num(char *name)
{ {
ucell p[5]; ucell p[5];
@ -6049,6 +6114,14 @@ static void OPHANDLER_CALL emit_parm5_gvar(char *name)
outinstr(name,(sizeof p / sizeof p[0]),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm5_local(char *name)
{
ucell p[5];
emit_param_local(p,(sizeof p / sizeof p[0]));
outinstr(name,(sizeof p / sizeof p[0]),p);
}
static void OPHANDLER_CALL emit_do_switch(char *name) static void OPHANDLER_CALL emit_do_switch(char *name)
{ {
ucell p[2]; ucell p[2];
@ -6138,12 +6211,12 @@ static EMIT_OPCODE emit_opcodelist[] = {
{156, "const", emit_parm2_gvar_num }, {156, "const", emit_parm2_gvar_num },
{ 12, "const.alt", emit_parm1_num }, { 12, "const.alt", emit_parm1_num },
{ 11, "const.pri", emit_parm1_num }, { 11, "const.pri", emit_parm1_num },
{157, "const.s", emit_parm2_num }, {157, "const.s", emit_parm2_local },
{114, "dec", emit_parm1_gvar }, {114, "dec", emit_parm1_gvar },
{113, "dec.alt", emit_parm0 }, {113, "dec.alt", emit_parm0 },
{116, "dec.i", emit_parm0 }, {116, "dec.i", emit_parm0 },
{112, "dec.pri", emit_parm0 }, {112, "dec.pri", emit_parm0 },
{115, "dec.s", emit_parm1_num }, {115, "dec.s", emit_parm1_local },
{ 95, "eq", emit_parm0 }, { 95, "eq", emit_parm0 },
{106, "eq.c.alt", emit_parm1_num }, {106, "eq.c.alt", emit_parm1_num },
{105, "eq.c.pri", emit_parm1_num }, {105, "eq.c.pri", emit_parm1_num },
@ -6159,7 +6232,7 @@ static EMIT_OPCODE emit_opcodelist[] = {
{108, "inc.alt", emit_parm0 }, {108, "inc.alt", emit_parm0 },
{111, "inc.i", emit_parm0 }, {111, "inc.i", emit_parm0 },
{107, "inc.pri", emit_parm0 }, {107, "inc.pri", emit_parm0 },
{110, "inc.s", emit_parm1_num }, {110, "inc.s", emit_parm1_local },
{ 86, "invert", emit_parm0 }, { 86, "invert", emit_parm0 },
{ 55, "jeq", emit_parm1_lbl }, { 55, "jeq", emit_parm1_lbl },
{ 60, "jgeq", emit_parm1_lbl }, { 60, "jgeq", emit_parm1_lbl },
@ -6186,14 +6259,14 @@ static EMIT_OPCODE emit_opcodelist[] = {
{154, "load.both", emit_parm2_gvar }, {154, "load.both", emit_parm2_gvar },
{ 9, "load.i", emit_parm0 }, { 9, "load.i", emit_parm0 },
{ 1, "load.pri", emit_parm1_gvar }, { 1, "load.pri", emit_parm1_gvar },
{ 4, "load.s.alt", emit_parm1_num }, { 4, "load.s.alt", emit_parm1_local },
{155, "load.s.both",emit_parm2_num }, {155, "load.s.both",emit_parm2_local },
{ 3, "load.s.pri", emit_parm1_num }, { 3, "load.s.pri", emit_parm1_local },
{ 10, "lodb.i", emit_do_lodb_strb }, { 10, "lodb.i", emit_do_lodb_strb },
{ 6, "lref.alt", emit_parm1_gvar }, { 6, "lref.alt", emit_parm1_gvar },
{ 5, "lref.pri", emit_parm1_gvar }, { 5, "lref.pri", emit_parm1_gvar },
{ 8, "lref.s.alt", emit_parm1_num }, { 8, "lref.s.alt", emit_parm1_local },
{ 7, "lref.s.pri", emit_parm1_num }, { 7, "lref.s.pri", emit_parm1_local },
{ 34, "move.alt", emit_parm0 }, { 34, "move.alt", emit_parm0 },
{ 33, "move.pri", emit_parm0 }, { 33, "move.pri", emit_parm0 },
{117, "movs", emit_parm1_num }, {117, "movs", emit_parm1_num },
@ -6206,28 +6279,28 @@ static EMIT_OPCODE emit_opcodelist[] = {
{ 42, "pop.pri", emit_parm0 }, { 42, "pop.pri", emit_parm0 },
{ 46, "proc", emit_parm0 }, { 46, "proc", emit_parm0 },
{ 40, "push", emit_parm1_gvar }, { 40, "push", emit_parm1_gvar },
{133, "push.adr", emit_parm1_num }, {133, "push.adr", emit_parm1_local },
{ 37, "push.alt", emit_parm0 }, { 37, "push.alt", emit_parm0 },
{ 39, "push.c", emit_parm1_num }, { 39, "push.c", emit_parm1_num },
{ 36, "push.pri", emit_parm0 }, { 36, "push.pri", emit_parm0 },
{ 38, "push.r", emit_parm1_num }, { 38, "push.r", emit_parm1_num },
{ 41, "push.s", emit_parm1_num }, { 41, "push.s", emit_parm1_local },
{139, "push2", emit_parm2_gvar }, {139, "push2", emit_parm2_gvar },
{141, "push2.adr", emit_parm2_num }, {141, "push2.adr", emit_parm2_local },
{138, "push2.c", emit_parm2_num }, {138, "push2.c", emit_parm2_num },
{140, "push2.s", emit_parm2_num }, {140, "push2.s", emit_parm2_local },
{143, "push3", emit_parm3_gvar }, {143, "push3", emit_parm3_gvar },
{145, "push3.adr", emit_parm3_num }, {145, "push3.adr", emit_parm3_local },
{142, "push3.c", emit_parm3_num }, {142, "push3.c", emit_parm3_num },
{144, "push3.s", emit_parm3_num }, {144, "push3.s", emit_parm3_local },
{147, "push4", emit_parm4_gvar }, {147, "push4", emit_parm4_gvar },
{149, "push4.adr", emit_parm4_num }, {149, "push4.adr", emit_parm4_local },
{146, "push4.c", emit_parm4_num }, {146, "push4.c", emit_parm4_num },
{148, "push4.s", emit_parm4_num }, {148, "push4.s", emit_parm4_local },
{151, "push5", emit_parm5_gvar }, {151, "push5", emit_parm5_gvar },
{153, "push5.adr", emit_parm5_num }, {153, "push5.adr", emit_parm5_local },
{150, "push5.c", emit_parm5_num }, {150, "push5.c", emit_parm5_num },
{152, "push5.s", emit_parm5_num }, {152, "push5.s", emit_parm5_local },
{ 47, "ret", emit_parm0 }, { 47, "ret", emit_parm0 },
{ 48, "retn", emit_parm0 }, { 48, "retn", emit_parm0 },
{ 32, "sctrl", emit_parm1_num }, { 32, "sctrl", emit_parm1_num },
@ -6250,15 +6323,15 @@ static EMIT_OPCODE emit_opcodelist[] = {
/*{127, "srange", emit_parm2_num }, */ /*{127, "srange", emit_parm2_num }, */
{ 20, "sref.alt", emit_parm1_gvar }, { 20, "sref.alt", emit_parm1_gvar },
{ 19, "sref.pri", emit_parm1_gvar }, { 19, "sref.pri", emit_parm1_gvar },
{ 22, "sref.s.alt", emit_parm1_num }, { 22, "sref.s.alt", emit_parm1_local },
{ 21, "sref.s.pri", emit_parm1_num }, { 21, "sref.s.pri", emit_parm1_local },
{ 67, "sshr", emit_parm0 }, { 67, "sshr", emit_parm0 },
{ 44, "stack", emit_parm1_num }, { 44, "stack", emit_parm1_num },
{ 16, "stor.alt", emit_parm1_gvar }, { 16, "stor.alt", emit_parm1_gvar },
{ 23, "stor.i", emit_parm0 }, { 23, "stor.i", emit_parm0 },
{ 15, "stor.pri", emit_parm1_gvar }, { 15, "stor.pri", emit_parm1_gvar },
{ 18, "stor.s.alt", emit_parm1_num }, { 18, "stor.s.alt", emit_parm1_local },
{ 17, "stor.s.pri", emit_parm1_num }, { 17, "stor.s.pri", emit_parm1_local },
{ 24, "strb.i", emit_do_lodb_strb }, { 24, "strb.i", emit_do_lodb_strb },
{ 79, "sub", emit_parm0 }, { 79, "sub", emit_parm0 },
{ 80, "sub.alt", emit_parm0 }, { 80, "sub.alt", emit_parm0 },
@ -6278,7 +6351,7 @@ static EMIT_OPCODE emit_opcodelist[] = {
{ 91, "zero", emit_parm1_gvar }, { 91, "zero", emit_parm1_gvar },
{ 90, "zero.alt", emit_parm0 }, { 90, "zero.alt", emit_parm0 },
{ 89, "zero.pri", emit_parm0 }, { 89, "zero.pri", emit_parm0 },
{ 92, "zero.s", emit_parm1_num }, { 92, "zero.s", emit_parm1_local },
}; };
static int emit_findopcode(const char *instr,int maxlen) static int emit_findopcode(const char *instr,int maxlen)