fix problem with multiple result values combined with an incorrect JIT guess on application of a structure-type predicate

svn: r14461
This commit is contained in:
Matthew Flatt 2009-04-08 10:44:53 +00:00
parent 28ce21c23b
commit 4ccff8023e

View File

@ -139,9 +139,9 @@ static void *on_demand_jit_code;
static void *on_demand_jit_arity_code;
static void *get_stack_pointer_code;
static void *stack_cache_pop_code;
static void *struct_pred_code;
static void *struct_pred_code, *struct_pred_multi_code;
static void *struct_pred_branch_code;
static void *struct_get_code;
static void *struct_get_code, *struct_get_multi_code;
static void *bad_app_vals_target;
static void *app_values_slow_code, *app_values_multi_slow_code, *app_values_tail_slow_code;
static void *finish_tail_call_code, *finish_tail_call_fixup_code;
@ -3894,7 +3894,8 @@ static int generate_inlined_type_test(mz_jit_state *jitter, Scheme_App2_Rec *app
static int generate_inlined_struct_op(int kind, mz_jit_state *jitter,
Scheme_Object *rator, Scheme_Object *rand,
jit_insn **for_branch, int branch_short)
jit_insn **for_branch, int branch_short,
int multi_ok)
/* de-sync'd ok; for branch, sync'd before */
{
mz_runstack_skipped(jitter, 1);
@ -3933,9 +3934,17 @@ static int generate_inlined_struct_op(int kind, mz_jit_state *jitter,
for_branch[2] = jit_patchable_movi_p(JIT_V1, jit_forward());
(void)jit_calli(struct_pred_branch_code);
} else if (kind == 1) {
(void)jit_calli(struct_pred_code);
if (multi_ok) {
(void)jit_calli(struct_pred_multi_code);
} else {
(void)jit_calli(struct_pred_code);
}
} else {
(void)jit_calli(struct_get_code);
if (multi_ok) {
(void)jit_calli(struct_get_multi_code);
} else {
(void)jit_calli(struct_get_code);
}
}
return 1;
@ -3955,11 +3964,11 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
int k;
k = inlineable_struct_prim(rator, jitter, 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, multi_ok);
scheme_direct_call_count++;
return 1;
} else if ((k == 2) && !for_branch) {
generate_inlined_struct_op(2, jitter, rator, app->rand, for_branch, branch_short);
generate_inlined_struct_op(2, jitter, rator, app->rand, for_branch, branch_short, multi_ok);
scheme_direct_call_count++;
return 1;
}
@ -7393,22 +7402,27 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
/* *** struct_{pred,get}[_branch]_code *** */
/* R1 is (potential) struct proc, R0 is (potential) struct */
/* In branch mode, V1 is target address for false branch */
{
for (ii = 0; ii < 2; ii++) {
for (i = 0; i < 3; i++) {
void *code, *code_end;
int kind, for_branch;
jit_insn *ref, *ref2, *refslow, *bref1, *bref2, *bref3, *bref4, *bref5, *bref6, *bref8;
if ((ii == 1) && (i == 1)) continue; /* no multi variant of pred branch */
code = jit_get_ip().ptr;
if (!i) {
kind = 1;
for_branch = 0;
struct_pred_code = jit_get_ip().ptr;
if (ii == 1)
struct_pred_multi_code = jit_get_ip().ptr;
else
struct_pred_code = jit_get_ip().ptr;
} else if (i == 1) {
kind = 1;
for_branch = 1;
struct_pred_branch_code = jit_get_ip().ptr;
struct_pred_branch_code = jit_get_ip().ptr;
/* Save target address for false branch: */
#ifdef MZ_USE_JIT_PPC
jit_movr_p(JIT_V(3), JIT_V1);
@ -7423,7 +7437,10 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
} else {
kind = 2;
for_branch = 0;
struct_get_code = jit_get_ip().ptr;
if (ii == 1)
struct_get_multi_code = jit_get_ip().ptr;
else
struct_get_code = jit_get_ip().ptr;
}
mz_prolog(JIT_V1);
@ -7445,7 +7462,11 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
jit_pusharg_p(JIT_RUNSTACK);
jit_pusharg_p(JIT_V1);
jit_pusharg_p(JIT_R1);
(void)mz_finish(_scheme_apply_from_native);
if (ii == 1) {
(void)mz_finish(_scheme_apply_multi_from_native);
} else {
(void)mz_finish(_scheme_apply_from_native);
}
jit_retval(JIT_R0);
VALIDATE_RESULT(JIT_R0);
jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));