diff options
Diffstat (limited to '3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp')
| -rw-r--r-- | 3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp new file mode 100644 index 00000000000..ed980394eab --- /dev/null +++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp @@ -0,0 +1,49 @@ +// This file is part of AsmJit project <https://asmjit.com> +// +// See <asmjit/core.h> or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#include <asmjit/ujit.h> + +#if defined(ASMJIT_UJIT_X86) + +#if defined(_MSC_VER) + #include <intrin.h> +#else + #include <immintrin.h> +#endif + +namespace UniCompilerTests { + +// A reference implementation of MUL+ADD with the use of FMA. This has to be provided otherwise the +// compiler may use FPU registers in 32-bit x86 case, which would make the result different than when +// compiled by JIT compiler that would use XMM registers (32/64-bit SSE/AVX operations). + +float fmadd_fma_ref(float a, float b, float c) noexcept { + __m128 av = _mm_set1_ps(a); + __m128 bv = _mm_set1_ps(b); + __m128 cv = _mm_set1_ps(c); + + return _mm_cvtss_f32(_mm_fmadd_ss(av, bv, cv)); +} + +double fmadd_fma_ref(double a, double b, double c) noexcept { + __m128d av = _mm_set1_pd(a); + __m128d bv = _mm_set1_pd(b); + __m128d cv = _mm_set1_pd(c); + + return _mm_cvtsd_f64(_mm_fmadd_sd(av, bv, cv)); +} + +void madd_fma_check_valgrind_bug(const float a[4], const float b[4], const float c[4], float dst[4]) noexcept { + __m128 av = _mm_loadu_ps(a); + __m128 bv = _mm_loadu_ps(b); + __m128 cv = _mm_loadu_ps(c); + + __m128 dv = _mm_fmadd_ss(av, bv, cv); + _mm_storeu_ps(dst, dv); +} + +} // {UniCompilerTests} + +#endif // ASMJIT_UJIT_X86 |
