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)
