aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/m68k
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2018-08-08 20:01:26 +0000
committerAndreas Schwab <schwab@gcc.gnu.org>2018-08-08 20:01:26 +0000
commitede9446c26a9290bfb60422b31868212c00a4af7 (patch)
treea1f3ea49d5630e2f4ad14d977deca75fb0d3b278 /gcc/config/m68k
parentf10a91352f83232394646df5a67bdb8f4366a067 (diff)
m68k: handle more cases of TLS symbols with offset
PR target/46179 * config/m68k/m68k.h (FINAL_PRESCAN_INSN): Don't define. * config/m68k/m68k.c (handle_move_double): Don't call m68k_final_prescan_insn. (m68k_adjust_decorated_operand): Renamed from m68k_final_prescan_insn, remove first and third operand and simplify. (print_operand): Call it. (print_operand_address): Call it. PR target/46179 * gcc.target/m68k/tls-dimode.c: New file. From-SVN: r263432
Diffstat (limited to 'gcc/config/m68k')
-rw-r--r--gcc/config/m68k/m68k.c66
-rw-r--r--gcc/config/m68k/m68k.h3
2 files changed, 30 insertions, 39 deletions
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 75a5a5b69b9..303dfc1c0c9 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -2329,11 +2329,10 @@ m68k_unwrap_symbol (rtx orig, bool unwrap_reloc32_p)
return m68k_unwrap_symbol_1 (orig, unwrap_reloc32_p, NULL);
}
-/* Prescan insn before outputing assembler for it. */
+/* Adjust decorated address operand before outputing assembler for it. */
-void
-m68k_final_prescan_insn (rtx_insn *insn ATTRIBUTE_UNUSED,
- rtx *operands, int n_operands)
+static void
+m68k_adjust_decorated_operand (rtx op)
{
int i;
@@ -2355,45 +2354,38 @@ m68k_final_prescan_insn (rtx_insn *insn ATTRIBUTE_UNUSED,
to patch up anything outside of the operand. */
subrtx_var_iterator::array_type array;
- for (i = 0; i < n_operands; ++i)
+ FOR_EACH_SUBRTX_VAR (iter, array, op, ALL)
{
- rtx op;
-
- op = operands[i];
-
- FOR_EACH_SUBRTX_VAR (iter, array, op, ALL)
+ rtx x = *iter;
+ if (m68k_unwrap_symbol (x, true) != x)
{
- rtx x = *iter;
- if (m68k_unwrap_symbol (x, true) != x)
- {
- rtx plus;
+ rtx plus;
- gcc_assert (GET_CODE (x) == CONST);
- plus = XEXP (x, 0);
+ gcc_assert (GET_CODE (x) == CONST);
+ plus = XEXP (x, 0);
- if (GET_CODE (plus) == PLUS || GET_CODE (plus) == MINUS)
- {
- rtx unspec;
- rtx addend;
+ if (GET_CODE (plus) == PLUS || GET_CODE (plus) == MINUS)
+ {
+ rtx unspec;
+ rtx addend;
- unspec = XEXP (plus, 0);
- gcc_assert (GET_CODE (unspec) == UNSPEC);
- addend = XEXP (plus, 1);
- gcc_assert (CONST_INT_P (addend));
+ unspec = XEXP (plus, 0);
+ gcc_assert (GET_CODE (unspec) == UNSPEC);
+ addend = XEXP (plus, 1);
+ gcc_assert (CONST_INT_P (addend));
- /* We now have all the pieces, rearrange them. */
+ /* We now have all the pieces, rearrange them. */
- /* Move symbol to plus. */
- XEXP (plus, 0) = XVECEXP (unspec, 0, 0);
+ /* Move symbol to plus. */
+ XEXP (plus, 0) = XVECEXP (unspec, 0, 0);
- /* Move plus inside unspec. */
- XVECEXP (unspec, 0, 0) = plus;
+ /* Move plus inside unspec. */
+ XVECEXP (unspec, 0, 0) = plus;
- /* Move unspec to top level of const. */
- XEXP (x, 0) = unspec;
- }
- iter.skip_subrtxes ();
+ /* Move unspec to top level of const. */
+ XEXP (x, 0) = unspec;
}
+ iter.skip_subrtxes ();
}
}
}
@@ -3496,7 +3488,6 @@ handle_move_double (rtx operands[2],
/* Normal case: do the two words, low-numbered first. */
- m68k_final_prescan_insn (NULL, operands, 2);
handle_movsi (operands);
/* Do the middle one of the three words for long double */
@@ -3507,7 +3498,6 @@ handle_move_double (rtx operands[2],
if (addreg1)
handle_reg_adjust (addreg1, 4);
- m68k_final_prescan_insn (NULL, middlehalf, 2);
handle_movsi (middlehalf);
}
@@ -3518,7 +3508,6 @@ handle_move_double (rtx operands[2],
handle_reg_adjust (addreg1, 4);
/* Do that word. */
- m68k_final_prescan_insn (NULL, latehalf, 2);
handle_movsi (latehalf);
/* Undo the adds we just did. */
@@ -4464,6 +4453,9 @@ floating_exact_log2 (rtx x)
void
print_operand (FILE *file, rtx op, int letter)
{
+ if (op != NULL_RTX)
+ m68k_adjust_decorated_operand (op);
+
if (letter == '.')
{
if (MOTOROLA)
@@ -4712,6 +4704,8 @@ print_operand_address (FILE *file, rtx addr)
{
struct m68k_address address;
+ m68k_adjust_decorated_operand (addr);
+
if (!m68k_decompose_address (QImode, addr, true, &address))
gcc_unreachable ();
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 506fa4e50e7..29e9be2b9d2 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -867,9 +867,6 @@ do { if (cc_prev_status.flags & CC_IN_68881) \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u\n", (int)(ROUNDED)))
-#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
- m68k_final_prescan_insn (INSN, OPVEC, NOPERANDS)
-
/* On the 68000, we use several CODE characters:
'.' for dot needed in Motorola-style opcode names.
'-' for an operand pushing on the stack: