编辑
我测试了 32 位版本,代码很紧凑。因此,以下是 64 位问题。
我正在使用 VS 2012 RC。Debug 是 32 位的,Release 是 64 位的。下面是调试然后发布反汇编的一行代码:
crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff];
0000006f mov eax,dword ptr [ebp-40h]
00000072 shr eax,8
00000075 mov edx,dword ptr [ebp-3Ch]
00000078 mov ecx,0FF00h
0000007d and edx,ecx
0000007f shr edx,8
00000082 mov ecx,dword ptr [ebp-40h]
00000085 mov ebx,0FFh
0000008a and ecx,ebx
0000008c xor edx,ecx
0000008e mov ecx,dword ptr ds:[03387F38h]
00000094 cmp edx,dword ptr [ecx+4]
00000097 jb 0000009E
00000099 call 6F54F5EC
0000009e xor eax,dword ptr [ecx+edx*4+8]
000000a2 mov dword ptr [ebp-40h],eax
-----------------------------------------------------------------------------
crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff];
000000a5 mov eax,dword ptr [rsp+20h]
000000a9 shr eax,8
000000ac mov dword ptr [rsp+38h],eax
000000b0 mov rdx,124DEE68h
000000ba mov rdx,qword ptr [rdx]
000000bd mov eax,dword ptr [rsp+00000090h]
000000c4 and eax,0FF00h
000000c9 shr eax,8
000000cc mov ecx,dword ptr [rsp+20h]
000000d0 and ecx,0FFh
000000d6 xor eax,ecx
000000d8 mov ecx,eax
000000da mov qword ptr [rsp+40h],rdx
000000df mov rax,qword ptr [rsp+40h]
000000e4 mov rax,qword ptr [rax+8]
000000e8 mov qword ptr [rsp+48h],rcx
000000ed cmp qword ptr [rsp+48h],rax
000000f2 jae 0000000000000100
000000f4 mov rax,qword ptr [rsp+48h]
000000f9 mov qword ptr [rsp+48h],rax
000000fe jmp 0000000000000105
00000100 call 000000005FA5D364
00000105 mov rax,qword ptr [rsp+40h]
0000010a mov rcx,qword ptr [rsp+48h]
0000010f mov ecx,dword ptr [rax+rcx*4+10h]
00000113 mov eax,dword ptr [rsp+38h]
00000117 xor eax,ecx
00000119 mov dword ptr [rsp+20h],eax
64 位版本中的所有额外代码在做什么?它在测试什么?我没有对此进行基准测试,但 32 位代码应该执行得更快。
编辑
整体功能:
public static uint CRC32(uint val)
{
uint crc = 0xffffffff;
crc = (crc >> 8) ^ crcTable[(val & 0x000000ff) ^ crc & 0xff];
crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff];
crc = (crc >> 8) ^ crcTable[((val & 0x00ff0000) >> 16) ^ crc & 0xff];
crc = (crc >> 8) ^ crcTable[(val >> 24) ^ crc & 0xff];
// flip bits
return (crc ^ 0xffffffff);
}