[mono/mono] [2 commits] 4dc607fc: [jit] Fix the optimized variant of push/pop LMF code.

"Zoltan Varga ([email protected])" <[email protected]> Thu, 21 Nov 2013 17:58:03 +0000
Newsgroups gmane.comp.gnome.mono.patches
Message-ID <000001427bcfc450-bc2b5a47-dd89-498e-b0b3-bd154bdcbf00-000000@email.amazonses.com>
   Branch: refs/heads/master
     Home: https://github.com/mono/mono
  Compare: https://github.com/mono/mono/compare/1ff37128b7b7...1a8004315c0d

   Commit: 4dc607fc8c479e738a09affb752b6be6eeaba268
   Author: Zoltan Varga <[email protected]> (vargaz)
     Date: 2013-11-21 17:55:24 GMT
      URL: https://github.com/mono/mono/commit/4dc607fc8c479e738a09affb752b6be6eeaba268

[jit] Fix the optimized variant of push/pop LMF code.

Changed paths:
  M mono/mini/method-to-ir.c

Modified: mono/mini/method-to-ir.c
===================================================================
@@ -1918,7 +1918,7 @@
 		/* Save previous_lmf */
 		EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), lmf_ins->dreg);
 		/* Set new LMF */
-		emit_tls_set (cfg, lmf_reg, OP_TLS_SET_REG);
+		emit_tls_set (cfg, lmf_reg, TLS_KEY_LMF);
 	} else {
 		/*
 		 * Store lmf_addr in a variable, so it can be allocated to a global register.
@@ -1967,7 +1967,7 @@
 		prev_lmf_reg = alloc_preg (cfg);
 		EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
 		/* Set new LMF */
-		emit_tls_set (cfg, prev_lmf_reg, OP_TLS_SET_REG);
+		emit_tls_set (cfg, prev_lmf_reg, TLS_KEY_LMF);
 	} else {
 		/*
 		 * Emit IR to pop the LMF:

   Commit: 1a8004315c0d840de0e7dbd82f7585a0b4cbf6c3
   Author: Zoltan Varga <[email protected]> (vargaz)
     Date: 2013-11-21 17:55:24 GMT
      URL: https://github.com/mono/mono/commit/1a8004315c0d840de0e7dbd82f7585a0b4cbf6c3

[jit] Implement the optimized variant of the push/pop LMF code on amd64.

Changed paths:
  M mono/mini/cpu-amd64.md
  M mono/mini/mini-amd64.c
  M mono/mini/mini-amd64.h

Modified: mono/mini/cpu-amd64.md
===================================================================
@@ -295,6 +295,8 @@ amd64_set_xmmreg_r8: dest:f src1:f len:14 clob:m
 amd64_save_sp_to_lmf: len:16
 tls_get: dest:i len:16
 tls_get_reg: dest:i src1:i len:32
+tls_set: src1:i len:16
+tls_set_reg: src1:i src2:i len:32
 atomic_add_i4: src1:b src2:i dest:i len:32
 atomic_add_new_i4: src1:b src2:i dest:i len:32
 atomic_exchange_i4: src1:b src2:i dest:a len:32

Modified: mono/mini/mini-amd64.c
===================================================================
@@ -2018,9 +2018,14 @@
 	if (cfg->method->save_lmf)
 		cfg->create_lmf_var = TRUE;
 
-#if !defined(HOST_WIN32) && !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
-	if (cfg->method->save_lmf)
+#if !defined(HOST_WIN32)
+	if (cfg->method->save_lmf) {
 		cfg->lmf_ir = TRUE;
+#if defined(__APPLE__)
+		if (!optimize_for_xen)
+			cfg->lmf_ir_mono_lmf = TRUE;
+#endif
+	}
 #endif
 
 #ifndef MONO_AMD64_NO_PUSHES
@@ -3692,6 +3697,40 @@
 	return code;
 }
 
+static guint8*
+amd64_emit_tls_set (guint8 *code, int sreg, int tls_offset)
+{
+#ifdef HOST_WIN32
+	g_assert_not_reached ();
+#elif defined(__APPLE__)
+	x86_prefix (code, X86_GS_PREFIX);
+	amd64_mov_mem_reg (code, tls_gs_offset + (tls_offset * 8), sreg, 8);
+#else
+	g_assert_not_reached ();
+#endif
+	return code;
+}
+
+static guint8*
+amd64_emit_tls_set_reg (guint8 *code, int sreg, int offset_reg)
+{
+#ifdef HOST_WIN32
+	g_assert_not_reached ();
+#elif defined(__APPLE__)
+	// FIXME: tls_gs_offset can change too, do these when calculating the tls offset
+	g_assert (sreg != AMD64_R11);
+	amd64_mov_reg_reg (code, AMD64_R11, offset_reg, sizeof (gpointer));
+	amd64_shift_reg_imm (code, X86_SHL, AMD64_R11, 3);
+	if (tls_gs_offset)
+		amd64_alu_reg_imm (code, X86_ADD, AMD64_R11, tls_gs_offset);
+	x86_prefix (code, X86_GS_PREFIX);
+	amd64_mov_membase_reg (code, AMD64_R11, 0, sreg, sizeof (gpointer));
+#else
+	g_assert_not_reached ();
+#endif
+	return code;
+}
+
 /*
  * emit_setup_lmf:
  *
@@ -5667,7 +5706,14 @@
 		case OP_TLS_GET_REG:
 			code = emit_tls_get_reg (code, ins->dreg, ins->sreg1);
 			break;
+		case OP_TLS_SET: {
+			code = amd64_emit_tls_set (code, ins->sreg1, ins->inst_offset);
+			break;
+		}
+		case OP_TLS_SET_REG: {
+			code = amd64_emit_tls_set_reg (code, ins->sreg1, ins->sreg2);
 			break;
+		}
 		case OP_MEMORY_BARRIER: {
 			switch (ins->backend.memory_barrier_kind) {
 			case StoreLoadBarrier:

Modified: mono/mini/mini-amd64.h
===================================================================
@@ -339,9 +339,7 @@ struct MonoLMF {
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
 
 #define MONO_ARCH_ENABLE_REGALLOC_IN_EH_BLOCKS 1
-#if !defined(__APPLE__)
 #define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
-#endif
 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
 #define MONO_ARCH_HAVE_ATOMIC_ADD 1


_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches