On 7/18/19 1:18 PM, James Greenhalgh wrote:
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
Correct, it is undefined behavior in C++.
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
I don't know the relevant details of the TBAA implementation, but that
certainly sounds like GCC uses C semantics for this pattern even in C++,
so it should work as expected when compiled with GCC.
Jason