summaryrefslogtreecommitdiffstats
path: root/gfx/2d/MMIHelpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/2d/MMIHelpers.h')
-rw-r--r--gfx/2d/MMIHelpers.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/gfx/2d/MMIHelpers.h b/gfx/2d/MMIHelpers.h
new file mode 100644
index 0000000000..72e2ea5df3
--- /dev/null
+++ b/gfx/2d/MMIHelpers.h
@@ -0,0 +1,232 @@
+/*
+ ============================================================================
+ Name : MMIHelpers.h
+ Author : Heiher <r@hev.cc>
+ Version : 0.0.1
+ Copyright : Copyright (c) 2015 everyone.
+ Description : The helpers for x86 SSE to Loongson MMI.
+ ============================================================================
+ */
+
+#ifndef __MMI_HELPERS_H__
+#define __MMI_HELPERS_H__
+
+#define __mm_packxxxx(_f, _D, _d, _s, _t) \
+# _f " %[" # _t "], %[" # _d "h], %[" # _s "h] \n\t" # _f " %[" # _D \
+ "l], %[" # _d "l], %[" # _s \
+ "l] \n\t" \
+ "punpckhwd %[" # _D "h], %[" # _D "l], %[" # _t \
+ "] \n\t" \
+ "punpcklwd %[" # _D "l], %[" # _D "l], %[" # _t "] \n\t"
+
+#define _mm_or(_D, _d, _s) \
+ "or %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "or %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+#define _mm_xor(_D, _d, _s) \
+ "xor %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "xor %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+#define _mm_and(_D, _d, _s) \
+ "and %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "and %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pandn */
+#define _mm_pandn(_D, _d, _s) \
+ "pandn %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "pandn %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pshuflw */
+#define _mm_pshuflh(_D, _d, _s) \
+ "mov.d %[" #_D "h], %[" #_d \
+ "h] \n\t" \
+ "pshufh %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: psllw (bits) */
+#define _mm_psllh(_D, _d, _s) \
+ "psllh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "psllh %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: pslld (bits) */
+#define _mm_psllw(_D, _d, _s) \
+ "psllw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "psllw %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: psllq (bits) */
+#define _mm_pslld(_D, _d, _s) \
+ "dsll %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "dsll %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: pslldq (bytes) */
+#define _mm_psllq(_D, _d, _s, _s64, _tf) \
+ "subu %[" #_tf "], %[" #_s64 "], %[" #_s \
+ "] \n\t" \
+ "dsrl %[" #_tf "], %[" #_d "l], %[" #_tf \
+ "] \n\t" \
+ "dsll %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "dsll %[" #_D "l], %[" #_d "l], %[" #_s \
+ "] \n\t" \
+ "or %[" #_D "h], %[" #_D "h], %[" #_tf "] \n\t"
+
+/* SSE: psrlw (bits) */
+#define _mm_psrlh(_D, _d, _s) \
+ "psrlh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "psrlh %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: psrld (bits) */
+#define _mm_psrlw(_D, _d, _s) \
+ "psrlw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "psrlw %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: psrlq (bits) */
+#define _mm_psrld(_D, _d, _s) \
+ "dsrl %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "dsrl %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: psrldq (bytes) */
+#define _mm_psrlq(_D, _d, _s, _s64, _tf) \
+ "subu %[" #_tf "], %[" #_s64 "], %[" #_s \
+ "] \n\t" \
+ "dsll %[" #_tf "], %[" #_d "h], %[" #_tf \
+ "] \n\t" \
+ "dsrl %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "dsrl %[" #_D "l], %[" #_d "l], %[" #_s \
+ "] \n\t" \
+ "or %[" #_D "l], %[" #_D "l], %[" #_tf "] \n\t"
+
+/* SSE: psrad */
+#define _mm_psraw(_D, _d, _s) \
+ "psraw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "] \n\t" \
+ "psraw %[" #_D "l], %[" #_d "l], %[" #_s "] \n\t"
+
+/* SSE: paddb */
+#define _mm_paddb(_D, _d, _s) \
+ "paddb %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "paddb %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: paddw */
+#define _mm_paddh(_D, _d, _s) \
+ "paddh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "paddh %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: paddd */
+#define _mm_paddw(_D, _d, _s) \
+ "paddw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "paddw %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: paddq */
+#define _mm_paddd(_D, _d, _s) \
+ "dadd %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "dadd %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: psubw */
+#define _mm_psubh(_D, _d, _s) \
+ "psubh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "psubh %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: psubd */
+#define _mm_psubw(_D, _d, _s) \
+ "psubw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "psubw %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pmaxub */
+#define _mm_pmaxub(_D, _d, _s) \
+ "pmaxub %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "pmaxub %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pmullw */
+#define _mm_pmullh(_D, _d, _s) \
+ "pmullh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "pmullh %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pmulhw */
+#define _mm_pmulhh(_D, _d, _s) \
+ "pmulhh %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "pmulhh %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: pmuludq */
+#define _mm_pmuluw(_D, _d, _s) \
+ "pmuluw %[" #_D "h], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "pmuluw %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: packsswb */
+#define _mm_packsshb(_D, _d, _s, _t) __mm_packxxxx(packsshb, _D, _d, _s, _t)
+
+/* SSE: packssdw */
+#define _mm_packsswh(_D, _d, _s, _t) __mm_packxxxx(packsswh, _D, _d, _s, _t)
+
+/* SSE: packuswb */
+#define _mm_packushb(_D, _d, _s, _t) __mm_packxxxx(packushb, _D, _d, _s, _t)
+
+/* SSE: punpcklbw */
+#define _mm_punpcklbh(_D, _d, _s) \
+ "punpckhbh %[" #_D "h], %[" #_d "l], %[" #_s \
+ "l] \n\t" \
+ "punpcklbh %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: punpcklwd */
+#define _mm_punpcklhw(_D, _d, _s) \
+ "punpckhhw %[" #_D "h], %[" #_d "l], %[" #_s \
+ "l] \n\t" \
+ "punpcklhw %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: punpckldq */
+#define _mm_punpcklwd(_D, _d, _s) \
+ "punpckhwd %[" #_D "h], %[" #_d "l], %[" #_s \
+ "l] \n\t" \
+ "punpcklwd %[" #_D "l], %[" #_d "l], %[" #_s "l] \n\t"
+
+/* SSE: punpcklqdq */
+#define _mm_punpckldq(_D, _d, _s) \
+ "mov.d %[" #_D "h], %[" #_s \
+ "l] \n\t" \
+ "mov.d %[" #_D "l], %[" #_d "l] \n\t"
+
+/* SSE: punpckhbw */
+#define _mm_punpckhbh(_D, _d, _s) \
+ "punpcklbh %[" #_D "l], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "punpckhbh %[" #_D "h], %[" #_d "h], %[" #_s "h] \n\t"
+
+/* SSE: punpckhwd */
+#define _mm_punpckhhw(_D, _d, _s) \
+ "punpcklhw %[" #_D "l], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "punpckhhw %[" #_D "h], %[" #_d "h], %[" #_s "h] \n\t"
+
+/* SSE: punpckhdq */
+#define _mm_punpckhwd(_D, _d, _s) \
+ "punpcklwd %[" #_D "l], %[" #_d "h], %[" #_s \
+ "h] \n\t" \
+ "punpckhwd %[" #_D "h], %[" #_d "h], %[" #_s "h] \n\t"
+
+/* SSE: punpckhqdq */
+#define _mm_punpckhdq(_D, _d, _s) \
+ "mov.d %[" #_D "l], %[" #_d \
+ "h] \n\t" \
+ "mov.d %[" #_D "h], %[" #_s "h] \n\t"
+
+#endif /* __MMI_HELPERS_H__ */