Commit 0d433a6a by Richard Henderson Committed by Richard Henderson

ia64.c (ia64_expand_tls_address): Properly truncate result when op0 is SImode.

        * config/ia64/ia64.c (ia64_expand_tls_address): Properly truncate
        result when op0 is SImode.

From-SVN: r70790
parent 1d109416
2003-08-25 Richard Henderson <rth@redhat.com>
* config/ia64/ia64.c (ia64_expand_tls_address): Properly truncate
result when op0 is SImode.
2003-08-25 Nathanael Nerode <neroden@twcny.rr.com> 2003-08-25 Nathanael Nerode <neroden@twcny.rr.com>
* fixinc/inclhack.def (svr4_sighandler_type): New fix, ported * fixinc/inclhack.def (svr4_sighandler_type): New fix, ported
......
...@@ -1222,6 +1222,7 @@ static rtx ...@@ -1222,6 +1222,7 @@ static rtx
ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1) ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1)
{ {
rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp, insns; rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp, insns;
rtx orig_op0 = op0;
switch (tls_kind) switch (tls_kind)
{ {
...@@ -1245,8 +1246,10 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1) ...@@ -1245,8 +1246,10 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1)
insns = get_insns (); insns = get_insns ();
end_sequence (); end_sequence ();
if (GET_MODE (op0) != Pmode)
op0 = tga_ret;
emit_libcall_block (insns, op0, tga_ret, op1); emit_libcall_block (insns, op0, tga_ret, op1);
return NULL_RTX; break;
case TLS_MODEL_LOCAL_DYNAMIC: case TLS_MODEL_LOCAL_DYNAMIC:
/* ??? This isn't the completely proper way to do local-dynamic /* ??? This isn't the completely proper way to do local-dynamic
...@@ -1274,19 +1277,16 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1) ...@@ -1274,19 +1277,16 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1)
tmp = gen_reg_rtx (Pmode); tmp = gen_reg_rtx (Pmode);
emit_libcall_block (insns, tmp, tga_ret, tga_eqv); emit_libcall_block (insns, tmp, tga_ret, tga_eqv);
if (register_operand (op0, Pmode)) if (!register_operand (op0, Pmode))
tga_ret = op0; op0 = gen_reg_rtx (Pmode);
else
tga_ret = gen_reg_rtx (Pmode);
if (TARGET_TLS64) if (TARGET_TLS64)
{ {
emit_insn (gen_load_dtprel (tga_ret, op1)); emit_insn (gen_load_dtprel (op0, op1));
emit_insn (gen_adddi3 (tga_ret, tmp, tga_ret)); emit_insn (gen_adddi3 (op0, tmp, op0));
} }
else else
emit_insn (gen_add_dtprel (tga_ret, tmp, op1)); emit_insn (gen_add_dtprel (op0, tmp, op1));
break;
return (tga_ret == op0 ? NULL_RTX : tga_ret);
case TLS_MODEL_INITIAL_EXEC: case TLS_MODEL_INITIAL_EXEC:
tmp = gen_reg_rtx (Pmode); tmp = gen_reg_rtx (Pmode);
...@@ -1295,32 +1295,32 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1) ...@@ -1295,32 +1295,32 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1)
RTX_UNCHANGING_P (tmp) = 1; RTX_UNCHANGING_P (tmp) = 1;
tmp = force_reg (Pmode, tmp); tmp = force_reg (Pmode, tmp);
if (register_operand (op0, Pmode)) if (!register_operand (op0, Pmode))
op1 = op0; op0 = gen_reg_rtx (Pmode);
else emit_insn (gen_adddi3 (op0, tmp, gen_thread_pointer ()));
op1 = gen_reg_rtx (Pmode); break;
emit_insn (gen_adddi3 (op1, tmp, gen_thread_pointer ()));
return (op1 == op0 ? NULL_RTX : op1);
case TLS_MODEL_LOCAL_EXEC: case TLS_MODEL_LOCAL_EXEC:
if (register_operand (op0, Pmode)) if (!register_operand (op0, Pmode))
tmp = op0; op0 = gen_reg_rtx (Pmode);
else
tmp = gen_reg_rtx (Pmode);
if (TARGET_TLS64) if (TARGET_TLS64)
{ {
emit_insn (gen_load_tprel (tmp, op1)); emit_insn (gen_load_tprel (op0, op1));
emit_insn (gen_adddi3 (tmp, gen_thread_pointer (), tmp)); emit_insn (gen_adddi3 (op0, gen_thread_pointer (), op0));
} }
else else
emit_insn (gen_add_tprel (tmp, gen_thread_pointer (), op1)); emit_insn (gen_add_tprel (op0, gen_thread_pointer (), op1));
break;
return (tmp == op0 ? NULL_RTX : tmp);
default: default:
abort (); abort ();
} }
if (orig_op0 == op0)
return NULL_RTX;
if (GET_MODE (orig_op0) == Pmode)
return op0;
return gen_lowpart (GET_MODE (orig_op0), op0);
} }
rtx rtx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment