[AArch64][TLSIE][2/2] Implement TLS IE for tiny model
authorJiong Wang <jiwang@gcc.gnu.org>
Wed, 26 Aug 2015 13:38:40 +0000 (13:38 +0000)
committerJiong Wang <jiwang@gcc.gnu.org>
Wed, 26 Aug 2015 13:38:40 +0000 (13:38 +0000)
2015-08-26  Marcus Shawcroft  <marcus.shawcroft@arm.com>
    Jiong Wang  <jiong.wang@arm.com>
gcc/
* config/aarch64/aarch64.md (UNSPEC_GOTTINYTLS): New UNSPEC.
(tlsie_tiny_<mode>): New define_insn.
(tlsie_tiny_sidi): Likewise.
* config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
SYMBOL_TINY_TLSIE.
(aarch64_symbol_context): New comment for SYMBOL_TINY_TLSIE.
* config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Support
SYMBOL_TINY_TLSIE.
(aarch64_expand_mov_immediate): Likewise.
(aarch64_print_operand): Likewise.
(arch64_classify_tls_symbol): Likewise.

gcc/testsuite/
* gcc.target/aarch64/tlsie_tiny_1.c: New testcase.

From-SVN: r227220

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/tlsie_tiny_1.c [new file with mode: 0644]

index 8f92283fe39ee51e0d782e16aeaac6241dc1d8eb..a0c4fb99acd468d6a547a5870e003e780dd59092 100644 (file)
@@ -1,3 +1,18 @@
+2015-08-26  Marcus Shawcroft  <marcus.shawcroft@arm.com>
+           Jiong Wang  <jiong.wang@arm.com>
+
+       * config/aarch64/aarch64.md (UNSPEC_GOTTINYTLS): New UNSPEC.
+       (tlsie_tiny_<mode>): New define_insn.
+       (tlsie_tiny_sidi): Likewise.
+       * config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
+       SYMBOL_TINY_TLSIE.
+       (aarch64_symbol_context): New comment for SYMBOL_TINY_TLSIE.
+       * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Support
+       SYMBOL_TINY_TLSIE.
+       (aarch64_expand_mov_immediate): Likewise.
+       (aarch64_print_operand): Likewise.
+       (arch64_classify_tls_symbol): Likewise.
+
 2015-08-26  Matthew Wahab  <matthew.wahab@arm.com>
 
        * config/arm/arm-arches.def: Replace single value flags with
index 59c364dc72ea651a8dd891817a676c4f183abd97..8fbc204123a7d0cc5f082aea721e0465c2233ea2 100644 (file)
@@ -74,6 +74,7 @@ enum aarch64_symbol_context
    SYMBOL_SMALL_TLSGD
    SYMBOL_SMALL_TLSDESC
    SYMBOL_SMALL_GOTTPREL
+   SYMBOL_TINY_TLSIE
    SYMBOL_TLSLE12
    SYMBOL_TLSLE24
    SYMBOL_TLSLE32
@@ -114,6 +115,7 @@ enum aarch64_symbol_type
   SYMBOL_SMALL_GOTTPREL,
   SYMBOL_TINY_ABSOLUTE,
   SYMBOL_TINY_GOT,
+  SYMBOL_TINY_TLSIE,
   SYMBOL_TLSLE12,
   SYMBOL_TLSLE24,
   SYMBOL_TLSLE32,
index 626589859e7358536e1e0783950514d976011140..c74bf84fc8bfb2b80167b676e17834e0d1ea77e6 100644 (file)
@@ -1159,6 +1159,31 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
       emit_insn (gen_ldr_got_tiny (dest, imm));
       return;
 
+    case SYMBOL_TINY_TLSIE:
+      {
+       machine_mode mode = GET_MODE (dest);
+       rtx tp = aarch64_load_tp (NULL);
+
+       if (mode == ptr_mode)
+         {
+           if (mode == DImode)
+             emit_insn (gen_tlsie_tiny_di (dest, imm, tp));
+           else
+             {
+               tp = gen_lowpart (mode, tp);
+               emit_insn (gen_tlsie_tiny_si (dest, imm, tp));
+             }
+         }
+       else
+         {
+           gcc_assert (mode == Pmode);
+           emit_insn (gen_tlsie_tiny_sidi (dest, imm, tp));
+         }
+
+       set_unique_reg_note (get_last_insn (), REG_EQUIV, imm);
+       return;
+      }
+
     default:
       gcc_unreachable ();
     }
@@ -1693,6 +1718,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
        case SYMBOL_SMALL_GOT_28K:
        case SYMBOL_SMALL_GOT_4G:
        case SYMBOL_TINY_GOT:
+       case SYMBOL_TINY_TLSIE:
          if (offset != const0_rtx)
            {
              gcc_assert(can_create_pseudo_p ());
@@ -4623,6 +4649,10 @@ aarch64_print_operand (FILE *f, rtx x, char code)
          asm_fprintf (asm_out_file, ":got:");
          break;
 
+       case SYMBOL_TINY_TLSIE:
+         asm_fprintf (asm_out_file, ":gottprel:");
+         break;
+
        default:
          break;
        }
@@ -8728,7 +8758,14 @@ aarch64_classify_tls_symbol (rtx x)
       return TARGET_TLS_DESC ? SYMBOL_SMALL_TLSDESC : SYMBOL_SMALL_TLSGD;
 
     case TLS_MODEL_INITIAL_EXEC:
-      return SYMBOL_SMALL_GOTTPREL;
+      switch (aarch64_cmodel)
+       {
+       case AARCH64_CMODEL_TINY:
+       case AARCH64_CMODEL_TINY_PIC:
+         return SYMBOL_TINY_TLSIE;
+       default:
+         return SYMBOL_SMALL_GOTTPREL;
+       }
 
     case TLS_MODEL_LOCAL_EXEC:
       if (aarch64_tls_size == 12)
index deac21150b575199a850b30db3ba5c4870bbc0fc..80fd6c4894ebdc738b2c635c80b74592ec32b162 100644 (file)
@@ -90,6 +90,7 @@
     UNSPEC_GOTSMALLPIC28K
     UNSPEC_GOTSMALLTLS
     UNSPEC_GOTTINYPIC
+    UNSPEC_GOTTINYTLS
     UNSPEC_LD1
     UNSPEC_LD2
     UNSPEC_LD2_DUP
    (set_attr "length" "8")]
 )
 
+(define_insn "tlsie_tiny_<mode>"
+  [(set (match_operand:PTR 0 "register_operand" "=&r")
+       (unspec:PTR [(match_operand 1 "aarch64_tls_ie_symref" "S")
+                    (match_operand:PTR 2 "register_operand" "r")]
+                  UNSPEC_GOTTINYTLS))]
+  ""
+  "ldr\\t%<w>0, %L1\;add\\t%<w>0, %<w>0, %<w>2"
+  [(set_attr "type" "multiple")
+   (set_attr "length" "8")]
+)
+
+(define_insn "tlsie_tiny_sidi"
+  [(set (match_operand:DI 0 "register_operand" "=&r")
+       (zero_extend:DI
+         (unspec:SI [(match_operand 1 "aarch64_tls_ie_symref" "S")
+                     (match_operand:DI 2 "register_operand" "r")
+                     ]
+                     UNSPEC_GOTTINYTLS)))]
+  ""
+  "ldr\\t%w0, %L1\;add\\t%<w>0, %<w>0, %<w>2"
+  [(set_attr "type" "multiple")
+   (set_attr "length" "8")]
+)
+
 (define_insn "tlsle12_<mode>"
   [(set (match_operand:P 0 "register_operand" "=r")
        (unspec:P [(match_operand:P 1 "register_operand" "r")
index 2e1198e78a054b7313ad33bd0f8672c156831ebe..b1dcc1588dc1a3b1febb8848b94d8363c94d82e3 100644 (file)
@@ -1,3 +1,7 @@
+2015-08-26  Jiong Wang  <jiong.wang@arm.com>
+
+       * gcc.target/aarch64/tlsie_tiny_1.c: New testcase.
+
 2015-08-26  Jiong Wang  <jiong.wang@arm.com>
 
        * gcc.target/aarch64/tlsle_1.x: Rename to tls_1.x
diff --git a/gcc/testsuite/gcc.target/aarch64/tlsie_tiny_1.c b/gcc/testsuite/gcc.target/aarch64/tlsie_tiny_1.c
new file mode 100644 (file)
index 0000000..7477fa6
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-O2 -fpic -ftls-model=initial-exec -mcmodel=tiny" } */
+
+#include "tls_1.x"
+
+/* { dg-final { scan-assembler-times ":gottprel:" 2 } } */