not
псевдоlyszt.net охватывает not и другие инструкции RISC-V более подробно.
Описание
not инвертирует все биты регистра. 0 становится 1, а 1 становится 0. Приведённая ниже форма читает исходный регистр rs, переворачивает все 32 бита и записывает результат в регистр назначения rd. Эта операция — побитовое дополнение.
not rd, rs
not — это псевдоинструкция: читаемое имя, которое ассемблер переписывает в реальную инструкцию. Она превращается в приведённую ниже инструкцию, то есть XOR с маской из всех 1.
xori rd, rs, -1
XOR переворачивает бит там, где маска содержит 1, поэтому маска из всех 1 переворачивает все биты. Значение -1 — это все 1 в битах, поэтому оно работает как маска. В RISC-V нет отдельной инструкции инвертирования, потому что эта перезапись справляется с этим.
not даёт противоположность маски. Если шаблон выбирает определённые биты, not даёт шаблон, который выбирает остальные. Использование not вместе с and очищает биты, названные исходной маской, что выключает набор флагов.
Руководство RISC-V определяет not как псевдоинструкцию ассемблера для xori с константой -1 и описывает этот xori как побитовую логическую инверсию регистра rs1.
not и neg дают разные результаты. not переворачивает биты, а neg переворачивает знак. not от 5 равно -6, а neg от 5 равно -5. Трассировка симулятора показывает xori, который выполняется вместо not.
Разворачивается в
xori rd, rs, -1
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
li t0, 0 not t1, t0 # t1 = -1 (every bit flipped)
