Я знаю 3 метода, но, насколько мне известно, обычно используются только первые 2:
1) Отметьте бит знака с помощью andps
или andnotps
.
- Плюсы: одна быстрая инструкция, если маска уже находится в регистре, что делает ее идеальной для выполнения этого много раз в цикле.
- Минусы: Маска может быть не в регистре или хуже, даже в кеше, что вызывает очень длинную выборку памяти.
2) Вычтите значение от нуля до отрицания, а затем получите max оригинала и отрицание.
- Плюсы: фиксированная стоимость, потому что ничего не нужно, чтобы получить, например, маску.
- Минусы: всегда будет медленнее, чем метод маски, если условия идеальны, и мы должны дождаться завершения
subps
перед использованием командыmaxps
.
3) Как и в случае с вариантом 2, вычтите исходное значение из нуля для отрицания, но затем "побитовое" и результат с оригиналом, используя andps
. Я провел тест, сравнивая это с методом 2, и, похоже, он ведет себя одинаково с методом 2, кроме случаев, когда имеет дело с NaN
s, и в этом случае результат будет другим результатом NaN
, чем метод 2.
- Плюсы: должно быть немного быстрее, чем метод 2, потому что
andps
обычно быстрее, чемmaxps
. - Минусы: может ли это привести к непреднамеренному поведению, когда
NaN
задействован? Может быть, нет, потому чтоNaN
по-прежнему являетсяNaN
, даже если это другое значениеNaN
, правильно?
Мысли и мнения приветствуются.