py/emit: Combine name and global into one func for load/store/delete.
Reduces code size by: bare-arm: -56 minimal x86: -300 unix x64: -576 unix nanbox: -300 stm32: -164 cc3200: -56 esp8266: -236 esp32: -76
This commit is contained in:
parent
26b5754092
commit
d298013939
|
@ -66,7 +66,7 @@ typedef enum {
|
|||
#define EMIT(fun) (comp->emit_method_table->fun(comp->emit))
|
||||
#define EMIT_ARG(fun, ...) (comp->emit_method_table->fun(comp->emit, __VA_ARGS__))
|
||||
#define EMIT_LOAD_FAST(qst, local_num) (comp->emit_method_table->load_id.local(comp->emit, qst, local_num, MP_EMIT_IDOP_LOCAL_FAST))
|
||||
#define EMIT_LOAD_GLOBAL(qst) (comp->emit_method_table->load_id.global(comp->emit, qst))
|
||||
#define EMIT_LOAD_GLOBAL(qst) (comp->emit_method_table->load_id.global(comp->emit, qst, MP_EMIT_IDOP_GLOBAL_GLOBAL))
|
||||
|
||||
#else
|
||||
|
||||
|
@ -74,7 +74,7 @@ typedef enum {
|
|||
#define EMIT(fun) (mp_emit_bc_##fun(comp->emit))
|
||||
#define EMIT_ARG(fun, ...) (mp_emit_bc_##fun(comp->emit, __VA_ARGS__))
|
||||
#define EMIT_LOAD_FAST(qst, local_num) (mp_emit_bc_load_local(comp->emit, qst, local_num, MP_EMIT_IDOP_LOCAL_FAST))
|
||||
#define EMIT_LOAD_GLOBAL(qst) (mp_emit_bc_load_global(comp->emit, qst))
|
||||
#define EMIT_LOAD_GLOBAL(qst) (mp_emit_bc_load_global(comp->emit, qst, MP_EMIT_IDOP_GLOBAL_GLOBAL))
|
||||
|
||||
#endif
|
||||
|
||||
|
|
16
py/emit.h
16
py/emit.h
|
@ -59,6 +59,10 @@ typedef enum {
|
|||
#define MP_EMIT_IDOP_LOCAL_FAST (0)
|
||||
#define MP_EMIT_IDOP_LOCAL_DEREF (1)
|
||||
|
||||
// Kind for emit_id_ops->global()
|
||||
#define MP_EMIT_IDOP_GLOBAL_NAME (0)
|
||||
#define MP_EMIT_IDOP_GLOBAL_GLOBAL (1)
|
||||
|
||||
// Kind for emit->build()
|
||||
#define MP_EMIT_BUILD_TUPLE (0)
|
||||
#define MP_EMIT_BUILD_LIST (1)
|
||||
|
@ -72,8 +76,7 @@ typedef struct _emit_t emit_t;
|
|||
|
||||
typedef struct _mp_emit_method_table_id_ops_t {
|
||||
void (*local)(emit_t *emit, qstr qst, mp_uint_t local_num, int kind);
|
||||
void (*name)(emit_t *emit, qstr qst);
|
||||
void (*global)(emit_t *emit, qstr qst);
|
||||
void (*global)(emit_t *emit, qstr qst, int kind);
|
||||
} mp_emit_method_table_id_ops_t;
|
||||
|
||||
typedef struct _emit_method_table_t {
|
||||
|
@ -190,14 +193,11 @@ void mp_emit_bc_adjust_stack_size(emit_t *emit, mp_int_t delta);
|
|||
void mp_emit_bc_set_source_line(emit_t *emit, mp_uint_t line);
|
||||
|
||||
void mp_emit_bc_load_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind);
|
||||
void mp_emit_bc_load_name(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_load_global(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_load_global(emit_t *emit, qstr qst, int kind);
|
||||
void mp_emit_bc_store_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind);
|
||||
void mp_emit_bc_store_name(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_store_global(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_store_global(emit_t *emit, qstr qst, int kind);
|
||||
void mp_emit_bc_delete_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind);
|
||||
void mp_emit_bc_delete_name(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_delete_global(emit_t *emit, qstr qst);
|
||||
void mp_emit_bc_delete_global(emit_t *emit, qstr qst, int kind);
|
||||
|
||||
void mp_emit_bc_label_assign(emit_t *emit, mp_uint_t l);
|
||||
void mp_emit_bc_import_name(emit_t *emit, qstr qst);
|
||||
|
|
43
py/emitbc.c
43
py/emitbc.c
|
@ -568,19 +568,12 @@ void mp_emit_bc_load_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind
|
|||
}
|
||||
}
|
||||
|
||||
void mp_emit_bc_load_name(emit_t *emit, qstr qst) {
|
||||
void mp_emit_bc_load_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_BC_LOAD_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_BC_LOAD_NAME);
|
||||
MP_STATIC_ASSERT(MP_BC_LOAD_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_BC_LOAD_GLOBAL);
|
||||
(void)qst;
|
||||
emit_bc_pre(emit, 1);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_NAME, qst);
|
||||
if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE_DYNAMIC) {
|
||||
emit_write_bytecode_byte(emit, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void mp_emit_bc_load_global(emit_t *emit, qstr qst) {
|
||||
(void)qst;
|
||||
emit_bc_pre(emit, 1);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_GLOBAL, qst);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_NAME + kind, qst);
|
||||
if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE_DYNAMIC) {
|
||||
emit_write_bytecode_byte(emit, 0);
|
||||
}
|
||||
|
@ -621,14 +614,11 @@ void mp_emit_bc_store_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kin
|
|||
}
|
||||
}
|
||||
|
||||
void mp_emit_bc_store_name(emit_t *emit, qstr qst) {
|
||||
void mp_emit_bc_store_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_BC_STORE_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_BC_STORE_NAME);
|
||||
MP_STATIC_ASSERT(MP_BC_STORE_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_BC_STORE_GLOBAL);
|
||||
emit_bc_pre(emit, -1);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_STORE_NAME, qst);
|
||||
}
|
||||
|
||||
void mp_emit_bc_store_global(emit_t *emit, qstr qst) {
|
||||
emit_bc_pre(emit, -1);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_STORE_GLOBAL, qst);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_STORE_NAME + kind, qst);
|
||||
}
|
||||
|
||||
void mp_emit_bc_store_attr(emit_t *emit, qstr qst) {
|
||||
|
@ -651,14 +641,11 @@ void mp_emit_bc_delete_local(emit_t *emit, qstr qst, mp_uint_t local_num, int ki
|
|||
emit_write_bytecode_byte_uint(emit, MP_BC_DELETE_FAST + kind, local_num);
|
||||
}
|
||||
|
||||
void mp_emit_bc_delete_name(emit_t *emit, qstr qst) {
|
||||
void mp_emit_bc_delete_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_BC_DELETE_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_BC_DELETE_NAME);
|
||||
MP_STATIC_ASSERT(MP_BC_DELETE_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_BC_DELETE_GLOBAL);
|
||||
emit_bc_pre(emit, 0);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_DELETE_NAME, qst);
|
||||
}
|
||||
|
||||
void mp_emit_bc_delete_global(emit_t *emit, qstr qst) {
|
||||
emit_bc_pre(emit, 0);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_DELETE_GLOBAL, qst);
|
||||
emit_write_bytecode_byte_qstr(emit, MP_BC_DELETE_NAME + kind, qst);
|
||||
}
|
||||
|
||||
void mp_emit_bc_delete_attr(emit_t *emit, qstr qst) {
|
||||
|
@ -954,17 +941,14 @@ const emit_method_table_t emit_bc_method_table = {
|
|||
|
||||
{
|
||||
mp_emit_bc_load_local,
|
||||
mp_emit_bc_load_name,
|
||||
mp_emit_bc_load_global,
|
||||
},
|
||||
{
|
||||
mp_emit_bc_store_local,
|
||||
mp_emit_bc_store_name,
|
||||
mp_emit_bc_store_global,
|
||||
},
|
||||
{
|
||||
mp_emit_bc_delete_local,
|
||||
mp_emit_bc_delete_name,
|
||||
mp_emit_bc_delete_global,
|
||||
},
|
||||
|
||||
|
@ -1032,19 +1016,16 @@ const emit_method_table_t emit_bc_method_table = {
|
|||
#else
|
||||
const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_load_id_ops = {
|
||||
mp_emit_bc_load_local,
|
||||
mp_emit_bc_load_name,
|
||||
mp_emit_bc_load_global,
|
||||
};
|
||||
|
||||
const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_store_id_ops = {
|
||||
mp_emit_bc_store_local,
|
||||
mp_emit_bc_store_name,
|
||||
mp_emit_bc_store_global,
|
||||
};
|
||||
|
||||
const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_delete_id_ops = {
|
||||
mp_emit_bc_delete_local,
|
||||
mp_emit_bc_delete_name,
|
||||
mp_emit_bc_delete_global,
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -63,9 +63,9 @@ void mp_emit_common_id_op(emit_t *emit, const mp_emit_method_table_id_ops_t *emi
|
|||
|
||||
// call the emit backend with the correct code
|
||||
if (id->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) {
|
||||
emit_method_table->name(emit, qst);
|
||||
emit_method_table->global(emit, qst, MP_EMIT_IDOP_GLOBAL_NAME);
|
||||
} else if (id->kind == ID_INFO_KIND_GLOBAL_EXPLICIT) {
|
||||
emit_method_table->global(emit, qst);
|
||||
emit_method_table->global(emit, qst, MP_EMIT_IDOP_GLOBAL_GLOBAL);
|
||||
} else if (id->kind == ID_INFO_KIND_LOCAL) {
|
||||
emit_method_table->local(emit, qst, id->local_num, MP_EMIT_IDOP_LOCAL_FAST);
|
||||
} else {
|
||||
|
|
|
@ -946,34 +946,40 @@ STATIC void emit_native_load_local(emit_t *emit, qstr qst, mp_uint_t local_num,
|
|||
}
|
||||
}
|
||||
|
||||
STATIC void emit_native_load_name(emit_t *emit, qstr qst) {
|
||||
STATIC void emit_native_load_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_F_LOAD_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_F_LOAD_NAME);
|
||||
MP_STATIC_ASSERT(MP_F_LOAD_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_F_LOAD_GLOBAL);
|
||||
emit_native_pre(emit);
|
||||
if (kind == MP_EMIT_IDOP_GLOBAL_NAME) {
|
||||
DEBUG_printf("load_name(%s)\n", qstr_str(qst));
|
||||
emit_native_pre(emit);
|
||||
emit_call_with_imm_arg(emit, MP_F_LOAD_NAME, qst, REG_ARG_1);
|
||||
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
|
||||
}
|
||||
|
||||
STATIC void emit_native_load_global(emit_t *emit, qstr qst) {
|
||||
DEBUG_printf("load_global(%s)\n", qstr_str(qst));
|
||||
emit_native_pre(emit);
|
||||
// check for builtin casting operators
|
||||
if (emit->do_viper_types && qst == MP_QSTR_int) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_INT);
|
||||
} else if (emit->do_viper_types && qst == MP_QSTR_uint) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_UINT);
|
||||
} else if (emit->do_viper_types && qst == MP_QSTR_ptr) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR);
|
||||
} else if (emit->do_viper_types && qst == MP_QSTR_ptr8) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR8);
|
||||
} else if (emit->do_viper_types && qst == MP_QSTR_ptr16) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR16);
|
||||
} else if (emit->do_viper_types && qst == MP_QSTR_ptr32) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR32);
|
||||
} else {
|
||||
emit_call_with_imm_arg(emit, MP_F_LOAD_GLOBAL, qst, REG_ARG_1);
|
||||
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
|
||||
DEBUG_printf("load_global(%s)\n", qstr_str(qst));
|
||||
if (emit->do_viper_types) {
|
||||
// check for builtin casting operators
|
||||
if (qst == MP_QSTR_int) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_INT);
|
||||
return;
|
||||
} else if (qst == MP_QSTR_uint) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_UINT);
|
||||
return;
|
||||
} else if (qst == MP_QSTR_ptr) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR);
|
||||
return;
|
||||
} else if (qst == MP_QSTR_ptr8) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR8);
|
||||
return;
|
||||
} else if (qst == MP_QSTR_ptr16) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR16);
|
||||
return;
|
||||
} else if (qst == MP_QSTR_ptr32) {
|
||||
emit_post_push_imm(emit, VTYPE_BUILTIN_CAST, VTYPE_PTR32);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
emit_call_with_imm_arg(emit, MP_F_LOAD_NAME + kind, qst, REG_ARG_1);
|
||||
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
|
||||
}
|
||||
|
||||
STATIC void emit_native_load_attr(emit_t *emit, qstr qst) {
|
||||
// depends on type of subject:
|
||||
|
@ -1194,16 +1200,15 @@ STATIC void emit_native_store_local(emit_t *emit, qstr qst, mp_uint_t local_num,
|
|||
}
|
||||
}
|
||||
|
||||
STATIC void emit_native_store_name(emit_t *emit, qstr qst) {
|
||||
STATIC void emit_native_store_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_F_STORE_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_F_STORE_NAME);
|
||||
MP_STATIC_ASSERT(MP_F_STORE_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_F_STORE_GLOBAL);
|
||||
if (kind == MP_EMIT_IDOP_GLOBAL_NAME) {
|
||||
// mp_store_name, but needs conversion of object (maybe have mp_viper_store_name(obj, type))
|
||||
vtype_kind_t vtype;
|
||||
emit_pre_pop_reg(emit, &vtype, REG_ARG_2);
|
||||
assert(vtype == VTYPE_PYOBJ);
|
||||
emit_call_with_imm_arg(emit, MP_F_STORE_NAME, qst, REG_ARG_1); // arg1 = name
|
||||
emit_post(emit);
|
||||
}
|
||||
|
||||
STATIC void emit_native_store_global(emit_t *emit, qstr qst) {
|
||||
} else {
|
||||
vtype_kind_t vtype = peek_vtype(emit, 0);
|
||||
if (vtype == VTYPE_PYOBJ) {
|
||||
emit_pre_pop_reg(emit, &vtype, REG_ARG_2);
|
||||
|
@ -1212,7 +1217,8 @@ STATIC void emit_native_store_global(emit_t *emit, qstr qst) {
|
|||
emit_call_with_imm_arg(emit, MP_F_CONVERT_NATIVE_TO_OBJ, vtype, REG_ARG_2); // arg2 = type
|
||||
ASM_MOV_REG_REG(emit->as, REG_ARG_2, REG_RET);
|
||||
}
|
||||
emit_call_with_imm_arg(emit, MP_F_STORE_GLOBAL, qst, REG_ARG_1); // arg1 = name
|
||||
}
|
||||
emit_call_with_imm_arg(emit, MP_F_STORE_NAME + kind, qst, REG_ARG_1); // arg1 = name
|
||||
emit_post(emit);
|
||||
}
|
||||
|
||||
|
@ -1417,15 +1423,11 @@ STATIC void emit_native_delete_local(emit_t *emit, qstr qst, mp_uint_t local_num
|
|||
}
|
||||
}
|
||||
|
||||
STATIC void emit_native_delete_name(emit_t *emit, qstr qst) {
|
||||
STATIC void emit_native_delete_global(emit_t *emit, qstr qst, int kind) {
|
||||
MP_STATIC_ASSERT(MP_F_DELETE_NAME + MP_EMIT_IDOP_GLOBAL_NAME == MP_F_DELETE_NAME);
|
||||
MP_STATIC_ASSERT(MP_F_DELETE_NAME + MP_EMIT_IDOP_GLOBAL_GLOBAL == MP_F_DELETE_GLOBAL);
|
||||
emit_native_pre(emit);
|
||||
emit_call_with_imm_arg(emit, MP_F_DELETE_NAME, qst, REG_ARG_1);
|
||||
emit_post(emit);
|
||||
}
|
||||
|
||||
STATIC void emit_native_delete_global(emit_t *emit, qstr qst) {
|
||||
emit_native_pre(emit);
|
||||
emit_call_with_imm_arg(emit, MP_F_DELETE_GLOBAL, qst, REG_ARG_1);
|
||||
emit_call_with_imm_arg(emit, MP_F_DELETE_NAME + kind, qst, REG_ARG_1);
|
||||
emit_post(emit);
|
||||
}
|
||||
|
||||
|
@ -2194,17 +2196,14 @@ const emit_method_table_t EXPORT_FUN(method_table) = {
|
|||
|
||||
{
|
||||
emit_native_load_local,
|
||||
emit_native_load_name,
|
||||
emit_native_load_global,
|
||||
},
|
||||
{
|
||||
emit_native_store_local,
|
||||
emit_native_store_name,
|
||||
emit_native_store_global,
|
||||
},
|
||||
{
|
||||
emit_native_delete_local,
|
||||
emit_native_delete_name,
|
||||
emit_native_delete_global,
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in New Issue