@@ -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))
new file mode 100644
@@ -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 } } */
new file mode 100644
@@ -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 } } */