mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-04-20 05:53:26 +00:00
Make penalty PRNG available for general use by compiler.
This commit is contained in:
parent
3c6cec0846
commit
a0fbb05bf0
10
src/lj_jit.h
10
src/lj_jit.h
@ -278,7 +278,7 @@ typedef struct jit_State {
|
|||||||
|
|
||||||
HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */
|
HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */
|
||||||
uint32_t penaltyslot; /* Round-robin index into 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. */
|
BPropEntry bpropcache[BPROP_SLOTS]; /* Backpropagation cache slots. */
|
||||||
uint32_t bpropslot; /* Round-robin index into bpropcache 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. */
|
int mcprot; /* Protection of current mcode area. */
|
||||||
} jit_State;
|
} 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. */
|
/* Exit stubs. */
|
||||||
#if LJ_TARGET_X86ORX64
|
#if LJ_TARGET_X86ORX64
|
||||||
/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */
|
/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */
|
||||||
|
@ -310,14 +310,6 @@ void lj_trace_freestate(global_State *g)
|
|||||||
|
|
||||||
/* -- Penalties and blacklisting ------------------------------------------ */
|
/* -- 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. */
|
/* Blacklist a bytecode instruction. */
|
||||||
static void blacklist_pc(GCproto *pt, BCIns *pc)
|
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? */
|
if (mref(J->penalty[i].pc, const BCIns) == pc) { /* Cache slot found? */
|
||||||
/* First try to bump its hotcount several times. */
|
/* First try to bump its hotcount several times. */
|
||||||
val = ((uint32_t)J->penalty[i].val << 1) +
|
val = ((uint32_t)J->penalty[i].val << 1) +
|
||||||
penalty_prng(J, PENALTY_RNDBITS);
|
LJ_PRNG_BITS(J, PENALTY_RNDBITS);
|
||||||
if (val > PENALTY_MAX) {
|
if (val > PENALTY_MAX) {
|
||||||
blacklist_pc(pt, pc); /* Blacklist it, if that didn't help. */
|
blacklist_pc(pt, pc); /* Blacklist it, if that didn't help. */
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user