@@ -189,13 +189,16 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
189189
190190#define EXPORT_FUN (name ) emit_native_x86_##name
191191
192+ // caller-save, so can be used as temporaries
192193#define REG_TEMP0 (REG_EAX)
193- #define REG_TEMP1 (REG_EBX )
194- #define REG_TEMP2 (REG_ECX )
194+ #define REG_TEMP1 (REG_ECX )
195+ #define REG_TEMP2 (REG_EDX )
195196
196- #define REG_LOCAL_1 (REG_ESI)
197- #define REG_LOCAL_2 (REG_EDI)
198- #define REG_LOCAL_NUM (2)
197+ // callee-save, so can be used as locals
198+ #define REG_LOCAL_1 (REG_EBX)
199+ #define REG_LOCAL_2 (REG_ESI)
200+ #define REG_LOCAL_3 (REG_EDI)
201+ #define REG_LOCAL_NUM (3)
199202
200203#define ASM_PASS_COMPUTE ASM_X86_PASS_COMPUTE
201204#define ASM_PASS_EMIT ASM_X86_PASS_EMIT
@@ -528,6 +531,8 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
528531 asm_x86_mov_arg_to_r32 (emit -> as , i , REG_LOCAL_1 );
529532 } else if (i == 1 ) {
530533 asm_x86_mov_arg_to_r32 (emit -> as , i , REG_LOCAL_2 );
534+ } else if (i == 2 ) {
535+ asm_x86_mov_arg_to_r32 (emit -> as , i , REG_LOCAL_3 );
531536 } else {
532537 asm_x86_mov_arg_to_r32 (emit -> as , i , REG_TEMP0 );
533538 asm_x86_mov_r32_to_local (emit -> as , REG_TEMP0 , i - REG_LOCAL_NUM );
@@ -1022,6 +1027,8 @@ STATIC void emit_native_load_fast(emit_t *emit, qstr qstr, uint id_flags, int lo
10221027 emit_post_push_reg (emit , vtype , REG_LOCAL_1 );
10231028 } else if (local_num == 1 ) {
10241029 emit_post_push_reg (emit , vtype , REG_LOCAL_2 );
1030+ } else if (local_num == 2 ) {
1031+ emit_post_push_reg (emit , vtype , REG_LOCAL_3 );
10251032 } else {
10261033 need_reg_single (emit , REG_EAX , 0 );
10271034 asm_x86_mov_local_to_r32 (emit -> as , local_num - REG_LOCAL_NUM , REG_EAX );
@@ -1125,6 +1132,8 @@ STATIC void emit_native_store_fast(emit_t *emit, qstr qstr, int local_num) {
11251132 emit_pre_pop_reg (emit , & vtype , REG_LOCAL_1 );
11261133 } else if (local_num == 1 ) {
11271134 emit_pre_pop_reg (emit , & vtype , REG_LOCAL_2 );
1135+ } else if (local_num == 2 ) {
1136+ emit_pre_pop_reg (emit , & vtype , REG_LOCAL_3 );
11281137 } else {
11291138 emit_pre_pop_reg (emit , & vtype , REG_EAX );
11301139 asm_x86_mov_r32_to_local (emit -> as , REG_EAX , local_num - REG_LOCAL_NUM );
0 commit comments