From a0fbb05bf0353ac0fede6deec15db5d2d3a9017f Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 26 Feb 2010 17:01:33 +0100 Subject: Make penalty PRNG available for general use by compiler. --- src/lj_jit.h | 10 +++++++++- src/lj_trace.c | 10 +--------- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/lj_jit.h b/src/lj_jit.h index f0472282..ff3492bf 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h @@ -278,7 +278,7 @@ typedef struct jit_State { HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */ uint32_t penaltyslot; /* Round-robin index into penalty slots. */ - uint32_t prngstate; /* PRNG state for penalty randomization. */ + uint32_t prngstate; /* PRNG state. */ BPropEntry bpropcache[BPROP_SLOTS]; /* Backpropagation cache slots. */ uint32_t bpropslot; /* Round-robin index into bpropcache slots. */ @@ -297,6 +297,14 @@ typedef struct jit_State { int mcprot; /* Protection of current mcode area. */ } jit_State; +/* Trivial PRNG e.g. used for penalty randomization. */ +static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits) +{ + /* Yes, this LCG is very weak, but that doesn't matter for our use case. */ + J->prngstate = J->prngstate * 1103515245 + 12345; + return J->prngstate >> (32-bits); +} + /* Exit stubs. */ #if LJ_TARGET_X86ORX64 /* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */ diff --git a/src/lj_trace.c b/src/lj_trace.c index e476122c..0b55f717 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -310,14 +310,6 @@ void lj_trace_freestate(global_State *g) /* -- Penalties and blacklisting ------------------------------------------ */ -/* Trivial PRNG for randomization of penalties. */ -static uint32_t penalty_prng(jit_State *J, int bits) -{ - /* Yes, this LCG is very weak, but that doesn't matter for our use case. */ - J->prngstate = J->prngstate * 1103515245 + 12345; - return J->prngstate >> (32-bits); -} - /* Blacklist a bytecode instruction. */ static void blacklist_pc(GCproto *pt, BCIns *pc) { @@ -333,7 +325,7 @@ static void penalty_pc(jit_State *J, GCproto *pt, BCIns *pc, TraceError e) if (mref(J->penalty[i].pc, const BCIns) == pc) { /* Cache slot found? */ /* First try to bump its hotcount several times. */ val = ((uint32_t)J->penalty[i].val << 1) + - penalty_prng(J, PENALTY_RNDBITS); + LJ_PRNG_BITS(J, PENALTY_RNDBITS); if (val > PENALTY_MAX) { blacklist_pc(pt, pc); /* Blacklist it, if that didn't help. */ return; -- cgit v1.2.3-55-g6feb