ソースを参照

Change some misuses of esp in x64 interpreter.

Mike Pall 16 年 前
コミット
85d32aeb36
2 ファイル変更36 行追加36 行削除
  1. 34 34
      src/buildvm_x86.dasc
  2. 2 2
      src/buildvm_x86.h

+ 34 - 34
src/buildvm_x86.dasc

@@ -150,28 +150,28 @@
 |  pop rbx; pop rsi; pop rdi; pop rbp
 |.endmacro
 |
-|.define UNUSED1,	aword [esp+dword*26]
-|.define SAVE_PC,	dword [esp+dword*25]
-|.define SAVE_L,	dword [esp+dword*24]
-|.define SAVE_ERRF,	dword [esp+dword*23]
-|.define SAVE_NRES,	dword [esp+dword*22]
-|.define TMP2,		dword [esp+dword*21]
-|.define TMP1,		dword [esp+dword*20]
+|.define UNUSED1,	aword [rsp+dword*26]
+|.define SAVE_PC,	dword [rsp+dword*25]
+|.define SAVE_L,	dword [rsp+dword*24]
+|.define SAVE_ERRF,	dword [rsp+dword*23]
+|.define SAVE_NRES,	dword [rsp+dword*22]
+|.define TMP2,		dword [rsp+dword*21]
+|.define TMP1,		dword [rsp+dword*20]
 |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter
-|.define SAVE_RET,	aword [esp+aword*9]	//<-- rsp entering interpreter.
-|.define SAVE_R4,	aword [esp+aword*8]
-|.define SAVE_R3,	aword [esp+aword*7]
-|.define SAVE_R2,	aword [esp+aword*6]
-|.define SAVE_R1,	aword [esp+aword*5]	//<-- rsp after register saves.
-|.define SAVE_CFRAME,	aword [esp+aword*4]
-|.define CSAVE_4,	aword [esp+aword*3]
-|.define CSAVE_3,	aword [esp+aword*2]
-|.define CSAVE_2,	aword [esp+aword*1]
-|.define CSAVE_1,	aword [esp]		//<-- rsp while in interpreter.
+|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.
+|.define SAVE_R4,	aword [rsp+aword*8]
+|.define SAVE_R3,	aword [rsp+aword*7]
+|.define SAVE_R2,	aword [rsp+aword*6]
+|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.
+|.define SAVE_CFRAME,	aword [rsp+aword*4]
+|.define CSAVE_4,	aword [rsp+aword*3]
+|.define CSAVE_3,	aword [rsp+aword*2]
+|.define CSAVE_2,	aword [rsp+aword*1]
+|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.
 |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee
 |
 |// TMPQ overlaps TMP1/TMP2. NRESULTS overlaps TMP2 (and TMPQ).
-|.define TMPQ,		qword [esp]
+|.define TMPQ,		qword [rsp]
 |.define NRESULTS,	TMP2
 |
 |//-----------------------------------------------------------------------
@@ -188,24 +188,24 @@
 |.endmacro
 |
 |//----- 16 byte aligned,
-|.define SAVE_RET,	aword [esp+aword*9]	//<-- rsp entering interpreter.
-|.define SAVE_R4,	aword [esp+aword*8]
-|.define SAVE_R3,	aword [esp+aword*7]
-|.define SAVE_R2,	aword [esp+aword*6]
-|.define SAVE_R1,	aword [esp+aword*5]	//<-- rsp after register saves.
-|.define SAVE_CFRAME,	aword [esp+aword*4]
-|.define UNUSED1,	aword [esp+aword*3]
+|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.
+|.define SAVE_R4,	aword [rsp+aword*8]
+|.define SAVE_R3,	aword [rsp+aword*7]
+|.define SAVE_R2,	aword [rsp+aword*6]
+|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.
+|.define SAVE_CFRAME,	aword [rsp+aword*4]
+|.define UNUSED1,	aword [rsp+aword*3]
 |//----- ^^^ awords above, vvv dwords below
-|.define SAVE_PC,	dword [esp+dword*5]
-|.define SAVE_L,	dword [esp+dword*4]
-|.define SAVE_ERRF,	dword [esp+dword*3]
-|.define SAVE_NRES,	dword [esp+dword*2]
-|.define TMP2,		dword [esp+dword*1]
-|.define TMP1,		dword [esp]		//<-- rsp while in interpreter.
+|.define SAVE_PC,	dword [rsp+dword*5]
+|.define SAVE_L,	dword [rsp+dword*4]
+|.define SAVE_ERRF,	dword [rsp+dword*3]
+|.define SAVE_NRES,	dword [rsp+dword*2]
+|.define TMP2,		dword [rsp+dword*1]
+|.define TMP1,		dword [rsp]		//<-- rsp while in interpreter.
 |//----- 16 byte aligned
 |
 |// TMPQ overlaps TMP1/TMP2. NRESULTS overlaps TMP2 (and TMPQ).
-|.define TMPQ,		qword [esp]
+|.define TMPQ,		qword [rsp]
 |.define NRESULTS,	TMP2
 |
 |.endif
@@ -667,7 +667,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov)
   |2:  // Entry point for vm_cpcall below (RA = base, RB = L, PC = ftype).
   |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.
   |  mov SAVE_CFRAME, KBASE		// Caveat: overlaps INARG_BASE!
-  |  mov SAVE_PC, esp			// Any value outside of bytecode is ok.
+  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.
   |  mov L:RB->cframe, esp
   |
   |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.
@@ -697,7 +697,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov)
   |  mov RC, INARG_CP_UD
   |  mov RA, INARG_CP_FUNC
   |  mov BASE, INARG_CP_CALL
-  |  mov SAVE_PC, esp			// Any value outside of bytecode is ok.
+  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.
   |
   |  // Caveat: INARG_P_* and INARG_CP_* overlap!
   |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).

+ 2 - 2
src/buildvm_x86.h

@@ -57,11 +57,11 @@ static const unsigned char build_actionlist[12304] = {
   209,139,114,252,252,137,68,36,20,252,247,198,237,15,132,244,17,252,233,244,
   18,248,27,85,87,86,83,131,252,236,28,190,237,252,233,244,247,248,28,255,85,
   87,86,83,131,252,236,28,190,237,248,1,139,108,36,48,139,76,36,52,248,2,139,
-  189,233,137,124,36,52,137,100,36,24,137,165,233,139,157,233,129,195,239,248,
+  189,233,137,124,36,52,137,108,36,24,137,165,233,139,157,233,129,195,239,248,
   3,199,131,233,237,139,149,233,1,206,41,214,139,133,233,41,200,193,232,3,131,
   192,1,139,105,252,248,129,121,253,252,252,239,15,133,244,29,252,255,165,233,
   248,30,85,87,86,83,131,252,236,28,139,108,36,48,139,68,36,60,139,76,36,56,
-  139,84,36,52,137,100,36,24,139,189,233,43,189,233,199,68,36,60,0,0,0,0,137,
+  139,84,36,52,137,108,36,24,139,189,233,43,189,233,199,68,36,60,0,0,0,0,137,
   124,36,56,137,68,36,8,137,76,36,4,137,44,36,139,189,233,137,124,36,52,137,
   165,233,252,255,210,133,192,15,132,244,21,255,137,193,190,237,252,233,244,
   2,248,25,1,209,131,230,252,248,137,213,41,252,242,199,68,193,252,252,237,