Для хобби-проекта, над которым я работаю, мне нужно эмулировать определенные 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 -бит в любом случае , и поэтому мне не нужно эти обходные пути)