- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
楼主 |
发表于 2008-4-10 20:15:26
|
显示全部楼层
写了一个四路并行乘法
有时间调试下看效果如何?
mov esi, [left]
mov edi, [right]
mov ebx, [result]
mov ecx, [sLeft]
mov edx, [sRight]
cmp ecx, edx
jbe noExchange
xchg esi, [right]
xchg edi, [left]
xchg ecx, [sRight]
xchg edx, [sLeft]
noExchange:
test ecx, -1
je exit1 //长度0
test edx, -1
je exit1 //长度0
mov ecx, 0
pxor mm0, mm0
movd mm7, [esi]
add esi, 4
mov eax, edx
shr edx, 2
je firstLoop2 //不足4个
firstLoop1:
movd mm1, [edi]
pmuludq mm1, mm7
movd mm2, [edi+4]
pmuludq mm2, mm7
movd mm3, [edi+8]
pmuludq mm3, mm7
movd mm4, [edi+12]
pmuludq mm4, mm7
add edi, 16
paddq mm0, mm1
movd [ebx], mm0
psrlq mm0, 32
paddq mm0, mm2
movd [ebx+4], mm0
psrlq mm0, 32
paddq mm0, mm3
movd [ebx+8], mm0
psrlq mm0, 32
paddq mm0, mm4
movd [ebx+12], mm0
psrlq mm0, 32
add ebx, 16
sub edx, 1
jne firstLoop1
firstLoop2:
mov edx, eax
and edx, 3
je exitFirstLoop
firstLoop3:
movd mm1, [edi]
pmuludq mm1, mm7
add edi, 4
paddq mm0, mm1
movd [ebx], mm0
psrlq mm0, 32
add ebx, 4
sub edx, 1
jne firstLoop3
exitFirstLoop:
movd [ebx], mm0
add ecx, 1
cmp ecx, [sLeft]
jae exit1 //左操作数就一个双字
add esi, 4
outLoop1:
movd mm7, [esi]
mov ebx, [result]
lea ebx, [ebx+ecx*4]
mov edi, [right]
mov edx, [sRight]
pxor mm0, mm0
mov eax, edx
shr edx, 2
je innerLoop2
innerLoop1:
movd mm1, [edi]
pmuludq mm1, mm7
movd mm5, [ebx]
movd mm2, [edi+4]
pmuludq mm2, mm7
movd mm6, [ebx+4]
movd mm3, [edi+8]
pmuludq mm3, mm7
movd mm4, [edi+12]
pmuludq mm4, mm7
add edi, 16
paddq mm0, mm1
paddq mm0, mm5
movd [ebx], mm0
movd mm5, [ebx+8]
psrlq mm0, 32
paddq mm0, mm2
paddq mm0, mm6
movd [ebx+4], mm0
movd mm6, [ebx+12]
psrlq mm0, 32
paddq mm0, mm3
paddq mm0, mm5
movd [ebx+8], mm0
psrlq mm0, 32
paddq mm0, mm4
paddq mm0, mm6
movd [ebx+12], mm0
psrlq mm0, 32
add ebx, 16
sub edx, 1
jne innertLoop1
innerLoop2:
mov edx, eax
and edx, 3
je outLoop2
innerLoop3:
movd mm1, [edi]
pmuludq mm1, mm7
movd mm5, [ebx]
add edi, 4
paddq mm0, mm1
paddq mm0, mm5
movd [ebx], mm0
psrlq mm0, 32
add ebx, 4
sub edx, 1
jne firstLoop2
outLoop2:
movd [ebx], mm0
add ecx, 1
cmp ecx, [sLeft]
jb outLoop1
exit1: |
|