diff --git a/src/code/amd64.c b/src/code/amd64.c index 372ec0ddc0bfcabfa1b1ca69f3bc701869b8702c..419c96df62eb9e094e7f30c14b7f796be45f4b4d 100644 --- a/src/code/amd64.c +++ b/src/code/amd64.c @@ -1305,13 +1305,12 @@ static void amd64_push_local_function(int fun) amd64_load_fp_reg(); amd64_load_sp_reg(); mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX); - mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), - P_REG_RCX); + mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object),P_REG_RCX); mov_mem32_reg(P_REG_RAX, OFFSETOF(inherit, identifier_level), - P_REG_RAX); + P_REG_RAX); mov_reg_mem(P_REG_RCX, sp_reg, OFFSETOF(svalue, u.object)); add_reg_imm(P_REG_RAX, fun); - add_imm_mem( 1, P_REG_RCX,(INT32)OFFSETOF(object, refs)); + add_imm_mem(1, P_REG_RCX,(INT32)OFFSETOF(object, refs)); shl_reg_imm(P_REG_RAX, 16); add_reg_imm(P_REG_RAX, PIKE_T_FUNCTION); mov_reg_mem(P_REG_RAX, sp_reg, OFFSETOF(svalue, tu.t.type)); @@ -2379,7 +2378,6 @@ void ins_f_byte_with_arg(unsigned int a, INT32 b) return; } break; /* Fallback to C-version. */ - case F_RETURN_LOCAL: /* FIXME: The C version has a trick: if locals+b < expendibles, pop to there @@ -2461,7 +2459,6 @@ void ins_f_byte_with_arg(unsigned int a, INT32 b) LABEL_C; } return; - case F_LOCAL_INDEX: { LABELS(); @@ -3370,6 +3367,20 @@ void ins_f_byte_with_2_args(unsigned int a, INT32 b, INT32 c) amd64_call_c_function( object_low_set_index ); return; + case F_LEXICAL_LOCAL: + if( c < 5 ) + { + amd64_load_fp_reg(); + mov_reg_reg( fp_reg, P_REG_RAX ); + while(c--) + mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,scope), P_REG_RAX ); + mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,locals), P_REG_RAX ); + add_reg_imm_reg( P_REG_RAX, b*sizeof(struct svalue), P_REG_RBX ); + amd64_push_svaluep( P_REG_RBX ); + return; + } + /* use c version. Could have a loop version here. */ + break; case F_LOCAL_2_LOCAL: ins_debug_instr_prologue(a-F_OFFSET, b, c); if( b != c )