seqz
псевдоlyszt.net охватывает seqz и другие инструкции RISC-V более подробно.
Описание
seqz проверяет, содержит ли регистр ноль. Название означает "set if equal to zero" (установить, если равно нулю). Когда исходный регистр rs равен нулю, приведённая ниже форма записывает 1 в регистр назначения rd, а 0 — когда rs содержит любое другое значение.
seqz rd, rs
Результат — 1 или 0, отвечающий на вопрос, равно ли значение нулю.
seqz — это псевдоинструкция: читаемое имя, которое ассемблер переписывает в реальную инструкцию. Результатом является приведённая ниже инструкция, которая спрашивает, меньше ли значение 1.
sltiu rd, rs, 1
Среди беззнаковых чисел 0 — единственное значение меньше 1. Вы пишете seqz, а ассемблер выполняет перевод.
Ни одна инструкция RISC-V не спрашивает, равны ли два значения, поэтому seqz используется для построения проверок на равенство. Примените XOR к двум значениям, что даёт ноль, когда они совпадают, и ненулевой результат, когда они различаются, затем примените seqz к этому результату. 1 означает, что исходные значения были равны. Страница xor объясняет, почему XOR обнаруживает равенство.
Руководство RISC-V определяет seqz как псевдоинструкцию ассемблера для sltiu с константой 1, которая устанавливает rd в 1, если rs1 равно нулю, и в 0 в противном случае.
seqz также инвертирует смысл значения истина или ложь. Регистр, содержащий 0, становится 1, а любое ненулевое значение становится 0. Ответ — обычное число, поэтому его можно использовать в дальнейшей арифметике, например умножить на него, чтобы обнулить значение по условию. Его аналог — snez, который проверяет на ненулевое значение.
Разворачивается в
sltiu rd, rs, 1
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
li t0, 0 seqz t1, t0 # t1 = 1
