diff options
author | Hendiadyoin1 <leon.a@serenityos.org> | 2022-04-01 13:47:06 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-04-02 18:37:38 +0200 |
commit | 5ba5a6615d2994bd3decffba31aabbcc4e551eef (patch) | |
tree | d0858fbd30ea76d939da6dffcdbe24f1137c1634 /AK | |
parent | b1db1e4e4f90e4574888230b699d2191607d33b6 (diff) | |
download | serenity-5ba5a6615d2994bd3decffba31aabbcc4e551eef.zip |
AK: Add vector variants of sqrt and rsqrt
Diffstat (limited to 'AK')
-rw-r--r-- | AK/SIMDMath.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/AK/SIMDMath.h b/AK/SIMDMath.h index a8726963eb..5fff5c361d 100644 --- a/AK/SIMDMath.h +++ b/AK/SIMDMath.h @@ -6,7 +6,11 @@ #pragma once +#ifndef __SSE__ +# include <AK/Math.h> +#endif #include <AK/SIMD.h> +#include <AK/SIMDExtras.h> #include <math.h> // Functions returning vectors or accepting vector arguments have different calling conventions @@ -59,6 +63,34 @@ ALWAYS_INLINE static f32x4 exp(f32x4 v) }; } +ALWAYS_INLINE static f32x4 sqrt(f32x4 v) +{ +#ifdef __SSE__ + return __builtin_ia32_sqrtps(v); +#else + return f32x4 { + AK::sqrt(v[0]), + AK::sqrt(v[1]), + AK::sqrt(v[2]), + AK::sqrt(v[3]), + }; +#endif +} + +ALWAYS_INLINE static f32x4 rsqrt(f32x4 v) +{ +#ifdef __SSE__ + return __builtin_ia32_rsqrtps(v); +#else + return f32x4 { + 1.f / AK::sqrt(v[0]), + 1.f / AK::sqrt(v[1]), + 1.f / AK::sqrt(v[2]), + 1.f / AK::sqrt(v[3]), + }; +#endif +} + } #pragma GCC diagnostic pop |