/*
============================================================================
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__ */
Messung V0.5 C=91 H=100 G=95
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland