[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