Add TLS_GET support for s390x
authorNeale Ferguson <neale@sinenomine.net>
Tue, 31 Jan 2012 16:38:11 +0000 (11:38 -0500)
committerNeale Ferguson <neale@sinenomine.net>
Tue, 31 Jan 2012 16:38:11 +0000 (11:38 -0500)
mono/mini/cpu-s390x.md
mono/mini/mini-s390x.c
mono/utils/mono-compiler.h

index 221e076710d22193f087fc1f82a5b9586e3dfd16..4bd0175c6bb6b38db999bedc8f3920c334d3a031 100644 (file)
@@ -165,6 +165,7 @@ relaxed_nop: len:4
 oparglist: src1:i len:28
 bigmul: len:2 dest:i src1:a src2:i
 bigmul_un: len:2 dest:i src1:a src2:i
+tls_get: len:40 dest:i
 endfilter: src1:i len:28
 rethrow: src1:i len:26
 or_imm: dest:i src1:i len:24
index 1827df04910d1be2ae95dd32753f7f3c1640e78e..f89cedef4b9e1ea8d0010b143ec905e056e714c2 100644 (file)
@@ -367,7 +367,6 @@ static inline void add_stackParm (guint *, size_data *, ArgInfo *, gint);
 static inline void add_float (guint *, size_data *, ArgInfo *);
 static CallInfo * get_call_info (MonoCompile *, MonoMemPool *, MonoMethodSignature *, gboolean);
 static guchar * emit_float_to_int (MonoCompile *, guchar *, int, int, int, gboolean);
-gpointer mono_arch_get_lmf_addr (void);
 static guint8 * emit_load_volatile_arguments (guint8 *, MonoCompile *);
 static void catch_SIGILL(int, siginfo_t *, void *);
 static __inline__ void emit_unwind_regs(MonoCompile *, guint8 *, int, int, long);
@@ -384,8 +383,9 @@ static int indent_level = 0;
 
 int has_ld = 0;
 
-static int appdomain_tls_offset = -1,
-           thread_tls_offset = -1;
+static gint appdomain_tls_offset = -1,
+           lmf_tls_offset = -1,
+           lmf_addr_tls_offset = -1;
 
 pthread_key_t lmf_addr_key;
 
@@ -4095,6 +4095,21 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        s390_ledbr (code, ins->dreg, ins->sreg1);
                }
                        break;
+               case OP_TLS_GET: {
+                       if (s390_is_imm16 (ins->inst_offset)) {
+                               s390_lghi (code, s390_r13, ins->inst_offset);
+                       } else {
+                               s390_bras (code, s390_r13, 0);
+                               s390_j    (code, 4);
+                               s390_llong(code, ins->inst_offset);
+                               s390_lg   (code, s390_r13, 0, s390_r13, 4);
+                       }
+                       s390_ear (code, s390_r1, 0);
+                       s390_sllg(code, s390_r1, s390_r1, 0, 32);
+                       s390_ear (code, s390_r1, 1);
+                       s390_lg  (code, ins->dreg, s390_r13, s390_r1, 0);
+               }
+                       break;
                case OP_JMP: {
                        if (cfg->method->save_lmf)
                                restoreLMF(code, cfg->frame_reg, cfg->stack_usage);
@@ -4888,7 +4903,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 void
 mono_arch_register_lowlevel_calls (void)
 {
-       mono_register_jit_icall (mono_arch_get_lmf_addr, "mono_arch_get_lmf_addr", NULL, TRUE);
 }
 
 /*========================= End of Function ========================*/
@@ -5566,31 +5580,9 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
 void
 mono_arch_finish_init (void)
 {
-#if HAVE_KW_THREAD
-# if 0
-       __asm__ ("\tear\t%r1,0\n"
-                "\tlr\t%0,%3\n"
-                "\tsr\t%0,%r1\n"
-                "\tlr\t%1,%4\n"
-                "\tsr\t%1,%r1\n"
-                "\tlr\t%2,%5\n"
-                "\tsr\t%2,%r1\n"
-                : "=r" (appdomain_tls_offset),
-                  "=r" (thread_tls_offset),
-                  "=r" (lmf_tls_offset)
-                : "r" (&tls_appdomain),
-                  "r" (&tls_current_object),
-                  "r" (&mono_lmf_addr)
-                : "1", "cc");
-# endif
-#endif         
-
-       if (!lmf_addr_key_inited) {
-               lmf_addr_key_inited = TRUE;
-               pthread_key_create (&lmf_addr_key, NULL);
-       }
-       pthread_setspecific (lmf_addr_key, &tls->lmf);
-
+       appdomain_tls_offset = mono_domain_get_tls_offset();
+       lmf_tls_offset = mono_get_jit_tls_offset();
+       lmf_addr_tls_offset = mono_get_jit_tls_offset();
 }
 
 /*========================= End of Function ========================*/
@@ -5796,24 +5788,6 @@ mono_arch_flush_register_windows (void)
 
 /*========================= End of Function ========================*/
 
-/*------------------------------------------------------------------*/
-/*                                                                  */
-/* Name                - mono_arch_get_lmf_addr                            */
-/*                                                                  */
-/* Function    -                                                   */
-/*                                                                 */
-/* Returns     -                                                   */
-/*                                                                  */
-/*------------------------------------------------------------------*/
-
-gpointer
-mono_arch_get_lmf_addr (void)
-{
-        return pthread_getspecific (lmf_addr_key);
-}
-
-/*========================= End of Function ========================*/
-
 /*------------------------------------------------------------------*/
 /*                                                                  */
 /* Name                - mono_arch_is_inst_imm                             */
index 3ed8a8fbcb5ac80fe64be634c860f3ac630c4522..2d7a545068001ef843af994fcea9b2ca7fca2d6f 100644 (file)
 #  define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;                                 \
                                                __asm__ ("basr  %%r1,0\n\t"                     \
                                                         "j     0f\n\t"                         \
-                                                        ".quad " #var "@INDNTPOFF\n\t"         \
+                                                        ".quad " #var "@TLSGD\n\t"             \
                                                         "0:\n\t"                               \
                                                         "lg    %%r2,4(%%r1)\n\t"               \
-                                                        "brasl %%r14,__tls_get_offset@PLT\n\t" \
+                                                        "brasl %%r14,__tls_get_offset@PLT:tls_gdcall:"#var"\n\t" \
                                                         "lgr   %0,%%r2\n\t"                    \
                                                        : "=r" (foo) :                          \
                                                        : "1", "2", "14", "cc");                \