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. */
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. */
/* -- 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)
{
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;