Безотраслевой способ условно очистки реестра
Существует ли способ ветвления для очистки 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
либо очистит регистр назначения, либо оставит его без изменений.
Можно инвертировать условие, переключая маску или инвертируя флаг переноса. Проверка на ноль может быть достигнута либо вычитанием одного из тестируемого регистра, либо вычитанием тестируемого регистра из нуля. Первые наборы несут, если регистр был нулем; наборы второй формы несут в том случае, если регистр был ненулевым.