aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2005-10-21 14:09:31 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2005-10-21 14:09:31 +0000
commit6058b2fa2cc5799e442cc8c7a02bff0b170b6025 (patch)
tree39f9a75c2ec368a77dcd5189f93b6ef4dceb0fc8 /gcc
parentde19a50ee491251b17eb9aa2ed2f22361a37c211 (diff)
downloadgcc-6058b2fa2cc5799e442cc8c7a02bff0b170b6025.zip
gcc-6058b2fa2cc5799e442cc8c7a02bff0b170b6025.tar.gz
gcc-6058b2fa2cc5799e442cc8c7a02bff0b170b6025.tar.bz2
sh.c (prepare_move_operands): Handle the address constant which is a tls symbolic address plus a constant.
* config/sh/sh.c (prepare_move_operands): Handle the address constant which is a tls symbolic address plus a constant. From-SVN: r105736
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/sh/sh.c14
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ff0307..d7a6e59 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 3e0caf1..e11d557 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -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;
}
}