neg
псевдоlyszt.net охватывает neg и другие инструкции RISC-V более подробно.
Описание
neg меняет знак числа: 5 становится -5, а -5 становится 5. Название сокращает negate. Приведённая ниже форма помещает отрицание исходного регистра rs в регистр назначения rd.
neg rd, rs
neg — это псевдоинструкция. Ассемблер переписывает псевдоинструкцию, которая является читаемым именем, в одну или несколько реальных инструкций до того, как процессор с ней столкнётся. neg становится приведённой ниже инструкцией, которая вычитает число из zero, специального регистра, который всегда содержит 0.
sub rd, zero, rs
0 минус x равно -x, поэтому это даёт отрицание. RISC-V сохраняет свой набор реальных инструкций небольшим, повторно используя вычитание и нулевой регистр таким образом.
Диапазон отрицательных чисел простирается на один шаг дальше положительного диапазона. Он достигает примерно -2,1 миллиарда и только примерно +2,1 миллиарда. Самое отрицательное число не имеет положительного аналога, поэтому его отрицание зацикливается и даёт то же самое число. Код, вычисляющий абсолютные значения, должен учитывать этот случай.
Руководство RISC-V определяет sub как вычитание rs2 из rs1 и описывает регистр x0, называемый здесь zero, как жёстко заданный на значение, все биты которого равны 0. Вычитание значения из x0 даёт его отрицание, что и является формой, в которую превращается neg.
Пример превращает 5 в -5. В сочетании с ветвлением, которое пропускает neg, когда число уже положительное, это даёт обычное абсолютное значение из двух инструкций.
Разворачивается в
sub rd, zero, rs
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
li t0, 5 neg t1, t0 # t1 = -5
Ссылки
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.2, Integer Register-Register Instructions, page 29.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.1, Programmers' Model for Base Integer ISA, page 23.
