srai
lyszt.net охватывает srai и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
srai сдвигает биты вправо на фиксированную величину и копирует знаковый бит в освободившиеся верхние позиции, что сохраняет отрицательные числа отрицательными. Это форма sra с постоянной величиной, поэтому заполнение сохраняет знак. Буква i означает immediate (непосредственный) — константу, закодированную в инструкции.
Синтаксис srai приведён ниже, где amount — константа от 0 до 31.
srai rd, rs1, amount
Сдвиг вправо на одну позицию уменьшает число вдвое и оставляет знак без изменений, поэтому srai делит число со знаком на степень двойки. Следующая строка делит значение со знаком на 8 как для положительных, так и для отрицательных входных данных.
srai t0, t0, 3
srai округляет вниз, в сторону более отрицательного значения. Сдвиг -7 вправо на 1 даёт -4, тогда как div с делителем 2 даёт -3, потому что округляет в сторону нуля. Оба совпадают для неотрицательных чисел и для деления без остатка. Они различаются на единицу только тогда, когда отрицательное число даёт остаток. Код графики, аудио и обработки сигналов обычно требует округления вниз.
Руководство RISC-V кодирует сдвиги на константу как специализацию формата I-типа, одного из стандартных форматов инструкций. Величина сдвига занимает младшие 5 бит поля непосредственного значения, а бит 30 инструкции различает два сдвига вправо. srai выполняет арифметический сдвиг вправо, и исходный знаковый бит заполняет освободившиеся верхние биты.
Из четырёх сдвигов srai обрабатывает числа со знаком, которые делятся, а srli обрабатывает необработанные биты или числа, которые никогда не становятся отрицательными. Формы без i, sra и srl, принимают расстояние сдвига, вычисляемое во время выполнения программы.
Пример
li t0, -8 srai t1, t0, 1 # t1 = -4 (sign-filled)
