找回密码
 欢迎注册
查看: 7690|回复: 4

[讨论] B计划之移位

[复制链接]
发表于 2009-2-17 10:55:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
对这个专题
有些生疏了
先贴上很早以前的代码
  1. //移位   假设es   =   ds  
  2.   //左移   pL   <<   s   =   pA   (s   <   32)  
  3.   void   AsmShl(unsigned   long   *   pL,   unsigned   long   *   pA,   unsigned   long   t,   unsigned   long   s)  
  4.   {  
  5.   if   (t   ==   0)  
  6.         return;  
  7.   asm   {  
  8.           push   ds  
  9.           mov     ebx,   t  
  10.           mov     ecx,   s  
  11.           lea     esi,   dword   ptr   pL  
  12.           lea     edi,   dword   ptr   pA  
  13.           mov     edx,   0  
  14.           cld  
  15.           }  
  16.   AsmShl1:  
  17.   asm   {  
  18.           lodsd  
  19.           push   eax  
  20.           shld   eax,   edx,   cl  
  21.           pop     edx  
  22.           stosd  
  23.           dec     ebx  
  24.           jnz   AsmShl1  
  25.           mov     bl,   32  
  26.           sub     bl,   cl  
  27.           mov     cl,   bl  
  28.           shr     edx,   cl  
  29.           mov     [edi],   edx  
  30.           pop     ds  
  31.           }  
  32.   }  
  33.    
  34.   //右移   pL   >>   s   =   pA   (s   <   32)  
  35.   void   AsmShr(unsigned   long   *   pL,   unsigned   long   *   pA,   unsigned   long   t,   unsigned   long   s)  
  36.   {  
  37.   if   (t   ==   0)  
  38.         return;  
  39.   asm   {  
  40.           push   ds  
  41.           mov     ebx,   t  
  42.           mov     ecx,   s  
  43.           lea     esi,   dword   ptr   pL  
  44.           lea     edi,   dword   ptr   pA  
  45.           mov     edx,   [esi]  
  46.           add     esi,   4  
  47.           dec     ebx  
  48.           jz       AsmShr2  
  49.           cld  
  50.           }  
  51.   AsmShr1:  
  52.   asm   {  
  53.           lodsd  
  54.           shrd   edx,   eax,   cl  
  55.           xchg   edx,   eax  
  56.           stosd  
  57.           dec     ebx  
  58.           jnz   AsmShr1  
  59.           }  
  60.   AsmShr2:  
  61.   asm   {  
  62.           shr     edx,   cl  
  63.           mov     [edi],   edx  
  64.           pop     ds  
  65.           }  
  66.   }  
  67.    
  68.   
复制代码
然后考虑做出优化的代码来
可以用MMX/SSE/SSE2等指令
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-17 11:38:53 | 显示全部楼层

  1. typedef unsigned int DWORD;

  2.   //左移   pL   <<   s   =   pA   (s   <   32)
  3.   //最高位移出的数据做返回值
  4.   //不检查t, s为0的情况,乃高级函数的事情
  5.   __declspec(naked)
  6.   DWORD  __cdecl BAsmShl(DWORD * pA, DWORD * pL, DWORD t, DWORD s)  
  7.   {  

  8.           __asm   {
  9.                   push ebx
  10.                   push esi
  11.                   push edi
  12.                   mov ecx, [esp + 12 + 16]
  13.           mov  ebx, [esp + 12 + 12]  
  14.                   shl ebx, 2
  15.           mov  esi, [esp + 12 + 8]
  16.                   add  esi, ebx
  17.           mov  edi, [esp + 12 + 4]
  18.                   add edi, ebx
  19.                   neg ebx
  20.           xor  edx, edx
  21.   AsmShl1:  
  22.           mov eax, dword ptr [esi + ebx]
  23.           shld eax, edx, cl  
  24.           mov edx, dword ptr [esi + ebx]
  25.           mov dword ptr [edi + ebx], eax
  26.           add  ebx, 4  
  27.           jnz  AsmShl1  
  28.           sub  ecx,   32
  29.                   neg  ecx
  30.                   mov  eax, edx
  31.           shr  eax, cl      
  32.                   pop edi
  33.                   pop esi
  34.                   pop ebx
  35.                   ret
  36.           }  
  37.   }  
复制代码

优化1, 通用版本
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-17 16:29:17 | 显示全部楼层
好了
2#的程序测试完成了
另外,ALU形式的不知道是否4路展开合适否

下一个考虑MMX形式的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-17 17:54:59 | 显示全部楼层
  1. __declspec(naked)
  2.   DWORD  __cdecl BAsmShl_MMX(DWORD * pA, DWORD * pL, DWORD t, DWORD s)  
  3.   {  

  4.           __asm   {
  5.    movd mm0, dword ptr [esp + 16]  //s
  6.    mov ecx, dword ptr [esp + 12] //t
  7.    mov eax, dword ptr [esp + 8]
  8.    shl ecx, 2
  9.    add eax, ecx
  10.    mov edx, dword ptr [esp + 4]
  11.    add edx, ecx
  12.    neg ecx
  13.    pxor mm1, mm1
  14. asmLoop1:
  15.           movd mm2, dword ptr [eax + ecx]
  16.    psllq mm2, mm0
  17.           por  mm2, mm1
  18.    movd dword ptr [edx + ecx], mm2
  19.    punpckhdq mm2, mm1
  20.           movq mm1, mm2
  21.    add ecx, 4
  22.    jnz asmLoop1
  23.           movd eax, mm1
  24.    emms
  25.    ret
  26.    }  
  27.   }   
复制代码
时间几乎和ALU版本相同
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-17 20:55:51 | 显示全部楼层
Core 2 XEON 1.6G
100万次1024DWORD左移3位
两个版本都是1.95秒
差距在0.01秒以下

大概3.07Clock/DWORD
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-4 03:30 , Processed in 0.056412 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表