diff options
| author | Mike Pall <mike> | 2010-02-24 01:18:49 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-02-24 01:18:49 +0100 |
| commit | 857f538eacdb2c45913cd8c32f3c0d8a6f273f50 (patch) | |
| tree | c67a6d4c8ae617dad442daba6bdad4263c605058 | |
| parent | 8ae2f9feaaed874e01a87df6646242b80acceabb (diff) | |
| download | luajit-857f538eacdb2c45913cd8c32f3c0d8a6f273f50.tar.gz luajit-857f538eacdb2c45913cd8c32f3c0d8a6f273f50.tar.bz2 luajit-857f538eacdb2c45913cd8c32f3c0d8a6f273f50.zip | |
Fix exit state for 64 bit mode.
| -rw-r--r-- | lib/dump.lua | 29 | ||||
| -rw-r--r-- | src/lj_target_x86.h | 2 | ||||
| -rw-r--r-- | src/lj_trace.c | 2 |
3 files changed, 24 insertions, 9 deletions
diff --git a/lib/dump.lua b/lib/dump.lua index ccd43d72..39de30d0 100644 --- a/lib/dump.lua +++ b/lib/dump.lua | |||
| @@ -306,10 +306,18 @@ local function dump_snap(tr) | |||
| 306 | end | 306 | end |
| 307 | 307 | ||
| 308 | -- NYI: should really get the register map from the disassembler. | 308 | -- NYI: should really get the register map from the disassembler. |
| 309 | local reg_map = { | 309 | local reg_map = ({ |
| 310 | [0] = "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", | 310 | x86 = { |
| 311 | "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", | 311 | [0] = "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", |
| 312 | } | 312 | "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", |
| 313 | }, | ||
| 314 | x64 = { | ||
| 315 | [0] = "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", | ||
| 316 | "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", | ||
| 317 | "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", | ||
| 318 | "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", | ||
| 319 | } | ||
| 320 | })[jit.arch] | ||
| 313 | 321 | ||
| 314 | -- Return a register name or stack slot for a rid/sp location. | 322 | -- Return a register name or stack slot for a rid/sp location. |
| 315 | local function ridsp_name(ridsp) | 323 | local function ridsp_name(ridsp) |
| @@ -508,9 +516,16 @@ local function dump_texit(tr, ex, ngpr, nfpr, ...) | |||
| 508 | out:write("---- TRACE ", tr, " exit ", ex, "\n") | 516 | out:write("---- TRACE ", tr, " exit ", ex, "\n") |
| 509 | if dumpmode.X then | 517 | if dumpmode.X then |
| 510 | local regs = {...} | 518 | local regs = {...} |
| 511 | for i=1,ngpr do | 519 | if jit.arch == "x64" then |
| 512 | out:write(format(" %08x", regs[i])) | 520 | for i=1,ngpr do |
| 513 | if i % 8 == 0 then out:write("\n") end | 521 | out:write(format(" %016x", regs[i])) |
| 522 | if i % 4 == 0 then out:write("\n") end | ||
| 523 | end | ||
| 524 | else | ||
| 525 | for i=1,ngpr do | ||
| 526 | out:write(format(" %08x", regs[i])) | ||
| 527 | if i % 8 == 0 then out:write("\n") end | ||
| 528 | end | ||
| 514 | end | 529 | end |
| 515 | for i=1,nfpr do | 530 | for i=1,nfpr do |
| 516 | out:write(format(" %+17.14g", regs[ngpr+i])) | 531 | out:write(format(" %+17.14g", regs[ngpr+i])) |
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h index 2ccea549..cb1892d5 100644 --- a/src/lj_target_x86.h +++ b/src/lj_target_x86.h | |||
| @@ -116,7 +116,7 @@ enum { | |||
| 116 | /* This definition must match with the *.dasc file(s). */ | 116 | /* This definition must match with the *.dasc file(s). */ |
| 117 | typedef struct { | 117 | typedef struct { |
| 118 | lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ | 118 | lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ |
| 119 | int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ | 119 | intptr_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ |
| 120 | int32_t spill[256]; /* Spill slots. */ | 120 | int32_t spill[256]; /* Spill slots. */ |
| 121 | } ExitState; | 121 | } ExitState; |
| 122 | 122 | ||
diff --git a/src/lj_trace.c b/src/lj_trace.c index 6f63c945..d55d3a85 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -636,7 +636,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
| 636 | setintV(L->top++, RID_NUM_GPR); | 636 | setintV(L->top++, RID_NUM_GPR); |
| 637 | setintV(L->top++, RID_NUM_FPR); | 637 | setintV(L->top++, RID_NUM_FPR); |
| 638 | for (i = 0; i < RID_NUM_GPR; i++) | 638 | for (i = 0; i < RID_NUM_GPR; i++) |
| 639 | setintV(L->top++, ex->gpr[i]); | 639 | setnumV(L->top++, cast_num(ex->gpr[i])); |
| 640 | for (i = 0; i < RID_NUM_FPR; i++) { | 640 | for (i = 0; i < RID_NUM_FPR; i++) { |
| 641 | setnumV(L->top, ex->fpr[i]); | 641 | setnumV(L->top, ex->fpr[i]); |
| 642 | if (LJ_UNLIKELY(tvisnan(L->top))) | 642 | if (LJ_UNLIKELY(tvisnan(L->top))) |
