On Tue, 7 Jan 2020 at 17:18, Marc Glisse <marc.gli...@inria.fr> wrote: > > On Tue, 7 Jan 2020, Christophe Lyon wrote: > > > I've received a support request where GCC generates strd/ldrd which > > require aligned memory addresses, while the user code actually > > provides sub-aligned pointers. > > > > The sample code is derived from CMSIS: > > #define __SIMD32_TYPE int > > #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) > > > > void foo(short *pDst, int in1, int in2) { > > *__SIMD32(pDst)++ = in1; > > *__SIMD32(pDst)++ = in2; > > } > > > > compiled with arm-none-eabi-gcc -mcpu=cortex-m7 CMSIS.c -S -O2 > > generates: > > foo: > > strd r1, r2, [r0] > > bx lr > > > > Using -mno-unaligned-access of course makes no change, since the code > > is lying to the compiler by casting short* to int*. > > If the issue is as well isolated as this, can't they just edit the code? > > typedef int __SIMD32_TYPE __attribute__((aligned(1))); >
That type is defined by a macro in CMSIS's arm_math.h. I think users don't want to play tricks with such libraries, but I could try to check with them if something around these lines would be acceptable. > gets > > str r1, [r0] @ unaligned > str r2, [r0, #4] @ unaligned > > instead of > > strd r1, r2, [r0] > > -- > Marc Glisse