negпсевдо

neg

псевдо
RISC-V Ассемблер Ссылка

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