2008-08-19 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 18 Aug 2008 23:04:02 +0000 (23:04 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 18 Aug 2008 23:04:02 +0000 (23:04 -0000)
* tramp-amd64.c mini-amd64.h: Change the VTABLE_REG to RDI since RAX is
clobbered by the trampoline code.

svn path=/trunk/mono/; revision=110880

mono/mini/ChangeLog
mono/mini/mini-amd64.h
mono/mini/tramp-amd64.c

index b5e046074f449677ad2b21826c0d3493ec7cff48..45013d9a573496f69d01d077416d085a958aa6fa 100644 (file)
@@ -1,5 +1,8 @@
 2008-08-19  Zoltan Varga  <vargaz@gmail.com>
 
+       * tramp-amd64.c mini-amd64.h: Change the VTABLE_REG to RDI since RAX is
+       clobbered by the trampoline code.
+
        * tramp-amd64.c mini-amd64.h: Change the VTABLE_REG to RAX since that is
        not clobbered by the indirect calling code.
 
index e8273af6f56e3038992c408f8d157a7f9dc26e54..311251c3f282bffe33b8c26263ccf027c72a4fbc 100644 (file)
@@ -259,6 +259,14 @@ typedef struct {
 
 #endif /* __FreeBSD__ */
 
+#ifdef PLATFORM_WIN32
+#define MONO_AMD64_ARG_REG1 AMD64_RCX
+#define MONO_AMD64_ARG_REG2 AMD64_RDX
+#else
+#define MONO_AMD64_ARG_REG1 AMD64_RDI
+#define MONO_AMD64_ARG_REG2 AMD64_RSI
+#endif
+
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
 #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS
 
@@ -280,7 +288,7 @@ typedef struct {
 #define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_HAVE_TLS_GET 1
 #define MONO_ARCH_IMT_REG AMD64_R11
-#define MONO_ARCH_VTABLE_REG AMD64_RAX
+#define MONO_ARCH_VTABLE_REG MONO_AMD64_ARG_REG1
 /*
  * We use r10 for the rgctx register rather than r11 because r11 is
  * used by the trampoline as a scratch register and hence might be
index 33a72e26b07273acec3f866e49bda6a1fc5b982c..5aacd30c5f2a93695e5a183ca866986fc53783f1 100644 (file)
@@ -247,7 +247,7 @@ mono_arch_create_trampoline_code_full (MonoTrampolineType tramp_type, guint32 *c
                if (byte_offset < 0)
                        mono_marshal_find_bitfield_offset (MonoVTable, initialized, &byte_offset, &bitmask);
 
-               amd64_test_membase_imm_size (code, MONO_ARCH_VTABLE_REG, byte_offset, bitmask, 1);
+               amd64_test_membase_imm_size (code, MONO_AMD64_ARG_REG1, byte_offset, bitmask, 1);
                jump = code;
                amd64_branch8 (code, X86_CC_Z, -1, 1);
 
@@ -359,7 +359,7 @@ mono_arch_create_trampoline_code_full (MonoTrampolineType tramp_type, guint32 *c
                }
                amd64_mov_membase_reg (code, AMD64_RBP, arg_offset, AMD64_R11, 8);
        } else {
-               amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, saved_regs_offset + (MONO_ARCH_VTABLE_REG * 8), 8);
+               amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, saved_regs_offset + (MONO_AMD64_ARG_REG1 * 8), 8);
                amd64_mov_membase_reg (code, AMD64_RBP, arg_offset, AMD64_R11, 8);
        }
 
@@ -640,9 +640,9 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot)
        g_free (rgctx_null_jumps);
 
        /* move the rgctx pointer to the VTABLE register */
-       amd64_mov_reg_reg (buf, MONO_ARCH_VTABLE_REG, AMD64_ARG_REG1, 8);
-       /* store the slot in RCX */
-       amd64_mov_reg_imm (buf, AMD64_RCX, slot);
+       amd64_mov_reg_reg (buf, MONO_AMD64_ARG_REG1, AMD64_ARG_REG1, 8);
+       /* store the slot in the second argument register */
+       amd64_mov_reg_imm (buf, MONO_AMD64_ARG_REG2, slot);
        /* jump to the actual trampoline */
        amd64_call_code (buf, tramp);
 
@@ -656,7 +656,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot)
 guint32
 mono_arch_get_rgctx_lazy_fetch_offset (gpointer *regs)
 {
-       return (guint32)(gulong)(regs [AMD64_RCX]);
+       return (guint32)(gulong)(regs [MONO_AMD64_ARG_REG2]);
 }
 
 void