- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
楼主 |
发表于 2008-3-18 11:16:32
|
显示全部楼层
第一个可用代码,此问题MMX指令完全不可用
void UInt128x128To256_SSE2_40F( UINT32 * const result,
const UINT32 * const left,
const UINT32 * const right )
{
//使用MMX寄存器, 但用SSE2指令
__asm
{
mov esi, left
mov edi, right
mov ebx, result
//0:0
movd mm0, [esi]
pmuludq mm0, [edi]
movd [ebx], mm0
psrlq mm0, 32
// 0:1 1:0
movd mm1, [esi]
pmuludq mm1, [edi+4]
movd mm2, [edi]
pmuludq mm2, [esi+4]
mov eax, -1
//mm0+mm1+mm2
paddq mm0, mm1//mm0=mm0+mm1 mm0肯定小于 2^64
movd mm1, eax
pand mm1, mm0
psrlq mm0, 32 //分解mm0 = mm0:mm1
movd mm3, eax
pand mm3, mm2
psrlq mm2, 32 //分解mm2=mm2:mm3
paddq mm1, mm3 //mm1=mm1+mm3
paddq mm0, mm2 //mm0=mm0+mm2
movd [ebx+4], mm1 //mm1低位存储
psrlq mm1, 32 //mm1高位
paddq mm0, mm1 //得到进位
//1:1 0:2 2:0
movd mm1, [esi+4]
pmuludq mm1, [edi+4]
movd mm2, [esi]
pmuludq mm2, [edi+8]
movd mm3, [edi]
pmuludq mm3, [esi+8]
//mm0+mm1+mm2+mm3
movd mm6, eax
pand mm6, mm0
psrlq mm0, 32 //分解mm0=mm0:mm6
movd mm5, eax
pand mm5, mm1
psrlq mm1, 32 //分解mm1=mm1:mm5
paddq mm6, mm5 //mm6=mm6+mm5
paddq mm0, mm1 //mm0=mm0+mm1
movd mm4, eax
pand mm4, mm2
psrlq mm2, 32 //分解mm2=mm2:mm4
paddq mm6, mm4 //mm6=mm6+mm4
paddq mm0, mm2 //mm0=mm0+mm2
movd mm7, eax
pand mm7, mm3
psrlq mm3, 32 //分解mm3=mm3:mm7
paddq mm6, mm7 //mm6=mm6+mm7
paddq mm0, mm3 //mm0=mm0+mm3
movd [ebx+8], mm6 //mm6低位存储
psrlq mm6, 32
paddq mm0, mm6 //得到进位
//0:3 1:2 2:1 3:0
movd mm1, [esi]
pmuludq mm1, [edi+12]
movd mm2, [esi+4]
pmuludq mm2, [edi+8]
movd mm3, [esi+8]
pmuludq mm3, [edi+4]
movd mm4, [esi+12]
pmuludq mm4, [edi]
//mm0+mm1+mm2+mm3+mm4
movd mm5, eax
pand mm5, mm1
psrlq mm1, 32 //分解mm1=mm1:mm5
paddq mm0, mm5 //mm0=mm0+mm5
movd mm6, eax
pand mm6, mm2
psrlq mm2, 32 //分解mm2=mm2:mm6
paddq mm0, mm6 //mm0=mm0+mm6
paddq mm1, mm2 //mm1=mm1+mm2
movd mm7, eax
pand mm7, mm3
psrlq mm3, 32 //分解mm3=mm3:mm7
paddq mm0, mm7 //mm0=mm0+mm7
paddq mm1, mm3 //mm1=mm1+mm3
movd mm5, eax
pand mm5, mm4
psrlq mm4, 32 //分解mm4=mm4:mm5
paddq mm0, mm5 //mm0=mm0+mm5
paddq mm1, mm4 //mm1=mm1+mm4
movd [ebx+12], mm0 //mm0低位存储
psrlq mm0, 32
paddq mm0, mm1 //新进位
//1:3 2:2 3:1
movd mm2, [esi+4]
pmuludq mm2, [edi+12]
movd mm1, [esi+8]
pmuludq mm1, [edi+8]
movd mm3, [esi+12]
pmuludq mm3, [edi+4]
//mm0+mm1+mm2+mm3
movd mm7, eax
pand mm7, mm0
psrlq mm0, 32 //分解mm0=mm0:mm7
movd mm6, eax
pand mm6, mm1
psrlq mm1, 32 //分解mm1=mm1:mm6
paddq mm7, mm6 //mm7=mm7+mm6
paddq mm0, mm1 //mm0=mm0+mm1
movd mm5, eax
pand mm5, mm2
psrlq mm2, 32 //分解mm2=mm2:mm5
paddq mm7, mm5 //mm7=mm7+mm5
paddq mm0, mm2 //mm0=mm0+mm2
movd mm4, eax
pand mm4, mm3
psrlq mm3, 32 //分解mm3=mm3:mm4
paddq mm7, mm4 //mm7=mm7+mm4
paddq mm0, mm3 //mm0=mm0+mm3
movd [ebx+16], mm7 //mm7低位存储
psrlq mm7, 32
paddq mm0, mm7 //得到进位
//2:3 3:2
movd mm1, [esi+8]
pmuludq mm1, [edi+12]
movd mm2, [esi+12]
pmuludq mm2, [edi+8]
//mm0+mm1+mm2
movd mm7, eax
pand mm7, mm0
psrlq mm0, 32 //分解mm0=mm0:mm7
movd mm6, eax
pand mm6, mm1
psrlq mm1, 32 //分解mm1=mm1:mm6
paddq mm7, mm6 //mm7=mm7+mm6
paddq mm0, mm1 //mm0=mm0+mm1
movd mm5, eax
pand mm5, mm2
psrlq mm2, 32 //分解mm2=mm2:mm5
paddq mm7, mm5 //mm7=mm7+mm5
paddq mm0, mm2 //mm0=mm0+mm2
movd [ebx+20], mm7 //mm7低位存储
psrlq mm7, 32
paddq mm0, mm7 //得到进位
//3:3
movd mm1, [esi+12]
pmuludq mm1, [edi+12]
//mm0+mm1
movd mm6, eax
pand mm6, mm0
psrlq mm0, 32 //分解mm0=mm0:mm6
movd mm7, eax
pand mm7, mm1
psrlq mm1, 32 //分解mm1=mm1:mm7
paddq mm6, mm7 //mm6=mm6+mm7
paddq mm0, mm1 //mm0=mm0+mm1
movd [ebx+24], mm6 //mm6低位存储
psrlq mm6, 32
paddq mm0, mm6 //进位
movd [ebx+28], mm0 //存储
emms
// ret
}
} |
|