Безотраслевой способ условно очистки реестра

Существует ли способ ветвления для очистки 32-битного регистра в зависимости от состояния регистра состояния? Это может быть достигнуто с помощью дополнительного четкого регистра и CMOVcc, но это слишком дорого для x86 в 32-битном режиме для меня. грустно CMOVcc не иметь версии с операндом immideate. Чтение из памяти тоже плохой вариант.

Есть SETcc (хотя операнд 1 байт), но не "CLEARcc"инструкция по x86.

2 ответа

Решение

Это может вас разочаровать, но CMOVcc очень хорошо в этом отношении. Используя это с переменной ddZERO со значением 0 не так уж и плохо, особенно в цикле.

CMOVcc rTarget, ddZERO

сбрасывает rTarget зарегистрироваться на ноль, если cc условия соблюдены.
В противном случае (есть иное) вы можете инвертировать сценарий и CMOVcc на НЕ СООТВЕТСТВУЮЩЕМ состоянии Какой выбор будет лучше, зависит от частоты возникновения.

Если у вас есть регистр со значением 0 Вы должны использовать это вместо этого. Но если вы не можете сэкономить регистр, используя (кэшированную) область памяти, это не так уж плохо. Эта оценка основана на опыте, и IIRC, использующий константу в области кэшированной памяти L1, имеет практически незначительную задержку в цикле.

По сути, в большинстве ISA есть один общий метод, обеспечивающий настройку ветвления или очистку регистра: генерирование маски "все ноль" или "все единицы" из флага переноса: sbb reg,reg очищает маску, когда перенос равен нулю, и устанавливает маску, когда перенос установлен. С последующим and dst, reg либо очистит регистр назначения, либо оставит его без изменений.

Можно инвертировать условие, переключая маску или инвертируя флаг переноса. Проверка на ноль может быть достигнута либо вычитанием одного из тестируемого регистра, либо вычитанием тестируемого регистра из нуля. Первые наборы несут, если регистр был нулем; наборы второй формы несут в том случае, если регистр был ненулевым.

Другие вопросы по тегам