mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
codegen.c: get_int_operand() to support OP_LOADL (int in pool).
This commit is contained in:
@@ -549,7 +549,7 @@ gen_return(codegen_scope *s, uint8_t op, uint16_t src)
|
||||
}
|
||||
|
||||
static mrb_bool
|
||||
get_int_operand(struct mrb_insn_data *data, mrb_int *n)
|
||||
get_int_operand(codegen_scope *s, struct mrb_insn_data *data, mrb_int *n)
|
||||
{
|
||||
switch (data->insn) {
|
||||
case OP_LOADI__1:
|
||||
@@ -574,6 +574,24 @@ get_int_operand(struct mrb_insn_data *data, mrb_int *n)
|
||||
*n = (mrb_int)((uint32_t)data->b<<16)+data->c;
|
||||
return TRUE;
|
||||
|
||||
case OP_LOADL:
|
||||
{
|
||||
mrb_pool_value *pv = &s->pool[data->b];
|
||||
|
||||
if (pv->tt == IREP_TT_INT32) {
|
||||
*n = (mrb_int)pv->u.i32;
|
||||
}
|
||||
#ifdef MRB_INT64
|
||||
else if (pv->tt == IREP_TT_INT64) {
|
||||
*n = (mrb_int)pv->u.i64;
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
@@ -591,7 +609,7 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
|
||||
struct mrb_insn_data data = mrb_last_insn(s);
|
||||
mrb_int n;
|
||||
|
||||
if (!get_int_operand(&data, &n)) {
|
||||
if (!get_int_operand(s, &data, &n)) {
|
||||
/* not integer immediate */
|
||||
goto normal;
|
||||
}
|
||||
@@ -864,7 +882,7 @@ gen_uniop(codegen_scope *s, mrb_sym sym, uint16_t dst)
|
||||
struct mrb_insn_data data = mrb_last_insn(s);
|
||||
mrb_int n;
|
||||
|
||||
if (get_int_operand(&data, &n)) {
|
||||
if (get_int_operand(s, &data, &n)) {
|
||||
s->pc = s->lastpc;
|
||||
if (sym == MRB_OPSYM_2(s->mrb, minus)) {
|
||||
n = -n;
|
||||
|
||||
Reference in New Issue
Block a user