[摘要]= nBlue; __m64 nNull = _m_from_int(0); // null __m64 tmp = _m_from_int(0); ...
= nBlue;
__m64 nNull = _m_from_int(0); // null
__m64 tmp = _m_from_int(0); // 临时工作临时变量初始化
_mm_empty(); // 清空MMX寄存器。
__m64 nCoeff = Get_m64(c);
DWORD* pIn = (DWORD*) pSource; // 输入双字数组
DWORD* pOut = (DWORD*) pDest; // 输出双字数组
for ( int i = 0; i < nNumberOfPixels; i++ )
{
tmp = _m_from_int(*pIn); // tmp = *pIn (在tmp的低32位写入数据)
tmp = _mm_unpacklo_pi8(tmp, nNull ); //将tmp中低位的4个字节转化为字
//字的高位用nNull中对应位上的位值填充。
tmp = _mm_mullo_pi16 (tmp , nCoeff); //将tmp中的每一个字相乘,将相乘结果的高位送到nCoeff,在tmp中只保留每个结果的低位。
tmp = _mm_srli_pi16 (tmp , 8); // 将tmp中的每一个字右移8位,相当于除以256
tmp = _mm_packs_pu16 (tmp, nNull); // 使用饱和模式将tmp中的结果做如下处理:
//将tmp中的4个字转化为4个字节,并将这4个字节写到tmp中的低32位中
// 同时,将nNull中的4个字转化为4个字节,并将这4个字节写到tmp的高32位中。
*pOut = _m_to_int(tmp); // *pOut = tmp (将tmp低32位的数据放入pOut数组中)
pIn++;
pOut++;
}
_mm_empty();
}
你可以参看示例项目的源代码了解有关此项目的更多的细节。
SSE2 技术
SSE2技术包含有一个类似MMX中对整数操作的指令集,同时也包含128位的SSE寄存器组。比如,用SSE2技术实现更改图象颜色平衡度能够比用纯C++代码实现此功能在效率上有很大提升。SSE2同时是SSE技术的扩展,比如它不仅可以单精度浮点数数组,而且能够处理双精度浮点数数据类型的数组。用C++实现的MMXSwarm 示例项目不仅使用了MMX指令函数,而且使用了SSE2指令对整型数操作的函数。
参考文档:
[1] Intel软件说明书(Intel Software manuals):http://developer.intel.com/design/archives/processors/mmx/index.htm 。
[2] MSDN中有关MMX技术的主题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefsupportformmxtechnology.asp。
[3] Microsoft Visual C++ CPUID项目示例:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamcpuiddeterminecpucapabilities.asp。
[4] Microsoft Visual C++ MMXSwarm项目示例:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamMMXSwarmSampleDemonstratesCImageVisualCsMMXSupport.asp。
[5]
Matt Pietrek在Microsoft Systems Journal 1998年2月刊上的评论文章:
http://www.microsoft.com/msj/0298/hood0298.aspx 。
关键词:基于MMX指令集的程序设计简介