Mercurial
annotate third_party/luajit/src/lj_snap.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | 94705b5986b3 |
| children |
| rev | line source |
|---|---|
|
178
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 /* |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 ** Snapshot handling. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #define lj_snap_c |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #define LUA_CORE |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 #include "lj_obj.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 #if LJ_HASJIT |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 #include "lj_gc.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 #include "lj_tab.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 #include "lj_state.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 #include "lj_frame.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 #include "lj_bc.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 #include "lj_ir.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 #include "lj_jit.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 #include "lj_iropt.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 #include "lj_trace.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 #include "lj_snap.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 #include "lj_target.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 #if LJ_HASFFI |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 #include "lj_ctype.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 #include "lj_cdata.h" |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 /* Pass IR on to next optimization in chain (FOLD). */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 #define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 /* Emit raw IR without passing through optimizations. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 #define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 /* -- Snapshot buffer allocation ------------------------------------------ */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 /* Grow snapshot buffer. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 void lj_snap_grow_buf_(jit_State *J, MSize need) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 MSize maxsnap = (MSize)J->param[JIT_P_maxsnap]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 if (need > maxsnap) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 lj_trace_err(J, LJ_TRERR_SNAPOV); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 lj_mem_growvec(J->L, J->snapbuf, J->sizesnap, maxsnap, SnapShot); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 J->cur.snap = J->snapbuf; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 /* Grow snapshot map buffer. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 void lj_snap_grow_map_(jit_State *J, MSize need) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 if (need < 2*J->sizesnapmap) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 need = 2*J->sizesnapmap; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 else if (need < 64) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 need = 64; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 J->cur.snapmap = J->snapmapbuf; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 J->sizesnapmap = need; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 /* -- Snapshot generation ------------------------------------------------- */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 /* Add all modified slots to the snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 IRRef retf = J->chain[IR_RETF]; /* Limits SLOAD restore elimination. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 BCReg s; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 MSize n = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
68 for (s = 0; s < nslots; s++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 TRef tr = J->slot[s]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 IRRef ref = tref_ref(tr); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 #if LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
72 if (s == 1) { /* Ignore slot 1 in LJ_FR2 mode, except if tailcalled. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 if ((tr & TREF_FRAME)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 map[n++] = SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 if ((tr & (TREF_FRAME | TREF_CONT)) && !ref) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 cTValue *base = J->L->base - J->baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 tr = J->slot[s] = (tr & 0xff0000) | lj_ir_k64(J, IR_KNUM, base[s].u64); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 ref = tref_ref(tr); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
81 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
82 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
83 if (ref) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 SnapEntry sn = SNAP_TR(s, tr); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 IRIns *ir = &J->cur.ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 if ((LJ_FR2 || !(sn & (SNAP_CONT|SNAP_FRAME))) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 ir->o == IR_SLOAD && ir->op1 == s && ref > retf) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 /* |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 ** No need to snapshot unmodified non-inherited slots. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 ** But always snapshot the function below a frame in LJ_FR2 mode. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 if (!(ir->op2 & IRSLOAD_INHERIT) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 (!LJ_FR2 || s == 0 || s+1 == nslots || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 !(J->slot[s+1] & (TREF_CONT|TREF_FRAME)))) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 /* No need to restore readonly slots and unmodified non-parent slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 if (!(LJ_DUALNUM && (ir->op2 & IRSLOAD_CONVERT)) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 (ir->op2 & (IRSLOAD_READONLY|IRSLOAD_PARENT)) != IRSLOAD_PARENT) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 sn |= SNAP_NORESTORE; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 if (LJ_SOFTFP32 && irt_isnum(ir->t)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 sn |= SNAP_SOFTFPNUM; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 map[n++] = sn; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 return n; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 /* Add frame links at the end of the snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 static MSize snapshot_framelinks(jit_State *J, SnapEntry *map, uint8_t *topslot) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 cTValue *frame = J->L->base - 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 cTValue *lim = J->L->base - J->baseslot + LJ_FR2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 GCfunc *fn = frame_func(frame); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 cTValue *ftop = isluafunc(fn) ? (frame+funcproto(fn)->framesize) : J->L->top; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 #if LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 uint64_t pcbase = (u64ptr(J->pc) << 8) | (J->baseslot - 2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 lj_assertJ(2 <= J->baseslot && J->baseslot <= 257, "bad baseslot"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 memcpy(map, &pcbase, sizeof(uint64_t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 #else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 MSize f = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 map[f++] = SNAP_MKPC(J->pc); /* The current PC is always the first entry. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 lj_assertJ(!J->pt || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 (J->pc >= proto_bc(J->pt) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 J->pc < proto_bc(J->pt) + J->pt->sizebc), "bad snapshot PC"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 while (frame > lim) { /* Backwards traversal of all frames above base. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 if (frame_islua(frame)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 map[f++] = SNAP_MKPC(frame_pc(frame)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 frame = frame_prevl(frame); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 } else if (frame_iscont(frame)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 map[f++] = SNAP_MKFTSZ(frame_ftsz(frame)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 map[f++] = SNAP_MKPC(frame_contpc(frame)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 frame = frame_prevd(frame); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 lj_assertJ(!frame_isc(frame), "broken frame chain"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 map[f++] = SNAP_MKFTSZ(frame_ftsz(frame)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 frame = frame_prevd(frame); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 if (frame + funcproto(frame_func(frame))->framesize > ftop) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 ftop = frame + funcproto(frame_func(frame))->framesize; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 *topslot = (uint8_t)(ftop - lim); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 #if LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 lj_assertJ(sizeof(SnapEntry) * 2 == sizeof(uint64_t), "bad SnapEntry def"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
153 return 2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 #else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 lj_assertJ(f == (MSize)(1 + J->framedepth), "miscalculated snapshot size"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 return f; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 /* Take a snapshot of the current stack. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 BCReg nslots = J->baseslot + J->maxslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 MSize nent; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 SnapEntry *p; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 /* Conservative estimate. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 lj_snap_grow_map(J, nsnapmap + nslots + (MSize)(LJ_FR2?2:J->framedepth+1)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 p = &J->cur.snapmap[nsnapmap]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
169 nent = snapshot_slots(J, p, nslots); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 snap->nent = (uint8_t)nent; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 nent += snapshot_framelinks(J, p + nent, &snap->topslot); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 snap->mapofs = (uint32_t)nsnapmap; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 snap->ref = (IRRef1)J->cur.nins; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 snap->mcofs = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 snap->nslots = (uint8_t)nslots; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 snap->count = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
177 J->cur.nsnapmap = (uint32_t)(nsnapmap + nent); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
180 /* Add or merge a snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 void lj_snap_add(jit_State *J) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
182 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
183 MSize nsnap = J->cur.nsnap; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
184 MSize nsnapmap = J->cur.nsnapmap; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
185 /* Merge if no ins. inbetween or if requested and no guard inbetween. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
186 if ((nsnap > 0 && J->cur.snap[nsnap-1].ref == J->cur.nins) || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
187 (J->mergesnap && !irt_isguard(J->guardemit))) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 if (nsnap == 1) { /* But preserve snap #0 PC. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
190 goto nomerge; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 nsnapmap = J->cur.snap[--nsnap].mapofs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
193 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 nomerge: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 lj_snap_grow_buf(J, nsnap+1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 J->cur.nsnap = (uint16_t)(nsnap+1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 J->mergesnap = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 J->guardemit.irt = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 snapshot_stack(J, &J->cur.snap[nsnap], nsnapmap); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 /* -- Snapshot modification ----------------------------------------------- */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
205 #define SNAP_USEDEF_SLOTS (LJ_MAX_JSLOTS+LJ_STACK_EXTRA) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 /* Find unused slots with reaching-definitions bytecode data-flow analysis. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 static BCReg snap_usedef(jit_State *J, uint8_t *udf, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 const BCIns *pc, BCReg maxslot) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
210 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 BCReg s; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
212 GCobj *o; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
214 if (maxslot == 0) return 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
215 #ifdef LUAJIT_USE_VALGRIND |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
216 /* Avoid errors for harmless reads beyond maxslot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
217 memset(udf, 1, SNAP_USEDEF_SLOTS); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
218 #else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
219 memset(udf, 1, maxslot); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
220 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
221 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
222 /* Treat open upvalues as used. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 o = gcref(J->L->openupval); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 while (o) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
225 if (uvval(gco2uv(o)) < J->L->base) break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 udf[uvval(gco2uv(o)) - J->L->base] = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
227 o = gcref(o->gch.nextgc); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
228 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
230 #define USE_SLOT(s) udf[(s)] &= ~1 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 #define DEF_SLOT(s) udf[(s)] *= 3 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
232 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
233 /* Scan through following bytecode and check for uses/defs. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 lj_assertJ(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 "snapshot PC out of range"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 for (;;) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
237 BCIns ins = *pc++; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
238 BCOp op = bc_op(ins); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
239 switch (bcmode_b(op)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
240 case BCMvar: USE_SLOT(bc_b(ins)); break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
241 default: break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
242 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
243 switch (bcmode_c(op)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
244 case BCMvar: USE_SLOT(bc_c(ins)); break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
245 case BCMrbase: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
246 lj_assertJ(op == BC_CAT, "unhandled op %d with RC rbase", op); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 for (s = bc_b(ins); s <= bc_c(ins); s++) USE_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
248 for (; s < maxslot; s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 case BCMjump: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 handle_jump: { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 BCReg minslot = bc_a(ins); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 if (op >= BC_FORI && op <= BC_JFORL) minslot += FORL_EXT; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 else if (op >= BC_ITERL && op <= BC_JITERL) minslot += bc_b(pc[-2])-1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 else if (op == BC_UCLO) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 ptrdiff_t delta = bc_j(ins); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 if (delta < 0) return maxslot; /* Prevent loop. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 pc += delta; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 for (s = minslot; s < maxslot; s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 return minslot < maxslot ? minslot : maxslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 case BCMlit: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 goto handle_jump; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
267 } else if (bc_isret(op)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
268 BCReg top = op == BC_RETM ? maxslot : (bc_a(ins) + bc_d(ins)-1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
269 for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 for (; s < top; s++) USE_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 for (; s < maxslot; s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 return 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
273 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 case BCMfunc: return maxslot; /* NYI: will abort, anyway. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 default: break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
278 switch (bcmode_a(op)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
279 case BCMvar: USE_SLOT(bc_a(ins)); break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
280 case BCMdst: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
281 if (!(op == BC_ISTC || op == BC_ISFC)) DEF_SLOT(bc_a(ins)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 case BCMbase: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 if (op >= BC_CALLM && op <= BC_ITERN) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 BCReg top = (op == BC_CALLM || op == BC_CALLMT || bc_c(ins) == 0) ? |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 maxslot : (bc_a(ins) + bc_c(ins)+LJ_FR2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 if (LJ_FR2) DEF_SLOT(bc_a(ins)+1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 s = bc_a(ins) - ((op == BC_ITERC || op == BC_ITERN) ? 3 : 0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 for (; s < top; s++) USE_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 for (; s < maxslot; s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
291 if (op == BC_CALLT || op == BC_CALLMT) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
292 for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 return 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 } else if (op == BC_VARG) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 return maxslot; /* NYI: punt. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 } else if (op == BC_KNIL) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 for (s = bc_a(ins); s <= bc_d(ins); s++) DEF_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 } else if (op == BC_TSETM) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 for (s = bc_a(ins)-1; s < maxslot; s++) USE_SLOT(s); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
302 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 default: break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 lj_assertJ(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 "use/def analysis PC out of range"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 #undef USE_SLOT |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 #undef DEF_SLOT |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 return 0; /* unreachable */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 /* Mark slots used by upvalues of child prototypes as used. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 static void snap_useuv(GCproto *pt, uint8_t *udf) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 /* This is a coarse check, because it's difficult to correlate the lifetime |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
319 ** of slots and closures. But the number of false positives is quite low. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 ** A false positive may cause a slot not to be purged, which is just |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
321 ** a missed optimization. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 if ((pt->flags & PROTO_CHILD)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 ptrdiff_t i, j, n = pt->sizekgc; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
325 GCRef *kr = mref(pt->k, GCRef) - 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
326 for (i = 0; i < n; i++, kr--) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
327 GCobj *o = gcref(*kr); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
328 if (o->gch.gct == ~LJ_TPROTO) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 for (j = 0; j < gco2pt(o)->sizeuv; j++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
330 uint32_t v = proto_uv(gco2pt(o))[j]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
331 if ((v & PROTO_UV_LOCAL)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
332 udf[(v & 0xff)] = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
333 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
334 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
335 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
336 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
337 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
338 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
339 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
340 /* Purge dead slots before the next snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
341 void lj_snap_purge(jit_State *J) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
342 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
343 uint8_t udf[SNAP_USEDEF_SLOTS]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
344 BCReg s, maxslot = J->maxslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
345 if (bc_op(*J->pc) == BC_FUNCV && maxslot > J->pt->numparams) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
346 maxslot = J->pt->numparams; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
347 s = snap_usedef(J, udf, J->pc, maxslot); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
348 if (s < maxslot) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
349 snap_useuv(J->pt, udf); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
350 for (; s < maxslot; s++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
351 if (udf[s] != 0) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
352 J->base[s] = 0; /* Purge dead slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 /* Shrink last snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
357 void lj_snap_shrink(jit_State *J) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
359 SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
360 SnapEntry *map = &J->cur.snapmap[snap->mapofs]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
361 MSize n, m, nlim, nent = snap->nent; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
362 uint8_t udf[SNAP_USEDEF_SLOTS]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 BCReg maxslot = J->maxslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 BCReg baseslot = J->baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 BCReg minslot = snap_usedef(J, udf, snap_pc(&map[nent]), maxslot); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
366 if (minslot < maxslot) snap_useuv(J->pt, udf); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
367 maxslot += baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
368 minslot += baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
369 snap->nslots = (uint8_t)maxslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
370 for (n = m = 0; n < nent; n++) { /* Remove unused slots from snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
371 BCReg s = snap_slot(map[n]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
372 if (s < minslot || (s < maxslot && udf[s-baseslot] == 0)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
373 map[m++] = map[n]; /* Only copy used slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
374 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
375 snap->nent = (uint8_t)m; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
376 nlim = J->cur.nsnapmap - snap->mapofs - 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
378 J->cur.nsnapmap = (uint32_t)(snap->mapofs + m); /* Free up space in map. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
380 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 /* -- Snapshot access ----------------------------------------------------- */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 /* Initialize a Bloom Filter with all renamed refs. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
384 ** There are very few renames (often none), so the filter has |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
385 ** very few bits set. This makes it suitable for negative filtering. |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
386 */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
387 static BloomFilter snap_renamefilter(GCtrace *T, SnapNo lim) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
388 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
389 BloomFilter rfilt = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
390 IRIns *ir; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
391 for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
392 if (ir->op2 <= lim) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
393 bloomset(rfilt, ir->op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
394 return rfilt; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
395 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
396 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 /* Process matching renames to find the original RegSP. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 static RegSP snap_renameref(GCtrace *T, SnapNo lim, IRRef ref, RegSP rs) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
399 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
400 IRIns *ir; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
401 for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
402 if (ir->op1 == ref && ir->op2 <= lim) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
403 rs = ir->prev; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
404 return rs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
405 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
406 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
407 /* Copy RegSP from parent snapshot to the parent links of the IR. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
408 IRIns *lj_snap_regspmap(jit_State *J, GCtrace *T, SnapNo snapno, IRIns *ir) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
409 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
410 SnapShot *snap = &T->snap[snapno]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 SnapEntry *map = &T->snapmap[snap->mapofs]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 BloomFilter rfilt = snap_renamefilter(T, snapno); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 MSize n = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
414 IRRef ref = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
415 UNUSED(J); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 for ( ; ; ir++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 uint32_t rs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 if (ir->o == IR_SLOAD) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 if (!(ir->op2 & IRSLOAD_PARENT)) break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
420 for ( ; ; n++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
421 lj_assertJ(n < snap->nent, "slot %d not found in snapshot", ir->op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
422 if (snap_slot(map[n]) == ir->op1) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
423 ref = snap_ref(map[n++]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
425 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 } else if (LJ_SOFTFP32 && ir->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
428 ref++; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
429 } else if (ir->o == IR_PVAL) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
430 ref = ir->op1 + REF_BIAS; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
431 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
432 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
433 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
434 rs = T->ir[ref].prev; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
435 if (bloomtest(rfilt, ref)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
436 rs = snap_renameref(T, snapno, ref, rs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
437 ir->prev = (uint16_t)rs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
438 lj_assertJ(regsp_used(rs), "unused IR %04d in snapshot", ref - REF_BIAS); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
439 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
440 return ir; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
441 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
442 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
443 /* -- Snapshot replay ----------------------------------------------------- */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
444 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
445 /* Replay constant from parent trace. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
446 static TRef snap_replay_const(jit_State *J, IRIns *ir) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
447 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
448 /* Only have to deal with constants that can occur in stack slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
449 switch ((IROp)ir->o) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
450 case IR_KPRI: return TREF_PRI(irt_type(ir->t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
451 case IR_KINT: return lj_ir_kint(J, ir->i); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
452 case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
453 case IR_KNUM: case IR_KINT64: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
454 return lj_ir_k64(J, (IROp)ir->o, ir_k64(ir)->u64); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
455 case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir)); /* Continuation. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
456 default: lj_assertJ(0, "bad IR constant op %d", ir->o); return TREF_NIL; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
457 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
458 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
459 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
460 /* De-duplicate parent reference. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
461 static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
462 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
463 MSize j; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
464 for (j = 0; j < nmax; j++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
465 if (snap_ref(map[j]) == ref) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
466 return J->slot[snap_slot(map[j])] & ~(SNAP_KEYINDEX|SNAP_CONT|SNAP_FRAME); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
467 return 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
468 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
469 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
470 /* Emit parent reference with de-duplication. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
471 static TRef snap_pref(jit_State *J, GCtrace *T, SnapEntry *map, MSize nmax, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
472 BloomFilter seen, IRRef ref) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
473 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
474 IRIns *ir = &T->ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
475 TRef tr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
476 if (irref_isk(ref)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
477 tr = snap_replay_const(J, ir); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
478 else if (!regsp_used(ir->prev)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
479 tr = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
480 else if (!bloomtest(seen, ref) || (tr = snap_dedup(J, map, nmax, ref)) == 0) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
481 tr = emitir(IRT(IR_PVAL, irt_type(ir->t)), ref - REF_BIAS, 0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
482 return tr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
483 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
484 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
485 /* Check whether a sunk store corresponds to an allocation. Slow path. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
486 static int snap_sunk_store2(GCtrace *T, IRIns *ira, IRIns *irs) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
487 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
488 if (irs->o == IR_ASTORE || irs->o == IR_HSTORE || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
489 irs->o == IR_FSTORE || irs->o == IR_XSTORE) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
490 IRIns *irk = &T->ir[irs->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
491 if (irk->o == IR_AREF || irk->o == IR_HREFK) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
492 irk = &T->ir[irk->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
493 return (&T->ir[irk->op1] == ira); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
494 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
495 return 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
496 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
497 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
498 /* Check whether a sunk store corresponds to an allocation. Fast path. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
499 static LJ_AINLINE int snap_sunk_store(GCtrace *T, IRIns *ira, IRIns *irs) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
500 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
501 if (irs->s != 255) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
502 return (ira + irs->s == irs); /* Fast check. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
503 return snap_sunk_store2(T, ira, irs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
504 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
505 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
506 /* Replay snapshot state to setup side trace. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
507 void lj_snap_replay(jit_State *J, GCtrace *T) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
508 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
509 SnapShot *snap = &T->snap[J->exitno]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
510 SnapEntry *map = &T->snapmap[snap->mapofs]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
511 MSize n, nent = snap->nent; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
512 BloomFilter seen = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
513 int pass23 = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
514 J->framedepth = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
515 /* Emit IR for slots inherited from parent snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
516 for (n = 0; n < nent; n++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
517 SnapEntry sn = map[n]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
518 BCReg s = snap_slot(sn); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
519 IRRef ref = snap_ref(sn); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
520 IRIns *ir = &T->ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
521 TRef tr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
522 /* The bloom filter avoids O(nent^2) overhead for de-duping slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
523 if (bloomtest(seen, ref) && (tr = snap_dedup(J, map, n, ref)) != 0) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
524 goto setslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
525 bloomset(seen, ref); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
526 if (irref_isk(ref)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
527 /* See special treatment of LJ_FR2 slot 1 in snapshot_slots() above. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
528 if (LJ_FR2 && (sn == SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL))) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
529 tr = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
530 else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
531 tr = snap_replay_const(J, ir); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
532 } else if (!regsp_used(ir->prev)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
533 pass23 = 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
534 lj_assertJ(s != 0, "unused slot 0 in snapshot"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
535 tr = s; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
536 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
537 IRType t = irt_type(ir->t); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
538 uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
539 if (LJ_SOFTFP32 && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
540 if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
541 if ((sn & SNAP_KEYINDEX)) mode |= IRSLOAD_KEYINDEX; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
542 tr = emitir_raw(IRT(IR_SLOAD, t), s, mode); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
543 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
544 setslot: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
545 /* Same as TREF_* flags. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
546 J->slot[s] = tr | (sn&(SNAP_KEYINDEX|SNAP_CONT|SNAP_FRAME)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
547 J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && (s != LJ_FR2)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
548 if ((sn & SNAP_FRAME)) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
549 J->baseslot = s+1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
550 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
551 if (pass23) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
552 IRIns *irlast = &T->ir[snap->ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
553 pass23 = 0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
554 /* Emit dependent PVALs. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
555 for (n = 0; n < nent; n++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
556 SnapEntry sn = map[n]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
557 IRRef refp = snap_ref(sn); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
558 IRIns *ir = &T->ir[refp]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
559 if (regsp_reg(ir->r) == RID_SUNK) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
560 if (J->slot[snap_slot(sn)] != snap_slot(sn)) continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
561 pass23 = 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
562 lj_assertJ(ir->o == IR_TNEW || ir->o == IR_TDUP || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
563 ir->o == IR_CNEW || ir->o == IR_CNEWI, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
564 "sunk parent IR %04d has bad op %d", refp - REF_BIAS, ir->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
565 if (ir->op1 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
566 if (ir->op2 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
567 if (LJ_HASFFI && ir->o == IR_CNEWI) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
568 if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
569 snap_pref(J, T, map, nent, seen, (ir+1)->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
570 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
571 IRIns *irs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
572 for (irs = ir+1; irs < irlast; irs++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
573 if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
574 if (snap_pref(J, T, map, nent, seen, irs->op2) == 0) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
575 snap_pref(J, T, map, nent, seen, T->ir[irs->op2].op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
576 else if ((LJ_SOFTFP32 || (LJ_32 && LJ_HASFFI)) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
577 irs+1 < irlast && (irs+1)->o == IR_HIOP) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
578 snap_pref(J, T, map, nent, seen, (irs+1)->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
579 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
580 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
581 } else if (!irref_isk(refp) && !regsp_used(ir->prev)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
582 lj_assertJ(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
583 "sunk parent IR %04d has bad op %d", refp - REF_BIAS, ir->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
584 J->slot[snap_slot(sn)] = snap_pref(J, T, map, nent, seen, ir->op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
585 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
586 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
587 /* Replay sunk instructions. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
588 for (n = 0; pass23 && n < nent; n++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
589 SnapEntry sn = map[n]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
590 IRRef refp = snap_ref(sn); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
591 IRIns *ir = &T->ir[refp]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
592 if (regsp_reg(ir->r) == RID_SUNK) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
593 TRef op1, op2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
594 if (J->slot[snap_slot(sn)] != snap_slot(sn)) { /* De-dup allocs. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
595 J->slot[snap_slot(sn)] = J->slot[J->slot[snap_slot(sn)]]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
596 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
597 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
598 op1 = ir->op1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
599 if (op1 >= T->nk) op1 = snap_pref(J, T, map, nent, seen, op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
600 op2 = ir->op2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
601 if (op2 >= T->nk) op2 = snap_pref(J, T, map, nent, seen, op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
602 if (LJ_HASFFI && ir->o == IR_CNEWI) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
603 if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
604 lj_needsplit(J); /* Emit joining HIOP. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
605 op2 = emitir_raw(IRT(IR_HIOP, IRT_I64), op2, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
606 snap_pref(J, T, map, nent, seen, (ir+1)->op2)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
607 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
608 J->slot[snap_slot(sn)] = emitir(ir->ot & ~(IRT_MARK|IRT_ISPHI), op1, op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
609 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
610 IRIns *irs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
611 TRef tr = emitir(ir->ot, op1, op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
612 J->slot[snap_slot(sn)] = tr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
613 for (irs = ir+1; irs < irlast; irs++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
614 if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
615 IRIns *irr = &T->ir[irs->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
616 TRef val, key = irr->op2, tmp = tr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
617 if (irr->o != IR_FREF) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
618 IRIns *irk = &T->ir[key]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
619 if (irr->o == IR_HREFK) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
620 key = lj_ir_kslot(J, snap_replay_const(J, &T->ir[irk->op1]), |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
621 irk->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
622 else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
623 key = snap_replay_const(J, irk); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
624 if (irr->o == IR_HREFK || irr->o == IR_AREF) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
625 IRIns *irf = &T->ir[irr->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
626 tmp = emitir(irf->ot, tmp, irf->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
627 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
628 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
629 tmp = emitir(irr->ot, tmp, key); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
630 val = snap_pref(J, T, map, nent, seen, irs->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
631 if (val == 0) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
632 IRIns *irc = &T->ir[irs->op2]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
633 lj_assertJ(irc->o == IR_CONV && irc->op2 == IRCONV_NUM_INT, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
634 "sunk store for parent IR %04d with bad op %d", |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
635 refp - REF_BIAS, irc->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
636 val = snap_pref(J, T, map, nent, seen, irc->op1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
637 val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
638 } else if ((LJ_SOFTFP32 || (LJ_32 && LJ_HASFFI)) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
639 irs+1 < irlast && (irs+1)->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
640 IRType t = IRT_I64; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
641 if (LJ_SOFTFP32 && irt_type((irs+1)->t) == IRT_SOFTFP) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
642 t = IRT_NUM; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
643 lj_needsplit(J); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
644 if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
645 uint64_t k = (uint32_t)T->ir[irs->op2].i + |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
646 ((uint64_t)T->ir[(irs+1)->op2].i << 32); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
647 val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM, k); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
648 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
649 val = emitir_raw(IRT(IR_HIOP, t), val, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
650 snap_pref(J, T, map, nent, seen, (irs+1)->op2)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
651 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
652 tmp = emitir(IRT(irs->o, t), tmp, val); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
653 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
654 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
655 tmp = emitir(irs->ot, tmp, val); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
656 } else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
657 emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
658 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
659 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
660 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
661 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
662 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
663 J->base = J->slot + J->baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
664 J->maxslot = snap->nslots - J->baseslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
665 lj_snap_add(J); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
666 if (pass23) /* Need explicit GC step _after_ initial snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
667 emitir_raw(IRTG(IR_GCSTEP, IRT_NIL), 0, 0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
668 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
669 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
670 /* -- Snapshot restore ---------------------------------------------------- */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
671 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
672 static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
673 SnapNo snapno, BloomFilter rfilt, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
674 IRIns *ir, TValue *o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
675 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
676 /* Restore a value from the trace exit state. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
677 static void snap_restoreval(jit_State *J, GCtrace *T, ExitState *ex, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
678 SnapNo snapno, BloomFilter rfilt, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
679 IRRef ref, TValue *o) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
680 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
681 IRIns *ir = &T->ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
682 IRType1 t = ir->t; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
683 RegSP rs = ir->prev; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
684 if (irref_isk(ref)) { /* Restore constant slot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
685 if (ir->o == IR_KPTR) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
686 o->u64 = (uint64_t)(uintptr_t)ir_kptr(ir); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
687 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
688 lj_assertJ(!(ir->o == IR_KKPTR || ir->o == IR_KNULL), |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
689 "restore of const from IR %04d with bad op %d", |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
690 ref - REF_BIAS, ir->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
691 lj_ir_kvalue(J->L, o, ir); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
692 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
693 return; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
694 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
695 if (LJ_UNLIKELY(bloomtest(rfilt, ref))) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
696 rs = snap_renameref(T, snapno, ref, rs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
697 if (ra_hasspill(regsp_spill(rs))) { /* Restore from spill slot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
698 int32_t *sps = &ex->spill[regsp_spill(rs)]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
699 if (irt_isinteger(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
700 setintV(o, *sps); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
701 #if !LJ_SOFTFP32 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
702 } else if (irt_isnum(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
703 o->u64 = *(uint64_t *)sps; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
704 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
705 #if LJ_64 && !LJ_GC64 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
706 } else if (irt_islightud(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
707 /* 64 bit lightuserdata which may escape already has the tag bits. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
708 o->u64 = *(uint64_t *)sps; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
709 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
710 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
711 lj_assertJ(!irt_ispri(t), "PRI ref with spill slot"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
712 setgcV(J->L, o, (GCobj *)(uintptr_t)*(GCSize *)sps, irt_toitype(t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
713 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
714 } else { /* Restore from register. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
715 Reg r = regsp_reg(rs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
716 if (ra_noreg(r)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
717 lj_assertJ(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
718 "restore from IR %04d has no reg", ref - REF_BIAS); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
719 snap_restoreval(J, T, ex, snapno, rfilt, ir->op1, o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
720 if (LJ_DUALNUM) setnumV(o, (lua_Number)intV(o)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
721 return; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
722 } else if (irt_isinteger(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
723 setintV(o, (int32_t)ex->gpr[r-RID_MIN_GPR]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
724 #if !LJ_SOFTFP |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
725 } else if (irt_isnum(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
726 setnumV(o, ex->fpr[r-RID_MIN_FPR]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
727 #elif LJ_64 /* && LJ_SOFTFP */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
728 } else if (irt_isnum(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
729 o->u64 = ex->gpr[r-RID_MIN_GPR]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
730 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
731 #if LJ_64 && !LJ_GC64 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
732 } else if (irt_is64(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
733 /* 64 bit values that already have the tag bits. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
734 o->u64 = ex->gpr[r-RID_MIN_GPR]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
735 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
736 } else if (irt_ispri(t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
737 setpriV(o, irt_toitype(t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
738 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
739 setgcV(J->L, o, (GCobj *)ex->gpr[r-RID_MIN_GPR], irt_toitype(t)); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
740 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
741 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
742 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
743 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
744 #if LJ_HASFFI |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
745 /* Restore raw data from the trace exit state. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
746 static void snap_restoredata(jit_State *J, GCtrace *T, ExitState *ex, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
747 SnapNo snapno, BloomFilter rfilt, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
748 IRRef ref, void *dst, CTSize sz) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
749 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
750 IRIns *ir = &T->ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
751 RegSP rs = ir->prev; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
752 int32_t *src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
753 uint64_t tmp; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
754 UNUSED(J); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
755 if (irref_isk(ref)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
756 if (ir_isk64(ir)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
757 src = (int32_t *)&ir[1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
758 } else if (sz == 8) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
759 tmp = (uint64_t)(uint32_t)ir->i; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
760 src = (int32_t *)&tmp; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
761 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
762 src = &ir->i; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
763 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
764 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
765 if (LJ_UNLIKELY(bloomtest(rfilt, ref))) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
766 rs = snap_renameref(T, snapno, ref, rs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
767 if (ra_hasspill(regsp_spill(rs))) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
768 src = &ex->spill[regsp_spill(rs)]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
769 if (sz == 8 && !irt_is64(ir->t)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
770 tmp = (uint64_t)(uint32_t)*src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
771 src = (int32_t *)&tmp; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
772 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
773 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
774 Reg r = regsp_reg(rs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
775 if (ra_noreg(r)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
776 /* Note: this assumes CNEWI is never used for SOFTFP split numbers. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
777 lj_assertJ(sz == 8 && ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
778 "restore from IR %04d has no reg", ref - REF_BIAS); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
779 snap_restoredata(J, T, ex, snapno, rfilt, ir->op1, dst, 4); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
780 *(lua_Number *)dst = (lua_Number)*(int32_t *)dst; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
781 return; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
782 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
783 src = (int32_t *)&ex->gpr[r-RID_MIN_GPR]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
784 #if !LJ_SOFTFP |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
785 if (r >= RID_MAX_GPR) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
786 src = (int32_t *)&ex->fpr[r-RID_MIN_FPR]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
787 #if LJ_TARGET_PPC |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
788 if (sz == 4) { /* PPC FPRs are always doubles. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
789 *(float *)dst = (float)*(double *)src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
790 return; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
791 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
792 #else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
793 if (LJ_BE && sz == 4) src++; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
794 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
795 } else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
796 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
797 if (LJ_64 && LJ_BE && sz == 4) src++; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
798 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
799 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
800 lj_assertJ(sz == 1 || sz == 2 || sz == 4 || sz == 8, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
801 "restore from IR %04d with bad size %d", ref - REF_BIAS, sz); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
802 if (sz == 4) *(int32_t *)dst = *src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
803 else if (sz == 8) *(int64_t *)dst = *(int64_t *)src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
804 else if (sz == 1) *(int8_t *)dst = (int8_t)*src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
805 else *(int16_t *)dst = (int16_t)*src; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
806 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
807 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
808 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
809 /* Unsink allocation from the trace exit state. Unsink sunk stores. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
810 static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
811 SnapNo snapno, BloomFilter rfilt, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
812 IRIns *ir, TValue *o) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
813 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
814 lj_assertJ(ir->o == IR_TNEW || ir->o == IR_TDUP || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
815 ir->o == IR_CNEW || ir->o == IR_CNEWI, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
816 "sunk allocation with bad op %d", ir->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
817 #if LJ_HASFFI |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
818 if (ir->o == IR_CNEW || ir->o == IR_CNEWI) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
819 CTState *cts = ctype_cts(J->L); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
820 CTypeID id = (CTypeID)T->ir[ir->op1].i; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
821 CTSize sz; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
822 CTInfo info = lj_ctype_info(cts, id, &sz); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
823 GCcdata *cd = lj_cdata_newx(cts, id, sz, info); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
824 setcdataV(J->L, o, cd); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
825 if (ir->o == IR_CNEWI) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
826 uint8_t *p = (uint8_t *)cdataptr(cd); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
827 lj_assertJ(sz == 4 || sz == 8, "sunk cdata with bad size %d", sz); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
828 if (LJ_32 && sz == 8 && ir+1 < T->ir + T->nins && (ir+1)->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
829 snap_restoredata(J, T, ex, snapno, rfilt, (ir+1)->op2, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
830 LJ_LE ? p+4 : p, 4); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
831 if (LJ_BE) p += 4; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
832 sz = 4; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
833 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
834 snap_restoredata(J, T, ex, snapno, rfilt, ir->op2, p, sz); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
835 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
836 IRIns *irs, *irlast = &T->ir[T->snap[snapno].ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
837 for (irs = ir+1; irs < irlast; irs++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
838 if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
839 IRIns *iro = &T->ir[T->ir[irs->op1].op2]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
840 uint8_t *p = (uint8_t *)cd; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
841 CTSize szs; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
842 lj_assertJ(irs->o == IR_XSTORE, "sunk store with bad op %d", irs->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
843 lj_assertJ(T->ir[irs->op1].o == IR_ADD, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
844 "sunk store with bad add op %d", T->ir[irs->op1].o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
845 lj_assertJ(iro->o == IR_KINT || iro->o == IR_KINT64, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
846 "sunk store with bad const offset op %d", iro->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
847 if (irt_is64(irs->t)) szs = 8; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
848 else if (irt_isi8(irs->t) || irt_isu8(irs->t)) szs = 1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
849 else if (irt_isi16(irs->t) || irt_isu16(irs->t)) szs = 2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
850 else szs = 4; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
851 if (LJ_64 && iro->o == IR_KINT64) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
852 p += (int64_t)ir_k64(iro)->u64; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
853 else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
854 p += iro->i; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
855 lj_assertJ(p >= (uint8_t *)cdataptr(cd) && |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
856 p + szs <= (uint8_t *)cdataptr(cd) + sz, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
857 "sunk store with offset out of range"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
858 if (LJ_32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
859 lj_assertJ(szs == 4, "sunk store with bad size %d", szs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
860 snap_restoredata(J, T, ex, snapno, rfilt, (irs+1)->op2, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
861 LJ_LE ? p+4 : p, 4); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
862 if (LJ_BE) p += 4; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
863 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
864 snap_restoredata(J, T, ex, snapno, rfilt, irs->op2, p, szs); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
865 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
866 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
867 } else |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
868 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
869 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
870 IRIns *irs, *irlast; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
871 GCtab *t = ir->o == IR_TNEW ? lj_tab_new(J->L, ir->op1, ir->op2) : |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
872 lj_tab_dup(J->L, ir_ktab(&T->ir[ir->op1])); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
873 settabV(J->L, o, t); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
874 irlast = &T->ir[T->snap[snapno].ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
875 for (irs = ir+1; irs < irlast; irs++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
876 if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
877 IRIns *irk = &T->ir[irs->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
878 TValue tmp, *val; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
879 lj_assertJ(irs->o == IR_ASTORE || irs->o == IR_HSTORE || |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
880 irs->o == IR_FSTORE, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
881 "sunk store with bad op %d", irs->o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
882 if (irk->o == IR_FREF) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
883 lj_assertJ(irk->op2 == IRFL_TAB_META, |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
884 "sunk store with bad field %d", irk->op2); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
885 snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
886 /* NOBARRIER: The table is new (marked white). */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
887 setgcref(t->metatable, obj2gco(tabV(&tmp))); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
888 } else { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
889 irk = &T->ir[irk->op2]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
890 if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
891 lj_ir_kvalue(J->L, &tmp, irk); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
892 val = lj_tab_set(J->L, t, &tmp); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
893 /* NOBARRIER: The table is new (marked white). */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
894 snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, val); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
895 if (LJ_SOFTFP32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
896 snap_restoreval(J, T, ex, snapno, rfilt, (irs+1)->op2, &tmp); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
897 val->u32.hi = tmp.u32.lo; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
898 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
899 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
900 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
901 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
902 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
903 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
904 /* Restore interpreter state from exit state with the help of a snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
905 const BCIns *lj_snap_restore(jit_State *J, void *exptr) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
906 { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
907 ExitState *ex = (ExitState *)exptr; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
908 SnapNo snapno = J->exitno; /* For now, snapno == exitno. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
909 GCtrace *T = traceref(J, J->parent); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
910 SnapShot *snap = &T->snap[snapno]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
911 MSize n, nent = snap->nent; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
912 SnapEntry *map = &T->snapmap[snap->mapofs]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
913 #if !LJ_FR2 || defined(LUA_USE_ASSERT) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
914 SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1-LJ_FR2]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
915 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
916 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
917 ptrdiff_t ftsz0; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
918 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
919 TValue *frame; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
920 BloomFilter rfilt = snap_renamefilter(T, snapno); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
921 const BCIns *pc = snap_pc(&map[nent]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
922 lua_State *L = J->L; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
923 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
924 /* Set interpreter PC to the next PC to get correct error messages. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
925 setcframe_pc(cframe_raw(L->cframe), pc+1); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
926 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
927 /* Make sure the stack is big enough for the slots from the snapshot. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
928 if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
929 L->top = curr_topL(L); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
930 lj_state_growstack(L, snap->topslot - curr_proto(L)->framesize); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
931 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
932 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
933 /* Fill stack slots with data from the registers and spill slots. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
934 frame = L->base-1-LJ_FR2; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
935 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
936 ftsz0 = frame_ftsz(frame); /* Preserve link to previous frame in slot #0. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
937 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
938 for (n = 0; n < nent; n++) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
939 SnapEntry sn = map[n]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
940 if (!(sn & SNAP_NORESTORE)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
941 TValue *o = &frame[snap_slot(sn)]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
942 IRRef ref = snap_ref(sn); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
943 IRIns *ir = &T->ir[ref]; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
944 if (ir->r == RID_SUNK) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
945 MSize j; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
946 for (j = 0; j < n; j++) |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
947 if (snap_ref(map[j]) == ref) { /* De-duplicate sunk allocations. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
948 copyTV(L, o, &frame[snap_slot(map[j])]); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
949 goto dupslot; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
950 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
951 snap_unsink(J, T, ex, snapno, rfilt, ir, o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
952 dupslot: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
953 continue; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
954 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
955 snap_restoreval(J, T, ex, snapno, rfilt, ref, o); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
956 if (LJ_SOFTFP32 && (sn & SNAP_SOFTFPNUM) && tvisint(o)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
957 TValue tmp; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
958 snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
959 o->u32.hi = tmp.u32.lo; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
960 #if !LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
961 } else if ((sn & (SNAP_CONT|SNAP_FRAME))) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
962 /* Overwrite tag with frame link. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
963 setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
964 L->base = o+1; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
965 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
966 } else if ((sn & SNAP_KEYINDEX)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
967 /* A IRT_INT key index slot is restored as a number. Undo this. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
968 o->u32.lo = (uint32_t)(LJ_DUALNUM ? intV(o) : lj_num2int(numV(o))); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
969 o->u32.hi = LJ_KEYINDEX; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
970 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
971 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
972 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
973 #if LJ_FR2 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
974 L->base += (map[nent+LJ_BE] & 0xff); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
975 #endif |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
976 lj_assertJ(map + nent == flinks, "inconsistent frames in snapshot"); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
977 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
978 /* Compute current stack top. */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
979 switch (bc_op(*pc)) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
980 default: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
981 if (bc_op(*pc) < BC_FUNCF) { |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
982 L->top = curr_topL(L); |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
983 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
984 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
985 /* fallthrough */ |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
986 case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM: |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
987 L->top = frame + snap->nslots; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
988 break; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
989 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
990 return pc; |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
991 } |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
992 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
993 #undef emitir_raw |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
994 #undef emitir |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
995 |
|
94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
996 #endif |