Я собирался сказать «используйте 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 весьма обычно требовать такого рода дополнительных усилий со стороны программиста (или, как правило, от компилятора).Идея состоит в том, чтобы «сделать аппаратное обеспечение простым, чтобы оно могло работать быстро, и не имеет значения, усложнит ли это конструирование программного обеспечения».