summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorHendiadyoin1 <leon.a@serenityos.org>2022-04-01 13:47:06 +0200
committerAndreas Kling <kling@serenityos.org>2022-04-02 18:37:38 +0200
commit5ba5a6615d2994bd3decffba31aabbcc4e551eef (patch)
treed0858fbd30ea76d939da6dffcdbe24f1137c1634 /AK
parentb1db1e4e4f90e4574888230b699d2191607d33b6 (diff)
downloadserenity-5ba5a6615d2994bd3decffba31aabbcc4e551eef.zip
AK: Add vector variants of sqrt and rsqrt
Diffstat (limited to 'AK')
-rw-r--r--AK/SIMDMath.h32
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