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
