beqz
псевдоlyszt.net охватывает beqz и другие инструкции RISC-V более подробно.
Описание
beqz выполняет переход, когда регистр содержит ноль. Название означает branch if equal to zero (переход, если равно нулю). В приведённой ниже форме процессор переходит к помеченной позиции, когда rs равен нулю, а в противном случае продолжает к следующей инструкции.
beqz rs, label
beqz — это псевдоинструкция, читаемое имя, которое ассемблер переписывает в реальную инструкцию. Она превращается в инструкцию ниже, которая сравнивает регистр с zero, специальным регистром, который всегда содержит 0.
beq rs, zero, label
beqz даёт более короткий способ записи самого распространённого сравнения. См. beq, чтобы узнать, как работают ветвления и метки.
Ноль часто встречается в низкоуровневом коде, поэтому и существует это сокращение. Нулевой байт отмечает конец текста. Ноль — обычный сигнал того, что операция завершилась успешно. Ноль также представляет пустое или отсутствующее значение, а циклы обратного отсчёта завершаются на нуле. Проверка на ноль используется после загрузки символа для обнаружения конца строки, на возвращённом статусе для выбора пути успеха и на счётчике для завершения цикла.
Руководство RISC-V приводит одну причину, по которой его ветвления сравнивают два регистра, а не сравнивают один регистр с нулём. Сравнения с нулём требуют нетривиальной задержки схемы, поэтому они почти так же дороги, как сравнения арифметических величин. Поэтому beqz — это псевдоинструкция, использующая beq с zero.
Первая строка ниже читается яснее, чем вторая, которая явно записывает сравнение с нулём.
beqz t0, done beq t0, zero, done
Псевдоинструкции существуют для читаемости, и машинный код, который они создают, идентичен. Её противоположность — bnez, которая выполняет переход, когда значение не равно нулю.
Разворачивается в
beq rs, zero, label
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
li t0, 0 beqz t0, done # t0 == 0, so jump to 'done'
