Commit 5aa3c762 by John David Anglin

pa.md (call): Generate indirect long calls to non-local functions when outputing 32-bit code.

	* config/pa/pa.md (call): Generate indirect long calls to non-local
	functions when outputing 32-bit code.
	(call_value): Likewise except for special call to buggy powf function.

From-SVN: r207121
parent cc5cec10
2014-01-26 John David Anglin <danglin@gcc.gnu.org> 2014-01-26 John David Anglin <danglin@gcc.gnu.org>
* config/pa/pa.md (call): Generate indirect long calls to non-local
functions when outputing 32-bit code.
(call_value): Likewise except for special call to buggy powf function.
* config/pa/pa.c (pa_attr_length_indirect_call): Adjust length of * config/pa/pa.c (pa_attr_length_indirect_call): Adjust length of
portable runtime and PIC indirect calls. portable runtime and PIC indirect calls.
(pa_output_indirect_call): Remove unnecessary nop from portable runtime (pa_output_indirect_call): Remove unnecessary nop from portable runtime
......
...@@ -7087,7 +7087,17 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" ...@@ -7087,7 +7087,17 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
if (TARGET_PORTABLE_RUNTIME) if (TARGET_PORTABLE_RUNTIME)
op = force_reg (SImode, XEXP (operands[0], 0)); op = force_reg (SImode, XEXP (operands[0], 0));
else else
op = XEXP (operands[0], 0); {
op = XEXP (operands[0], 0);
/* Generate indirect long calls to non-local functions. */
if (!TARGET_64BIT && TARGET_LONG_CALLS && GET_CODE (op) == SYMBOL_REF)
{
tree call_decl = SYMBOL_REF_DECL (op);
if (!(call_decl && targetm.binds_local_p (call_decl)))
op = force_reg (word_mode, op);
}
}
if (TARGET_64BIT) if (TARGET_64BIT)
{ {
...@@ -7575,11 +7585,29 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" ...@@ -7575,11 +7585,29 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
rtx op; rtx op;
rtx dst = operands[0]; rtx dst = operands[0];
rtx nb = operands[2]; rtx nb = operands[2];
bool call_powf = false;
if (TARGET_PORTABLE_RUNTIME) if (TARGET_PORTABLE_RUNTIME)
op = force_reg (SImode, XEXP (operands[1], 0)); op = force_reg (SImode, XEXP (operands[1], 0));
else else
op = XEXP (operands[1], 0); {
op = XEXP (operands[1], 0);
if (GET_CODE (op) == SYMBOL_REF)
{
/* Handle special call to buggy powf function. */
if (TARGET_HPUX && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT
&& !strcmp (targetm.strip_name_encoding (XSTR (op, 0)), "powf"))
call_powf = true;
/* Generate indirect long calls to non-local functions. */
else if (!TARGET_64BIT && TARGET_LONG_CALLS)
{
tree call_decl = SYMBOL_REF_DECL (op);
if (!(call_decl && targetm.binds_local_p (call_decl)))
op = force_reg (word_mode, op);
}
}
}
if (TARGET_64BIT) if (TARGET_64BIT)
{ {
...@@ -7639,8 +7667,7 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" ...@@ -7639,8 +7667,7 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
rtx r4 = gen_rtx_REG (word_mode, 4); rtx r4 = gen_rtx_REG (word_mode, 4);
if (GET_CODE (op) == SYMBOL_REF) if (GET_CODE (op) == SYMBOL_REF)
{ {
if (TARGET_HPUX && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT if (call_powf)
&& !strcmp (targetm.strip_name_encoding (XSTR (op, 0)), "powf"))
emit_call_insn (gen_call_val_powf_64bit (dst, op, nb, r4)); emit_call_insn (gen_call_val_powf_64bit (dst, op, nb, r4));
else else
emit_call_insn (gen_call_val_symref_64bit (dst, op, nb, r4)); emit_call_insn (gen_call_val_symref_64bit (dst, op, nb, r4));
...@@ -7659,18 +7686,14 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" ...@@ -7659,18 +7686,14 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
{ {
rtx r4 = gen_rtx_REG (word_mode, 4); rtx r4 = gen_rtx_REG (word_mode, 4);
if (TARGET_HPUX && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT if (call_powf)
&& !strcmp (targetm.strip_name_encoding (XSTR (op, 0)),
"powf"))
emit_call_insn (gen_call_val_powf_pic (dst, op, nb, r4)); emit_call_insn (gen_call_val_powf_pic (dst, op, nb, r4));
else else
emit_call_insn (gen_call_val_symref_pic (dst, op, nb, r4)); emit_call_insn (gen_call_val_symref_pic (dst, op, nb, r4));
} }
else else
{ {
if (TARGET_HPUX && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT if (call_powf)
&& !strcmp (targetm.strip_name_encoding (XSTR (op, 0)),
"powf"))
emit_call_insn (gen_call_val_powf (dst, op, nb)); emit_call_insn (gen_call_val_powf (dst, op, nb));
else else
emit_call_insn (gen_call_val_symref (dst, op, nb)); emit_call_insn (gen_call_val_symref (dst, op, nb));
......
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