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)
