VC2008(VC9)的代码优化
(2007-11-07 23:19)
BCB与VC6的优化差不多,只是调用约定不同,平衡堆栈方式,BCB是__stdcall,而VC6是__cdecl。
VC9的优化,爽的厉害,内循环完全展开,4个寄存器用的恰到好处,一气呵成,流畅舒服。
C代码:
unsigned int calc_our_crc(unsigned int crc_head, const void * buf, int lenth)
{
unsigned int crc;
unsigned char * p = (unsigned char *)buf;
int j;
crc = crc_head;
while(lenth --) {
crc ^= ((* p) << 0x10);
p++;
for(j = 0; j<8; j++) {
crc += crc;
if (crc & 0x80000000)
crc ^= unsigned int(0x11864CFB);
}
}
return crc;
}
C++ Builder
::1006DAC8:: 55 PUSH EBP :BYCALL
::1006DAC9:: 8BEC MOV EBP,ESP
::1006DACB:: 53 PUSH EBX
::1006DACC:: 8B5D 10 MOV EBX,[EBP+10]
::1006DACF:: 8B45 08 MOV EAX,[EBP+8]
::1006DAD2:: 8B4D 0C MOV ECX,[EBP+C]
::1006DAD5:: EB 20 JMP SHORT 1006DAF7 :JMPDOWN
::1006DAD7:: 33D2 XOR EDX,EDX :BYJMP JmpBy:1006DAFE,
::1006DAD9:: 8A11 MOV DL,[ECX]
::1006DADB:: C1E2 10 SHL EDX,10
::1006DADE:: 33C2 XOR EAX,EDX
::1006DAE0:: 41 INC ECX
::1006DAE1:: 33D2 XOR EDX,EDX
::1006DAE3:: 03C0 ADD EAX,EAX :BYJMP JmpBy:1006DAF5,
::1006DAE5:: A9 00000080 TEST EAX,80000000
::1006DAEA:: 74 05 JE SHORT 1006DAF1 :JMPDOWN
::1006DAEC:: 35 FB4C8611 XOR EAX,11864CFB
::1006DAF1:: 42 INC EDX :BYJMP JmpBy:1006DAEA,
::1006DAF2:: 83FA 08 CMP EDX,8
::1006DAF5:: 7C EC JL SHORT 1006DAE3 :JMPUP
::1006DAF7:: 8BD3 MOV EDX,EBX :BYJMP JmpBy:1006DAD5,
::1006DAF9:: 83C3 FF ADD EBX,-1
::1006DAFC:: 85D2 TEST EDX,EDX
::1006DAFE:: 75 D7 JNZ SHORT 1006DAD7 :JMPUP
::1006DB00:: 5B POP EBX
::1006DB01:: 5D POP EBP
::1006DB02:: C2 0C00 RETN C
VC6
::10001F20:: 8B4C24 0C MOV ECX, DWORD PTR [ESP+C] :BYCALL CallBy:10001C1A,
::10001F24:: 8B5424 08 MOV EDX, DWORD PTR [ESP+8]
::10001F28:: 8B4424 04 MOV EAX, DWORD PTR [ESP+4]
::10001F2C:: 56 PUSH ESI
::10001F2D:: 8BF1 MOV ESI, ECX
::10001F2F:: 49 DEC ECX
::10001F30:: 85F6 TEST ESI, ESI
::10001F32:: 74 26 JE SHORT 10001F5A :JMPDOWN
::10001F34:: 8D71 01 LEA ESI, DWORD PTR [ECX+1]
::10001F37:: 33C9 XOR ECX, ECX :BYJMP JmpBy:10001F58,
::10001F39:: 8A0A MOV CL, BYTE PTR [EDX]
::10001F3B:: C1E1 10 SHL ECX, 10
::10001F3E:: 33C1 XOR EAX, ECX
::10001F40:: 42 INC EDX
::10001F41:: B9 08000000 MOV ECX, 8
::10001F46:: 03C0 ADD EAX, EAX :BYJMP JmpBy:10001F55,
::10001F48:: A9 00000080 TEST EAX, 80000000
::10001F4D:: 74 05 JE SHORT 10001F54 :JMPDOWN
::10001F4F:: 35 FB4C8611 XOR EAX, 11864CFB
::10001F54:: 49 DEC ECX :BYJMP JmpBy:10001F4D,
::10001F55:: 75 EF JNZ SHORT 10001F46 :JMPUP
::10001F57:: 4E DEC ESI
::10001F58:: 75 DD JNZ SHORT 10001F37 :JMPUP
::10001F5A:: 5E POP ESI :BYJMP JmpBy:10001F32,
::10001F5B:: C3 RETN
VC2008(VC9)的优化
::00401000:: 8B5424 0C MOV EDX,[ESP+C] :BYCALL CallBy:00402B1E,
::00401004:: 8B4C24 08 MOV ECX,[ESP+8]
::00401008:: 8B4424 04 MOV EAX,[ESP+4]
::0040100C:: 85D2 TEST EDX,EDX
::0040100E:: 74 68 JE SHORT 00401078 :JMPDOWN
::00401010:: 56 PUSH ESI
::00401011:: 0FB631 MOVZX ESI,BYTE PTR [ECX] :BYJMP JmpBy:00401075,
::00401014:: C1E6 10 SHL ESI,10
::00401017:: 33C6 XOR EAX,ESI
::00401019:: 03C0 ADD EAX,EAX
::0040101B:: 4A DEC EDX
::0040101C:: 41 INC ECX
::0040101D:: 85C0 TEST EAX,EAX
::0040101F:: 79 05 JNS SHORT 00401026 :JMPDOWN
::00401021:: 35 FB4C8611 XOR EAX,11864CFB
::00401026:: 03C0 ADD EAX,EAX :BYJMP JmpBy:0040101F,
::00401028:: 85C0 TEST EAX,EAX
::0040102A:: 79 05 JNS SHORT 00401031 :JMPDOWN
::0040102C:: 35 FB4C8611 XOR EAX,11864CFB
::00401031:: 03C0 ADD EAX,EAX :BYJMP JmpBy:0040102A,
::00401033:: 85C0 TEST EAX,EAX
::00401035:: 79 05 JNS SHORT 0040103C :JMPDOWN
::00401037:: 35 FB4C8611 XOR EAX,11864CFB
::0040103C:: 03C0 ADD EAX,EAX :BYJMP JmpBy:00401035,
::0040103E:: 85C0 TEST EAX,EAX
::00401040:: 79 05 JNS SHORT 00401047 :JMPDOWN
::00401042:: 35 FB4C8611 XOR EAX,11864CFB
::00401047:: 03C0 ADD EAX,EAX :BYJMP JmpBy:00401040,
::00401049:: 85C0 TEST EAX,EAX
::0040104B:: 79 05 JNS SHORT 00401052 :JMPDOWN
::0040104D:: 35 FB4C8611 XOR EAX,11864CFB
::00401052:: 03C0 ADD EAX,EAX :BYJMP JmpBy:0040104B,
::00401054:: 85C0 TEST EAX,EAX
::00401056:: 79 05 JNS SHORT 0040105D :JMPDOWN
::00401058:: 35 FB4C8611 XOR EAX,11864CFB
::0040105D:: 03C0 ADD EAX,EAX :BYJMP JmpBy:00401056,
::0040105F:: 85C0 TEST EAX,EAX
::00401061:: 79 05 JNS SHORT 00401068
::00401063:: 35 FB4C8611 XOR EAX,11864CFB
::00401068:: 03C0 ADD EAX,EAX :BYJMP JmpBy:00401061,
::0040106A:: 85C0 TEST EAX,EAX
::0040106C:: 79 05 JNS SHORT 00401073 :JMPDOWN
::0040106E:: 35 FB4C8611 XOR EAX,11864CFB
::00401073:: 85D2 TEST EDX,EDX :BYJMP JmpBy:0040106C,
::00401075:: 75 9A JNZ SHORT 00401011 :JMPUP
::00401077:: 5E POP ESI
::00401078:: C3 RETN :BYJMP JmpBy:0040100E,