From 5d0b65519cca129913e598045d94bef0387164db Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 1 Mar 2010 06:46:45 +0100 Subject: Enable tracing of recursion. Now compiles tail-recursion, up-recursion and down-recursion. Benchmarks vs. Lua: fib 20x, ack 23x, binary-trees 4.7x. --- src/buildvm_x64.h | 38 ++++++++++++++++--------------- src/buildvm_x64win.h | 40 ++++++++++++++++---------------- src/buildvm_x86.dasc | 3 +-- src/buildvm_x86.h | 64 +++++++++++++++++++++++++++------------------------- 4 files changed, 75 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h index c394624d..57508e89 100644 --- a/src/buildvm_x64.h +++ b/src/buildvm_x64.h @@ -12,7 +12,7 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[14028] = { +static const unsigned char build_actionlist[14049] = { 254,1,248,10,252,247,195,237,15,132,244,11,131,227,252,248,41,218,72,141, 76,25,252,248,139,90,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36,4, 252,247,195,237,15,132,244,13,248,14,252,247,195,237,15,132,244,10,65,199, @@ -676,8 +676,9 @@ static const unsigned char build_actionlist[14028] = { 233,139,4,193,72,139,128,233,139,108,36,24,65,137,150,233,65,137,174,233, 76,137,36,36,76,137,108,36,8,72,131,252,236,16,252,255,224,255,141,156,253, 131,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252, - 238,255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244,23, - 15,182,139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233, + 238,255,137,221,209,252,237,129,229,239,102,65,131,172,253,46,233,1,15,132, + 244,142,255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,15,135,244, + 23,15,182,139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,254,252,233, 245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252,233, 244,2,255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,252,252,68, 137,120,252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,22,137,209, @@ -2150,6 +2151,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FUNCF: #if LJ_HASJIT + dasm_put(Dst, 13731, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif case BC_FUNCV: /* NYI: compiled vararg functions. */ break; @@ -2159,13 +2161,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IFUNCF: - dasm_put(Dst, 13731, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + dasm_put(Dst, 13752, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); if (op == BC_JFUNCF) { - dasm_put(Dst, 13762, BC_JLOOP); + dasm_put(Dst, 13783, BC_JLOOP); } else { dasm_put(Dst, 9531); } - dasm_put(Dst, 13771, LJ_TNIL); + dasm_put(Dst, 13792, LJ_TNIL); break; case BC_JFUNCV: @@ -2176,30 +2178,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; /* NYI: compiled vararg functions. */ case BC_IFUNCV: - dasm_put(Dst, 13793, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + dasm_put(Dst, 13814, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); if (op == BC_JFUNCV) { - dasm_put(Dst, 13762, BC_JLOOP); + dasm_put(Dst, 13783, BC_JLOOP); } else { - dasm_put(Dst, 13890, -4+PC2PROTO(k)); + dasm_put(Dst, 13911, -4+PC2PROTO(k)); } - dasm_put(Dst, 13915, LJ_TNIL); + dasm_put(Dst, 13936, LJ_TNIL); break; case BC_FUNCC: case BC_FUNCCW: - dasm_put(Dst, 13937, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + dasm_put(Dst, 13958, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); if (op == BC_FUNCC) { - dasm_put(Dst, 13967); + dasm_put(Dst, 13988); } else { - dasm_put(Dst, 13971); + dasm_put(Dst, 13992); } - dasm_put(Dst, 13979, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 14000, DISPATCH_GL(vmstate), ~LJ_VMST_C); if (op == BC_FUNCC) { - dasm_put(Dst, 13989); + dasm_put(Dst, 14010); } else { - dasm_put(Dst, 13994, DISPATCH_GL(wrapf)); + dasm_put(Dst, 14015, DISPATCH_GL(wrapf)); } - dasm_put(Dst, 14000, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 14021, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2227,7 +2229,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 14026); + dasm_put(Dst, 14047); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h index de65f400..97ab59d9 100644 --- a/src/buildvm_x64win.h +++ b/src/buildvm_x64win.h @@ -12,7 +12,7 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[13976] = { +static const unsigned char build_actionlist[13997] = { 254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,72, 141,76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68, 36,84,252,247,198,237,15,132,244,13,248,14,252,247,198,237,15,132,244,10, @@ -676,9 +676,10 @@ static const unsigned char build_actionlist[13976] = { 233,102,68,15,127,129,233,102,68,15,127,137,233,102,68,15,127,145,233,102, 68,15,127,153,233,102,68,15,127,161,233,102,68,15,127,169,233,102,68,15,127, 177,233,102,68,15,127,185,233,252,255,224,255,141,180,253,134,233,139,6,15, - 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,139,190,233, - 139,108,36,96,141,12,202,59,141,233,15,135,244,23,15,182,142,233,57,200,15, - 134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194, + 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,137,252,245, + 209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,142,255,139,190, + 233,139,108,36,96,141,12,202,59,141,233,15,135,244,23,15,182,142,233,57,200, + 15,134,244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194, 252,252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,197,237, 141,4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,36,96,141, 12,200,59,141,233,15,135,244,22,137,209,137,194,15,182,174,233,133,252,237, @@ -2150,6 +2151,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FUNCF: #if LJ_HASJIT + dasm_put(Dst, 13692, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif case BC_FUNCV: /* NYI: compiled vararg functions. */ break; @@ -2159,13 +2161,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IFUNCF: - dasm_put(Dst, 13692, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + dasm_put(Dst, 13713, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); if (op == BC_JFUNCF) { - dasm_put(Dst, 13722, BC_JLOOP); + dasm_put(Dst, 13743, BC_JLOOP); } else { dasm_put(Dst, 9539); } - dasm_put(Dst, 13731, LJ_TNIL); + dasm_put(Dst, 13752, LJ_TNIL); break; case BC_JFUNCV: @@ -2176,30 +2178,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; /* NYI: compiled vararg functions. */ case BC_IFUNCV: - dasm_put(Dst, 13753, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + dasm_put(Dst, 13774, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); if (op == BC_JFUNCV) { - dasm_put(Dst, 13722, BC_JLOOP); + dasm_put(Dst, 13743, BC_JLOOP); } else { - dasm_put(Dst, 13844, -4+PC2PROTO(k)); + dasm_put(Dst, 13865, -4+PC2PROTO(k)); } - dasm_put(Dst, 13867, LJ_TNIL); + dasm_put(Dst, 13888, LJ_TNIL); break; case BC_FUNCC: case BC_FUNCCW: - dasm_put(Dst, 13889, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + dasm_put(Dst, 13910, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); if (op == BC_FUNCC) { - dasm_put(Dst, 13919); + dasm_put(Dst, 13940); } else { - dasm_put(Dst, 13923); + dasm_put(Dst, 13944); } - dasm_put(Dst, 13931, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 13952, DISPATCH_GL(vmstate), ~LJ_VMST_C); if (op == BC_FUNCC) { - dasm_put(Dst, 13940); + dasm_put(Dst, 13961); } else { - dasm_put(Dst, 13944, DISPATCH_GL(wrapf)); + dasm_put(Dst, 13965, DISPATCH_GL(wrapf)); } - dasm_put(Dst, 13949, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 13970, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2227,7 +2229,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 13974); + dasm_put(Dst, 13995); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index a3e65174..fbeb4f29 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc @@ -4790,8 +4790,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FUNCF: #if LJ_HASJIT - | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. - | // hotcall RB + | hotcall RB #endif case BC_FUNCV: /* NYI: compiled vararg functions. */ | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op. diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h index 5bf7e60c..8a421ec8 100644 --- a/src/buildvm_x86.h +++ b/src/buildvm_x86.h @@ -12,7 +12,7 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[15177] = { +static const unsigned char build_actionlist[15198] = { 254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,141, 76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36, 20,252,247,198,237,15,132,244,13,248,14,252,247,198,237,15,132,244,10,199, @@ -730,21 +730,22 @@ static const unsigned char build_actionlist[15177] = { 255,141,180,253,134,233,139,1,137,105,252,252,137,65,252,248,255,139,139, 233,139,4,129,139,128,233,139,108,36,48,137,147,233,137,171,233,252,255,224, 255,141,180,253,134,233,139,6,15,182,204,15,182,232,131,198,4,193,232,16, - 252,255,36,171,255,139,190,233,139,108,36,48,141,12,202,59,141,233,15,135, - 244,23,15,182,142,233,57,200,15,134,244,249,248,2,255,15,183,70,252,254,252, - 233,245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252, - 233,244,2,255,141,44,197,237,141,4,194,139,122,252,248,137,104,252,252,137, - 120,252,248,139,108,36,48,141,12,200,59,141,233,15,135,244,22,137,209,137, - 194,15,182,174,233,133,252,237,15,132,244,248,248,1,131,193,8,57,209,15,131, - 244,249,139,121,252,248,137,56,139,121,252,252,137,120,4,131,192,8,199,65, - 252,252,237,131,252,237,1,15,133,244,1,248,2,255,139,190,233,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,248,3,199,64,4,237, - 131,192,8,131,252,237,1,15,133,244,3,252,233,244,2,255,139,106,252,248,139, - 189,233,139,108,36,48,141,68,194,252,248,137,149,233,141,136,233,59,141,233, - 137,133,233,255,137,44,36,255,137,124,36,4,137,44,36,255,15,135,244,21,199, - 131,233,237,255,252,255,215,255,252,255,147,233,255,199,131,233,237,139,149, - 233,141,12,194,252,247,217,3,141,233,139,114,252,252,252,233,244,12,255,254, - 0 + 252,255,36,171,255,137,252,245,209,252,237,129,229,239,102,131,172,253,43, + 233,1,15,132,244,142,255,139,190,233,139,108,36,48,141,12,202,59,141,233, + 15,135,244,23,15,182,142,233,57,200,15,134,244,249,248,2,255,15,183,70,252, + 254,252,233,245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134, + 244,3,252,233,244,2,255,141,44,197,237,141,4,194,139,122,252,248,137,104, + 252,252,137,120,252,248,139,108,36,48,141,12,200,59,141,233,15,135,244,22, + 137,209,137,194,15,182,174,233,133,252,237,15,132,244,248,248,1,131,193,8, + 57,209,15,131,244,249,139,121,252,248,137,56,139,121,252,252,137,120,4,131, + 192,8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,139,190,233, + 139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,248,3, + 199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,233,244,2,255,139,106, + 252,248,139,189,233,139,108,36,48,141,68,194,252,248,137,149,233,141,136, + 233,59,141,233,137,133,233,255,137,44,36,255,137,124,36,4,137,44,36,255,15, + 135,244,21,199,131,233,237,255,252,255,215,255,252,255,147,233,255,199,131, + 233,237,139,149,233,141,12,194,252,247,217,3,141,233,139,114,252,252,252, + 233,244,12,255,254,0 }; enum { @@ -2278,6 +2279,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FUNCF: #if LJ_HASJIT + dasm_put(Dst, 14895, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif case BC_FUNCV: /* NYI: compiled vararg functions. */ break; @@ -2287,13 +2289,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IFUNCF: - dasm_put(Dst, 14895, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + dasm_put(Dst, 14916, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); if (op == BC_JFUNCF) { - dasm_put(Dst, 14925, BC_JLOOP); + dasm_put(Dst, 14946, BC_JLOOP); } else { dasm_put(Dst, 10814); } - dasm_put(Dst, 14934, LJ_TNIL); + dasm_put(Dst, 14955, LJ_TNIL); break; case BC_JFUNCV: @@ -2304,30 +2306,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; /* NYI: compiled vararg functions. */ case BC_IFUNCV: - dasm_put(Dst, 14956, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + dasm_put(Dst, 14977, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); if (op == BC_JFUNCV) { - dasm_put(Dst, 14925, BC_JLOOP); + dasm_put(Dst, 14946, BC_JLOOP); } else { - dasm_put(Dst, 15047, -4+PC2PROTO(k)); + dasm_put(Dst, 15068, -4+PC2PROTO(k)); } - dasm_put(Dst, 15069, LJ_TNIL); + dasm_put(Dst, 15090, LJ_TNIL); break; case BC_FUNCC: case BC_FUNCCW: - dasm_put(Dst, 15091, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + dasm_put(Dst, 15112, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); if (op == BC_FUNCC) { - dasm_put(Dst, 15120); + dasm_put(Dst, 15141); } else { - dasm_put(Dst, 15124); + dasm_put(Dst, 15145); } - dasm_put(Dst, 15132, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 15153, DISPATCH_GL(vmstate), ~LJ_VMST_C); if (op == BC_FUNCC) { - dasm_put(Dst, 15141); + dasm_put(Dst, 15162); } else { - dasm_put(Dst, 15145, DISPATCH_GL(wrapf)); + dasm_put(Dst, 15166, DISPATCH_GL(wrapf)); } - dasm_put(Dst, 15150, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 15171, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2355,7 +2357,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 15175); + dasm_put(Dst, 15196); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); -- cgit v1.2.3-55-g6feb