|
@@ -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
|