summaryrefslogtreecommitdiffstatshomepage
path: root/py/emitnative.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/emitnative.c')
-rw-r--r--py/emitnative.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/py/emitnative.c b/py/emitnative.c
index 782f4b60dd..6afdf130a1 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -190,11 +190,12 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
#define EXPORT_FUN(name) emit_native_x86_##name
#define REG_TEMP0 (REG_EAX)
-#define REG_TEMP1 (REG_EDI)
-#define REG_TEMP2 (REG_ESI)
+#define REG_TEMP1 (REG_EBX)
+#define REG_TEMP2 (REG_ECX)
-#define REG_LOCAL_1 (REG_EBX)
-#define REG_LOCAL_NUM (1)
+#define REG_LOCAL_1 (REG_ESI)
+#define REG_LOCAL_2 (REG_EDI)
+#define REG_LOCAL_NUM (2)
#define ASM_PASS_COMPUTE ASM_X86_PASS_COMPUTE
#define ASM_PASS_EMIT ASM_X86_PASS_EMIT
@@ -523,17 +524,13 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
}
#elif N_X86
for (int i = 0; i < scope->num_pos_args; i++) {
- // TODO
- assert(0);
if (i == 0) {
- asm_x86_mov_r32_to_r32(emit->as, REG_ARG_1, REG_LOCAL_1);
+ asm_x86_mov_arg_to_r32(emit->as, i, REG_LOCAL_1);
} else if (i == 1) {
- asm_x86_mov_r32_to_local(emit->as, REG_ARG_2, i - REG_LOCAL_NUM);
- } else if (i == 2) {
- asm_x86_mov_r32_to_local(emit->as, REG_ARG_3, i - REG_LOCAL_NUM);
+ asm_x86_mov_arg_to_r32(emit->as, i, REG_LOCAL_2);
} else {
- // TODO not implemented
- assert(0);
+ asm_x86_mov_arg_to_r32(emit->as, i, REG_TEMP0);
+ asm_x86_mov_r32_to_local(emit->as, REG_TEMP0, i - REG_LOCAL_NUM);
}
}
#elif N_THUMB
@@ -1023,6 +1020,8 @@ STATIC void emit_native_load_fast(emit_t *emit, qstr qstr, uint id_flags, int lo
#elif N_X86
if (local_num == 0) {
emit_post_push_reg(emit, vtype, REG_LOCAL_1);
+ } else if (local_num == 1) {
+ emit_post_push_reg(emit, vtype, REG_LOCAL_2);
} else {
need_reg_single(emit, REG_EAX, 0);
asm_x86_mov_local_to_r32(emit->as, local_num - REG_LOCAL_NUM, REG_EAX);
@@ -1124,6 +1123,8 @@ STATIC void emit_native_store_fast(emit_t *emit, qstr qstr, int local_num) {
#elif N_X86
if (local_num == 0) {
emit_pre_pop_reg(emit, &vtype, REG_LOCAL_1);
+ } else if (local_num == 1) {
+ emit_pre_pop_reg(emit, &vtype, REG_LOCAL_2);
} else {
emit_pre_pop_reg(emit, &vtype, REG_EAX);
asm_x86_mov_r32_to_local(emit->as, REG_EAX, local_num - REG_LOCAL_NUM);