diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-02-17 23:15:36 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2017-07-17 19:00:42 +0300 |
commit | 71ffbd5b73f827eeddffd22af1e783ccdc91dc80 (patch) | |
tree | 3039dfb454bda53cb913e36f979367f26d19ec58 | |
parent | fc68e0c63ad87f11ce885e9470c6d8e0f2d8f020 (diff) | |
download | meson-71ffbd5b73f827eeddffd22af1e783ccdc91dc80.zip meson-71ffbd5b73f827eeddffd22af1e783ccdc91dc80.tar.gz meson-71ffbd5b73f827eeddffd22af1e783ccdc91dc80.tar.bz2 |
Add AVX support.
-rw-r--r-- | test cases/common/139 simd/meson.build | 2 | ||||
-rw-r--r-- | test cases/common/139 simd/simd_avx.c | 26 | ||||
-rw-r--r-- | test cases/common/139 simd/simdchecker.c | 6 |
3 files changed, 33 insertions, 1 deletions
diff --git a/test cases/common/139 simd/meson.build b/test cases/common/139 simd/meson.build index 7769bfd..1d23ffb 100644 --- a/test cases/common/139 simd/meson.build +++ b/test cases/common/139 simd/meson.build @@ -18,7 +18,6 @@ cdata = configuration_data() # The following headers need to be added. Also Thumb and Altivec. #<wmmintrin.h> AES -#<immintrin.h> AVX #<zmmintrin.h> AVX512 simdlibs = [] @@ -30,6 +29,7 @@ simdarr = [['-mmmx', 'HAVE_MMX', 'simd_mmx', 'simd_mmx.c'], ['-mssse3', 'HAVE_SSSE3', 'simd_ssse3', 'simd_ssse3.c'], ['-msse4.1', 'HAVE_SSE41', 'simd_sse41', 'simd_sse41.c'], ['-msse4.2', 'HAVE_SSE42', 'simd_sse42', 'simd_sse42.c'], + ['-mavx', 'HAVE_AVX', 'simd_avx', 'simd_avx.c'], ] foreach ia : simdarr diff --git a/test cases/common/139 simd/simd_avx.c b/test cases/common/139 simd/simd_avx.c new file mode 100644 index 0000000..26d76a0 --- /dev/null +++ b/test cases/common/139 simd/simd_avx.c @@ -0,0 +1,26 @@ +#include<simdconfig.h> +#include<simdfuncs.h> + +#include<immintrin.h> +#include<cpuid.h> +#include<stdint.h> + +int avx_available() { + return __builtin_cpu_supports("avx"); +} + +void increment_avx(float arr[4]) { + double darr[4]; + darr[0] = arr[0]; + darr[1] = arr[1]; + darr[2] = arr[2]; + darr[3] = arr[3]; + __m256d val = _mm256_loadu_pd(darr); + __m256d one = _mm256_set1_pd(1.0); + __m256d result = _mm256_add_pd(val, one); + _mm256_storeu_pd(darr, result); + arr[0] = (float)darr[0]; + arr[1] = (float)darr[1]; + arr[2] = (float)darr[2]; + arr[3] = (float)darr[3]; +} diff --git a/test cases/common/139 simd/simdchecker.c b/test cases/common/139 simd/simdchecker.c index 62841b0..da53f0a 100644 --- a/test cases/common/139 simd/simdchecker.c +++ b/test cases/common/139 simd/simdchecker.c @@ -17,6 +17,12 @@ int main(int argc, char **argv) { /* Add here. The first matched one is used so put "better" instruction * sets at the top. */ +#if HAVE_AVX + if(fptr == NULL && avx_available()) { + fptr = increment_avx; + type = "AVX"; + } +#endif #if HAVE_SSE42 if(fptr == NULL && sse42_available()) { fptr = increment_sse42; |