Аддиу и Адди почти идентичны. Единственное отличие состоит в том, что addi генерирует исключение при переполнении в дополнении, в то время как addiu не генерирует переполнение.
Итак, вы можете заменить все addiu на addi.
Управление или доступ к значениям указателей стека и кадра. Я думал о жестком кодировании аддендов как констант, но я не уверен, возможно ли это или это изменит значения.
Нет проблем заменить addi на addi. Никакое вменяемое программное обеспечение не может создать адреса в sp / fp, которые могут вызвать переполнение в этой ситуации
Доступ к верхним / нижним частям 32-разрядных целых чисел по отдельности с использованием% hi и% lo и сложение их вместе
Вы можете использовать addi, но люди обычно используют ori для этой операции.
lui $2,%hi(output_layer.3511)
ori $2,$2,%lo(output_layer.3511)
В любом случае риск переполнения отсутствует (поскольку 16 LSB очищаются с помощью lui), а addi, addiu и ori строго эквивалентны.
Дополнительные инструкции, которые появляются, когда я компилирую функцию "mod" в C (расширение функции mod для получения остатка "трудным путем" не помогло), например. fracPart = currentInput% 256; в Си компилируется в
lw $3,40($fp)
li $2,-2147483648 # 0xffffffff80000000
ori $2,$2,0xff
and $2,$3,$2
bgez $2,$L17
nop
addiu $2,$2,-1
li $3,-256 # 0xffffffffffffff00
or $2,$2,$3
addiu $2,$2,1
$L17:
sw $2,48($fp)
Этот код кажется очень странным. Почему бы не заменить две строки (li + ori) на
li $2, 0xffffffff800000ff
Последняя часть (после bgez) выполняется только строго отрицательными числами и для них она эквивалентна or
с 0xffffffffffffff00, и пара addiu кажется бесполезной ...
В любом случае их также можно заменить на addi.
EDIT:
Если addi недоступен, вы можете скопировать немедленный в бесплатный регистр, а затем выполнить добавление / addu с этим регистром. В большинстве соглашений MIPS $ 1 используется для хранения временных значений asm и никогда используется компиляторами. Так что вы можете свободно использовать его (при условии, что вы не используете макросы, которые могут использовать этот регистр).
Систематический перевод addiu может быть
addiu $d, $s, imm
## ->
ori $1, $0, imm
add $d, $s, $1
И ori, и add являются настоящими инструкциями, и 1 доллар можно безопасно использовать. В некоторых ассемблерах вы должны использовать $ at (временный ассемблер) вместо $ 1.