Оптимизация побитовой логики

В моем коде следующие строки в настоящее время являются горячей точкой:

int table1[256] = /*...*/;
int table2[512] = /*...*/;
int table3[512] = /*...*/;

int* result = /*...*/;
for(int r = 0; r < r_end; ++r)
{
    std::uint64_t bits = bit_reader.value(); // 64 bits, no assumption regarding bits.

    // The get_ functions are table lookups from the highest word of the bits variable.

    struct entry
    {
        int sign_offset : 5;
        int r_offset    : 4;        
        int x           : 7;        
    };

    // NOTE: We are only interested in the highest word in the bits variable.

    entry e;
    if(is_in_table1(bits)) // branch prediction should work well here since table1 will be hit more often than 2 or 3, and 2 more often than 3.
        e = reinterpret_cast(table1[get_table1_index(bits)]);
    else if(is_in_table2(bits))
        e = reinterpret_cast(table2[get_table2_index(bits)]);
    else
        e = reinterpret_cast(table3[get_table3_index(bits)]);

    r                 += e.r_offset; // r is 18 bits, top 14 bits are always 0.
    int x              = e.x; // x is 14 bits, top 18 bits are always 0.        
    int sign_offset    = e.sign_offset;

    assert(sign_offset <= 16 && sign_offset > 0);

    // The following is the hotspot.

    int sign    = 1 - (bits >> (63 - sign_offset) & 0x2);
    (*result++) = ((x << 18) * sign) | r; // 32 bits

    // End of hotspot

    bit_reader.skip(sign_offset); // sign_offset is the last bit used.
}

Хотя я еще не понял, как еще оптимизировать это, может быть, что-то из встроенных функций для операций в битах -гранулярность ,__shiftleft128или_rotможет быть полезно?

Обратите внимание, что я также выполняю обработку полученных данных на графическом процессоре, поэтому важно получить что-то в result, что затем может быть использовано графическим процессором для правильного вычисления.

Предложения?

РЕДАКТИРОВАТЬ:

Добавлен просмотр таблицы -вверх.

РЕДАКТИРОВАТЬ:

            int sign = 1 - (bits >> (63 - e.sign_offset) & 0x2);
000000013FD6B893  and         ecx,1Fh  
000000013FD6B896  mov         eax,3Fh  
000000013FD6B89B  sub         eax,ecx  
000000013FD6B89D  movzx       ecx,al  
000000013FD6B8A0  shr         r8,cl  
000000013FD6B8A3  and         r8d,2  
000000013FD6B8A7  mov         r14d,1  
000000013FD6B8AD  sub         r14d,r8d  

12
задан 18 revs, 3 users 100% 14 August 2012 в 10:38
поделиться