Это вариант Быстрый поиск некоторых полубайтов в двух 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).