| 
注册时间2008-2-6最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分51605在线时间 小时 
 | 
 
 楼主|
发表于 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
 }
} | 
 |