From 771c2f9542b4e84b08c107060319603d12ec8867 Mon Sep 17 00:00:00 2001 From: Andrew Hsieh Date: Mon, 14 Apr 2014 21:05:51 -0700 Subject: [4.9] Fix ARM/GCC-4.9 generates insufficient alignment for NEON vst/vld See d909af3e2469aad87d5c3e79b93c778fd26c03a9 Change-Id: Ie1de9f946f397196bb6f1623f5add86933739484 --- gcc-4.9/gcc/config/arm/arm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'gcc-4.9') diff --git a/gcc-4.9/gcc/config/arm/arm.c b/gcc-4.9/gcc/config/arm/arm.c index e5cf50366..17d030490 100644 --- a/gcc-4.9/gcc/config/arm/arm.c +++ b/gcc-4.9/gcc/config/arm/arm.c @@ -21581,9 +21581,13 @@ arm_print_operand (FILE *stream, rtx x, int code) memsize = MEM_SIZE (x); /* Only certain alignment specifiers are supported by the hardware. */ - if (memsize == 32 && (align % 32) == 0) + /* Note that ARM EABI only guarentees 8-byte stack alignment. While GCC + honors stricter alignment of composite type in user code, it doesn't + observe the alignment of memory passed as an extra argument for function + returning large composite type. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57271 */ + if (memsize == 32 && (align % 32) == 0 && !TARGET_AAPCS_BASED) align_bits = 256; - else if ((memsize == 16 || memsize == 32) && (align % 16) == 0) + else if ((memsize == 16 || memsize == 32) && (align % 16) == 0 && !TARGET_AAPCS_BASED) align_bits = 128; else if (memsize >= 8 && (align % 8) == 0) align_bits = 64; -- cgit v1.2.3