Ver código fonte

AK: Add vector variants of sqrt and rsqrt

Hendiadyoin1 3 anos atrás
pai
commit
5ba5a6615d
1 arquivos alterados com 32 adições e 0 exclusões
  1. 32 0
      AK/SIMDMath.h

+ 32 - 0
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