aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-06-29 01:51:39 +0200
committerMike Pall <mike>2011-06-29 01:52:23 +0200
commit82eca898db87bde10fbbb14a0f35ef75b6c3dcc6 (patch)
tree9b5aa8a81267664430a94fc40a131fe33c1832d7 /src
parentdeeb8196c4d4085f3cc5a3389b568de7da739190 (diff)
downloadluajit-82eca898db87bde10fbbb14a0f35ef75b6c3dcc6.tar.gz
luajit-82eca898db87bde10fbbb14a0f35ef75b6c3dcc6.tar.bz2
luajit-82eca898db87bde10fbbb14a0f35ef75b6c3dcc6.zip
Prefer recording loops over calls.
Hotcounts are decremented by 2 for loops and by 1 for calls.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc12
-rw-r--r--src/buildvm_arm.h128
-rw-r--r--src/buildvm_x64.h60
-rw-r--r--src/buildvm_x64win.h40
-rw-r--r--src/buildvm_x86.dasc8
-rw-r--r--src/buildvm_x86.h30
-rw-r--r--src/lj_dispatch.c3
-rw-r--r--src/lj_dispatch.h4
-rw-r--r--src/lj_jit.h2
-rw-r--r--src/lj_trace.c5
10 files changed, 151 insertions, 141 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index fd7c7b81..9b6b5aed 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -185,23 +185,23 @@
185| 185|
186#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) 186#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
187| 187|
188|.macro hotcheck 188|.macro hotcheck, delta
189| lsr CARG1, PC, #1 189| lsr CARG1, PC, #1
190| and CARG1, CARG1, #126 190| and CARG1, CARG1, #126
191| sub CARG1, CARG1, #-GG_DISP2HOT 191| sub CARG1, CARG1, #-GG_DISP2HOT
192| ldrh CARG2, [DISPATCH, CARG1] 192| ldrh CARG2, [DISPATCH, CARG1]
193| subs CARG2, CARG2, #1 193| subs CARG2, CARG2, #delta
194| strh CARG2, [DISPATCH, CARG1] 194| strh CARG2, [DISPATCH, CARG1]
195|.endmacro 195|.endmacro
196| 196|
197|.macro hotloop 197|.macro hotloop
198| hotcheck 198| hotcheck HOTCOUNT_LOOP
199| beq ->vm_hotloop 199| blo ->vm_hotloop
200|.endmacro 200|.endmacro
201| 201|
202|.macro hotcall 202|.macro hotcall
203| hotcheck 203| hotcheck HOTCOUNT_CALL
204| beq ->vm_hotcall 204| blo ->vm_hotcall
205|.endmacro 205|.endmacro
206| 206|
207|// Set current VM state. 207|// Set current VM state.
diff --git a/src/buildvm_arm.h b/src/buildvm_arm.h
index 505048bd..b450f5df 100644
--- a/src/buildvm_arm.h
+++ b/src/buildvm_arm.h
@@ -12,7 +12,7 @@
12#define DASM_SECTION_CODE_OP 0 12#define DASM_SECTION_CODE_OP 0
13#define DASM_SECTION_CODE_SUB 1 13#define DASM_SECTION_CODE_SUB 1
14#define DASM_MAXSECTION 2 14#define DASM_MAXSECTION 2
15static const unsigned int build_actionlist[5702] = { 15static const unsigned int build_actionlist[5706] = {
160x00010001, 160x00010001,
170x00060014, 170x00060014,
180xe3160000, 180xe3160000,
@@ -5381,9 +5381,10 @@ static const unsigned int build_actionlist[5702] = {
53810xe2400000, 53810xe2400000,
53820x000a0000, 53820x000a0000,
53830xe19710b0, 53830xe19710b0,
53840xe2511001, 53840xe2511000,
53850x000a0000,
53850xe18710b0, 53860xe18710b0,
53860x0a000000, 53870x3a000000,
53870x00050091, 53880x00050091,
53880x00000000, 53890x00000000,
53890xe1aa00d9, 53900xe1aa00d9,
@@ -5519,9 +5520,10 @@ static const unsigned int build_actionlist[5702] = {
55190xe2400000, 55200xe2400000,
55200x000a0000, 55210x000a0000,
55210xe19710b0, 55220xe19710b0,
55220xe2511001, 55230xe2511000,
55240x000a0000,
55230xe18710b0, 55250xe18710b0,
55240x0a000000, 55260x3a000000,
55250x00050091, 55270x00050091,
55260x00000000, 55280x00000000,
55270xe1aa00d9, 55290xe1aa00d9,
@@ -5550,9 +5552,10 @@ static const unsigned int build_actionlist[5702] = {
55500xe2400000, 55520xe2400000,
55510x000a0000, 55530x000a0000,
55520xe19710b0, 55540xe19710b0,
55530xe2511001, 55550xe2511000,
55560x000a0000,
55540xe18710b0, 55570xe18710b0,
55550x0a000000, 55580x3a000000,
55560x00050091, 55590x00050091,
55570x00000000, 55600x00000000,
55580xe5d6c000, 55610xe5d6c000,
@@ -5590,9 +5593,10 @@ static const unsigned int build_actionlist[5702] = {
55900xe2400000, 55930xe2400000,
55910x000a0000, 55940x000a0000,
55920xe19710b0, 55950xe19710b0,
55930xe2511001, 55960xe2511000,
55970x000a0000,
55940xe18710b0, 55980xe18710b0,
55950x0a000000, 55990x3a000000,
55960x00050093, 56000x00050093,
55970x00000000, 56010x00000000,
55980xe5180000, 56020xe5180000,
@@ -7138,7 +7142,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7138 7142
7139 case BC_FORL: 7143 case BC_FORL:
7140#if LJ_HASJIT 7144#if LJ_HASJIT
7141 dasm_put(Dst, 5363, -GG_DISP2HOT); 7145 dasm_put(Dst, 5363, -GG_DISP2HOT, HOTCOUNT_LOOP);
7142#endif 7146#endif
7143 break; 7147 break;
7144 7148
@@ -7150,68 +7154,68 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7150 case BC_FORI: 7154 case BC_FORI:
7151 case BC_IFORL: 7155 case BC_IFORL:
7152 vk = (op == BC_IFORL || op == BC_JFORL); 7156 vk = (op == BC_IFORL || op == BC_JFORL);
7153 dasm_put(Dst, 5373); 7157 dasm_put(Dst, 5374);
7154 if (op != BC_JFORL) { 7158 if (op != BC_JFORL) {
7155 dasm_put(Dst, 5375); 7159 dasm_put(Dst, 5376);
7156 } 7160 }
7157 if (!vk) { 7161 if (!vk) {
7158 dasm_put(Dst, 5377, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM); 7162 dasm_put(Dst, 5378, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
7159 } else { 7163 } else {
7160 dasm_put(Dst, 5395, -LJ_TISNUM); 7164 dasm_put(Dst, 5396, -LJ_TISNUM);
7161 if (op == BC_IFORL) { 7165 if (op == BC_IFORL) {
7162 dasm_put(Dst, 5403); 7166 dasm_put(Dst, 5404);
7163 } else { 7167 } else {
7164 dasm_put(Dst, 5405); 7168 dasm_put(Dst, 5406);
7165 } 7169 }
7166 dasm_put(Dst, 5408); 7170 dasm_put(Dst, 5409);
7167 } 7171 }
7168 dasm_put(Dst, 5413); 7172 dasm_put(Dst, 5414);
7169 if (op == BC_FORI) { 7173 if (op == BC_FORI) {
7170 dasm_put(Dst, 5415); 7174 dasm_put(Dst, 5416);
7171 } else if (op == BC_JFORI) { 7175 } else if (op == BC_JFORI) {
7172 dasm_put(Dst, 5417); 7176 dasm_put(Dst, 5418);
7173 } else if (op == BC_IFORL) { 7177 } else if (op == BC_IFORL) {
7174 dasm_put(Dst, 5420); 7178 dasm_put(Dst, 5421);
7175 } 7179 }
7176 if (vk) { 7180 if (vk) {
7177 dasm_put(Dst, 5422); 7181 dasm_put(Dst, 5423);
7178 } 7182 }
7179 dasm_put(Dst, 5424); 7183 dasm_put(Dst, 5425);
7180 if (op == BC_JFORI || op == BC_JFORL) { 7184 if (op == BC_JFORI || op == BC_JFORL) {
7181 dasm_put(Dst, 5429, BC_JLOOP); 7185 dasm_put(Dst, 5430, BC_JLOOP);
7182 } 7186 }
7183 dasm_put(Dst, 5432); 7187 dasm_put(Dst, 5433);
7184 if (!vk) { 7188 if (!vk) {
7185 dasm_put(Dst, 5439); 7189 dasm_put(Dst, 5440);
7186 } else { 7190 } else {
7187 dasm_put(Dst, 5441); 7191 dasm_put(Dst, 5442);
7188 } 7192 }
7189 dasm_put(Dst, 5443); 7193 dasm_put(Dst, 5444);
7190 if (!vk) { 7194 if (!vk) {
7191 dasm_put(Dst, 5447, -LJ_TISNUM, -LJ_TISNUM); 7195 dasm_put(Dst, 5448, -LJ_TISNUM, -LJ_TISNUM);
7192 } else { 7196 } else {
7193 dasm_put(Dst, 5459); 7197 dasm_put(Dst, 5460);
7194 } 7198 }
7195 dasm_put(Dst, 5468); 7199 dasm_put(Dst, 5469);
7196 if (op == BC_FORI) { 7200 if (op == BC_FORI) {
7197 dasm_put(Dst, 5472); 7201 dasm_put(Dst, 5473);
7198 } else if (op == BC_JFORI) { 7202 } else if (op == BC_JFORI) {
7199 dasm_put(Dst, 5474, BC_JLOOP); 7203 dasm_put(Dst, 5475, BC_JLOOP);
7200 } else if (op == BC_IFORL) { 7204 } else if (op == BC_IFORL) {
7201 dasm_put(Dst, 5479); 7205 dasm_put(Dst, 5480);
7202 } else { 7206 } else {
7203 dasm_put(Dst, 5481, BC_JLOOP); 7207 dasm_put(Dst, 5482, BC_JLOOP);
7204 } 7208 }
7205 dasm_put(Dst, 5484); 7209 dasm_put(Dst, 5485);
7206 if (vk) { 7210 if (vk) {
7207 dasm_put(Dst, 5490); 7211 dasm_put(Dst, 5491);
7208 } 7212 }
7209 dasm_put(Dst, 5495); 7213 dasm_put(Dst, 5496);
7210 break; 7214 break;
7211 7215
7212 case BC_ITERL: 7216 case BC_ITERL:
7213#if LJ_HASJIT 7217#if LJ_HASJIT
7214 dasm_put(Dst, 5501, -GG_DISP2HOT); 7218 dasm_put(Dst, 5502, -GG_DISP2HOT, HOTCOUNT_LOOP);
7215#endif 7219#endif
7216 break; 7220 break;
7217 7221
@@ -7220,40 +7224,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7220 break; 7224 break;
7221#endif 7225#endif
7222 case BC_IITERL: 7226 case BC_IITERL:
7223 dasm_put(Dst, 5511); 7227 dasm_put(Dst, 5513);
7224 if (op == BC_JITERL) { 7228 if (op == BC_JITERL) {
7225 dasm_put(Dst, 5513, -LJ_TNIL, BC_JLOOP); 7229 dasm_put(Dst, 5515, -LJ_TNIL, BC_JLOOP);
7226 } else { 7230 } else {
7227 dasm_put(Dst, 5519, -LJ_TNIL); 7231 dasm_put(Dst, 5521, -LJ_TNIL);
7228 } 7232 }
7229 dasm_put(Dst, 5525); 7233 dasm_put(Dst, 5527);
7230 break; 7234 break;
7231 7235
7232 case BC_LOOP: 7236 case BC_LOOP:
7233#if LJ_HASJIT 7237#if LJ_HASJIT
7234 dasm_put(Dst, 5532, -GG_DISP2HOT); 7238 dasm_put(Dst, 5534, -GG_DISP2HOT, HOTCOUNT_LOOP);
7235#endif 7239#endif
7236 break; 7240 break;
7237 7241
7238 case BC_ILOOP: 7242 case BC_ILOOP:
7239 dasm_put(Dst, 5542); 7243 dasm_put(Dst, 5545);
7240 break; 7244 break;
7241 7245
7242 case BC_JLOOP: 7246 case BC_JLOOP:
7243#if LJ_HASJIT 7247#if LJ_HASJIT
7244 dasm_put(Dst, 5549, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); 7248 dasm_put(Dst, 5552, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
7245#endif 7249#endif
7246 break; 7250 break;
7247 7251
7248 case BC_JMP: 7252 case BC_JMP:
7249 dasm_put(Dst, 5563); 7253 dasm_put(Dst, 5566);
7250 break; 7254 break;
7251 7255
7252 /* -- Function headers -------------------------------------------------- */ 7256 /* -- Function headers -------------------------------------------------- */
7253 7257
7254 case BC_FUNCF: 7258 case BC_FUNCF:
7255#if LJ_HASJIT 7259#if LJ_HASJIT
7256 dasm_put(Dst, 5572, -GG_DISP2HOT); 7260 dasm_put(Dst, 5575, -GG_DISP2HOT, HOTCOUNT_CALL);
7257#endif 7261#endif
7258 case BC_FUNCV: /* NYI: compiled vararg functions. */ 7262 case BC_FUNCV: /* NYI: compiled vararg functions. */
7259 break; 7263 break;
@@ -7263,42 +7267,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7263 break; 7267 break;
7264#endif 7268#endif
7265 case BC_IFUNCF: 7269 case BC_IFUNCF:
7266 dasm_put(Dst, 5582, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k)); 7270 dasm_put(Dst, 5586, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
7267 if (op != BC_JFUNCF) { 7271 if (op != BC_JFUNCF) {
7268 dasm_put(Dst, 5592); 7272 dasm_put(Dst, 5596);
7269 } 7273 }
7270 dasm_put(Dst, 5595, ~LJ_TNIL); 7274 dasm_put(Dst, 5599, ~LJ_TNIL);
7271 if (op == BC_JFUNCF) { 7275 if (op == BC_JFUNCF) {
7272 dasm_put(Dst, 5602, BC_JLOOP); 7276 dasm_put(Dst, 5606, BC_JLOOP);
7273 } else { 7277 } else {
7274 dasm_put(Dst, 5606); 7278 dasm_put(Dst, 5610);
7275 } 7279 }
7276 dasm_put(Dst, 5611); 7280 dasm_put(Dst, 5615);
7277 break; 7281 break;
7278 7282
7279 case BC_JFUNCV: 7283 case BC_JFUNCV:
7280#if !LJ_HASJIT 7284#if !LJ_HASJIT
7281 break; 7285 break;
7282#endif 7286#endif
7283 dasm_put(Dst, 5617); 7287 dasm_put(Dst, 5621);
7284 break; /* NYI: compiled vararg functions. */ 7288 break; /* NYI: compiled vararg functions. */
7285 7289
7286 case BC_IFUNCV: 7290 case BC_IFUNCV:
7287 dasm_put(Dst, 5619, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL); 7291 dasm_put(Dst, 5623, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
7288 break; 7292 break;
7289 7293
7290 case BC_FUNCC: 7294 case BC_FUNCC:
7291 case BC_FUNCCW: 7295 case BC_FUNCCW:
7292 if (op == BC_FUNCC) { 7296 if (op == BC_FUNCC) {
7293 dasm_put(Dst, 5660, Dt8(->f)); 7297 dasm_put(Dst, 5664, Dt8(->f));
7294 } else { 7298 } else {
7295 dasm_put(Dst, 5663, DISPATCH_GL(wrapf)); 7299 dasm_put(Dst, 5667, DISPATCH_GL(wrapf));
7296 } 7300 }
7297 dasm_put(Dst, 5666, Dt1(->maxstack), Dt1(->base), Dt1(->top)); 7301 dasm_put(Dst, 5670, Dt1(->maxstack), Dt1(->base), Dt1(->top));
7298 if (op == BC_FUNCCW) { 7302 if (op == BC_FUNCCW) {
7299 dasm_put(Dst, 5676, Dt8(->f)); 7303 dasm_put(Dst, 5680, Dt8(->f));
7300 } 7304 }
7301 dasm_put(Dst, 5679, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate)); 7305 dasm_put(Dst, 5683, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
7302 break; 7306 break;
7303 7307
7304 /* ---------------------------------------------------------------------- */ 7308 /* ---------------------------------------------------------------------- */
@@ -7318,7 +7322,7 @@ static int build_backend(BuildCtx *ctx)
7318 7322
7319 build_subroutines(ctx); 7323 build_subroutines(ctx);
7320 7324
7321 dasm_put(Dst, 5701); 7325 dasm_put(Dst, 5705);
7322 for (op = 0; op < BC__MAX; op++) 7326 for (op = 0; op < BC__MAX; op++)
7323 build_ins(ctx, (BCOp)op, op); 7327 build_ins(ctx, (BCOp)op, op);
7324 7328
diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h
index f6ed666c..4e4eca54 100644
--- a/src/buildvm_x64.h
+++ b/src/buildvm_x64.h
@@ -751,16 +751,16 @@ static const unsigned char build_actionlist[16156] = {
751 182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,6,255,65,199,71,252, 751 182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,6,255,65,199,71,252,
752 252,237,65,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244, 752 252,237,65,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,
753 5,248,7,141,171,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233, 753 5,248,7,141,171,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233,
754 255,137,221,209,252,237,129,229,239,102,65,131,172,253,46,233,1,15,132,244, 754 255,137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,238,15,130,
755 148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12, 755 244,148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,
756 239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15, 756 12,239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,
757 140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133, 757 15,140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,
758 244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137, 758 133,244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,
759 41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141, 759 137,41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,
760 156,253,131,233,255,141,156,253,131,233,15,183,67,252,254,15,142,245,248, 760 6,141,156,253,131,233,255,141,156,253,131,233,15,183,67,252,254,15,142,245,
761 1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,1,255,248,7,139, 761 248,1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,1,255,248,7,
762 3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,5, 762 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,
763 255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,131,233,15, 763 5,255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,131,233,15,
764 183,67,252,254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,9,255,129, 764 183,67,252,254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,9,255,129,
765 121,253,4,239,255,15,131,244,60,129,121,253,12,239,15,131,244,60,255,129, 765 121,253,4,239,255,15,131,244,60,129,121,253,12,239,15,131,244,60,255,129,
766 121,253,12,239,15,131,244,165,129,121,253,20,239,15,131,244,165,255,139,105, 766 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] = {
777 139,4,129,72,139,128,233,139,108,36,24,65,137,150,233,65,137,174,233,76,137, 777 139,4,129,72,139,128,233,139,108,36,24,65,137,150,233,65,137,174,233,76,137,
778 36,36,76,137,108,36,8,72,131,252,236,16,252,255,224,255,141,156,253,131,233, 778 36,36,76,137,108,36,8,72,131,252,236,16,252,255,224,255,141,156,253,131,233,
779 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255, 779 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,
780 137,221,209,252,237,129,229,239,102,65,131,172,253,46,233,1,15,132,244,150, 780 137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,238,15,130,244,
781 255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244,24,15,182, 781 150,255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244,24,
782 139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233,245,255, 782 15,182,139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233,
783 248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2, 783 245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,
784 255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,252,252,68,137,120, 784 244,2,255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,252,252,68,
785 252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,23,137,209,137,194, 785 137,120,252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,23,137,209,
786 15,182,171,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244, 786 137,194,15,182,171,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,
787 249,68,139,121,252,248,68,137,56,68,139,121,252,252,68,137,120,4,131,192, 787 15,131,244,249,68,139,121,252,248,68,137,56,68,139,121,252,252,68,137,120,
788 8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,68,139,187,233, 788 4,131,192,8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,68,139,
789 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255, 789 187,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,
790 248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,233,244,2,255, 790 238,255,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,233,244,
791 139,106,252,248,76,139,189,233,139,108,36,24,141,68,194,252,248,137,149,233, 791 2,255,139,106,252,248,76,139,189,233,139,108,36,24,141,68,194,252,248,137,
792 141,136,233,59,141,233,137,133,233,255,76,137,252,254,137,252,239,255,15, 792 149,233,141,136,233,59,141,233,137,133,233,255,76,137,252,254,137,252,239,
793 135,244,22,65,199,134,233,237,255,65,252,255,215,255,65,252,255,150,233,255, 793 255,15,135,244,22,65,199,134,233,237,255,65,252,255,215,255,65,252,255,150,
794 65,199,134,233,237,139,149,233,141,12,194,252,247,217,3,141,233,139,90,252, 794 233,255,65,199,134,233,237,139,149,233,141,12,194,252,247,217,3,141,233,139,
795 252,252,233,244,12,255,254,0 795 90,252,252,252,233,244,12,255,254,0
796}; 796};
797 797
798enum { 798enum {
@@ -2777,7 +2777,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2777 2777
2778 case BC_FORL: 2778 case BC_FORL:
2779#if LJ_HASJIT 2779#if LJ_HASJIT
2780 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT); 2780 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2781#endif 2781#endif
2782 break; 2782 break;
2783 2783
@@ -2893,7 +2893,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2893 2893
2894 case BC_ITERL: 2894 case BC_ITERL:
2895#if LJ_HASJIT 2895#if LJ_HASJIT
2896 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT); 2896 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2897#endif 2897#endif
2898 break; 2898 break;
2899 2899
@@ -2913,7 +2913,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2913 2913
2914 case BC_LOOP: 2914 case BC_LOOP:
2915#if LJ_HASJIT 2915#if LJ_HASJIT
2916 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT); 2916 dasm_put(Dst, 15309, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2917#endif 2917#endif
2918 break; 2918 break;
2919 2919
@@ -2942,7 +2942,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2942 2942
2943 case BC_FUNCF: 2943 case BC_FUNCF:
2944#if LJ_HASJIT 2944#if LJ_HASJIT
2945 dasm_put(Dst, 15842, HOTCOUNT_PCMASK, GG_DISP2HOT); 2945 dasm_put(Dst, 15842, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
2946#endif 2946#endif
2947 case BC_FUNCV: /* NYI: compiled vararg functions. */ 2947 case BC_FUNCV: /* NYI: compiled vararg functions. */
2948 break; 2948 break;
diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h
index bb813284..0e1b5b46 100644
--- a/src/buildvm_x64win.h
+++ b/src/buildvm_x64win.h
@@ -746,7 +746,7 @@ static const unsigned char build_actionlist[16011] = {
746 36,252,235,248,6,255,199,71,252,252,237,131,199,8,255,199,68,194,252,244, 746 36,252,235,248,6,255,199,71,252,252,237,131,199,8,255,199,68,194,252,244,
747 237,255,131,192,1,252,233,244,5,248,7,141,174,233,252,247,197,237,15,133, 747 237,255,131,192,1,252,233,244,5,248,7,141,174,233,252,247,197,237,15,133,
748 244,14,41,252,234,255,1,252,233,255,137,252,245,209,252,237,129,229,239,102, 748 244,14,41,252,234,255,1,252,233,255,137,252,245,209,252,237,129,229,239,102,
749 131,172,253,43,233,1,15,132,244,148,255,141,12,202,255,129,121,253,4,239, 749 129,172,253,43,233,238,15,130,244,148,255,141,12,202,255,129,121,253,4,239,
750 15,133,244,255,255,129,121,253,12,239,15,133,244,60,129,121,253,20,239,15, 750 15,133,244,255,255,129,121,253,12,239,15,133,244,60,129,121,253,20,239,15,
751 133,244,60,139,41,131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133, 751 133,244,60,139,41,131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133,
752 244,165,129,121,253,20,239,15,133,244,165,255,139,105,16,133,252,237,15,136, 752 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] = {
775 15,127,153,233,102,68,15,127,161,233,102,68,15,127,169,233,102,68,15,127, 775 15,127,153,233,102,68,15,127,161,233,102,68,15,127,169,233,102,68,15,127,
776 177,233,102,68,15,127,185,233,252,255,224,255,141,180,253,134,233,139,6,15, 776 177,233,102,68,15,127,185,233,252,255,224,255,141,180,253,134,233,139,6,15,
777 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,137,252,245, 777 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,137,252,245,
778 209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,150,255,139,190, 778 209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,150,255,139,
779 233,139,108,36,96,141,12,202,59,141,233,15,135,244,24,15,182,142,233,57,200, 779 190,233,139,108,36,96,141,12,202,59,141,233,15,135,244,24,15,182,142,233,
780 15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194, 780 57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,
781 252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,197,237, 781 68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,
782 141,4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,36,96,141, 782 197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,
783 12,200,59,141,233,15,135,244,23,137,209,137,194,15,182,174,233,133,252,237, 783 36,96,141,12,200,59,141,233,15,135,244,23,137,209,137,194,15,182,174,233,
784 15,132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,252,248,137, 784 133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,
785 56,139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15, 785 252,248,137,56,139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,
786 133,244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,131,198,4,193, 786 252,237,1,15,133,244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,
787 232,16,252,255,36,252,235,255,248,3,199,64,4,237,131,192,8,131,252,237,1, 787 131,198,4,193,232,16,252,255,36,252,235,255,248,3,199,64,4,237,131,192,8,
788 15,133,244,3,252,233,244,2,255,139,106,252,248,72,139,189,233,139,108,36, 788 131,252,237,1,15,133,244,3,252,233,244,2,255,139,106,252,248,72,139,189,233,
789 96,141,68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,233,255, 789 139,108,36,96,141,68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,
790 72,137,252,250,137,252,233,255,15,135,244,22,199,131,233,237,255,252,255, 790 233,255,72,137,252,250,137,252,233,255,15,135,244,22,199,131,233,237,255,
791 215,255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194,252,247, 791 252,255,215,255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194,
792 217,3,141,233,139,114,252,252,252,233,244,12,255,254,0 792 252,247,217,3,141,233,139,114,252,252,252,233,244,12,255,254,0
793}; 793};
794 794
795enum { 795enum {
@@ -2775,7 +2775,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2775 2775
2776 case BC_FORL: 2776 case BC_FORL:
2777#if LJ_HASJIT 2777#if LJ_HASJIT
2778 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT); 2778 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2779#endif 2779#endif
2780 break; 2780 break;
2781 2781
@@ -2891,7 +2891,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2891 2891
2892 case BC_ITERL: 2892 case BC_ITERL:
2893#if LJ_HASJIT 2893#if LJ_HASJIT
2894 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT); 2894 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2895#endif 2895#endif
2896 break; 2896 break;
2897 2897
@@ -2911,7 +2911,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2911 2911
2912 case BC_LOOP: 2912 case BC_LOOP:
2913#if LJ_HASJIT 2913#if LJ_HASJIT
2914 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT); 2914 dasm_put(Dst, 15111, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2915#endif 2915#endif
2916 break; 2916 break;
2917 2917
@@ -2940,7 +2940,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
2940 2940
2941 case BC_FUNCF: 2941 case BC_FUNCF:
2942#if LJ_HASJIT 2942#if LJ_HASJIT
2943 dasm_put(Dst, 15710, HOTCOUNT_PCMASK, GG_DISP2HOT); 2943 dasm_put(Dst, 15710, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
2944#endif 2944#endif
2945 case BC_FUNCV: /* NYI: compiled vararg functions. */ 2945 case BC_FUNCV: /* NYI: compiled vararg functions. */
2946 break; 2946 break;
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index effd0737..21e18ea8 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -333,16 +333,16 @@
333| mov reg, PC 333| mov reg, PC
334| shr reg, 1 334| shr reg, 1
335| and reg, HOTCOUNT_PCMASK 335| and reg, HOTCOUNT_PCMASK
336| sub word [DISPATCH+reg+GG_DISP2HOT], 1 336| sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP
337| jz ->vm_hotloop 337| jb ->vm_hotloop
338|.endmacro 338|.endmacro
339| 339|
340|.macro hotcall, reg 340|.macro hotcall, reg
341| mov reg, PC 341| mov reg, PC
342| shr reg, 1 342| shr reg, 1
343| and reg, HOTCOUNT_PCMASK 343| and reg, HOTCOUNT_PCMASK
344| sub word [DISPATCH+reg+GG_DISP2HOT], 1 344| sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL
345| jz ->vm_hotcall 345| jb ->vm_hotcall
346|.endmacro 346|.endmacro
347| 347|
348|// Set current VM state. 348|// Set current VM state.
diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h
index 7adb2637..a9b74642 100644
--- a/src/buildvm_x86.h
+++ b/src/buildvm_x86.h
@@ -798,12 +798,12 @@ static const unsigned char build_actionlist[17111] = {
798 204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,6,255,199,71,252,252, 798 204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,6,255,199,71,252,252,
799 237,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248, 799 237,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248,
800 7,141,174,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233,255, 800 7,141,174,233,252,247,197,237,15,133,244,14,41,252,234,255,1,252,233,255,
801 137,252,245,209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,148, 801 137,252,245,209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,
802 255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,239, 802 148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,
803 15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,140, 803 239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,
804 244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,244, 804 140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,
805 165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,41, 805 244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,
806 255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141, 806 41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,
807 180,253,134,233,255,141,180,253,134,233,15,183,70,252,254,15,142,245,248, 807 180,253,134,233,255,141,180,253,134,233,15,183,70,252,254,15,142,245,248,
808 1,248,6,255,15,143,244,253,248,6,141,180,253,134,233,248,1,255,248,7,139, 808 1,248,6,255,15,143,244,253,248,6,141,180,253,134,233,248,1,255,248,7,139,
809 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,5,255,3,41, 809 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] = {
823 134,233,139,1,137,105,252,252,137,65,252,248,255,139,139,233,139,4,129,139, 823 134,233,139,1,137,105,252,252,137,65,252,248,255,139,139,233,139,4,129,139,
824 128,233,139,108,36,48,137,147,233,137,171,233,252,255,224,255,141,180,253, 824 128,233,139,108,36,48,137,147,233,137,171,233,252,255,224,255,141,180,253,
825 134,233,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255, 825 134,233,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,
826 137,252,245,209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,150, 826 137,252,245,209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,
827 255,139,190,233,139,108,36,48,141,12,202,59,141,233,15,135,244,24,15,182, 827 150,255,139,190,233,139,108,36,48,141,12,202,59,141,233,15,135,244,24,15,
828 142,233,57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255, 828 182,142,233,57,200,15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,
829 248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2, 829 255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,
830 255,141,44,197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252, 830 2,255,141,44,197,237,141,4,194,139,122,252,248,137,104,252,252,137,120,252,
831 248,139,108,36,48,141,12,200,59,141,233,15,135,244,23,137,209,137,194,15, 831 248,139,108,36,48,141,12,200,59,141,233,15,135,244,23,137,209,137,194,15,
832 182,174,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244, 832 182,174,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,
833 249,139,121,252,248,137,56,139,121,252,252,137,120,4,131,192,8,199,65,252, 833 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)
2933 2933
2934 case BC_FORL: 2934 case BC_FORL:
2935#if LJ_HASJIT 2935#if LJ_HASJIT
2936 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT); 2936 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
2937#endif 2937#endif
2938 break; 2938 break;
2939 2939
@@ -3049,7 +3049,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3049 3049
3050 case BC_ITERL: 3050 case BC_ITERL:
3051#if LJ_HASJIT 3051#if LJ_HASJIT
3052 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT); 3052 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
3053#endif 3053#endif
3054 break; 3054 break;
3055 3055
@@ -3069,7 +3069,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3069 3069
3070 case BC_LOOP: 3070 case BC_LOOP:
3071#if LJ_HASJIT 3071#if LJ_HASJIT
3072 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT); 3072 dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
3073#endif 3073#endif
3074 break; 3074 break;
3075 3075
@@ -3098,7 +3098,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3098 3098
3099 case BC_FUNCF: 3099 case BC_FUNCF:
3100#if LJ_HASJIT 3100#if LJ_HASJIT
3101 dasm_put(Dst, 16808, HOTCOUNT_PCMASK, GG_DISP2HOT); 3101 dasm_put(Dst, 16808, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
3102#endif 3102#endif
3103 case BC_FUNCV: /* NYI: compiled vararg functions. */ 3103 case BC_FUNCV: /* NYI: compiled vararg functions. */
3104 break; 3104 break;
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c
index c29cad46..b1d17add 100644
--- a/src/lj_dispatch.c
+++ b/src/lj_dispatch.c
@@ -50,7 +50,8 @@ void lj_dispatch_init(GG_State *GG)
50/* Initialize hotcount table. */ 50/* Initialize hotcount table. */
51void lj_dispatch_init_hotcount(global_State *g) 51void lj_dispatch_init_hotcount(global_State *g)
52{ 52{
53 HotCount start = (HotCount)G2J(g)->param[JIT_P_hotloop]; 53 int32_t hotloop = G2J(g)->param[JIT_P_hotloop];
54 HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);
54 HotCount *hotcount = G2GG(g)->hotcount; 55 HotCount *hotcount = G2GG(g)->hotcount;
55 uint32_t i; 56 uint32_t i;
56 for (i = 0; i < HOTCOUNT_SIZE; i++) 57 for (i = 0; i < HOTCOUNT_SIZE; i++)
diff --git a/src/lj_dispatch.h b/src/lj_dispatch.h
index dd4f68fe..c50d33ac 100644
--- a/src/lj_dispatch.h
+++ b/src/lj_dispatch.h
@@ -20,6 +20,10 @@ typedef uint16_t HotCount;
20#define HOTCOUNT_SIZE 64 20#define HOTCOUNT_SIZE 64
21#define HOTCOUNT_PCMASK ((HOTCOUNT_SIZE-1)*sizeof(HotCount)) 21#define HOTCOUNT_PCMASK ((HOTCOUNT_SIZE-1)*sizeof(HotCount))
22 22
23/* Hotcount decrements. */
24#define HOTCOUNT_LOOP 2
25#define HOTCOUNT_CALL 1
26
23/* This solves a circular dependency problem -- bump as needed. Sigh. */ 27/* This solves a circular dependency problem -- bump as needed. Sigh. */
24#define GG_NUM_ASMFF 62 28#define GG_NUM_ASMFF 62
25 29
diff --git a/src/lj_jit.h b/src/lj_jit.h
index 7e26aadc..1f7ddc21 100644
--- a/src/lj_jit.h
+++ b/src/lj_jit.h
@@ -232,7 +232,7 @@ typedef struct HotPenalty {
232} HotPenalty; 232} HotPenalty;
233 233
234#define PENALTY_SLOTS 64 /* Penalty cache slot. Must be a power of 2. */ 234#define PENALTY_SLOTS 64 /* Penalty cache slot. Must be a power of 2. */
235#define PENALTY_MIN 36 /* Minimum penalty value. */ 235#define PENALTY_MIN (36*2) /* Minimum penalty value. */
236#define PENALTY_MAX 60000 /* Maximum penalty value. */ 236#define PENALTY_MAX 60000 /* Maximum penalty value. */
237#define PENALTY_RNDBITS 4 /* # of random bits to add to penalty value. */ 237#define PENALTY_RNDBITS 4 /* # of random bits to add to penalty value. */
238 238
diff --git a/src/lj_trace.c b/src/lj_trace.c
index c65ca9cd..33cc98f7 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -643,9 +643,10 @@ void lj_trace_ins(jit_State *J, const BCIns *pc)
643/* A hotcount triggered. Start recording a root trace. */ 643/* A hotcount triggered. Start recording a root trace. */
644void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc) 644void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc)
645{ 645{
646 ERRNO_SAVE
647 /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */ 646 /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */
648 hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]+1); /* Reset hotcount. */ 647 ERRNO_SAVE
648 /* Reset hotcount. */
649 hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]*HOTCOUNT_LOOP);
649 /* Only start a new trace if not recording or inside __gc call or vmevent. */ 650 /* Only start a new trace if not recording or inside __gc call or vmevent. */
650 if (J->state == LJ_TRACE_IDLE && 651 if (J->state == LJ_TRACE_IDLE &&
651 !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) { 652 !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {