[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