As we have generalized GD Descriptor support for all memory model in
the first patch.  Support for tiny model is quite straightforward. We
just need to output different instruction sequences according on memory
model.

OK for trunk?

2015-06-22  Jiong Wang  <jiong.w...@arm.com>

gcc/
  * config/aarch64/aarch64.md (tlsdesc_<mode>): Support tiny model
  constraint.
  
gcc/testsuite/
  * gcc.target/aarch64/tlsdesc_small.c: New.
  * gcc.target/aarch64/tlsdesc_tiny.c: Ditto.
  
-- 
Regards,
Jiong

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 827ae8e..1b4e387 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -4394,9 +4394,19 @@
    (clobber (reg:CC CC_REGNUM))
    (clobber (match_scratch:DI 1 "=r"))]
   "TARGET_TLS_DESC"
-  "adrp\\tx0, %A0\;ldr\\t%<w>1, [x0, #%L0]\;add\\t<w>0, <w>0, %L0\;.tlsdesccall\\t%0\;blr\\t%1"
+  {
+    if (aarch64_cmodel_var == AARCH64_CMODEL_TINY)
+      return "ldr\t%<w>1, #%A0;adr\t<w>0, %A0;.tlsdesccall\t%0;blr\t%1";
+    else if (aarch64_cmodel_var == AARCH64_CMODEL_SMALL)
+      return "adrp\tx0, %A0;ldr\t%<w>1, [x0, #%L0];add\t<w>0, <w>0, %L0;.tlsdesccall\t%0;blr\t%1";
+    else
+      /* TBD: Large model to be supported.  */
+      gcc_unreachable ();
+  }
   [(set_attr "type" "call")
-   (set_attr "length" "16")])
+   (set (attr "length")
+	(if_then_else (match_test "aarch64_cmodel_var == AARCH64_CMODEL_TINY")
+	(const_int 12) (const_int 16)))])
 
 (define_insn "stack_tie"
   [(set (mem:BLK (scratch))
diff --git a/gcc/testsuite/gcc.target/aarch64/tlsdesc_small.c b/gcc/testsuite/gcc.target/aarch64/tlsdesc_small.c
new file mode 100644
index 0000000..f1429b9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/tlsdesc_small.c
@@ -0,0 +1,9 @@
+/* { dg-do run } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-O2 -ftls-model=global-dynamic -fPIC --save-temps" } */
+
+#include "tls.c"
+
+/* { dg-final { scan-assembler-times "adrp\tx0, :tlsdesc:" 2 } } */
+/* { dg-final { scan-assembler-times "tlsdesccall" 2 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/tlsdesc_tiny.c b/gcc/testsuite/gcc.target/aarch64/tlsdesc_tiny.c
new file mode 100644
index 0000000..a107650
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/tlsdesc_tiny.c
@@ -0,0 +1,9 @@
+/* { dg-do run } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-O2 -ftls-model=global-dynamic -fPIC -mcmodel=tiny --save-temps" } */
+
+#include "tls.c"
+
+/* { dg-final { scan-assembler-times "adr\tx0, :tlsdesc:" 2 } } */
+/* { dg-final { scan-assembler-times "tlsdesccall" 2 } } */
+/* { dg-final { cleanup-saved-temps } } */

Reply via email to