www.pudn.com > mmxswarm.zip > MMXWrapper.h


// MMXWrapper.h : Very thin object wrapper over the MMX types 
// 
// This is a part of the Microsoft Foundation Classes C++ library. 
// Copyright (c) Microsoft Corporation.  All rights reserved. 
// 
// This source code is only intended as a supplement to the 
// Microsoft Foundation Classes Reference and related 
// electronic documentation provided with the library. 
// See these sources for detailed information regarding the 
// Microsoft Foundation Classes product. 
// 
#pragma once 
 
// Very thin and specific classes to have the MMX types more C++ friendly. 
class CMMXUnsigned16Saturated 
{ 
public: 
	CMMXUnsigned16Saturated() 
	{ 
	} 
	CMMXUnsigned16Saturated( DWORD dw ) 
	{ 
		m_m64 = _m_from_int( dw ); 
	} 
	CMMXUnsigned16Saturated( __m64 m64 ) 
	{ 
		m_m64 = m64; 
	} 
	CMMXUnsigned16Saturated( ULONGLONG qw ) 
	{ 
		m_m64.m64_u64 = qw; 
	} 
 
	CMMXUnsigned16Saturated& operator=( DWORD dw ) 
	{ 
		m_m64 = _m_from_int( dw ); 
		return( *this ); 
	} 
	CMMXUnsigned16Saturated& operator=( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = m.m_m64; 
		return( *this ); 
	} 
	CMMXUnsigned16Saturated& operator=( ULONGLONG qw ) 
	{ 
		m_m64.m64_u64 = qw; 
		return( *this ); 
	} 
 
	operator __m64() const 
	{ 
		return( m_m64 ); 
	} 
 
	operator ULONGLONG() const 
	{ 
		return( m_m64.m64_u64 ); 
	} 
 
	void Clear() 
	{ 
		m_m64 = _mm_setzero_si64(); 
	} 
 
	CMMXUnsigned16Saturated& operator+=( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = _mm_adds_pu16( m_m64, m ); 
		return( *this ); 
	} 
	CMMXUnsigned16Saturated& operator-=( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = _mm_subs_pu16( m_m64, m ); 
		return( *this ); 
	} 
	CMMXUnsigned16Saturated& operator>>=( int nBits ) 
	{ 
		m_m64 = _mm_srli_pi16( m_m64, nBits ); 
		return( *this ); 
	} 
 
	CMMXUnsigned16Saturated& operator<<=( int nBits ) 
	{ 
		m_m64 = _mm_slli_pi16( m_m64, nBits ); 
		return( *this ); 
	} 
 
	CMMXUnsigned16Saturated& operator&=( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = _mm_and_si64(m_m64, m); 
		return(*this); 
	} 
 
	CMMXUnsigned16Saturated& operator|=( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = _mm_or_si64(m_m64, m); 
		return(*this); 
	} 
 
	CMMXUnsigned16Saturated& AndNot( const CMMXUnsigned16Saturated& m ) 
	{ 
		m_m64 = _mm_andnot_si64(m, m_m64); 
		return(*this); 
	} 
 
	DWORD PackBytes() const 
	{ 
		return( _m_to_int( _mm_packs_pu16( m_m64, _mm_setzero_si64() ) ) ); 
	} 
 
	ULONGLONG PackBytes( const CMMXUnsigned16Saturated& mUpper ) const 
	{ 
		return( _mm_packs_pu16( m_m64, mUpper ).m64_u64 ); 
	} 
 
	void UnpackBytesLo( DWORD dw ) 
	{ 
		m_m64 = _mm_unpacklo_pi8( _m_from_int( dw ), _mm_setzero_si64() ); 
	} 
	void UnpackBytesHi( DWORD dw ) 
	{ 
		m_m64 = _mm_unpacklo_pi8( _mm_setzero_si64(), _m_from_int( dw ) ); 
	} 
 
	void UnpackBytes(CMMXUnsigned16Saturated &mmLeft) 
	{ 
		mmLeft = _mm_unpackhi_pi8( m_m64, _mm_setzero_si64() ); 
		m_m64 = _mm_unpacklo_pi8( m_m64, _mm_setzero_si64() ); 
	} 
 
public: 
	__m64 m_m64; 
}; 
 
inline CMMXUnsigned16Saturated operator+( const CMMXUnsigned16Saturated& m1, const CMMXUnsigned16Saturated& m2 ) 
{ 
	return( _mm_adds_pu16( m1.m_m64, m2.m_m64 ) ); 
} 
 
inline CMMXUnsigned16Saturated operator-( const CMMXUnsigned16Saturated& m1, const CMMXUnsigned16Saturated& m2 ) 
{ 
	return( _mm_subs_pu16( m1.m_m64, m2.m_m64 ) ); 
} 
 
inline CMMXUnsigned16Saturated operator<<( const CMMXUnsigned16Saturated& m1, int nBits ) 
{ 
	return( _mm_slli_pi16( m1, nBits ) ); 
} 
 
inline CMMXUnsigned16Saturated operator>>( const CMMXUnsigned16Saturated& m1, int nBits ) 
{ 
	return( _mm_srli_pi16( m1, nBits ) ); 
} 
 
inline CMMXUnsigned16Saturated operator&( const CMMXUnsigned16Saturated& m1, const CMMXUnsigned16Saturated& m2 ) 
{ 
	return(_mm_and_si64(m1, m2)); 
}