【问题标题】:Dividing / Shifting Assembly Differences划分/移动装配差异
【发布时间】:2011-03-22 09:32:57
【问题描述】:

早上好,下午好,晚上好,

一直在查看关闭“抑制 JIT 优化 (...)”选项的调试版本的汇编代码,我注意到以下奇怪的行为(bitCountulong):

          int BitQuotient = (int)(bitCount / 32);

00000110  push        dword ptr [ebp+0Ch] 
00000113  push        dword ptr [ebp+8] 
00000116  push        0 
00000118  push        20h 
0000011a  call        738EF4D5 
0000011f  mov         dword ptr [ebp-44h],eax 

相对

          int BitQuotient = (int)(bitCount >> 5);

00000110  mov         eax,dword ptr [ebp+8] 
00000113  mov         edx,dword ptr [ebp+0Ch] 
00000116  shrd        eax,edx,5 
0000011a  shr         edx,5 
0000011d  mov         dword ptr [ebp-44h],eax 

为什么在组装上有这样的差异?编译器不应该检测到除以 32 与右移 5 相同并替换代码吗?另外,call 指令在第一段代码上做了什么?我怀疑这与将运算符 / 应用于非原生 ulong 有关,但这也意味着编译器不会内联这种运算符?

编辑:看看int BitRemainder = (int)(bitCount % 32)而不是int BitRemainder = (int)(bitCount & 31)

00000120  mov         eax,dword ptr [ebp+8] 
00000123  mov         edx,dword ptr [ebp+0Ch] 
00000126  mov         ecx,20h 
0000012b  cmp         edx,ecx 
0000012d  jb          00000139 
0000012f  mov         ebx,eax 
00000131  mov         eax,edx 
00000133  xor         edx,edx 
00000135  div         eax,ecx 
00000137  mov         eax,ebx 
00000139  div         eax,ecx 
0000013b  mov         eax,edx 
0000013d  xor         edx,edx 
0000013f  mov         dword ptr [ebp-48h],eax 

00000120  mov         eax,dword ptr [ebp+8] 
00000123  and         eax,1Fh 
00000126  mov         dword ptr [ebp-48h],eax 

非常感谢。

【问题讨论】:

  • bitCount的数据类型是什么?
  • 对不起... bitCount 是ulong
  • 啊,我正要开始谈论 -ve 数字;干得好,你添加了那个!
  • 您是否实际分析过是否存在明显的速度差异?很可能是现代 CPU 它们实际上是相同的......
  • 嗯,使用Stopwatch32 * 200000000 迭代,平均差异并不明显......但无论如何,这很奇怪。

标签: c# assembly


【解决方案1】:

第一个 sn-p 中的代码执行 64 位除法。 x86 抖动不会为该内联生成机器代码,它会太多。它依赖于一个名为 JIT_ULDiv 的辅助函数。这是针对抖动或 C 编译器的常见策略。您可以在 SSCLI20 源代码、clr/src/vm/jithelpers.cpp 源代码文件中看到 jitter 可以使用的帮助函数类型。 long 和 ulong 算术的辅助函数位于文件顶部。

第二个 sn-p 执行 32 位除法,只需要很少的机器代码指令就可以在线生成。将除法转换为移位是一种简单的优化。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多