]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Prefer recording loops over calls.
authorMike Pall <mike>
Tue, 28 Jun 2011 23:51:39 +0000 (01:51 +0200)
committerMike Pall <mike>
Tue, 28 Jun 2011 23:52:23 +0000 (01:52 +0200)
Hotcounts are decremented by 2 for loops and by 1 for calls.

src/buildvm_arm.dasc
src/buildvm_arm.h
src/buildvm_x64.h
src/buildvm_x64win.h
src/buildvm_x86.dasc
src/buildvm_x86.h
src/lj_dispatch.c
src/lj_dispatch.h
src/lj_jit.h
src/lj_trace.c

index fd7c7b8117f99d8c7037752ab0fc4755cbac9ef3..9b6b5aed96415e2035d0cf0403253d4288e2d259 100644 (file)
 |
 #define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
 |
-|.macro hotcheck
+|.macro hotcheck, delta
 |  lsr CARG1, PC, #1
 |  and CARG1, CARG1, #126
 |  sub CARG1, CARG1, #-GG_DISP2HOT
 |  ldrh CARG2, [DISPATCH, CARG1]
-|  subs CARG2, CARG2, #1
+|  subs CARG2, CARG2, #delta
 |  strh CARG2, [DISPATCH, CARG1]
 |.endmacro
 |
 |.macro hotloop
-|  hotcheck
-|  beq ->vm_hotloop
+|  hotcheck HOTCOUNT_LOOP
+|  blo ->vm_hotloop
 |.endmacro
 |
 |.macro hotcall
-|  hotcheck
-|  beq ->vm_hotcall
+|  hotcheck HOTCOUNT_CALL
+|  blo ->vm_hotcall
 |.endmacro
 |
 |// Set current VM state.
index 505048bd91c7db2970fa8c602b899d934558c144..b450f5dfab1e05883fafdcaf14e235c2cb3a21c9 100644 (file)
@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP   0
 #define DASM_SECTION_CODE_SUB  1
 #define DASM_MAXSECTION                2
-static const unsigned int build_actionlist[5702] = {
+static const unsigned int build_actionlist[5706] = {
 0x00010001,
 0x00060014,
 0xe3160000,
@@ -5381,9 +5381,10 @@ static const unsigned int build_actionlist[5702] = {
 0xe2400000,
 0x000a0000,
 0xe19710b0,
-0xe2511001,
+0xe2511000,
+0x000a0000,
 0xe18710b0,
-0x0a000000,
+0x3a000000,
 0x00050091,
 0x00000000,
 0xe1aa00d9,
@@ -5519,9 +5520,10 @@ static const unsigned int build_actionlist[5702] = {
 0xe2400000,
 0x000a0000,
 0xe19710b0,
-0xe2511001,
+0xe2511000,
+0x000a0000,
 0xe18710b0,
-0x0a000000,
+0x3a000000,
 0x00050091,
 0x00000000,
 0xe1aa00d9,
@@ -5550,9 +5552,10 @@ static const unsigned int build_actionlist[5702] = {
 0xe2400000,
 0x000a0000,
 0xe19710b0,
-0xe2511001,
+0xe2511000,
+0x000a0000,
 0xe18710b0,
-0x0a000000,
+0x3a000000,
 0x00050091,
 0x00000000,
 0xe5d6c000,
@@ -5590,9 +5593,10 @@ static const unsigned int build_actionlist[5702] = {
 0xe2400000,
 0x000a0000,
 0xe19710b0,
-0xe2511001,
+0xe2511000,
+0x000a0000,
 0xe18710b0,
-0x0a000000,
+0x3a000000,
 0x00050093,
 0x00000000,
 0xe5180000,
@@ -7138,7 +7142,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 5363, -GG_DISP2HOT);
+    dasm_put(Dst, 5363, -GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -7150,68 +7154,68 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   case BC_FORI:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 5373);
+    dasm_put(Dst, 5374);
     if (op != BC_JFORL) {
-      dasm_put(Dst, 5375);
+      dasm_put(Dst, 5376);
     }
     if (!vk) {
-      dasm_put(Dst, 5377, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
+      dasm_put(Dst, 5378, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
     } else {
-      dasm_put(Dst, 5395, -LJ_TISNUM);
+      dasm_put(Dst, 5396, -LJ_TISNUM);
       if (op == BC_IFORL) {
-       dasm_put(Dst, 5403);
+       dasm_put(Dst, 5404);
       } else {
-       dasm_put(Dst, 5405);
+       dasm_put(Dst, 5406);
       }
-      dasm_put(Dst, 5408);
+      dasm_put(Dst, 5409);
     }
-    dasm_put(Dst, 5413);
+    dasm_put(Dst, 5414);
     if (op == BC_FORI) {
-      dasm_put(Dst, 5415);
+      dasm_put(Dst, 5416);
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 5417);
+      dasm_put(Dst, 5418);
     } else if (op == BC_IFORL) {
-      dasm_put(Dst, 5420);
+      dasm_put(Dst, 5421);
     }
     if (vk) {
-      dasm_put(Dst, 5422);
+      dasm_put(Dst, 5423);
     }
-    dasm_put(Dst, 5424);
+    dasm_put(Dst, 5425);
     if (op == BC_JFORI || op == BC_JFORL) {
-      dasm_put(Dst, 5429, BC_JLOOP);
+      dasm_put(Dst, 5430, BC_JLOOP);
     }
-    dasm_put(Dst, 5432);
+    dasm_put(Dst, 5433);
     if (!vk) {
-      dasm_put(Dst, 5439);
+      dasm_put(Dst, 5440);
     } else {
-      dasm_put(Dst, 5441);
+      dasm_put(Dst, 5442);
     }
-    dasm_put(Dst, 5443);
+    dasm_put(Dst, 5444);
     if (!vk) {
-      dasm_put(Dst, 5447, -LJ_TISNUM, -LJ_TISNUM);
+      dasm_put(Dst, 5448, -LJ_TISNUM, -LJ_TISNUM);
     } else {
-      dasm_put(Dst, 5459);
+      dasm_put(Dst, 5460);
     }
-    dasm_put(Dst, 5468);
+    dasm_put(Dst, 5469);
     if (op == BC_FORI) {
-      dasm_put(Dst, 5472);
+      dasm_put(Dst, 5473);
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 5474, BC_JLOOP);
+      dasm_put(Dst, 5475, BC_JLOOP);
     } else if (op == BC_IFORL) {
-      dasm_put(Dst, 5479);
+      dasm_put(Dst, 5480);
     } else {
-      dasm_put(Dst, 5481, BC_JLOOP);
+      dasm_put(Dst, 5482, BC_JLOOP);
     }
-    dasm_put(Dst, 5484);
+    dasm_put(Dst, 5485);
     if (vk) {
-      dasm_put(Dst, 5490);
+      dasm_put(Dst, 5491);
     }
-    dasm_put(Dst, 5495);
+    dasm_put(Dst, 5496);
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 5501, -GG_DISP2HOT);
+    dasm_put(Dst, 5502, -GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -7220,40 +7224,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 5511);
+    dasm_put(Dst, 5513);
     if (op == BC_JITERL) {
-      dasm_put(Dst, 5513, -LJ_TNIL, BC_JLOOP);
+      dasm_put(Dst, 5515, -LJ_TNIL, BC_JLOOP);
     } else {
-      dasm_put(Dst, 5519, -LJ_TNIL);
+      dasm_put(Dst, 5521, -LJ_TNIL);
     }
-    dasm_put(Dst, 5525);
+    dasm_put(Dst, 5527);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 5532, -GG_DISP2HOT);
+    dasm_put(Dst, 5534, -GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 5542);
+    dasm_put(Dst, 5545);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 5549, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
+    dasm_put(Dst, 5552, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 5563);
+    dasm_put(Dst, 5566);
     break;
 
   /* -- Function headers -------------------------------------------------- */
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 5572, -GG_DISP2HOT);
+    dasm_put(Dst, 5575, -GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -7263,42 +7267,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 5582, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
+    dasm_put(Dst, 5586, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
     if (op != BC_JFUNCF) {
-      dasm_put(Dst, 5592);
+      dasm_put(Dst, 5596);
     }
-    dasm_put(Dst, 5595, ~LJ_TNIL);
+    dasm_put(Dst, 5599, ~LJ_TNIL);
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 5602, BC_JLOOP);
+      dasm_put(Dst, 5606, BC_JLOOP);
     } else {
-      dasm_put(Dst, 5606);
+      dasm_put(Dst, 5610);
     }
-    dasm_put(Dst, 5611);
+    dasm_put(Dst, 5615);
     break;
 
   case BC_JFUNCV:
 #if !LJ_HASJIT
     break;
 #endif
-    dasm_put(Dst, 5617);
+    dasm_put(Dst, 5621);
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 5619, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
+    dasm_put(Dst, 5623, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 5660, Dt8(->f));
+      dasm_put(Dst, 5664, Dt8(->f));
     } else {
-      dasm_put(Dst, 5663, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 5667, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 5666, Dt1(->maxstack), Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 5670, Dt1(->maxstack), Dt1(->base), Dt1(->top));
     if (op == BC_FUNCCW) {
-      dasm_put(Dst, 5676, Dt8(->f));
+      dasm_put(Dst, 5680, Dt8(->f));
     }
-    dasm_put(Dst, 5679, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
+    dasm_put(Dst, 5683, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -7318,7 +7322,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx);
 
-  dasm_put(Dst, 5701);
+  dasm_put(Dst, 5705);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op);
 
index f6ed666c73d6ed6b5d769d4aacaa1258cddc9ba0..4e4eca54462b28d7c38f17fb4b4d90a477067c72 100644 (file)
@@ -751,16 +751,16 @@ static const unsigned char build_actionlist[16156] = {
   182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,6,255,65,199,71,252,
   252,237,65,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,
   5,248,7,141,171,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233,
-  255,137,221,209,252,237,129,229,239,102,65,131,172,253,46,233,1,15,132,244,
-  148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,
-  239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,
-  140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,
-  244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,
-  41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,
-  156,253,131,233,255,141,156,253,131,233,15,183,67,252,254,15,142,245,248,
-  1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,1,255,248,7,139,
-  3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,5,
-  255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,131,233,15,
+  255,137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,238,15,130,
+  244,148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,
+  12,239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,
+  15,140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,
+  133,244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,
+  137,41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,
+  6,141,156,253,131,233,255,141,156,253,131,233,15,183,67,252,254,15,142,245,
+  248,1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,1,255,248,7,
+  139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,
+  5,255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,131,233,15,
   183,67,252,254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,9,255,129,
   121,253,4,239,255,15,131,244,60,129,121,253,12,239,15,131,244,60,255,129,
   121,253,12,239,15,131,244,165,129,121,253,20,239,15,131,244,165,255,139,105,
@@ -777,22 +777,22 @@ static const unsigned char build_actionlist[16156] = {
   139,4,129,72,139,128,233,139,108,36,24,65,137,150,233,65,137,174,233,76,137,
   36,36,76,137,108,36,8,72,131,252,236,16,252,255,224,255,141,156,253,131,233,
   139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,
-  137,221,209,252,237,129,229,239,102,65,131,172,253,46,233,1,15,132,244,150,
-  255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244,24,15,182,
-  139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233,245,255,
-  248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,
-  255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,252,252,68,137,120,
-  252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,23,137,209,137,194,
-  15,182,171,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,
-  249,68,139,121,252,248,68,137,56,68,139,121,252,252,68,137,120,4,131,192,
-  8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,68,139,187,233,
-  139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,
-  248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,233,244,2,255,
-  139,106,252,248,76,139,189,233,139,108,36,24,141,68,194,252,248,137,149,233,
-  141,136,233,59,141,233,137,133,233,255,76,137,252,254,137,252,239,255,15,
-  135,244,22,65,199,134,233,237,255,65,252,255,215,255,65,252,255,150,233,255,
-  65,199,134,233,237,139,149,233,141,12,194,252,247,217,3,141,233,139,90,252,
-  252,252,233,244,12,255,254,0
+  137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,238,15,130,244,
+  150,255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244,24,
+  15,182,139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233,
+  245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,
+  244,2,255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,252,252,68,
+  137,120,252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,23,137,209,
+  137,194,15,182,171,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,
+  15,131,244,249,68,139,121,252,248,68,137,56,68,139,121,252,252,68,137,120,
+  4,131,192,8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,68,139,
+  187,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,
+  238,255,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,233,244,
+  2,255,139,106,252,248,76,139,189,233,139,108,36,24,141,68,194,252,248,137,
+  149,233,141,136,233,59,141,233,137,133,233,255,76,137,252,254,137,252,239,
+  255,15,135,244,22,65,199,134,233,237,255,65,252,255,215,255,65,252,255,150,
+  233,255,65,199,134,233,237,139,149,233,141,12,194,252,247,217,3,141,233,139,
+  90,252,252,252,233,244,12,255,254,0
 };
 
 enum {
@@ -2777,7 +2777,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2893,7 +2893,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2913,7 +2913,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2942,7 +2942,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 15842, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15842, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
index bb8132841bf70fd4605fe90679cca763c0de7849..0e1b5b464079a0aa9725f746b4ac0d7a55dbb6df 100644 (file)
@@ -746,7 +746,7 @@ static const unsigned char build_actionlist[16011] = {
   36,252,235,248,6,255,199,71,252,252,237,131,199,8,255,199,68,194,252,244,
   237,255,131,192,1,252,233,244,5,248,7,141,174,233,252,247,197,237,15,133,
   244,14,41,252,234,255,1,252,233,255,137,252,245,209,252,237,129,229,239,102,
-  131,172,253,43,233,1,15,132,244,148,255,141,12,202,255,129,121,253,4,239,
+  129,172,253,43,233,238,15,130,244,148,255,141,12,202,255,129,121,253,4,239,
   15,133,244,255,255,129,121,253,12,239,15,133,244,60,129,121,253,20,239,15,
   133,244,60,139,41,131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133,
   244,165,129,121,253,20,239,15,133,244,165,255,139,105,16,133,252,237,15,136,
@@ -775,21 +775,21 @@ static const unsigned char build_actionlist[16011] = {
   15,127,153,233,102,68,15,127,161,233,102,68,15,127,169,233,102,68,15,127,
   177,233,102,68,15,127,185,233,252,255,224,255,141,180,253,134,233,139,6,15,
   182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,137,252,245,
-  209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,150,255,139,190,
-  233,139,108,36,96,141,12,202,59,141,233,15,135,244,24,15,182,142,233,57,200,
-  15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194,
-  252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,197,237,
-  141,4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,36,96,141,
-  12,200,59,141,233,15,135,244,23,137,209,137,194,15,182,174,233,133,252,237,
-  15,132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,252,248,137,
-  56,139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,
-  133,244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,131,198,4,193,
-  232,16,252,255,36,252,235,255,248,3,199,64,4,237,131,192,8,131,252,237,1,
-  15,133,244,3,252,233,244,2,255,139,106,252,248,72,139,189,233,139,108,36,
-  96,141,68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,233,255,
-  72,137,252,250,137,252,233,255,15,135,244,22,199,131,233,237,255,252,255,
-  215,255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194,252,247,
-  217,3,141,233,139,114,252,252,252,233,244,12,255,254,0
+  209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,150,255,139,
+  190,233,139,108,36,96,141,12,202,59,141,233,15,135,244,24,15,182,142,233,
+  57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,
+  68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,
+  197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,
+  36,96,141,12,200,59,141,233,15,135,244,23,137,209,137,194,15,182,174,233,
+  133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,
+  252,248,137,56,139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,
+  252,237,1,15,133,244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,
+  131,198,4,193,232,16,252,255,36,252,235,255,248,3,199,64,4,237,131,192,8,
+  131,252,237,1,15,133,244,3,252,233,244,2,255,139,106,252,248,72,139,189,233,
+  139,108,36,96,141,68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,
+  233,255,72,137,252,250,137,252,233,255,15,135,244,22,199,131,233,237,255,
+  252,255,215,255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194,
+  252,247,217,3,141,233,139,114,252,252,252,233,244,12,255,254,0
 };
 
 enum {
@@ -2775,7 +2775,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2891,7 +2891,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2911,7 +2911,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2940,7 +2940,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 15710, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 15710, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
index effd0737918e26ab7dff2bf74107e23080b6b47b..21e18ea8676308e90cb22fa6f74ab7cfbd59be1d 100644 (file)
 |  mov reg, PC
 |  shr reg, 1
 |  and reg, HOTCOUNT_PCMASK
-|  sub word [DISPATCH+reg+GG_DISP2HOT], 1
-|  jz ->vm_hotloop
+|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP
+|  jb ->vm_hotloop
 |.endmacro
 |
 |.macro hotcall, reg
 |  mov reg, PC
 |  shr reg, 1
 |  and reg, HOTCOUNT_PCMASK
-|  sub word [DISPATCH+reg+GG_DISP2HOT], 1
-|  jz ->vm_hotcall
+|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL
+|  jb ->vm_hotcall
 |.endmacro
 |
 |// Set current VM state.
index 7adb2637e52e6937a4a36537b5b9c48d9809b846..a9b74642d12b85560cd4f01f0d60211bc503e57e 100644 (file)
@@ -798,12 +798,12 @@ static const unsigned char build_actionlist[17111] = {
   204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,6,255,199,71,252,252,
   237,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248,
   7,141,174,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233,255,
-  137,252,245,209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,148,
-  255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,239,
-  15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,140,
-  244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,244,
-  165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,41,
-  255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,
+  137,252,245,209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,
+  148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,
+  239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,
+  140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,
+  244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,
+  41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,
   180,253,134,233,255,141,180,253,134,233,15,183,70,252,254,15,142,245,248,
   1,248,6,255,15,143,244,253,248,6,141,180,253,134,233,248,1,255,248,7,139,
   6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,5,255,3,41,
@@ -823,11 +823,11 @@ static const unsigned char build_actionlist[17111] = {
   134,233,139,1,137,105,252,252,137,65,252,248,255,139,139,233,139,4,129,139,
   128,233,139,108,36,48,137,147,233,137,171,233,252,255,224,255,141,180,253,
   134,233,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,
-  137,252,245,209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,150,
-  255,139,190,233,139,108,36,48,141,12,202,59,141,233,15,135,244,24,15,182,
-  142,233,57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,
-  248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,
-  255,141,44,197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252,
+  137,252,245,209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,
+  150,255,139,190,233,139,108,36,48,141,12,202,59,141,233,15,135,244,24,15,
+  182,142,233,57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,
+  255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,
+  2,255,141,44,197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252,
   248,139,108,36,48,141,12,200,59,141,233,15,135,244,23,137,209,137,194,15,
   182,174,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,
   249,139,121,252,248,137,56,139,121,252,252,137,120,4,131,192,8,199,65,252,
@@ -2933,7 +2933,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -3049,7 +3049,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -3069,7 +3069,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -3098,7 +3098,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 16808, HOTCOUNT_PCMASK, GG_DISP2HOT);
+    dasm_put(Dst, 16808, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
index c29cad46f394d3fd9c7ec0d49fe2c9d49f6c831f..b1d17add26a7b1454952297502c19e6a6235f0e7 100644 (file)
@@ -50,7 +50,8 @@ void lj_dispatch_init(GG_State *GG)
 /* Initialize hotcount table. */
 void lj_dispatch_init_hotcount(global_State *g)
 {
-  HotCount start = (HotCount)G2J(g)->param[JIT_P_hotloop];
+  int32_t hotloop = G2J(g)->param[JIT_P_hotloop];
+  HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);
   HotCount *hotcount = G2GG(g)->hotcount;
   uint32_t i;
   for (i = 0; i < HOTCOUNT_SIZE; i++)
index dd4f68fe26fcdf8182df139d3ea78063efa35cba..c50d33ac9f06ba916a61fb7e6f35c5f902eebc69 100644 (file)
@@ -20,6 +20,10 @@ typedef uint16_t HotCount;
 #define HOTCOUNT_SIZE          64
 #define HOTCOUNT_PCMASK                ((HOTCOUNT_SIZE-1)*sizeof(HotCount))
 
+/* Hotcount decrements. */
+#define HOTCOUNT_LOOP          2
+#define HOTCOUNT_CALL          1
+
 /* This solves a circular dependency problem -- bump as needed. Sigh. */
 #define GG_NUM_ASMFF   62
 
index 7e26aadc3dbd2165a8f2b1bf5f270b1ed3d47ffe..1f7ddc21cfb7b984cc7a3a01321faef77afa2e9c 100644 (file)
@@ -232,7 +232,7 @@ typedef struct HotPenalty {
 } HotPenalty;
 
 #define PENALTY_SLOTS  64      /* Penalty cache slot. Must be a power of 2. */
-#define PENALTY_MIN    36      /* Minimum penalty value. */
+#define PENALTY_MIN    (36*2)  /* Minimum penalty value. */
 #define PENALTY_MAX    60000   /* Maximum penalty value. */
 #define PENALTY_RNDBITS        4       /* # of random bits to add to penalty value. */
 
index c65ca9cde176639897620948c098aa9dfc648280..33cc98f7ed32bcdb04f3d78be49f700c0ea42611 100644 (file)
@@ -643,9 +643,10 @@ void lj_trace_ins(jit_State *J, const BCIns *pc)
 /* A hotcount triggered. Start recording a root trace. */
 void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc)
 {
-  ERRNO_SAVE
   /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */
-  hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]+1);  /* Reset hotcount. */
+  ERRNO_SAVE
+  /* Reset hotcount. */
+  hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]*HOTCOUNT_LOOP);
   /* Only start a new trace if not recording or inside __gc call or vmevent. */
   if (J->state == LJ_TRACE_IDLE &&
       !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {