emit/__emit: New argument type: local variable (name or offset)
This commit is contained in:
parent
e55f6a213a
commit
c58fce34cb
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user