https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65770
Bug ID: 65770
Summary: [AArch64] vst2_lane broken on bigendian
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: alalaw01 at gcc dot gnu.org
Target: aarch64_be
Testcase:
void
test_vst2_lane_s32 (int32x2x2_t vals)
{
int32_t buf[2];
vst2_lane_s32 (buf, vals, 0);
for (int i = 0; i < 2; i++)
if (buf[i] != vget_lane_s32 (vals.val[i], 0))
abort();
}
int
main (int argc, char **argv)
{
int32_t load[4] = { 11, 12, 21, 22 };
test_vst2_lane_s32 (vld2_s32 (load));
}
Passes on aarch64-none-elf, but fails on aarch64_be-none-elf: the generated
assembly, contains
st2 {v0.s - v1.s}[3], [x1]
Which (1) has flipped endianness, and (2) has flipped endianness relative to a
Q register (int32x4_t) not a D register (int32x2_t).
A similar testcase for int32x4x2_t, also flips endianness, although at least
relative to the right vector length ;).