[Mono-devel-list] Trampolines...
Willibald Krenn
Willibald.Krenn at gmx.at
Thu Feb 24 10:43:13 EST 2005
Willibald Krenn schrieb:
I'll try to come up with a patch
> shortly, so we can discuss this in more detail.
Tried it now in my private tree (see changes for AMD64 below). Seems to
work as expected: My test application needed 15 of a total of 22
possible unbox trampolines: For the memory consumption on AMD64 this
means a saving of about 272 bytes due to the changes.
Honestly I don't know how AOT compilation is influenced by the patch..
But probably it breakes something.
Willi
diff -rN -u miniamd64-old/Compiler/OriginalMono/Header/mini-amd64.h
miniamd64-new/Compiler/OriginalMono/Header/mini-amd64.h
--- miniamd64-old/Compiler/OriginalMono/Header/mini-amd64.h 2005-02-23
18:14:21.000000000 +0100
+++ miniamd64-new/Compiler/OriginalMono/Header/mini-amd64.h 2005-02-24
15:11:11.000000000 +0100
@@ -232,6 +232,11 @@
void
mono_amd64_tramp_init (void);
+#define mono_arch_needs_unbox_tramp(method) (((method)->flags &
METHOD_ATTRIBUTE_VIRTUAL) && (method)->klass->valuetype)
+#define mono_arch_unbox_tramp_size 4
+guint8* mono_arch_get_unbox_tramp (guint8* code);
+
+
/* FIXME: */
//#define MONO_ARCH_BIGMUL_INTRINS 1
diff -rN -u miniamd64-old/Compiler/OriginalMono/Source/mini-amd64.c
miniamd64-new/Compiler/OriginalMono/Source/mini-amd64.c
--- miniamd64-old/Compiler/OriginalMono/Source/mini-amd64.c 2005-02-23
18:14:20.000000000 +0100
+++ miniamd64-new/Compiler/OriginalMono/Source/mini-amd64.c 2005-02-24
16:01:14.000000000 +0100
@@ -4827,6 +4827,24 @@
}
}
+#define mono_arch_needs_unbox_tramp(method) (((method)->flags &
METHOD_ATTRIBUTE_VIRTUAL) && (method)->klass->valuetype)
+#define mono_arch_unbox_tramp_size 4
+guint8*
+mono_arch_get_unbox_tramp (guint8* code)
+{
+ guint8 *result = code;
+ result = (guint8*)((guint64)result & ~7);
+ if ((result[0] == 0x48) && (result[1] == 0x83) && ((result[2] == 0xC6)
|| (result[2] == 0xC7)) &&
+ (result[3] == sizeof (MonoObject)))
+ return result;
+
+ /*g_print ("%p: %lx %p: %lx\n", result, *((guint64*)result), code,
*((guint64*)code));
+
+ mono_disassemble_code (code, 24, "Some code??");
+ mono_disassemble_code (result, 24, "Some code??");*/
+ g_assert_not_reached ();
+}
+
guint8 *
mono_arch_emit_prolog (MonoCompile *cfg)
{
@@ -4841,6 +4859,15 @@
cfg->code_size = MAX (((MonoMethodNormal
*)method)->header->code_size * 4, 512);
code = cfg->native_code = g_malloc (cfg->code_size);
+ if (mono_arch_needs_unbox_tramp (method)) {
+ /*if method is a virtual and from a value type, inline the unbox
trampoline here:*/
+ int this_reg = AMD64_RDI;
+ if (!mono_method_signature (method)->ret->byref && MONO_TYPE_ISSTRUCT
(mono_method_signature (method)->ret))
+ this_reg = AMD64_RSI;
+ /*unbox 'this' pointer*/
+ amd64_alu_reg_imm (code, X86_ADD, this_reg, sizeof (MonoObject));
+ }
+
amd64_push_reg (code, AMD64_RBP);
amd64_mov_reg_reg (code, AMD64_RBP, AMD64_RSP, sizeof (gpointer));
diff -rN -u miniamd64-old/Compiler/OriginalMono/Source/mini.c
miniamd64-new/Compiler/OriginalMono/Source/mini.c
--- miniamd64-old/Compiler/OriginalMono/Source/mini.c 2005-02-23
18:14:19.000000000 +0100
+++ miniamd64-new/Compiler/OriginalMono/Source/mini.c 2005-02-24
15:26:21.000000000 +0100
@@ -9108,12 +9108,21 @@
mini_select_instructions (cfg);
mono_codegen (cfg);
+
if (cfg->verbose_level >= 2) {
char *id = mono_method_full_name (cfg->method, FALSE);
mono_disassemble_code (cfg->native_code, cfg->code_len, id + 3);
g_free (id);
}
+ if (mono_arch_needs_unbox_tramp (cfg->method)) {
+ /*we have an inlined unboxing operation at code start.
+ Since we do not need it normally, we correct the
+ method start address to after the unboxing operation.*/
+ cfg->native_code += mono_arch_unbox_tramp_size;
+ cfg->code_len -= mono_arch_unbox_tramp_size;
+ }
+
if (recompilation) {
/*lock domain to guard against concurrent reads of jinfo*/
mono_domain_lock (cfg->domain);
diff -rN -u miniamd64-old/Compiler/OriginalMono/Source/tramp-amd64.c
miniamd64-new/Compiler/OriginalMono/Source/tramp-amd64.c
--- miniamd64-old/Compiler/OriginalMono/Source/tramp-amd64.c 2005-02-23
14:20:44.000000000 +0100
+++ miniamd64-new/Compiler/OriginalMono/Source/tramp-amd64.c 2005-02-24
16:11:10.000000000 +0100
@@ -98,7 +98,7 @@
if (vtable_slot) {
if (m->klass->valuetype)
- addr = get_unbox_trampoline (m, addr);
+ addr = mono_arch_get_unbox_tramp (addr);
g_assert (*vtable_slot);
@@ -183,7 +183,7 @@
g_assert (vtable_slot);
if (method->klass->valuetype)
- addr = get_unbox_trampoline (method, addr);
+ addr = mono_arch_get_unbox_tramp (addr); /*get_unbox_trampoline
(method, addr);*/
if (mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))
*vtable_slot = addr;
More information about the Mono-devel-list
mailing list