找回密码
 欢迎注册
查看: 12045|回复: 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. //右移 pL >> s = pA (s < 32)
  34. void AsmShr(unsigned long * pL, unsigned long * pA, unsigned long t, unsigned long s)
  35. {
  36. if (t == 0)
  37. return;
  38. asm {
  39. push ds
  40. mov ebx, t
  41. mov ecx, s
  42. lea esi, dword ptr pL
  43. lea edi, dword ptr pA
  44. mov edx, [esi]
  45. add esi, 4
  46. dec ebx
  47. jz AsmShr2
  48. cld
  49. }
  50. AsmShr1:
  51. asm {
  52. lodsd
  53. shrd edx, eax, cl
  54. xchg edx, eax
  55. stosd
  56. dec ebx
  57. jnz AsmShr1
  58. }
  59. AsmShr2:
  60. asm {
  61. shr edx, cl
  62. mov [edi], edx
  63. pop ds
  64. }
  65. }
复制代码
然后考虑做出优化的代码来 可以用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-11-22 13:39 , Processed in 0.028023 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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