pike.git/
src/
code/
amd64.c
Branch:
Tag:
Non-build tags
All tags
No tags
2014-12-04
2014-12-04 19:27:14 by Per Hedbor <ph@opera.com>
fcf10927e13789f9b86a6b3baa2bc0b7b1ef00eb (
24
lines) (+
18
/-
6
)
[
Show
|
Annotate
]
Branch:
bill/master_archive_support
Added F_LEXICAL_LOCAL amd64 edition
1305:
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); 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:
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:
LABEL_C; } return;
-
+
case F_LOCAL_INDEX: { LABELS();
3370:
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 )