On Wed, 2019-02-20 at 10:04 +0000, Richard Sandiford wrote: > > (E.g. __attribute__((vector_size)) never creates an ABI-level SVE vector, > even with -msve-vector-bits=N, but it can create an ABI-level Advanced > SIMD vector.) > > I think we should leave the SVE stuff out for now though. ISTM that: > > !GCC$ builtin (sin) attributes simd (notinbranch) if('aarch64') > !GCC$ builtin (sin) attributes simd (notinbranch) if('aarch64_sve') > > is trying to say that there's both an Advanced SIMD implementation of sin > and an SVE implementation of sin. But AFAICT the patch would just treat > the two the same way when SVE is enabled, which I think in practice means > that both would declare an Advanced SIMD function.
It looks like you are right. I did not know that GCC would essentially use the non-SVE vector functions to handle SVE vectors. So right now, GCC doesn't seem to need to differentiate between SVE and non-SVE. > Once we support SVE vector functions, how would the header file declare > the Advanced SIMD function when SVE is enabled on the command line? I guess this is what I was thinking the aarch64_sve if would be for, but there is a difference between supporting SVE (using non-SVE vector functions) and supporting SVE with functions that can take and return an SVE vector. I think that we should use 'if('aarch64_sve')' to mean SVE is enabled and we want GCC to call SVE vector functions. So right now this would always return false, until such time as GCC is changed to do calls with SVE vectors as arguments. Given that it would always return false I guess we could just drop it out for now. Steve Ellcey sell...@marvell.com FYI: If anyone is interested here is a test program I was compiling to see what GCC does with SVE, I compiled with -march=armv8.5-a, -march=armv8.5-a+sve and -msve-vector-bits=[256,2048,scalable] to see what sort of code got generated. I was a little surprised that using -march=armv8.5-a (without the +sve) and -msve-vector-bits= did not give a warning. Why set sve-vector-bits if SVE is not enabled. __attribute__ ((__simd__ ("notinbranch"))) extern float xsinf (float __x) __attribute__ ((__nothrow__ , __leaf__, __const__)); __attribute__ ((__simd__ ("notinbranch"))) extern float xcosf (float __x) __attribute__ ((__nothrow__ , __leaf__, __const__)); void foo (float * __restrict__ a,float * __restrict__ b,float * __restrict__ c) { int i; for (i = 0; i < 10000; i++) a[i] = xsinf(b[i]) * xcosf(c[i]); }