sh.c (prepare_move_operands): Handle the address constant which is a tls symbolic...
authorKaz Kojima <kkojima@gcc.gnu.org>
Fri, 21 Oct 2005 14:09:31 +0000 (14:09 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Fri, 21 Oct 2005 14:09:31 +0000 (14:09 +0000)
* config/sh/sh.c (prepare_move_operands): Handle the address
constant which is a tls symbolic address plus a constant.

From-SVN: r105736

gcc/ChangeLog
gcc/config/sh/sh.c

index 6ff0307d0ec083ed262011bffc4d45b4c7bf38a7..d7a6e5933168ff6c381628eef8a91b652a3cb6d9 100644 (file)
@@ -1,3 +1,8 @@
+2005-10-21  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/sh.c (prepare_move_operands): Handle the address
+       constant which is a tls symbolic address plus a constant.
+
 2005-10-21  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR driver/24473
index 3e0caf15f99c0065f695bc1040d1abc204da1352..e11d557d3c1a3c818dc9e3d7b64d81e22ff72feb 100644 (file)
@@ -1238,11 +1238,21 @@ prepare_move_operands (rtx operands[], enum machine_mode mode)
 
   if (mode == Pmode || mode == ptr_mode)
     {
-      rtx op0, op1;
+      rtx op0, op1, opc;
       enum tls_model tls_kind;
 
       op0 = operands[0];
       op1 = operands[1];
+      if (GET_CODE (op1) == CONST
+         && GET_CODE (XEXP (op1, 0)) == PLUS
+         && tls_symbolic_operand (XEXP (XEXP (op1, 0), 0), Pmode))
+       {
+         opc = XEXP (XEXP (op1, 0), 1);
+         op1 = XEXP (XEXP (op1, 0), 0);
+       }
+      else
+       opc = NULL_RTX;
+
       if ((tls_kind = tls_symbolic_operand (op1, Pmode)))
        {
          rtx tga_op1, tga_ret, tmp, tmp2;
@@ -1308,6 +1318,8 @@ prepare_move_operands (rtx operands[], enum machine_mode mode)
            default:
              gcc_unreachable ();
            }
+         if (opc)
+           emit_insn (gen_addsi3 (op1, op1, force_reg (SImode, opc)));
          operands[1] = op1;
        }
     }