On Mon, Jun 10, 2019 at 06:21:05PM +0100, Sylvia Taylor wrote:
> Greetings,
>
> This patch adds the intrinsic functions for:
> - vld1_<mode>_x4
> - vst1_<mode>_x4
> - vld1q_<mode>_x4
> - vst1q_<mode>_x4
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
>
> Ok for trunk? If yes, I don't have any commit rights, so can someone
> please commit it on my behalf.
Hi,
I'm concerned by this strategy for implementing the arm_neon.h builtins:
> +__extension__ extern __inline int8x8x4_t
> +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> +vld1_s8_x4 (const int8_t *__a)
> +{
> + union { int8x8x4_t __i; __builtin_aarch64_simd_xi __o; } __au;
> + __au.__o
> + = __builtin_aarch64_ld1x4v8qi ((const __builtin_aarch64_simd_qi *) __a);
> + return __au.__i;
> +}
As far as I know this is undefined behaviour in C++11. This was the best
resource I could find pointing to the relevant standards paragraphs.
https://stackoverflow.com/questions/11373203/accessing-inactive-union-member-and-undefined-behavior
That said, GCC explicitly allows it, so maybe this is fine?
https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Optimize-Options.html#Type-punning
Can anyone from the languages side chime in on whether we're exposing
undefined behaviour (in either C or C++) here?
Thanks,
James
>
> Cheers,
> Syl
>
> gcc/ChangeLog:
>
> 2019-06-10 Sylvia Taylor <[email protected]>
>
> * config/aarch64/aarch64-simd-builtins.def:
> (ld1x4): New.
> (st1x4): Likewise.
> * config/aarch64/aarch64-simd.md:
> (aarch64_ld1x4<VALLDIF:mode>): New pattern.
> (aarch64_st1x4<VALLDIF:mode>): Likewise.
> (aarch64_ld1_x4_<mode>): Likewise.
> (aarch64_st1_x4_<mode>): Likewise.
> * config/aarch64/arm_neon.h:
> (vld1_s8_x4): New function.
> (vld1q_s8_x4): Likewise.
> (vld1_s16_x4): Likewise.
> (vld1q_s16_x4): Likewise.
> (vld1_s32_x4): Likewise.
> (vld1q_s32_x4): Likewise.
> (vld1_u8_x4): Likewise.
> (vld1q_u8_x4): Likewise.
> (vld1_u16_x4): Likewise.
> (vld1q_u16_x4): Likewise.
> (vld1_u32_x4): Likewise.
> (vld1q_u32_x4): Likewise.
> (vld1_f16_x4): Likewise.
> (vld1q_f16_x4): Likewise.
> (vld1_f32_x4): Likewise.
> (vld1q_f32_x4): Likewise.
> (vld1_p8_x4): Likewise.
> (vld1q_p8_x4): Likewise.
> (vld1_p16_x4): Likewise.
> (vld1q_p16_x4): Likewise.
> (vld1_s64_x4): Likewise.
> (vld1_u64_x4): Likewise.
> (vld1_p64_x4): Likewise.
> (vld1q_s64_x4): Likewise.
> (vld1q_u64_x4): Likewise.
> (vld1q_p64_x4): Likewise.
> (vld1_f64_x4): Likewise.
> (vld1q_f64_x4): Likewise.
> (vst1_s8_x4): Likewise.
> (vst1q_s8_x4): Likewise.
> (vst1_s16_x4): Likewise.
> (vst1q_s16_x4): Likewise.
> (vst1_s32_x4): Likewise.
> (vst1q_s32_x4): Likewise.
> (vst1_u8_x4): Likewise.
> (vst1q_u8_x4): Likewise.
> (vst1_u16_x4): Likewise.
> (vst1q_u16_x4): Likewise.
> (vst1_u32_x4): Likewise.
> (vst1q_u32_x4): Likewise.
> (vst1_f16_x4): Likewise.
> (vst1q_f16_x4): Likewise.
> (vst1_f32_x4): Likewise.
> (vst1q_f32_x4): Likewise.
> (vst1_p8_x4): Likewise.
> (vst1q_p8_x4): Likewise.
> (vst1_p16_x4): Likewise.
> (vst1q_p16_x4): Likewise.
> (vst1_s64_x4): Likewise.
> (vst1_u64_x4): Likewise.
> (vst1_p64_x4): Likewise.
> (vst1q_s64_x4): Likewise.
> (vst1q_u64_x4): Likewise.
> (vst1q_p64_x4): Likewise.
> (vst1_f64_x4): Likewise.
> (vst1q_f64_x4): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> 2019-06-10 Sylvia Taylor <[email protected]>
>
> * gcc.target/aarch64/advsimd-intrinsics/vld1x4.c: New test.
> * gcc.target/aarch64/advsimd-intrinsics/vst1x4.c: New test.