Битовые операции и оптимизация
От: Аноним  
Дата: 18.05.11 23:54
Оценка:
Вот это код переписанный руками:

ssize_t xor_read (int f, void* p, size_t l)
{
    int rb = read(f, p, l);
    
    uchar* q=(uchar*)p;
    int c = rb;
    while( 0 <= --c ) {
        
        _asm push eax
        _asm push ebx
        _asm push edx

        _asm xor edx, edx
        _asm mov eax, dword ptr [q]
        _asm mov dl, byte ptr [eax]
        _asm mov eax, edx
        _asm mov ebx, eax
        _asm shl eax, 4
        _asm shr ebx, 4
        _asm or  eax, ebx
        _asm xor eax, 12
        _asm mov ebx, dword ptr [q]
        _asm mov byte ptr [ebx], al

        _asm pop edx
        _asm pop ebx
        _asm pop eax

        ++q;
    }

    return rb;
}


Если верить профайлеру VTune работает быстрее чем вот этот:

#define process( ch ) (uchar)(((ch<<4)|(ch>>4))^12)

ssize_t xor_read (int f, void* p, size_t l)
{
    int rb = read(f, p, l);
    
    uchar* q=(uchar*)p;
    int c = rb;
    while( 0 <= --c ) {
        *q = process( *q );
/*
0069F126  mov         eax,dword ptr [q] 
0069F129  movzx       ecx,byte ptr [eax] 
0069F12C  shl         ecx,4 
0069F12F  mov         edx,dword ptr [q] 
0069F132  movzx       eax,byte ptr [edx] 
0069F135  sar         eax,4 
0069F138  or          ecx,eax 
0069F13A  xor         ecx,0ch 
0069F13D  mov         edx,dword ptr [q] 
0069F140  mov         byte ptr [edx],cl 
*/
        ++q;
    };

    return rb;
}


Что не так? (msvc 2008)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.