Для хобби-проекта, над которым я работаю, мне нужно эмулировать определенные 64-битные целочисленные операции на процессоре x86, и он должен быть быстрым.
В настоящее время я делаю это с помощью инструкций MMX, но на самом деле это боль, с которой нужно работать, потому что мне нужно постоянно обновлять состояние регистра fp (и потому, что большинство команд MMX имеют дело со значными целыми числами, и мне нужно беззнаковое поведение).
Итак, мне интересно, смогут ли гуру SSE/оптимизации здесь на SO лучше реализовать с использованием SSE.
Операции, в которых я нуждаюсь, являются следующими (весьма специфическими):
uint64_t X, Y;
X = 0;
X = 1;
X << 1;
X != Y;
X + 1;
X & 0x1 // get lsb
X | 0x1 // set lsb
X > Y;
В частности, мне не нужна добавка или смена общего назначения, например, просто добавьте один и левый сдвиг. На самом деле, именно точные операции показаны здесь.
Кроме того, конечно, на x86, uint64_t
эмулируется с использованием двух 32-битных скаляров, что является медленным (и, в моем случае, просто не работает, потому что мне нужно, чтобы грузы/хранилища были атомарными, которые они не будут при загрузке/хранении двух отдельных регистров).
Следовательно, мне нужно решение SIMD.
Некоторые из этих операций тривиальны, уже поддерживаются SSE2. Другие (!=
и <
) требуют немного больше работы.
Предложения? SSE и SSE2 в порядке. Для разрешения SSE3 потребуется некоторое убеждение, и SSE4, вероятно, не может быть и речи (процессор, поддерживающий SSE4, вероятно, будет работать на 64-разрядном уровне, и поэтому мне не нужны эти обходные пути)