aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2009-11-25 00:31:11 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2009-11-25 00:31:11 +0000
commit0831e1d14944d254d6edffa87cbf859a0e4d655f (patch)
tree19edbabbc7ec973a04c7ccf16ca26f288bf86b42
parentf9a378936bba070f6e2786faecb54f7affc54691 (diff)
downloadgcc-0831e1d14944d254d6edffa87cbf859a0e4d655f.zip
gcc-0831e1d14944d254d6edffa87cbf859a0e4d655f.tar.gz
gcc-0831e1d14944d254d6edffa87cbf859a0e4d655f.tar.bz2
pa.c (output_call): Only use sr4 for long interspace calls if call binds local and generating non...
* pa.c (output_call): Only use sr4 for long interspace calls if call binds local and generating non PIC code. (attr_length_call): Adjust length calculation for above. From-SVN: r154527
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/pa/pa.c12
2 files changed, 12 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e6d118..16356a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-24 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ * pa.c (output_call): Only use sr4 for long interspace calls if
+ call binds local and generating non PIC code.
+ (attr_length_call): Adjust length calculation for above.
+
2009-11-25 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (plusminus_carry_mnemonic): New code attribute.
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index 62a58c5..d4caad2 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -7504,7 +7504,7 @@ attr_length_call (rtx insn, int sibcall)
{
length += 20;
- if (!TARGET_PA_20 && !TARGET_NO_SPACE_REGS && flag_pic)
+ if (!TARGET_PA_20 && !TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
length += 8;
}
@@ -7524,7 +7524,7 @@ attr_length_call (rtx insn, int sibcall)
if (!sibcall)
length += 8;
- if (!TARGET_NO_SPACE_REGS && flag_pic)
+ if (!TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
length += 8;
}
}
@@ -7721,7 +7721,7 @@ output_call (rtx insn, rtx call_dest, int sibcall)
if (!sibcall && !TARGET_PA_20)
{
output_asm_insn ("{bl|b,l} .+8,%%r2", xoperands);
- if (TARGET_NO_SPACE_REGS)
+ if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
output_asm_insn ("addi 8,%%r2,%%r2", xoperands);
else
output_asm_insn ("addi 16,%%r2,%%r2", xoperands);
@@ -7746,20 +7746,20 @@ output_call (rtx insn, rtx call_dest, int sibcall)
}
else
{
- if (!TARGET_NO_SPACE_REGS && flag_pic)
+ if (!TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
output_asm_insn ("ldsid (%%r1),%%r31\n\tmtsp %%r31,%%sr0",
xoperands);
if (sibcall)
{
- if (TARGET_NO_SPACE_REGS || !flag_pic)
+ if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
output_asm_insn ("be 0(%%sr4,%%r1)", xoperands);
else
output_asm_insn ("be 0(%%sr0,%%r1)", xoperands);
}
else
{
- if (TARGET_NO_SPACE_REGS || !flag_pic)
+ if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
output_asm_insn ("ble 0(%%sr4,%%r1)", xoperands);
else
output_asm_insn ("ble 0(%%sr0,%%r1)", xoperands);