Оба ответа верны; Есть множество способов компилировать это выражение, используя любые регистры, которые вы хотите, а также разные порядки операций или разные варианты команд.
Нет недостатка в записи результата в регистр, который инструкция считывает как ввод. Если бы было больше окружающего кода как части большой функции, использование меньшего количества регистров для временных может быть преимуществом. Модельное решение, возможно, является более оптимальным, чем ваше, многократно изменяя $s0
вместо использования большего количества временных значений, если вы рассматриваете давление распределения регистров как часть большой функции.
Но так как нет окружающего кода, нет никаких оснований говорить, что с тобой что-то не так. Может быть, полезно иметь оригинальное значение x
дольше.
Перестановка для более короткой задержки критического пути и параллелизм на уровне команд на суперскалярном процессоре . (например, MIPS r10k - суперскаляр в 4 раза с выполнением вне порядка)
Требуются три операции добавления / добавления, и обе версии в вашем вопросе имеют последовательную зависимость, проходящую через все три операции ALU.
2 арифметика дополнения ассоциативна. Но MIPS add
дает сбой при переполнении со знаком, поэтому имеет значение, какие временные результаты вы создаете (как для FP с ошибками округления). Но в MIPS также есть addu
, который оборачивается вместо сбоя, поэтому, если вам не нужно создавать исключение при переполнении со знаком, используйте addu
/ addiu
/ subu
, а затем вы можете переупорядочить операции на (x - A[20]) + (y - 10)
, например.
lw $t0, 80($s3) # load as early as possible
addiu $t1, $s1, -10 # y-10 in the shadow of the load delay slot
subu $s0, $s0, $t0 # x-A[20]
addu $s0, $s0, $t1
Обратите внимание, что x
($s0
) не должен быть готов до 3-й инструкции, поэтому мы можем скрыть некоторую задержку для ввода x
. Если вы знаете, из каких инструкций поступают ваши операнды, закажите свои операции так, чтобы последний, который, вероятно, был готов последним, был нужен последним. (Особенно, если вы настраиваете процессор в порядке, в отличие от r10k)
Конечно, если вы ожидаете некоторой задержки загрузки, выполнение всей работы ALU, которую вы можете выполнить, прежде чем использовать результат загрузки, имеет больше смысла, даже если это означает сериализацию всех трех операций добавления / подчинения, делая их зависимыми друг от друга.