Я не уверен, что инструкции SSE помогают сократить количество операций, необходимых для реализации того, что ваш код выполняет здесь; если кто-нибудь знает, мне тоже будет любопытно. Давайте немного разложим код.
Код представляет собой рекурсивный сдвиг / или последовательность, то есть вы берете младшие 6 бит, сдвигаете их влево на шесть или следующие 6 бит, снова сдвигаете и т. Д.
Таким образом, вы конвертируете массив из восьмибитных значений в упакованный массив из шести битов, и вы уменьшаете размер с 64 до 48 бит. Как:
|76543210|76543210|76543210|76543210|76543210|76543210|76543210|76543210|
|-----------------|54321054|32105432|10543210|54321054|32105432|10543210|
Поэтому вы можете размотать цикл и записать его следующим образом:
/*
* (buf[x] << 58)
* moves lowest six bits of a 64bit long into the highest bits, clears others
*
* >> (6 * x + 16)
* shifts the bits into the expected final position
*/
#define L(x) (((long)buf[x] << 58) >> (6 * x + 16))
long rv = L(0) | L(1) | L(2) | L(3) | L(4) | L(5) | L(6) | L(7);
Как уже упоминалось, я не знаю инструкции SSE, которая бы помогла с такой упаковкой (пакеты SSE выполняют четырехзначное, слово-короткое, короткое-байтовое).
Вы можете выполнять операции внутри регистров SSE, но, насколько я вижу, не уменьшать количество инструкций, необходимых для получения конечного результата.