m68k: handle more cases of TLS symbols with offset
authorAndreas Schwab <schwab@linux-m68k.org>
Wed, 8 Aug 2018 20:01:26 +0000 (20:01 +0000)
committerAndreas Schwab <schwab@gcc.gnu.org>
Wed, 8 Aug 2018 20:01:26 +0000 (20:01 +0000)
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

gcc/ChangeLog
gcc/config/m68k/m68k.c
gcc/config/m68k/m68k.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/m68k/tls-dimode.c [new file with mode: 0644]

index 64704bcd6d80b5559fb34c6b8687a58f055d0e3e..e8f65c97911d37ac342c1140a84330f64188bffc 100644 (file)
@@ -1,3 +1,15 @@
+2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
+
+       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.
+
 2018-08-08  Nathan Sidwell  <nathan@acm.org>
 
        * diagnostic.c (diagnostic_report_current_module): Use
index 75a5a5b69b95b8df1e555f374835c39a99d65e83..303dfc1c0c9432c83400eaaa11c8cd163c34eebd 100644 (file)
@@ -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 ();
 
index 506fa4e50e76f386d683e42351d38ca2c5e3d661..29e9be2b9d2c2ce5c179df2112807f837b0798db 100644 (file)
@@ -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:
index 12f842592d3747c3116211ae9928fdff3de87e47..779b50f98ed31475ee77e7d9f6afdec8cc1ccbe4 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
+
+       PR target/46179
+       * gcc.target/m68k/tls-dimode.c: New file.
+
 2018-08-08  Nathan Sidwell  <nathan@acm.org>
 
        * c-c++-common/inc-from-1a.h, c-c++-common/inc-from-1b.h,
diff --git a/gcc/testsuite/gcc.target/m68k/tls-dimode.c b/gcc/testsuite/gcc.target/m68k/tls-dimode.c
new file mode 100644 (file)
index 0000000..0bc59cd
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } } */
+/* { dg-options "-w -O2" } */
+
+__thread long long ti;
+
+void f (void)
+{
+  ti++;
+}
+
+void g (long long x)
+{
+  ti = x;
+}