diff options
Diffstat (limited to 'test cases/common/155 simd/simdchecker.c')
| -rw-r--r-- | test cases/common/155 simd/simdchecker.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/test cases/common/155 simd/simdchecker.c b/test cases/common/155 simd/simdchecker.c new file mode 100644 index 000000000..222fbf3e3 --- /dev/null +++ b/test cases/common/155 simd/simdchecker.c @@ -0,0 +1,93 @@ +#include<simdfuncs.h> +#include<stdio.h> + +/* + * A function that checks at runtime which simd accelerations are + * available and calls the best one. Falls + * back to plain C implementation if SIMD is not available. + */ + +int main(int argc, char **argv) { + float four[4] = {2.0, 3.0, 4.0, 5.0}; + 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_NEON + if(fptr == NULL && neon_available()) { + fptr = increment_neon; + type = "NEON"; + } +#endif +#if HAVE_AVX2 + if(fptr == NULL && avx2_available()) { + fptr = increment_avx2; + type = "AVX2"; + } +#endif +#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; + type = "SSE42"; + } +#endif +#if HAVE_SSE41 + if(fptr == NULL && sse41_available()) { + fptr = increment_sse41; + type = "SSE41"; + } +#endif +#if HAVE_SSSE3 + if(fptr == NULL && ssse3_available()) { + fptr = increment_ssse3; + type = "SSSE3"; + } +#endif +#if HAVE_SSE3 + if(fptr == NULL && sse3_available()) { + fptr = increment_sse3; + type = "SSE3"; + } +#endif +#if HAVE_SSE2 + if(fptr == NULL && sse2_available()) { + fptr = increment_sse2; + type = "SSE2"; + } +#endif +#if HAVE_SSE + if(fptr == NULL && sse_available()) { + fptr = increment_sse; + type = "SSE"; + } +#endif +#if HAVE_MMX + if(fptr == NULL && mmx_available()) { + fptr = increment_mmx; + type = "MMX"; + } +#endif + if(fptr == NULL) { + fptr = increment_fallback; + type = "fallback"; + } + printf("Using %s.\n", type); + fptr(four); + 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; + } + } + return 0; +} |
