py/emit: Combine fast and deref into one function for load/store/delete.
Reduces code size by:
bare-arm: -16
minimal x86: -208
unix x64: -408
unix nanbox: -248
stm32: -12
cc3200: -24
esp8266: -96
esp32: -44
diff --git a/py/emitbc.c b/py/emitbc.c
index b1b61ba..28d32d4 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -556,22 +556,18 @@
emit_write_bytecode_byte(emit, MP_BC_LOAD_NULL);
}
-void mp_emit_bc_load_fast(emit_t *emit, qstr qst, mp_uint_t local_num) {
+void mp_emit_bc_load_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind) {
+ MP_STATIC_ASSERT(MP_BC_LOAD_FAST_N + MP_EMIT_IDOP_LOCAL_FAST == MP_BC_LOAD_FAST_N);
+ MP_STATIC_ASSERT(MP_BC_LOAD_FAST_N + MP_EMIT_IDOP_LOCAL_DEREF == MP_BC_LOAD_DEREF);
(void)qst;
emit_bc_pre(emit, 1);
- if (local_num <= 15) {
+ if (kind == MP_EMIT_IDOP_LOCAL_FAST && local_num <= 15) {
emit_write_bytecode_byte(emit, MP_BC_LOAD_FAST_MULTI + local_num);
} else {
- emit_write_bytecode_byte_uint(emit, MP_BC_LOAD_FAST_N, local_num);
+ emit_write_bytecode_byte_uint(emit, MP_BC_LOAD_FAST_N + kind, local_num);
}
}
-void mp_emit_bc_load_deref(emit_t *emit, qstr qst, mp_uint_t local_num) {
- (void)qst;
- emit_bc_pre(emit, 1);
- emit_write_bytecode_byte_uint(emit, MP_BC_LOAD_DEREF, local_num);
-}
-
void mp_emit_bc_load_name(emit_t *emit, qstr qst) {
(void)qst;
emit_bc_pre(emit, 1);
@@ -613,22 +609,18 @@
emit_write_bytecode_byte(emit, MP_BC_LOAD_SUBSCR);
}
-void mp_emit_bc_store_fast(emit_t *emit, qstr qst, mp_uint_t local_num) {
+void mp_emit_bc_store_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind) {
+ MP_STATIC_ASSERT(MP_BC_STORE_FAST_N + MP_EMIT_IDOP_LOCAL_FAST == MP_BC_STORE_FAST_N);
+ MP_STATIC_ASSERT(MP_BC_STORE_FAST_N + MP_EMIT_IDOP_LOCAL_DEREF == MP_BC_STORE_DEREF);
(void)qst;
emit_bc_pre(emit, -1);
- if (local_num <= 15) {
+ if (kind == MP_EMIT_IDOP_LOCAL_FAST && local_num <= 15) {
emit_write_bytecode_byte(emit, MP_BC_STORE_FAST_MULTI + local_num);
} else {
- emit_write_bytecode_byte_uint(emit, MP_BC_STORE_FAST_N, local_num);
+ emit_write_bytecode_byte_uint(emit, MP_BC_STORE_FAST_N + kind, local_num);
}
}
-void mp_emit_bc_store_deref(emit_t *emit, qstr qst, mp_uint_t local_num) {
- (void)qst;
- emit_bc_pre(emit, -1);
- emit_write_bytecode_byte_uint(emit, MP_BC_STORE_DEREF, local_num);
-}
-
void mp_emit_bc_store_name(emit_t *emit, qstr qst) {
emit_bc_pre(emit, -1);
emit_write_bytecode_byte_qstr(emit, MP_BC_STORE_NAME, qst);
@@ -652,14 +644,11 @@
emit_write_bytecode_byte(emit, MP_BC_STORE_SUBSCR);
}
-void mp_emit_bc_delete_fast(emit_t *emit, qstr qst, mp_uint_t local_num) {
+void mp_emit_bc_delete_local(emit_t *emit, qstr qst, mp_uint_t local_num, int kind) {
+ MP_STATIC_ASSERT(MP_BC_DELETE_FAST + MP_EMIT_IDOP_LOCAL_FAST == MP_BC_DELETE_FAST);
+ MP_STATIC_ASSERT(MP_BC_DELETE_FAST + MP_EMIT_IDOP_LOCAL_DEREF == MP_BC_DELETE_DEREF);
(void)qst;
- emit_write_bytecode_byte_uint(emit, MP_BC_DELETE_FAST, local_num);
-}
-
-void mp_emit_bc_delete_deref(emit_t *emit, qstr qst, mp_uint_t local_num) {
- (void)qst;
- emit_write_bytecode_byte_uint(emit, MP_BC_DELETE_DEREF, local_num);
+ emit_write_bytecode_byte_uint(emit, MP_BC_DELETE_FAST + kind, local_num);
}
void mp_emit_bc_delete_name(emit_t *emit, qstr qst) {
@@ -972,20 +961,17 @@
mp_emit_bc_set_source_line,
{
- mp_emit_bc_load_fast,
- mp_emit_bc_load_deref,
+ mp_emit_bc_load_local,
mp_emit_bc_load_name,
mp_emit_bc_load_global,
},
{
- mp_emit_bc_store_fast,
- mp_emit_bc_store_deref,
+ mp_emit_bc_store_local,
mp_emit_bc_store_name,
mp_emit_bc_store_global,
},
{
- mp_emit_bc_delete_fast,
- mp_emit_bc_delete_deref,
+ mp_emit_bc_delete_local,
mp_emit_bc_delete_name,
mp_emit_bc_delete_global,
},
@@ -1056,22 +1042,19 @@
};
#else
const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_load_id_ops = {
- mp_emit_bc_load_fast,
- mp_emit_bc_load_deref,
+ 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_fast,
- mp_emit_bc_store_deref,
+ 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_fast,
- mp_emit_bc_delete_deref,
+ mp_emit_bc_delete_local,
mp_emit_bc_delete_name,
mp_emit_bc_delete_global,
};