+2016-12-05 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * config/arc/arc-protos.h (insn_is_tls_gd_dispatch): Remove.
+ * config/arc/arc.c (arc_unspec_offset): New function.
+ (arc_finalize_pic): Change.
+ (arc_emit_call_tls_get_addr): Likewise.
+ (arc_legitimize_tls_address): Likewise.
+ (arc_legitimize_pic_address): Likewise.
+ (insn_is_tls_gd_dispatch): Remove.
+ * config/arc/arc.h (INSN_REFERENCES_ARE_DELAYED): Change.
+ * config/arc/arc.md (ls_gd_load): Remove unused pattern.
+ (tls_gd_dispatch): Likewise.
+
2016-12-025 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/arm/arm.c (TARGET_ASM_INIT_SECTIONS): Fix wrong undef
/* PIC */
+/* Helper to generate unspec constant. */
+
+static rtx
+arc_unspec_offset (rtx loc, int unspec)
+{
+ return gen_rtx_CONST (Pmode, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, loc),
+ unspec));
+}
+
/* Emit special PIC prologues and epilogues. */
/* If the function has any GOTOFF relocations, then the GOTBASE
register has to be setup in the prologue
gcc_assert (flag_pic != 0);
pat = gen_rtx_SYMBOL_REF (Pmode, "_DYNAMIC");
- pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, pat), ARC_UNSPEC_GOT);
- pat = gen_rtx_CONST (Pmode, pat);
-
+ pat = arc_unspec_offset (pat, ARC_UNSPEC_GOT);
pat = gen_rtx_SET (baseptr_rtx, pat);
emit_insn (pat);
start_sequence ();
- rtx x = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, sym), reloc);
- x = gen_rtx_CONST (Pmode, x);
+ rtx x = arc_unspec_offset (sym, reloc);
emit_move_insn (r0, x);
use_reg (&call_fusage, r0);
addr = gen_rtx_CONST (Pmode, addr);
base = arc_legitimize_tls_address (base, TLS_MODEL_GLOBAL_DYNAMIC);
return gen_rtx_PLUS (Pmode, force_reg (Pmode, base), addr);
+
case TLS_MODEL_GLOBAL_DYNAMIC:
return arc_emit_call_tls_get_addr (addr, UNSPEC_TLS_GD, addr);
+
case TLS_MODEL_INITIAL_EXEC:
- addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_TLS_IE);
- addr = gen_rtx_CONST (Pmode, addr);
+ addr = arc_unspec_offset (addr, UNSPEC_TLS_IE);
addr = copy_to_mode_reg (Pmode, gen_const_mem (Pmode, addr));
return gen_rtx_PLUS (Pmode, arc_get_tp (), addr);
+
case TLS_MODEL_LOCAL_EXEC:
local_exec:
- addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_TLS_OFF);
- addr = gen_rtx_CONST (Pmode, addr);
+ addr = arc_unspec_offset (addr, UNSPEC_TLS_OFF);
return gen_rtx_PLUS (Pmode, arc_get_tp (), addr);
default:
gcc_unreachable ();
else if (!flag_pic)
return orig;
else if (CONSTANT_POOL_ADDRESS_P (addr) || SYMBOL_REF_LOCAL_P (addr))
- return gen_rtx_CONST (Pmode,
- gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr),
- ARC_UNSPEC_GOTOFFPC));
+ return arc_unspec_offset (addr, ARC_UNSPEC_GOTOFFPC);
/* This symbol must be referenced via a load from the Global
Offset Table (@GOTPC). */
- pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOT);
- pat = gen_rtx_CONST (Pmode, pat);
+ pat = arc_unspec_offset (addr, ARC_UNSPEC_GOT);
pat = gen_const_mem (Pmode, pat);
if (oldx == NULL)
return p;
}
-/* We can't inline this in INSN_REFERENCES_ARE_DELAYED because
- resource.h doesn't include the required header files. */
-
-bool
-insn_is_tls_gd_dispatch (rtx_insn *insn)
-{
- return recog_memoized (insn) == CODE_FOR_tls_gd_dispatch;
-}
-
/* Return true if OP is an acceptable memory operand for ARCompact
16-bit load instructions of MODE.
[(set_attr "is_sfunc" "yes")
(set_attr "predicable" "yes")])
-(define_insn "tls_gd_load"
- [(set (match_operand:SI 0 "dest_reg_operand" "=Rcq#q,c")
- (unspec:SI [(match_operand:SI 1 "register_operand" "Rcq#q,c")
- (match_operand:SI 2 "symbolic_operand" "X,X")]
- UNSPEC_TLS_GD))]
- ""
- ".tls_gd_ld %2`ld%? %0,[%1]"
- [(set_attr "type" "load")
- ; if the linker has to patch this into IE, we need a long insn
- ; (FIXME: or two short insn, ld_s / jl_s. missing -Os optimization.)
- (set_attr_alternative "iscompact"
- [(cond [(ne (symbol_ref "arc_tp_regno == 30") (const_int 0))
- (const_string "*")] (const_string "maybe"))
- (const_string "*")])])
-
(define_insn "tls_gd_get_addr"
[(set (reg:SI R0_REG)
(call:SI (mem:SI (unspec:SI [(match_operand:SI 0
; With TARGET_MEDIUM_CALLS, plt calls are not predicable.
(set_attr "predicable" "no")])
-; We make this call specific to the tls symbol to avoid commoning this
-; with calls for other symbols; we want the linker to be able to
-(define_insn "tls_gd_dispatch"
- [(set (reg:SI R0_REG)
- (unspec:SI
- [(reg:SI R0_REG)
- (call (mem:SI (match_operand:SI 0 "register_operand" "Rcq,q,c"))
- (const_int 0))
- (match_operand:SI 1 "symbolic_operand" "X,X,X")]
- UNSPEC_TLS_GD))
- (clobber (reg:SI RETURN_ADDR_REGNUM))
- (clobber (reg:DI R10_REG))
- (clobber (reg:SI R12_REG))]
- ""
- ".tls_gd_call %1`jl%!%* [%0]"
- [(set_attr "type" "call")
- (set_attr "iscompact" "maybe,false,*")
- (set_attr "predicable" "no,no,yes")])
-
;; For thread pointer builtins
(define_expand "get_thread_pointersi"
[(set (match_operand:SI 0 "register_operand") (match_dup 1))]