fold BC_INST_IVAR/FVAR/SVAR into one instruction
parent
a57072fb73
commit
139ead5d72
|
@ -142,14 +142,8 @@ enum {
|
||||||
BC_INST_CONC,
|
BC_INST_CONC,
|
||||||
/* like above but without delimiter */
|
/* like above but without delimiter */
|
||||||
BC_INST_CONC_W,
|
BC_INST_CONC_W,
|
||||||
/* push the value of svar with index D on the stack according to M */
|
/* push the value of var with index D on the stack according to M */
|
||||||
BC_INST_SVAR,
|
BC_INST_VAR,
|
||||||
/* push the value of ivar with index D on the stack according to M */
|
|
||||||
BC_INST_IVAR,
|
|
||||||
/* push the value of fvar with index D on the stack according to M */
|
|
||||||
BC_INST_FVAR,
|
|
||||||
/* pop a value off the stack and set vvar with index D to it */
|
|
||||||
BC_INST_FVAR1,
|
|
||||||
/* pop a value off the stack and set alias with index D to it */
|
/* pop a value off the stack and set alias with index D to it */
|
||||||
BC_INST_ALIAS,
|
BC_INST_ALIAS,
|
||||||
/* pop 2 values off the stack; top is value to set, below is alias name */
|
/* pop 2 values off the stack; top is value to set, below is alias name */
|
||||||
|
|
|
@ -328,21 +328,9 @@ void gen_state::gen_val(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_state::gen_lookup_ivar(ident &id, int ltype) {
|
void gen_state::gen_lookup_var(ident &id, int ltype) {
|
||||||
code.push_back(
|
code.push_back(
|
||||||
BC_INST_IVAR | ret_code(ltype, BC_RET_INT) | (id.index() << 8)
|
BC_INST_VAR | ret_code(ltype) | (id.index() << 8)
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void gen_state::gen_lookup_fvar(ident &id, int ltype) {
|
|
||||||
code.push_back(
|
|
||||||
BC_INST_FVAR | ret_code(ltype, BC_RET_FLOAT) | (id.index() << 8)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void gen_state::gen_lookup_svar(ident &id, int ltype) {
|
|
||||||
code.push_back(
|
|
||||||
BC_INST_SVAR | ret_code(ltype, BC_RET_STRING) | (id.index() << 8)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,9 +60,7 @@ struct gen_state {
|
||||||
std::size_t line = 0
|
std::size_t line = 0
|
||||||
);
|
);
|
||||||
|
|
||||||
void gen_lookup_ivar(ident &id, int ltype = 0);
|
void gen_lookup_var(ident &id, int ltype = 0);
|
||||||
void gen_lookup_fvar(ident &id, int ltype = 0);
|
|
||||||
void gen_lookup_svar(ident &id, int ltype = 0);
|
|
||||||
|
|
||||||
void gen_lookup_alias(ident &id, int ltype = 0, int dtype = 0);
|
void gen_lookup_alias(ident &id, int ltype = 0, int dtype = 0);
|
||||||
void gen_lookup_ident(int ltype = 0);
|
void gen_lookup_ident(int ltype = 0);
|
||||||
|
|
|
@ -481,24 +481,11 @@ lookup_id:
|
||||||
);
|
);
|
||||||
switch (id.type()) {
|
switch (id.type()) {
|
||||||
case ident_type::IVAR:
|
case ident_type::IVAR:
|
||||||
if (ltype == VAL_POP) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
gs.gen_lookup_ivar(id, ltype);
|
|
||||||
switch (ltype) {
|
|
||||||
case VAL_CODE:
|
|
||||||
case VAL_IDENT:
|
|
||||||
lookup_done(gs, ltype);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case ident_type::FVAR:
|
case ident_type::FVAR:
|
||||||
if (ltype == VAL_POP) {
|
if (ltype == VAL_POP) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
gs.gen_lookup_fvar(id, ltype);
|
gs.gen_lookup_var(id, ltype);
|
||||||
switch (ltype) {
|
switch (ltype) {
|
||||||
case VAL_CODE:
|
case VAL_CODE:
|
||||||
case VAL_IDENT:
|
case VAL_IDENT:
|
||||||
|
@ -513,7 +500,7 @@ lookup_id:
|
||||||
case VAL_POP:
|
case VAL_POP:
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
gs.gen_lookup_svar(id, ltype);
|
gs.gen_lookup_var(id, ltype);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
lookup_done(gs, ltype);
|
lookup_done(gs, ltype);
|
||||||
|
@ -605,13 +592,9 @@ lookup_id:
|
||||||
);
|
);
|
||||||
switch (id.type()) {
|
switch (id.type()) {
|
||||||
case ident_type::IVAR:
|
case ident_type::IVAR:
|
||||||
gs.gen_lookup_ivar(id);
|
|
||||||
return true;
|
|
||||||
case ident_type::FVAR:
|
case ident_type::FVAR:
|
||||||
gs.gen_lookup_fvar(id);
|
|
||||||
return true;
|
|
||||||
case ident_type::SVAR:
|
case ident_type::SVAR:
|
||||||
gs.gen_lookup_svar(id);
|
gs.gen_lookup_var(id);
|
||||||
return true;
|
return true;
|
||||||
case ident_type::ALIAS:
|
case ident_type::ALIAS:
|
||||||
gs.gen_lookup_alias(id);
|
gs.gen_lookup_alias(id);
|
||||||
|
|
30
src/cs_vm.cc
30
src/cs_vm.cc
|
@ -716,31 +716,11 @@ std::uint32_t *vm_exec(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BC_INST_SVAR | BC_RET_STRING:
|
case BC_INST_VAR | BC_RET_NULL:
|
||||||
case BC_INST_SVAR | BC_RET_NULL:
|
case BC_INST_VAR | BC_RET_INT:
|
||||||
case BC_INST_SVAR | BC_RET_INT:
|
case BC_INST_VAR | BC_RET_FLOAT:
|
||||||
case BC_INST_SVAR | BC_RET_FLOAT:
|
case BC_INST_VAR | BC_RET_STRING:
|
||||||
args.emplace_back() = static_cast<string_var *>(
|
args.emplace_back() = static_cast<global_var *>(
|
||||||
ts.istate->identmap[op >> 8]
|
|
||||||
)->value();
|
|
||||||
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case BC_INST_IVAR | BC_RET_INT:
|
|
||||||
case BC_INST_IVAR | BC_RET_NULL:
|
|
||||||
case BC_INST_IVAR | BC_RET_STRING:
|
|
||||||
case BC_INST_IVAR | BC_RET_FLOAT:
|
|
||||||
args.emplace_back() = static_cast<integer_var *>(
|
|
||||||
ts.istate->identmap[op >> 8]
|
|
||||||
)->value();
|
|
||||||
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case BC_INST_FVAR | BC_RET_FLOAT:
|
|
||||||
case BC_INST_FVAR | BC_RET_NULL:
|
|
||||||
case BC_INST_FVAR | BC_RET_STRING:
|
|
||||||
case BC_INST_FVAR | BC_RET_INT:
|
|
||||||
args.emplace_back() = static_cast<float_var *>(
|
|
||||||
ts.istate->identmap[op >> 8]
|
ts.istate->identmap[op >> 8]
|
||||||
)->value();
|
)->value();
|
||||||
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
|
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
|
||||||
|
|
Loading…
Reference in New Issue