aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2019-03-19 17:58:42 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2019-03-19 17:58:42 +0100
commite8926ce09f3ef0795b87dc922f431157e6916748 (patch)
tree27529516a80a71b94af1fe3a2dfaa158936fc923 /gcc
parentbb48c402f4ca67c9e5d0ed1104700c50058d6fb8 (diff)
downloadgcc-e8926ce09f3ef0795b87dc922f431157e6916748.zip
gcc-e8926ce09f3ef0795b87dc922f431157e6916748.tar.gz
gcc-e8926ce09f3ef0795b87dc922f431157e6916748.tar.bz2
rs6000: Unaligned stfiwx on older CPUs (PR89746)
The "classic" PowerPCs (6xx/7xx) are not STRICT_ALIGNMENT, but their floating point units are. This is not normally a problem, the ABIs make everything FP aligned. The RTL patterns converting FP to integer however get a potentially unaligned destination, and we do not want to do an stfiwx on that on such older CPUs. This fixes it. It does not change anything for TARGET_MFCRF targets (POWER4 and later). It also won't change anything for strict-alignment targets, or CPUs without hardware FP of course, or CPUs that do not implement stfiwx (older 4xx/5xx/8xx). It does not change the corresponding fixuns* pattern, because that can not be enabled on any CPU that cannot handle unaligned FP well. PR target/89746 * config/rs6000/rs6000.md (fix_trunc<mode>si2_stfiwx): If we have a non-TARGET_MFCRF target, and the dest is memory but not 32-bit aligned, go via a stack temporary. From-SVN: r269802
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.md4
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2ce11d..510faab8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-19 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR target/89746
+ * config/rs6000/rs6000.md (fix_trunc<mode>si2_stfiwx): If we have a
+ non-TARGET_MFCRF target, and the dest is memory but not 32-bit aligned,
+ go via a stack temporary.
+
2019-03-19 Jakub Jelinek <jakub@redhat.com>
PR target/89378
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 584b9da..297b884 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -5639,13 +5639,13 @@
tmp = gen_reg_rtx (DImode);
emit_insn (gen_fctiwz_<mode> (tmp, src));
- if (MEM_P (dest))
+ if (MEM_P (dest) && (TARGET_MFCRF || MEM_ALIGN (dest) >= 32))
{
dest = rs6000_force_indexed_or_indirect_mem (dest);
emit_insn (gen_stfiwx (dest, tmp));
DONE;
}
- else if (TARGET_POWERPC64 && (TARGET_MFPGPR || TARGET_DIRECT_MOVE))
+ else if (TARGET_POWERPC64 && (TARGET_MFPGPR || TARGET_DIRECT_MOVE) && !MEM_P (dest))
{
dest = gen_lowpart (DImode, dest);
emit_move_insn (dest, tmp);