Быстрый поиск и замена некоторого полубайта в int [c; микрооптимизация]

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

Задача состоит в том, чтобы найти предопределенный полубайт в int32 и заменить его другим полубайтом. Например, полубайт для поиска - 0x5; полубайт, который нужно заменить, равен 0xe:

int:   0x3d542753 (input)
           ^   ^
output:0x3dE427E3 (output int)

Может быть другая пара полубайта для поиска и полубайта для замены (известная во время компиляции).

Я проверил свою программу, эта часть является одной из самых горячих (проверено gprof, 75% времени находится в функции); и это называется очень-очень много раз (доказано gcov). Фактически это 3-й или 4-й цикл вложенных циклов с оценкой количества запусков (n ^ 3) * (2 ^ n) для n = 18..24.

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

static inline uint32_t nibble_replace (uint32_t A) __attribute__((always_inline))
{
  int i;
  uint32_t mask = 0xf;
  uint32_t search = 0x5;
  uint32_t replace = 0xe;
  for(i=0;i<8;i++) {
    if( (A&mask) == search ) 
        A = (A & (~mask) )   // clean i-th nibble
           | replace;        // and replace
    mask <<= 4; search <<= 4; replace <<= 4;
  }
  return A;
}

Можно ли переписать эту функцию и макрос параллельно, используя магию битовой логики? Magic - это что-то вроде (t-0x11111111) & (~ t) -0x88888888 и, возможно, его можно использовать с SSE *. Проверьте принятый ответ на связанный вопрос, чтобы получить представление о необходимой магии.

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

5
задан Community 23 May 2017 в 10:34
поделиться