В MIPS R-формат кодируется так:
opcode (6) | rs (5) | rt (5) | rd (5) | shamt (5) | funct (6)
Поле shamt
используется только в командах сдвига или поворота .В других случаях это всегда 0. Так почему они не могли использовать это для других более полезных вещей?
ИМХО, будет намного лучше использовать это поле для хранения регистрационного номера, в котором хранится перенос / заимствовать add
или sub
инструкции .Например,
addu $Rdest, $Rcarry, $Rsrc1, $Rsrc2
$Rcarry
будет установлен только на 0 или 1 в зависимости от бита переноса.Это сделает его гораздо более полезным для арифметики с множественной точностью.Архитектуры с регистром флагов могут выполнять сложение двойных слов в 2 инструкциях, тогда как MIPS нужно 3, потому что перенос должен быть рассчитан в отдельной инструкции.Умножения также выиграют от этого, потому что и максимум и минимум выходных данных могут быть указаны в самой инструкции вместо того, чтобы тратить несколько кодов операций для перемещения из / в регистры HI / LO
Аналогичнополе rs
фиксируется на 0 для shift инструкций.Почему они не могли использовать его для таких вещей, как поддержка смены нескольких слов, например, x86 shrd/shld
?Или просто используйте эти 5 битов в rs/shamt
в качестве поля sub-opcode .Это значительно увеличило бы пространство кода операции.С этим большим пространством, вероятно, MIPSr6 не нужно будет вносить срочные изменения, удалив некоторые инструкции, чтобы оставить место для будущего расширения