summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/util/u_sse.h
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-08-09 16:41:44 +0100
committerJosé Fonseca <jfonseca@vmware.com>2010-08-09 17:31:18 +0100
commit65b9747a54490dd56cd5cee4c2c1b9f51d35f133 (patch)
tree1a58d478a276e2575fe5e45a95252f42b68933bb /src/gallium/auxiliary/util/u_sse.h
parent95fb0bf58dde0b81ce601d3f0477fd1b2a5a28d4 (diff)
util: Move _mm_shuffle_epi8() to u_sse.h.
It's bound to be useful elsewhere.
Diffstat (limited to 'src/gallium/auxiliary/util/u_sse.h')
-rw-r--r--src/gallium/auxiliary/util/u_sse.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_sse.h b/src/gallium/auxiliary/util/u_sse.h
index 6145e34aa3..87959ab0aa 100644
--- a/src/gallium/auxiliary/util/u_sse.h
+++ b/src/gallium/auxiliary/util/u_sse.h
@@ -71,6 +71,35 @@ _mm_castps_si128(__m128 a)
#endif /* defined(_MSC_VER) && _MSC_VER < 1500 */
+
+#if defined(PIPE_ARCH_SSSE3)
+
+#include <tmmintrin.h>
+
+#else /* !PIPE_ARCH_SSSE3 */
+
+#include <emmintrin.h>
+
+/**
+ * Describe _mm_shuffle_epi8() with gcc extended inline assembly, for cases
+ * where -mssse3 is not supported/enabled.
+ *
+ * MSVC will never get in here as its intrinsics support do not rely on
+ * compiler command line options.
+ */
+static __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_mm_shuffle_epi8(__m128i a, __m128i mask)
+{
+ __m128i result;
+ __asm__("pshufb %1, %0"
+ : "=x" (result)
+ : "xm" (mask), "0" (a));
+ return result;
+}
+
+#endif /* !PIPE_ARCH_SSSE3 */
+
+
#endif /* PIPE_ARCH_X86 || PIPE_ARCH_X86_64 */
#endif /* U_SSE_H_ */