Оптимизированная для SSE эмуляция 64 -битных целых чисел

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

9
задан phuclv 6 June 2019 в 01:44
поделиться