diff options
author | Mike Pall <mike> | 2010-02-10 21:45:57 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-10 21:45:57 +0100 |
commit | bb0384c36628c94a2232955e0cac5cf45679039f (patch) | |
tree | d13f58838029a49fc1f7117ff9a78defc4c7fd0e /src | |
parent | d5a46621f9d1299a7e5c06c59dfc02d61dc04a79 (diff) | |
download | luajit-bb0384c36628c94a2232955e0cac5cf45679039f.tar.gz luajit-bb0384c36628c94a2232955e0cac5cf45679039f.tar.bz2 luajit-bb0384c36628c94a2232955e0cac5cf45679039f.zip |
Replace GCproto reference with bytecode PC in GCfuncL.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_x86.dasc | 51 | ||||
-rw-r--r-- | src/lj_func.c | 6 | ||||
-rw-r--r-- | src/lj_obj.h | 5 |
3 files changed, 32 insertions, 30 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index e09c37e9..90d80dbf 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -305,6 +305,8 @@ | |||
305 | #define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) | 305 | #define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) |
306 | #define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) | 306 | #define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) |
307 | | | 307 | | |
308 | #define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) | ||
309 | | | ||
308 | |// Decrement hashed hotcount and trigger trace recorder if zero. | 310 | |// Decrement hashed hotcount and trigger trace recorder if zero. |
309 | |.macro hotloop, reg | 311 | |.macro hotloop, reg |
310 | | mov reg, PC | 312 | | mov reg, PC |
@@ -406,11 +408,10 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
406 | | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return | 408 | | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return |
407 | | // DISPATCH initialized | 409 | | // DISPATCH initialized |
408 | | mov BASE, RA | 410 | | mov BASE, RA |
409 | | mov PROTO:RB, LFUNC:RB->pt | ||
410 | | mov [BASE-4], PC // Store caller PC. | 411 | | mov [BASE-4], PC // Store caller PC. |
411 | | movzx RA, byte PROTO:RB->framesize | 412 | | mov PC, LFUNC:RB->pc |
412 | | lea PC, [PROTO:RB+sizeof(GCproto)] | 413 | | movzx RA, byte [PC+PC2PROTO(framesize)] |
413 | | mov KBASE, PROTO:RB->k | 414 | | mov KBASE, [PC+PC2PROTO(k)] |
414 | | mov L:RB, SAVE_L | 415 | | mov L:RB, SAVE_L |
415 | | lea RA, [BASE+RA*8] // Top of frame. | 416 | | lea RA, [BASE+RA*8] // Top of frame. |
416 | | lea RC, [BASE+NARGS:RC*8-4] // Points to tag of 1st free slot. | 417 | | lea RC, [BASE+NARGS:RC*8-4] // Points to tag of 1st free slot. |
@@ -437,16 +438,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
437 | | lea PC, [NARGS:RC*8+FRAME_VARG] | 438 | | lea PC, [NARGS:RC*8+FRAME_VARG] |
438 | | lea BASE, [RA+PC-FRAME_VARG] | 439 | | lea BASE, [RA+PC-FRAME_VARG] |
439 | | mov [BASE-8], LFUNC:RB // Store copy of LFUNC. | 440 | | mov [BASE-8], LFUNC:RB // Store copy of LFUNC. |
440 | | mov PROTO:RB, LFUNC:RB->pt | ||
441 | | mov [BASE-4], PC // Store delta + FRAME_VARG. | 441 | | mov [BASE-4], PC // Store delta + FRAME_VARG. |
442 | | movzx PC, byte PROTO:RB->framesize | 442 | | mov PC, LFUNC:RB->pc |
443 | | lea KBASE, [BASE+PC*8] | 443 | | movzx RB, byte [PC+PC2PROTO(framesize)] |
444 | | mov L:PC, SAVE_L | 444 | | lea KBASE, [BASE+RB*8] |
445 | | mov L:RB, SAVE_L | ||
445 | | lea RC, [BASE+4] | 446 | | lea RC, [BASE+4] |
446 | | cmp KBASE, L:PC->maxstack | 447 | | cmp KBASE, L:RB->maxstack |
447 | | ja ->gate_lv_growstack // Need to grow stack. | 448 | | ja ->gate_lv_growstack // Need to grow stack. |
448 | | movzx PC, byte PROTO:RB->numparams | 449 | | movzx RB, byte [PC+PC2PROTO(numparams)] |
449 | | test PC, PC | 450 | | test RB, RB |
450 | | jz >2 | 451 | | jz >2 |
451 | |1: // Copy fixarg slots up. | 452 | |1: // Copy fixarg slots up. |
452 | | add RA, 8 | 453 | | add RA, 8 |
@@ -458,12 +459,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
458 | | mov [RC], KBASE | 459 | | mov [RC], KBASE |
459 | | add RC, 8 | 460 | | add RC, 8 |
460 | | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). | 461 | | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). |
461 | | sub PC, 1 | 462 | | sub RB, 1 |
462 | | jnz <1 | 463 | | jnz <1 |
463 | |2: | 464 | |2: |
464 | | movzx RA, byte PROTO:RB->framesize | 465 | | movzx RA, byte [PC+PC2PROTO(framesize)] |
465 | | lea PC, [PROTO:RB+sizeof(GCproto)] | 466 | | mov KBASE, [PC+PC2PROTO(k)] |
466 | | mov KBASE, PROTO:RB->k | ||
467 | | lea RA, [BASE+RA*8] | 467 | | lea RA, [BASE+RA*8] |
468 | | jmp <9 | 468 | | jmp <9 |
469 | | | 469 | | |
@@ -663,6 +663,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
663 | | jmp >1 | 663 | | jmp >1 |
664 | | | 664 | | |
665 | |->gate_lv_growstack: // Grow stack for vararg Lua function. | 665 | |->gate_lv_growstack: // Grow stack for vararg Lua function. |
666 | //XXX | ||
666 | | sub RC, 8 | 667 | | sub RC, 8 |
667 | | mov BASE, RA | 668 | | mov BASE, RA |
668 | | mov RA, KBASE | 669 | | mov RA, KBASE |
@@ -863,8 +864,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
863 | | mov RA, dword [RB-16] | 864 | | mov RA, dword [RB-16] |
864 | |.endif | 865 | |.endif |
865 | | mov LFUNC:KBASE, [BASE-8] | 866 | | mov LFUNC:KBASE, [BASE-8] |
866 | | mov PROTO:KBASE, LFUNC:KBASE->pt | 867 | | mov KBASE, LFUNC:KBASE->pc |
867 | | mov KBASE, PROTO:KBASE->k | 868 | | mov KBASE, [KBASE+PC2PROTO(k)] |
868 | | // BASE = base, RC = result, RB = meta base | 869 | | // BASE = base, RC = result, RB = meta base |
869 | | jmp RAa // Jump to continuation. | 870 | | jmp RAa // Jump to continuation. |
870 | | | 871 | | |
@@ -2719,8 +2720,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
2719 | |->vm_exit_interp: | 2720 | |->vm_exit_interp: |
2720 | #if LJ_HASJIT | 2721 | #if LJ_HASJIT |
2721 | | mov LFUNC:KBASE, [BASE-8] | 2722 | | mov LFUNC:KBASE, [BASE-8] |
2722 | | mov PROTO:KBASE, LFUNC:KBASE->pt | 2723 | | mov KBASE, LFUNC:KBASE->pc |
2723 | | mov KBASE, PROTO:KBASE->k | 2724 | | mov KBASE, [KBASE+PC2PROTO(k)] |
2724 | | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 | 2725 | | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 |
2725 | | set_vmstate INTERP | 2726 | | set_vmstate INTERP |
2726 | | ins_next | 2727 | | ins_next |
@@ -4454,8 +4455,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | |||
4454 | | not RDa | 4455 | | not RDa |
4455 | | lea BASE, [BASE+RD*8] | 4456 | | lea BASE, [BASE+RD*8] |
4456 | | mov LFUNC:KBASE, [BASE-8] | 4457 | | mov LFUNC:KBASE, [BASE-8] |
4457 | | mov PROTO:KBASE, LFUNC:KBASE->pt | 4458 | | mov KBASE, LFUNC:KBASE->pc |
4458 | | mov KBASE, PROTO:KBASE->k | 4459 | | mov KBASE, [KBASE+PC2PROTO(k)] |
4459 | | jmp <4 | 4460 | | jmp <4 |
4460 | | | 4461 | | |
4461 | |7: // Tailcall from a vararg function. | 4462 | |7: // Tailcall from a vararg function. |
@@ -4492,8 +4493,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | |||
4492 | | ins_AB_ // RA = base, RB = nresults+1, (RC = 1) | 4493 | | ins_AB_ // RA = base, RB = nresults+1, (RC = 1) |
4493 | | mov LFUNC:RC, [BASE-8] | 4494 | | mov LFUNC:RC, [BASE-8] |
4494 | | lea RA, [BASE+RA*8] | 4495 | | lea RA, [BASE+RA*8] |
4495 | | mov PROTO:RC, LFUNC:RC->pt | 4496 | | mov RC, LFUNC:RC->pc |
4496 | | movzx RC, byte PROTO:RC->numparams | 4497 | | movzx RC, byte [RC+PC2PROTO(numparams)] |
4497 | | mov TMP1, KBASE // Need one more free register. | 4498 | | mov TMP1, KBASE // Need one more free register. |
4498 | | lea KBASE, [BASE+RC*8+(8+FRAME_VARG)] | 4499 | | lea KBASE, [BASE+RC*8+(8+FRAME_VARG)] |
4499 | | sub KBASE, [BASE-4] | 4500 | | sub KBASE, [BASE-4] |
@@ -4618,8 +4619,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | |||
4618 | | not RAa // Note: ~RA = -(RA+1) | 4619 | | not RAa // Note: ~RA = -(RA+1) |
4619 | | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 | 4620 | | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 |
4620 | | mov LFUNC:KBASE, [BASE-8] | 4621 | | mov LFUNC:KBASE, [BASE-8] |
4621 | | mov PROTO:KBASE, LFUNC:KBASE->pt | 4622 | | mov KBASE, LFUNC:KBASE->pc |
4622 | | mov KBASE, PROTO:KBASE->k | 4623 | | mov KBASE, [KBASE+PC2PROTO(k)] |
4623 | | ins_next | 4624 | | ins_next |
4624 | | | 4625 | | |
4625 | |6: // Fill up results with nil. | 4626 | |6: // Fill up results with nil. |
diff --git a/src/lj_func.c b/src/lj_func.c index adc8c039..7d130176 100644 --- a/src/lj_func.c +++ b/src/lj_func.c | |||
@@ -112,8 +112,8 @@ GCfunc *lj_func_newL(lua_State *L, GCproto *pt, GCtab *env) | |||
112 | fn->l.gct = ~LJ_TFUNC; | 112 | fn->l.gct = ~LJ_TFUNC; |
113 | fn->l.ffid = FF_LUA; | 113 | fn->l.ffid = FF_LUA; |
114 | fn->l.nupvalues = cast_byte(pt->sizeuv); | 114 | fn->l.nupvalues = cast_byte(pt->sizeuv); |
115 | /* NOBARRIER: The GCfunc is new (marked white). */ | 115 | /* NOBARRIER: Really a setgcref. But the GCfunc is new (marked white). */ |
116 | setgcref(fn->l.pt, obj2gco(pt)); | 116 | setmref(fn->l.pc, proto_bc(pt)); |
117 | setgcref(fn->l.env, obj2gco(env)); | 117 | setgcref(fn->l.env, obj2gco(env)); |
118 | fn->l.gate = (pt->flags & PROTO_IS_VARARG) ? lj_gate_lv : lj_gate_lf; | 118 | fn->l.gate = (pt->flags & PROTO_IS_VARARG) ? lj_gate_lv : lj_gate_lf; |
119 | return fn; | 119 | return fn; |
@@ -137,7 +137,7 @@ GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent) | |||
137 | GCupval *uv; | 137 | GCupval *uv; |
138 | if ((v & 0x8000)) { | 138 | if ((v & 0x8000)) { |
139 | uv = func_finduv(L, base + (v & 0xff)); | 139 | uv = func_finduv(L, base + (v & 0xff)); |
140 | uv->dhash = (uint32_t)(uintptr_t)gcref(parent->pt) ^ (v << 24); | 140 | uv->dhash = (uint32_t)(uintptr_t)mref(parent->pc, char) ^ (v << 24); |
141 | } else { | 141 | } else { |
142 | uv = &gcref(puv[v])->uv; | 142 | uv = &gcref(puv[v])->uv; |
143 | } | 143 | } |
diff --git a/src/lj_obj.h b/src/lj_obj.h index f243a75b..a6637954 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
@@ -429,7 +429,7 @@ typedef struct GCfuncC { | |||
429 | 429 | ||
430 | typedef struct GCfuncL { | 430 | typedef struct GCfuncL { |
431 | GCfuncHeader; | 431 | GCfuncHeader; |
432 | GCRef pt; /* Link to prototype this function is based on. */ | 432 | MRef pc; /* Start PC (and GCproto reference). */ |
433 | GCRef uvptr[1]; /* Array of _pointers_ to upvalue objects (GCupval). */ | 433 | GCRef uvptr[1]; /* Array of _pointers_ to upvalue objects (GCupval). */ |
434 | } GCfuncL; | 434 | } GCfuncL; |
435 | 435 | ||
@@ -443,7 +443,8 @@ typedef union GCfunc { | |||
443 | #define isluafunc(fn) ((fn)->c.ffid == FF_LUA) | 443 | #define isluafunc(fn) ((fn)->c.ffid == FF_LUA) |
444 | #define iscfunc(fn) ((fn)->c.ffid == FF_C) | 444 | #define iscfunc(fn) ((fn)->c.ffid == FF_C) |
445 | #define isffunc(fn) ((fn)->c.ffid > FF_C) | 445 | #define isffunc(fn) ((fn)->c.ffid > FF_C) |
446 | #define funcproto(fn) check_exp(isluafunc(fn), &gcref((fn)->l.pt)->pt) | 446 | #define funcproto(fn) \ |
447 | check_exp(isluafunc(fn), (GCproto *)(mref((fn)->l.pc, char)-sizeof(GCproto))) | ||
447 | #define sizeCfunc(n) (sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n)) | 448 | #define sizeCfunc(n) (sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n)) |
448 | #define sizeLfunc(n) (sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n)) | 449 | #define sizeLfunc(n) (sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n)) |
449 | 450 | ||