+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
SYMBOL_SMALL_TLSGD
SYMBOL_SMALL_TLSDESC
SYMBOL_SMALL_GOTTPREL
+ SYMBOL_TINY_TLSIE
SYMBOL_TLSLE12
SYMBOL_TLSLE24
SYMBOL_TLSLE32
SYMBOL_SMALL_GOTTPREL,
SYMBOL_TINY_ABSOLUTE,
SYMBOL_TINY_GOT,
+ SYMBOL_TINY_TLSIE,
SYMBOL_TLSLE12,
SYMBOL_TLSLE24,
SYMBOL_TLSLE32,
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 ();
}
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 ());
asm_fprintf (asm_out_file, ":got:");
break;
+ case SYMBOL_TINY_TLSIE:
+ asm_fprintf (asm_out_file, ":gottprel:");
+ break;
+
default:
break;
}
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)
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")
+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
--- /dev/null
+/* { 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 } } */