andi
lyszt.net охоплює andi та інші інструкції RISC-V більш детально.
Формат кодування
Опис
andi виконує побітову операцію AND з константою. and приймає два регістри, а andi приймає регістр і безпосереднє значення — фіксоване значення, закодоване в інструкції. Літера i означає immediate (безпосереднє). Правило AND не змінюється: біт результату дорівнює 1 лише тоді, коли обидва вхідні біти дорівнюють 1, тому константа діє як маска, яка зберігає одні біти й очищає інші. Маскування та побітові операції описано на сторінці and.
Форму andi показано нижче. Вона виконує операцію AND над значенням у rs1 з константою imm і записує результат у rd.
andi rd, rs1, imm
Використовуйте її, коли заздалегідь відомо, які біти потрібно зберегти. Наступний рядок зберігає молодші 8 бітів t0 і очищає старші 24, видобуваючи один байт із більшого значення. Префікс 0x позначає шістнадцяткову константу.
andi t1, t0, 0xff
Константа має вміщатися в 12 бітів, тому вона не може виразити широку маску. Для більшої маски завантажте її в регістр за допомогою li і використайте and.
У посібнику RISC-V сказано, що 12-бітне безпосереднє значення перед операцією розширюється зі знаком до 32 бітів, тому в від’ємної константи всі старші біти встановлені. andi, ori і xori виконують побітову операцію над регістром rs1 і цим розширеним значенням та поміщають результат у rd.
Далі наведено два поширені випадки використання. Перший рядок зберігає лише молодший біт, який дорівнює 1 для непарних чисел і 0 для парних. Другий рядок дає остачу від ділення на 8, тому що беззнакова остача від ділення на степінь двійки — це молодші біти.
andi t1, t0, 1 andi t1, t0, 7
Приклад
andi t1, t0, 0xff # keep only the low byte
