У меня есть некоторый высокопроизводительный код, который выполняет манипуляции с битами. Его можно свести к следующей четко определенной проблеме:
Для 13-битного растрового изображения создайте 26-битную растровую карту, содержащую исходные биты, расположенные на ровных позициях.
Чтобы проиллюстрировать:
0000000000000000000abcdefghijklm (input, 32 bits)
0000000a0b0c0d0e0f0g0h0i0j0k0l0m (output, 32 bits)
В настоящее время я реализовал его в C:
if (input & (1 << 12))
output |= 1 << 24;
if (input & (1 << 11))
output |= 1 << 22;
if (input & (1 << 10))
output |= 1 << 20;
...
Мой компилятор (MS Visual Studio) превратил это в следующее:
test eax,1000h
jne 0064F5EC
or edx,1000000h
... (repeated 13 times with minor differences in constants)
Интересно, могу ли я сделать это быстрее. Я хотел бы, чтобы мой код написан на C, но возможно переход на язык ассемблера.
- Могу ли я использовать некоторые инструкции MMX/SSE для обработки всех бит одновременно?
- Может быть, я могу использовать умножение? (умножить на 0x11111111 или какую-либо другую магическую константу)
- Было бы лучше использовать инструкцию условного набора (SETcc) вместо инструкции условного перехода? Если да, как я могу заставить компилятор создать такой код для меня?
- Любая другая идея, как сделать это быстрее?
- Любая идея, как сделать обратное преобразование растрового изображения (я должен реализовать его тоже, бит его менее критическим)?