From dd1d2fb3d6973a3d3a4e6e9de81b15204ada238e Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 5 Jul 2010 23:02:55 +0000 Subject: [PATCH] 2010-07-06 Zoltan Varga * mini-amd64.h mini-amd64.c tramp-amd64.c aot-compiler.c: Change the IMT register to be the same as the RGCTX register, the two can't be used together on the same call. svn path=/trunk/mono/; revision=159928 --- mono/mini/ChangeLog | 6 ++++++ mono/mini/aot-compiler.c | 18 +++++++++------- mono/mini/mini-amd64.c | 45 ++++++++++++++-------------------------- mono/mini/mini-amd64.h | 4 ++-- mono/mini/tramp-amd64.c | 7 +++---- 5 files changed, 37 insertions(+), 43 deletions(-) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index cdd9125d38e..33052388892 100755 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,9 @@ +2010-07-06 Zoltan Varga + + * mini-amd64.h mini-amd64.c tramp-amd64.c aot-compiler.c: Change the IMT + register to be the same as the RGCTX register, the two can't be used together on + the same call. + 2010-07-05 Miguel de Icaza * driver.c (mono_main), main.c: Add support for MONO_VM_CONFIG diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 45229e96a49..9814b972d6d 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -1060,36 +1060,38 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) /* FIXME: Optimize this, i.e. use binary search etc. */ /* Maybe move the body into a separate function (slower, but much smaller) */ - /* R10 is a free register */ + /* R11 is a free register */ labels [0] = code; - amd64_alu_membase_imm (code, X86_CMP, AMD64_R10, 0, 0); + amd64_alu_membase_imm (code, X86_CMP, AMD64_R11, 0, 0); labels [1] = code; amd64_branch8 (code, X86_CC_Z, FALSE, 0); /* Check key */ - amd64_alu_membase_reg (code, X86_CMP, AMD64_R10, 0, MONO_ARCH_IMT_REG); + amd64_alu_membase_reg (code, X86_CMP, AMD64_R11, 0, MONO_ARCH_IMT_REG); labels [2] = code; amd64_branch8 (code, X86_CC_Z, FALSE, 0); /* Loop footer */ - amd64_alu_reg_imm (code, X86_ADD, AMD64_R10, 2 * sizeof (gpointer)); + amd64_alu_reg_imm (code, X86_ADD, AMD64_R11, 2 * sizeof (gpointer)); amd64_jump_code (code, labels [0]); /* Match */ mono_amd64_patch (labels [2], code); - amd64_mov_reg_membase (code, AMD64_R10, AMD64_R10, sizeof (gpointer), 8); - amd64_jump_membase (code, AMD64_R10, 0); + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, sizeof (gpointer), 8); + amd64_jump_membase (code, AMD64_R11, 0); /* No match */ /* FIXME: */ mono_amd64_patch (labels [1], code); x86_breakpoint (code); - /* mov (%rip), %r10 */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_RIP, 12345678, 8); + + /* mov (%rip), %r11 */ emit_byte (acfg, '\x4d'); emit_byte (acfg, '\x8b'); - emit_byte (acfg, '\x15'); + emit_byte (acfg, '\x1d'); emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); emit_bytes (acfg, buf, code - buf); diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index d063e7958b6..d51446cdd83 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -32,12 +32,6 @@ #include "cpu-amd64.h" #include "debugger-agent.h" -/* - * Can't define this in mini-amd64.h cause that would turn on the generic code in - * method-to-ir.c. - */ -#define MONO_ARCH_IMT_REG AMD64_R11 - static gint lmf_tls_offset = -1; static gint lmf_addr_tls_offset = -1; static gint appdomain_tls_offset = -1; @@ -7217,25 +7211,24 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI if (amd64_is_imm32 (item->key)) amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key); else { - amd64_mov_reg_imm (code, AMD64_R10, item->key); - amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R10); + amd64_mov_reg_imm (code, AMD64_R11, item->key); + amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R11); } } item->jmp_code = code; amd64_branch8 (code, X86_CC_NE, 0, FALSE); - /* See the comment below about R10 */ if (item->has_target_code) { - amd64_mov_reg_imm (code, AMD64_R10, item->value.target_code); - amd64_jump_reg (code, AMD64_R10); + amd64_mov_reg_imm (code, AMD64_R11, item->value.target_code); + amd64_jump_reg (code, AMD64_R11); } else { - amd64_mov_reg_imm (code, AMD64_R10, & (vtable->vtable [item->value.vtable_slot])); - amd64_jump_membase (code, AMD64_R10, 0); + amd64_mov_reg_imm (code, AMD64_R11, & (vtable->vtable [item->value.vtable_slot])); + amd64_jump_membase (code, AMD64_R11, 0); } if (fail_case) { amd64_patch (item->jmp_code, code); - amd64_mov_reg_imm (code, AMD64_R10, fail_tramp); - amd64_jump_reg (code, AMD64_R10); + amd64_mov_reg_imm (code, AMD64_R11, fail_tramp); + amd64_jump_reg (code, AMD64_R11); item->jmp_code = NULL; } } else { @@ -7244,33 +7237,27 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI if (amd64_is_imm32 (item->key)) amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key); else { - amd64_mov_reg_imm (code, AMD64_R10, item->key); - amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R10); + amd64_mov_reg_imm (code, AMD64_R11, item->key); + amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R11); } item->jmp_code = code; amd64_branch8 (code, X86_CC_NE, 0, FALSE); - /* See the comment below about R10 */ - amd64_mov_reg_imm (code, AMD64_R10, & (vtable->vtable [item->value.vtable_slot])); - amd64_jump_membase (code, AMD64_R10, 0); + amd64_mov_reg_imm (code, AMD64_R11, & (vtable->vtable [item->value.vtable_slot])); + amd64_jump_membase (code, AMD64_R11, 0); amd64_patch (item->jmp_code, code); amd64_breakpoint (code); item->jmp_code = NULL; #else - /* We're using R10 here because R11 - needs to be preserved. R10 needs - to be preserved for calls which - require a runtime generic context, - but interface calls don't. */ - amd64_mov_reg_imm (code, AMD64_R10, & (vtable->vtable [item->value.vtable_slot])); - amd64_jump_membase (code, AMD64_R10, 0); + amd64_mov_reg_imm (code, AMD64_R11, & (vtable->vtable [item->value.vtable_slot])); + amd64_jump_membase (code, AMD64_R11, 0); #endif } } else { if (amd64_is_imm32 (item->key)) amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key); else { - amd64_mov_reg_imm (code, AMD64_R10, item->key); - amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R10); + amd64_mov_reg_imm (code, AMD64_R11, item->key); + amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, AMD64_R11); } item->jmp_code = code; if (x86_is_imm8 (imt_branch_distance (imt_entries, i, item->check_target_idx))) diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h index c48e015ec17..9c32c312564 100644 --- a/mono/mini/mini-amd64.h +++ b/mono/mini/mini-amd64.h @@ -343,10 +343,10 @@ typedef struct { #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES_2 1 #define MONO_ARCH_HAVE_IMT 1 #define MONO_ARCH_HAVE_TLS_GET 1 -#define MONO_ARCH_IMT_REG AMD64_R11 +#define MONO_ARCH_IMT_REG AMD64_R10 #define MONO_ARCH_VTABLE_REG MONO_AMD64_ARG_REG1 /* - * We use r10 for the rgctx register rather than r11 because r11 is + * We use r10 for the imt/rgctx register rather than r11 because r11 is * used by the trampoline as a scratch register and hence might be * clobbered across method call boundaries. */ diff --git a/mono/mini/tramp-amd64.c b/mono/mini/tramp-amd64.c index 69a4d9915f3..d4a239f8519 100644 --- a/mono/mini/tramp-amd64.c +++ b/mono/mini/tramp-amd64.c @@ -519,11 +519,10 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf */ amd64_mov_membase_reg (code, AMD64_RBP, rax_offset, AMD64_RAX, 8); - /* Restore argument registers, r10 (needed to pass rgctx to - static shared generic methods), r11 (imt register for - interface calls), and rax (needed for direct calls to C vararg functions). */ + /* Restore argument registers, r10 (imt method/rgxtx) + and rax (needed for direct calls to C vararg functions). */ for (i = 0; i < AMD64_NREG; ++i) - if (AMD64_IS_ARGUMENT_REG (i) || i == AMD64_R10 || i == AMD64_R11 || i == AMD64_RAX) + if (AMD64_IS_ARGUMENT_REG (i) || i == AMD64_R10 || i == AMD64_RAX) amd64_mov_reg_membase (code, i, AMD64_RBP, saved_regs_offset + (i * 8), 8); for (i = 0; i < 8; ++i) -- 2.25.1