summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c85
1 files changed, 47 insertions, 38 deletions
diff --git a/py/vm.c b/py/vm.c
index d959880f12..36ea10f5c0 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -223,18 +223,6 @@ dispatch_loop:
PUSH(MP_OBJ_NULL);
DISPATCH();
- ENTRY(MP_BC_LOAD_FAST_0):
- obj_shared = fastn[0];
- goto load_check;
-
- ENTRY(MP_BC_LOAD_FAST_1):
- obj_shared = fastn[-1];
- goto load_check;
-
- ENTRY(MP_BC_LOAD_FAST_2):
- obj_shared = fastn[-2];
- goto load_check;
-
ENTRY(MP_BC_LOAD_FAST_N):
DECODE_UINT;
obj_shared = fastn[-unum];
@@ -288,18 +276,6 @@ dispatch_loop:
DISPATCH();
}
- ENTRY(MP_BC_STORE_FAST_0):
- fastn[0] = POP();
- DISPATCH();
-
- ENTRY(MP_BC_STORE_FAST_1):
- fastn[-1] = POP();
- DISPATCH();
-
- ENTRY(MP_BC_STORE_FAST_2):
- fastn[-2] = POP();
- DISPATCH();
-
ENTRY(MP_BC_STORE_FAST_N):
DECODE_UINT;
fastn[-unum] = POP();
@@ -606,19 +582,6 @@ unwind_jump:
}
DISPATCH();
- ENTRY(MP_BC_UNARY_OP):
- unum = *ip++;
- SET_TOP(mp_unary_op(unum, TOP()));
- DISPATCH();
-
- ENTRY(MP_BC_BINARY_OP): {
- unum = *ip++;
- mp_obj_t rhs = POP();
- mp_obj_t lhs = TOP();
- SET_TOP(mp_binary_op(unum, lhs, rhs));
- DISPATCH();
- }
-
ENTRY(MP_BC_BUILD_TUPLE):
DECODE_UINT;
sp -= unum - 1;
@@ -890,7 +853,53 @@ yield:
mp_import_all(POP());
DISPATCH();
- ENTRY_DEFAULT: {
+#if MICROPY_OPT_COMPUTED_GOTO
+ ENTRY(MP_BC_LOAD_CONST_SMALL_INT_MULTI):
+ PUSH(MP_OBJ_NEW_SMALL_INT((mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16));
+ DISPATCH();
+
+ ENTRY(MP_BC_LOAD_FAST_MULTI):
+ obj_shared = fastn[MP_BC_LOAD_FAST_MULTI - (mp_int_t)ip[-1]];
+ goto load_check;
+
+ ENTRY(MP_BC_STORE_FAST_MULTI):
+ fastn[MP_BC_STORE_FAST_MULTI - (mp_int_t)ip[-1]] = POP();
+ DISPATCH();
+
+ ENTRY(MP_BC_UNARY_OP_MULTI):
+ SET_TOP(mp_unary_op(ip[-1] - MP_BC_UNARY_OP_MULTI, TOP()));
+ DISPATCH();
+
+ ENTRY(MP_BC_BINARY_OP_MULTI): {
+ mp_obj_t rhs = POP();
+ mp_obj_t lhs = TOP();
+ SET_TOP(mp_binary_op(ip[-1] - MP_BC_BINARY_OP_MULTI, lhs, rhs));
+ DISPATCH();
+ }
+
+ ENTRY_DEFAULT:
+#else
+ ENTRY_DEFAULT:
+ if (ip[-1] < MP_BC_LOAD_CONST_SMALL_INT_MULTI + 64) {
+ PUSH(MP_OBJ_NEW_SMALL_INT((mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16));
+ DISPATCH();
+ } else if (ip[-1] < MP_BC_LOAD_FAST_MULTI + 16) {
+ obj_shared = fastn[MP_BC_LOAD_FAST_MULTI - (mp_int_t)ip[-1]];
+ goto load_check;
+ } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) {
+ fastn[MP_BC_STORE_FAST_MULTI - (mp_int_t)ip[-1]] = POP();
+ DISPATCH();
+ } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + 5) {
+ SET_TOP(mp_unary_op(ip[-1] - MP_BC_UNARY_OP_MULTI, TOP()));
+ DISPATCH();
+ } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + 35) {
+ mp_obj_t rhs = POP();
+ mp_obj_t lhs = TOP();
+ SET_TOP(mp_binary_op(ip[-1] - MP_BC_BINARY_OP_MULTI, lhs, rhs));
+ DISPATCH();
+ } else
+#endif
+ {
mp_obj_t obj = mp_obj_new_exception_msg(&mp_type_NotImplementedError, "byte code not implemented");
nlr_pop();
fastn[0] = obj;