JIT tweak to speed field access within a class

svn: r13406
This commit is contained in:
Matthew Flatt 2009-02-04 04:52:04 +00:00
parent 55ebce5466
commit 336fb67066

View File

@ -149,7 +149,7 @@ typedef struct {
GC_CAN_IGNORE jit_state js; GC_CAN_IGNORE jit_state js;
char *limit; char *limit;
int extra_pushed, max_extra_pushed; int extra_pushed, max_extra_pushed;
int depth; /* the position of the closure's first arg on the stack */ int depth; /* the position of the closure's first value on the stack */
int max_depth; int max_depth;
int *mappings; /* For each element, int *mappings; /* For each element,
case 0x1 bit: case 0x1 bit:
@ -167,9 +167,10 @@ typedef struct {
int local1_busy; int local1_busy;
int log_depth; int log_depth;
int self_pos, self_closure_size, self_toplevel_pos; int self_pos, self_closure_size, self_toplevel_pos;
int self_to_closure_delta;
void *self_restart_code; void *self_restart_code;
void *self_nontail_code; void *self_nontail_code;
Scheme_Native_Closure *nc; /* for extract_globals, only */ Scheme_Native_Closure *nc; /* for extract_globals and extract_closure_local, only */
Scheme_Closure_Data *self_data; Scheme_Closure_Data *self_data;
void *status_at_ptr; void *status_at_ptr;
int reg_status; int reg_status;
@ -1424,18 +1425,47 @@ Scheme_Object *extract_global(Scheme_Object *o, Scheme_Native_Closure *nc)
return globs[SCHEME_TOPLEVEL_POS(o)]; return globs[SCHEME_TOPLEVEL_POS(o)];
} }
static int inlineable_struct_prim(Scheme_Object *o, mz_jit_state *jitter) Scheme_Object *extract_closure_local(Scheme_Object *obj, mz_jit_state *jitter, int extra_push)
{ {
if (jitter->nc int pos;
&& SAME_TYPE(SCHEME_TYPE(o), scheme_toplevel_type)) {
Scheme_Object *p; pos = SCHEME_LOCAL_POS(obj);
p = extract_global(o, jitter->nc); pos -= extra_push;
p = ((Scheme_Bucket *)p)->val; if (pos >= jitter->self_pos - jitter->self_to_closure_delta) {
if (p && SCHEME_PRIMP(p)) { pos -= (jitter->self_pos - jitter->self_to_closure_delta);
if (((Scheme_Primitive_Proc *)p)->pp.flags & SCHEME_PRIM_IS_STRUCT_PRED) if (pos < jitter->nc->code->u2.orig_code->closure_size) {
return 1; return jitter->nc->vals[pos];
else if (((Scheme_Primitive_Proc *)p)->pp.flags & SCHEME_PRIM_IS_STRUCT_INDEXED_GETTER) }
return 2; }
return NULL;
}
static int check_val_struct_prim(Scheme_Object *p)
{
if (p && SCHEME_PRIMP(p)) {
if (((Scheme_Primitive_Proc *)p)->pp.flags & SCHEME_PRIM_IS_STRUCT_PRED)
return 1;
else if (((Scheme_Primitive_Proc *)p)->pp.flags & SCHEME_PRIM_IS_STRUCT_INDEXED_GETTER)
return 2;
else
return 0;
} else
return 0;
}
static int inlineable_struct_prim(Scheme_Object *o, mz_jit_state *jitter, int extra_push)
{
if (jitter->nc) {
if (SAME_TYPE(SCHEME_TYPE(o), scheme_toplevel_type)) {
Scheme_Object *p;
p = extract_global(o, jitter->nc);
p = ((Scheme_Bucket *)p)->val;
return check_val_struct_prim(p);
} else if (SAME_TYPE(SCHEME_TYPE(o), scheme_local_type)) {
Scheme_Object *p;
p = extract_closure_local(o, jitter, extra_push);
return check_val_struct_prim(p);
} }
} }
return 0; return 0;
@ -1447,7 +1477,7 @@ static int inlined_unary_prim(Scheme_Object *o, Scheme_Object *_app, mz_jit_stat
&& (SCHEME_PRIM_PROC_FLAGS(o) & SCHEME_PRIM_IS_UNARY_INLINED)) && (SCHEME_PRIM_PROC_FLAGS(o) & SCHEME_PRIM_IS_UNARY_INLINED))
return 1; return 1;
if (inlineable_struct_prim(o, jitter)) if (inlineable_struct_prim(o, jitter, 1))
return 1; return 1;
return 0; return 0;
@ -3758,6 +3788,8 @@ static int generate_inlined_struct_op(int kind, mz_jit_state *jitter,
{ {
mz_runstack_skipped(jitter, 1); mz_runstack_skipped(jitter, 1);
LOG_IT(("inlined struct op\n"));
generate(rator, jitter, 0, 0, JIT_R0); generate(rator, jitter, 0, 0, JIT_R0);
CHECK_LIMIT(); CHECK_LIMIT();
@ -3807,7 +3839,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
{ {
int k; int k;
k = inlineable_struct_prim(rator, jitter); k = inlineable_struct_prim(rator, jitter, 1);
if (k == 1) { if (k == 1) {
generate_inlined_struct_op(1, jitter, rator, app->rand, for_branch, branch_short); generate_inlined_struct_op(1, jitter, rator, app->rand, for_branch, branch_short);
scheme_direct_call_count++; scheme_direct_call_count++;
@ -7612,6 +7644,8 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
jitter->self_restart_code = jit_get_ip().ptr; jitter->self_restart_code = jit_get_ip().ptr;
if (!has_rest) if (!has_rest)
jitter->self_nontail_code = tail_code; jitter->self_nontail_code = tail_code;
jitter->self_to_closure_delta = jitter->self_pos;
/* Generate code for the body: */ /* Generate code for the body: */
jitter->need_set_rs = 1; jitter->need_set_rs = 1;