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 } } */