diff --git a/collects/tests/mzscheme/optimize.ss b/collects/tests/mzscheme/optimize.ss index 19c32bfd45..1a62a69916 100644 --- a/collects/tests/mzscheme/optimize.ss +++ b/collects/tests/mzscheme/optimize.ss @@ -108,6 +108,9 @@ (check-effect) (test v name ((eval `(lambda (x y) ,(wrap `(,op (,get-arg1) x y)))) arg2 arg3)) (check-effect) + (eval `(define _arg2 ,arg2)) + (test v name ((eval `(lambda (y) ,(wrap `(,op (,get-arg1) _arg2 y)))) arg3)) + (check-effect) (test v name ((eval `(lambda (x y z) ,(wrap `(,op x y z)))) (get-arg1) arg2 arg3)) (check-effect)))] [tri (lambda (v op get-arg1 arg2 arg3 check-effect #:wrap [wrap values]) @@ -285,6 +288,7 @@ (bin (expt 2 30) '+ (expt 2 29) (expt 2 29)) (bin (- (expt 2 31) 2) '+ (sub1 (expt 2 30)) (sub1 (expt 2 30))) (tri 6 '+ (lambda () 1) 2 3 void) + (tri 13/2 '+ (lambda () 1) 5/2 3 void) (bin 3 '- 7 4) (bin 11 '- 7 -4) @@ -293,6 +297,7 @@ (bin (- (expt 2 30)) '- (- (expt 2 29)) (expt 2 29)) (bin (- 2 (expt 2 31)) '- (- 1 (expt 2 30)) (sub1 (expt 2 30))) (tri 6 '- (lambda () 10) 3 1 void) + (tri 13/2 '- (lambda () 10) 3 1/2 void) (bin 4 '* 1 4) (bin 0 '* 0 4) @@ -305,6 +310,7 @@ (bin (expt 2 31) '* 2 (expt 2 30)) (bin (- (expt 2 30)) '* 2 (- (expt 2 29))) (tri 30 '* (lambda () 2) 3 5 void) + (tri 5 '* (lambda () 2) 3 5/6 void) (bin 0 '/ 0 4) (bin 1/4 '/ 1 4) @@ -314,6 +320,7 @@ (bin -4 '/ 16 -4) (bin 4 '/ -16 -4) (tri 3 '/ (lambda () 30) 5 2 void) + (tri 12 '/ (lambda () 30) 5 1/2 void) (bin-int 3 'quotient 10 3) (bin-int -3 'quotient 10 -3) diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index d91bccc3b2..2dfb220d94 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -3833,10 +3833,10 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r } else ref8 = NULL; jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Object *)0x0)->type); - ref9 = jit_bnei_p(jit_forward(), JIT_R2, scheme_double_type); + ref9 = jit_bnei_i(jit_forward(), JIT_R2, scheme_double_type); if (two_args) { jit_ldxi_s(JIT_R2, JIT_R1, &((Scheme_Object *)0x0)->type); - ref10 = jit_bnei_p(jit_forward(), JIT_R2, scheme_double_type); + ref10 = jit_bnei_i(jit_forward(), JIT_R2, scheme_double_type); } else ref10 = NULL; CHECK_LIMIT(); @@ -4067,8 +4067,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj } if (args_unboxed) { --jitter->unbox; - if (rand) - jitter->unbox_depth -= (rand2 ? 2 : 1); + jitter->unbox_depth -= (rand ? (rand2 ? 2 : 1) : 2); } if (for_branch) mz_rs_sync(); /* needed if arguments were unboxed */ @@ -4774,14 +4773,18 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj #define MAX_NON_SIMPLE_ARGS 5 -static int extract_nary_arg(int reg, int n, mz_jit_state *jitter, Scheme_App_Rec *app, Scheme_Object **alt_args) +static int extract_nary_arg(int reg, int n, mz_jit_state *jitter, Scheme_App_Rec *app, + Scheme_Object **alt_args, int old_short_jumps) { if (!alt_args) { jit_ldxi_p(reg, JIT_RUNSTACK, WORDS_TO_BYTES(n)); if (jitter->unbox) generate_unboxing(jitter); } else if (is_constant_and_avoids_r1(app->args[n+1])) { + __END_SHORT_JUMPS__(old_short_jumps); generate(app->args[n+1], jitter, 0, 0, reg); + CHECK_LIMIT(); + __START_SHORT_JUMPS__(old_short_jumps); } else { int i, j = 0; for (i = 0; i < n; i++) { @@ -4847,8 +4850,12 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, use_fx = 0; if (trigger_arg == i) trigger_arg++; + } else if (SCHEME_TYPE(v) >= _scheme_compiled_values_types_) { + use_fx = 0; + use_fl = 0; } } + if ((non_simple_c <= MAX_NON_SIMPLE_ARGS) && (non_simple_c < c)) { stack_c = non_simple_c; alt_args = non_simples; @@ -4872,7 +4879,7 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, trigger_arg = 0; } - extract_nary_arg(JIT_R0, trigger_arg, jitter, app, alt_args); + extract_nary_arg(JIT_R0, trigger_arg, jitter, app, alt_args, c < 100); CHECK_LIMIT(); /* trigger argument a fixnum? */ reffx = jit_bmsi_ul(jit_forward(), JIT_R0, 0x1); @@ -4881,7 +4888,7 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, if (use_fl) { /* First argument a flonum? */ jit_ldxi_s(JIT_R0, JIT_R0, &((Scheme_Object *)0x0)->type); - reffl = jit_beqi_p(jit_forward(), JIT_R0, scheme_double_type); + reffl = jit_beqi_i(jit_forward(), JIT_R0, scheme_double_type); CHECK_LIMIT(); } else { reffl = NULL; @@ -4899,7 +4906,7 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, int delta = stack_c - c; for (i = 0; i < c; i++) { if (delta) { - extract_nary_arg(JIT_R0, i, jitter, app, alt_args); + extract_nary_arg(JIT_R0, i, jitter, app, alt_args, c < 100); CHECK_LIMIT(); jit_stxi_p(WORDS_TO_BYTES(i+delta), JIT_RUNSTACK, JIT_R0); } else @@ -4930,10 +4937,10 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, if (i != trigger_arg) { v = app->args[i+1]; if (!SCHEME_FLOATP(v)) { - extract_nary_arg(JIT_R0, i, jitter, app, alt_args); + extract_nary_arg(JIT_R0, i, jitter, app, alt_args, c < 100); (void)jit_bmsi_ul(refslow, JIT_R0, 0x1); jit_ldxi_s(JIT_R0, JIT_R0, &((Scheme_Object *)0x0)->type); - (void)jit_bnei_p(refslow, JIT_R0, scheme_double_type); + (void)jit_bnei_i(refslow, JIT_R0, scheme_double_type); CHECK_LIMIT(); } } @@ -4942,12 +4949,12 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, args_unboxed = ((arith != 9) && (arith != 10)); /* no unboxing for min & max */ if (args_unboxed) jitter->unbox++; - extract_nary_arg(JIT_R0, 0, jitter, app, alt_args); + extract_nary_arg(JIT_R0, 0, jitter, app, alt_args, c < 100); CHECK_LIMIT(); for (i = 1; i < c; i++) { if (!arith && (i > 1)) - extract_nary_arg(JIT_R0, i - 1, jitter, app, alt_args); - extract_nary_arg((args_unboxed ? JIT_R0 : JIT_R1), i, jitter, app, alt_args); + extract_nary_arg(JIT_R0, i - 1, jitter, app, alt_args, c < 100); + extract_nary_arg((args_unboxed ? JIT_R0 : JIT_R1), i, jitter, app, alt_args, c < 100); if ((i == c - 1) && args_unboxed) --jitter->unbox; /* box last result */ if (!arith) memset(refs, 0, sizeof(refs)); __END_SHORT_JUMPS__(c < 100); @@ -4974,7 +4981,7 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, if (i != trigger_arg) { v = app->args[i+1]; if (!SCHEME_INTP(v)) { - extract_nary_arg(JIT_R0, i, jitter, app, alt_args); + extract_nary_arg(JIT_R0, i, jitter, app, alt_args, c < 100); CHECK_LIMIT(); (void)jit_bmci_ul(refslow, JIT_R0, 0x1); CHECK_LIMIT(); @@ -4983,11 +4990,11 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, } /* All fixnums, so inline fast fixnum combination; on overflow, bail out to refslow. */ - extract_nary_arg(JIT_R0, 0, jitter, app, alt_args); + extract_nary_arg(JIT_R0, 0, jitter, app, alt_args, c < 100); for (i = 1; i < c; i++) { if (!arith && (i > 1)) - extract_nary_arg(JIT_R0, i - 1, jitter, app, alt_args); - extract_nary_arg(JIT_R1, i, jitter, app, alt_args); + extract_nary_arg(JIT_R0, i - 1, jitter, app, alt_args, c < 100); + extract_nary_arg(JIT_R1, i, jitter, app, alt_args, c < 100); CHECK_LIMIT(); if (!arith) memset(refs, 0, sizeof(refs)); __END_SHORT_JUMPS__(c < 100); @@ -5310,7 +5317,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in /* Check for positive bignum: */ __START_SHORT_JUMPS__(branch_short); jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Object *)0x0)->type); - ref2 = jit_bnei_p(jit_forward(), JIT_R2, scheme_bignum_type); + ref2 = jit_bnei_i(jit_forward(), JIT_R2, scheme_bignum_type); jit_ldxi_s(JIT_R2, JIT_R0, &MZ_OPT_HASH_KEY(&((Scheme_Stx *)0x0)->iso)); ref3 = jit_bmci_ul(jit_forward(), JIT_R2, 0x1); __END_SHORT_JUMPS__(branch_short);