[arm64] Resurrect inlined fast tls
authorVlad Brezae <brezaevlad@gmail.com>
Tue, 22 Nov 2016 11:07:18 +0000 (03:07 -0800)
committerVlad Brezae <brezaevlad@gmail.com>
Wed, 14 Dec 2016 15:52:51 +0000 (17:52 +0200)
mono/mini/cpu-arm64.md
mono/mini/mini-arm64.c
mono/mini/mini-arm64.h
mono/utils/mono-tls.c

index 7700619d2e9a316159bf9ee1dfe8342b70e15ac6..c0651233eb50b02114232ec6ebf5e84ce6bcfea0 100644 (file)
@@ -247,9 +247,7 @@ br_reg: src1:i len:8
 bigmul: len:8 dest:l src1:i src2:i
 bigmul_un: len:8 dest:l src1:i src2:i
 tls_get: dest:i len:32
-tls_get_reg: dest:i src1:i len:32
 tls_set: src1:i len:32
-tls_set_reg: src1:i src2:i len:32
 
 # 32 bit opcodes
 int_add: dest:i src1:i src2:i len:4
index b463bbd33176858cd14d79b67c32abdf1836eeae..31b07e6faff2214f08dc0937648fabe8bf373099 100644 (file)
@@ -748,7 +748,11 @@ mono_arm_emit_aotconst (gpointer ji, guint8 *code, guint8 *code_start, int dreg,
 gboolean
 mono_arch_have_fast_tls (void)
 {
+#ifdef TARGET_IOS
        return FALSE;
+#else
+       return TRUE;
+#endif
 }
 
 static guint8*
@@ -764,15 +768,6 @@ emit_tls_get (guint8 *code, int dreg, int tls_offset)
        return code;
 }
 
-static guint8*
-emit_tls_get_reg (guint8 *code, int dreg, int offset_reg)
-{
-       g_assert (offset_reg != ARMREG_IP0);
-       arm_mrs (code, ARMREG_IP0, ARM_MRS_REG_TPIDR_EL0);
-       arm_ldrx_reg (code, dreg, ARMREG_IP0, offset_reg);
-       return code;
-}
-
 static guint8*
 emit_tls_set (guint8 *code, int sreg, int tls_offset)
 {
@@ -789,18 +784,6 @@ emit_tls_set (guint8 *code, int sreg, int tls_offset)
        return code;
 }
 
-
-static guint8*
-emit_tls_set_reg (guint8 *code, int sreg, int offset_reg)
-{
-       int tmpreg = ARMREG_IP0;
-
-       g_assert (sreg != tmpreg);
-       arm_mrs (code, tmpreg, ARM_MRS_REG_TPIDR_EL0);
-       arm_strx_reg (code, sreg, tmpreg, offset_reg);
-       return code;
-}
-
 /*
  * Emits
  * - mov sp, fp
@@ -3646,20 +3629,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_STOREI8_MEMBASE_REG:
                        code = emit_strx (code, sreg1, ins->inst_destbasereg, ins->inst_offset);
                        break;
-
                case OP_TLS_GET:
                        code = emit_tls_get (code, dreg, ins->inst_offset);
                        break;
-               case OP_TLS_GET_REG:
-                       code = emit_tls_get_reg (code, dreg, sreg1);
-                       break;
                case OP_TLS_SET:
                        code = emit_tls_set (code, sreg1, ins->inst_offset);
                        break;
-               case OP_TLS_SET_REG:
-                       code = emit_tls_set_reg (code, sreg1, sreg2);
-                       break;
-
                        /* Atomic */
                case OP_MEMORY_BARRIER:
                        arm_dmb (code, 0);
index 28745040b6b4db50673b3717e738fd56b4426e53..c794d3ea0bc35435c25ed7517b396b93ee328c87 100644 (file)
@@ -166,6 +166,7 @@ typedef struct {
 #else
 
 #define MONO_ARCH_REDZONE_SIZE 0
+#define MONO_ARCH_HAVE_FAST_TLS 1
 
 #endif
 
index abbbc1d9ae16d431f4f6b594ce9b0af4ef1761ec..ea2a34e43ccea4eab38afb4189bb0b8820543978 100644 (file)
 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset))
 #endif
 
+#elif defined(TARGET_ARM64) && !defined(PIC)
+
+#define MONO_THREAD_VAR_OFFSET(var,offset) \
+       __asm ( "mov %0, #0\n add %0, %0, #:tprel_hi12:" #var "\n add %0, %0, #:tprel_lo12_nc:" #var "\n" \
+               : "=r" (offset))
+
 #else
 
 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1