diff --git a/test cases/common/139 simd/meson.build b/test cases/common/139 simd/meson.build index 153b458b0..5311460cc 100644 --- a/test cases/common/139 simd/meson.build +++ b/test cases/common/139 simd/meson.build @@ -16,6 +16,17 @@ cdata = configuration_data() # # and then have a target that uses the result in links_with. +# The following headers need to be added. Also Thumb and Altivec. +# SSE2 +# SSE3 +# SSSE3 +# SSE4.1 +# SSE4.2 +# SSE4A +# AES +# AVX +# AVX512 + simdlibs = [] if cc.has_argument('-mmmx') @@ -23,6 +34,11 @@ if cc.has_argument('-mmmx') simdlibs += static_library('simd_mmx', 'simd_mmx.c', c_args : '-mmmx') endif +if cc.has_argument('-msse') + cdata.set('HAVE_SSE', 1) + simdlibs += static_library('simd_sse', 'simd_sse.c', c_args : '-msse') +endif + configure_file(output : 'simdconfig.h', configuration : cdata) diff --git a/test cases/common/139 simd/simd_mmx.c b/test cases/common/139 simd/simd_mmx.c index dc1d51c10..351f36e63 100644 --- a/test cases/common/139 simd/simd_mmx.c +++ b/test cases/common/139 simd/simd_mmx.c @@ -1,3 +1,6 @@ +#include +#include + #include #include #include diff --git a/test cases/common/139 simd/simd_sse.c b/test cases/common/139 simd/simd_sse.c new file mode 100644 index 000000000..11a74c917 --- /dev/null +++ b/test cases/common/139 simd/simd_sse.c @@ -0,0 +1,17 @@ +#include +#include + +#include +#include +#include + +int sse_available() { + return __builtin_cpu_supports("sse"); +} + +void increment_sse(float arr[4]) { + __m128 val = _mm_load_ps(arr); + __m128 one = _mm_set_ps1(1.0); + __m128 result = _mm_add_ps(val, one); + _mm_storeu_ps(arr, result); +} diff --git a/test cases/common/139 simd/simdchecker.c b/test cases/common/139 simd/simdchecker.c index d75af25fb..b3c94f95c 100644 --- a/test cases/common/139 simd/simdchecker.c +++ b/test cases/common/139 simd/simdchecker.c @@ -12,12 +12,18 @@ int main(int argc, char **argv) { const float expected[4] = {3.0, 4.0, 5.0, 6.0}; void (*fptr)(float[4]) = NULL; const char *type; + int i; +/* Add here. The first matched one is used so put "better" instruction + * sets at the top. + */ #if HAVE_SSE - /* Add here. The first matched one is used so put "better" instruction - * sets at the top. - */ -#elif HAVE_MMX + if(fptr == NULL && sse_available()) { + fptr = increment_sse; + type = "SSE"; + } +#endif +#if HAVE_MMX if(fptr == NULL && mmx_available()) { fptr = increment_mmx; type = "MMX"; @@ -29,7 +35,7 @@ int main(int argc, char **argv) { } printf("Using %s.\n", type); fptr(four); - for(int i=0; i<4; i++) { + for(i=0; i<4; i++) { if(four[i] != expected[i]) { printf("Increment function failed, got %f expected %f.\n", four[i], expected[i]); return 1;