Быстрый поиск нескольких полубайтов в двух целочисленных значениях с одинаковым смещением (C, микрооптимизация)

Моя задача - проверить (> триллионов проверок), содержат ли два int какую-либо из предопределенных пар полубайтов (первая пара 0x2 0x7; вторая 0xd 0x8). Например:

bit offset:   12345678
first int:  0x3d542783     first pair of  0x2    second:   0xd   
second int: 0x486378d9      nibbles:      0x7      pair:   0x8
               ^  ^

Итак, в этом примере я помечаю два смещения необходимыми парами (смещения 2 и 5, но не 7). Фактические смещения и количество найденных пар не нужны в моей задаче.

Итак, для данных двух int возникает вопрос: Содержат ли они любую из этих пар полубайтов с одинаковым смещением.

Я проверил моя программа, эта часть самое горячее место ( gprof проверено); и это называется очень-очень много раз ( gcov доказано). На самом деле это 3-й или 4-й цикл (наиболее вложенный) вложенных циклов.

Мой текущий код медленный (я переписываю его как функцию, но это код из внутреннего цикла):

static inline int nibble_check (uint32_t A, uint32_t B)
 __attribute__((always_inline))
{
  int i;
  for(i=0;i<8;i++)

    if(  ( ( (A&0xf) ==0xD) && ( (B&0xf) ==0x8) )     // first pair
      || ( ( (A&0xf) ==0x2) && ( (B&0xf) ==0x7) )  )  // second pair
        return 1; // nibbles found
    else {
        A>>=4;
        B>>=4;
    }

  return 0; // nibbles not found
}

Другая задача - найти эти пары не только по смещениям 0,4,8 бит и так далее, но и по смещениям 0,2,4,8,10, ... бит:

#define douburu_nibble_check(A,B) (nibble_check(A,B) || nibble_check(A>>2, B>>2) )

Можно ли переписать эта функция и макрос параллельно?

Мой компилятор - gcc452, а процессор - Intel Core2 Solo в 32-битном режиме (x86).

8
задан osgx 19 April 2013 в 15:06
поделиться