RISC-V создает 32-битные константы с LUI и ADDI - PullRequest
0 голосов
/ 07 июня 2018

LUI (немедленная загрузка сверху) используется для построения 32-битных констант и использует формат U-типа.LUI помещает значение U-немедленного в верхние 20 битов регистра назначения rd, заполняя младшие 12 битов нулями.

Я нашел это в руководстве, но если я хочу переместить 0xffffffff крегистр, весь код, который мне нужен:

LUI x2, 0xfffff000
ADDI x2, x2, 0xfff

Но возникла проблема, ADDI расширит знак, чтобы немедленно передать данные на номер со знаком, поэтому 0xfff будет расширен до 0xffffffff.

Это делает x2 в 0xffffefff, но не 0xffffffff

, и что является хорошей реализацией для перемещения 32-битных немедленно для регистрации?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Ассемблер RISC-V поддерживает псевдоинструкцию li x2, 0xFFFFFFFF.

Пусть N - это 32-разрядное целое число со знаком, дополненное 2 знаками.

Реализация общего случая li x2,Nis:

    # sign extend low 12 bits
    M=(N << 20) >> 20

    # Upper 20 bits
    K=((N-M) >> 12) <<12

    # Load upper 20 bits
    LUI x2,K

    # Add lower bits
    ADDI x2,x2,M

Конечно, для немедленной загрузки li можно использовать

   addi x2,x0,imm

Итак, li x2, 0xFFFFFFFF равно addi x2,x0,-1.

0 голосов
/ 08 июня 2018

Я собирался сказать «используйте ORI вместо ADDI», но затем я прочитал Руководство по набору инструкций, и оказалось, что это тоже не работает, потому что все нижние 12 операндов получают знак-расширенный, даже для логических операций.

AFAICT Вы должны сместить значение, которое вы положили в верхние 20 битов, таким образом, чтобы предвосхитить эффект инструкции, которую вы используете для установки младших 12 битов.Поэтому, если вы хотите получить значение X в верхних 20 битах и ​​собираетесь использовать ADDI для установки младших 12 бит, а у этих младших 12 битов будет 1 в крайнем левом положении, вы должны сделать LUI (X+1), а не LUI X.Точно так же, если вы собираетесь использовать XORI для установки младших 12 битов, и эти младшие 12 битов имеют 1 в крайнем левом положении, вы должны сделать LUI (~X) (то есть битовую инверсию X), а не LUI X.

Но прежде чем вы сделаете что-либо из этого, я посмотрю, есть ли у вашего ассемблера уже какая-то псевдооперация или макрос с немедленной загрузкой, которая позаботится об этом за вас.Если этого не произойдет, то посмотрите, можете ли вы написать один: -)

Для процессоров RISC весьма обычно требовать такого рода дополнительных усилий со стороны программиста (или, как правило, от компилятора).Идея состоит в том, чтобы «сделать аппаратное обеспечение простым, чтобы оно могло работать быстро, и не имеет значения, усложнит ли это конструирование программного обеспечения».

...