У
старых MIPS не было rem
, только div
, который помещал результаты в специальные регистры, чтобы избежать микроархитектурных проблем с обратной записью в файл регистров из инструкции с высокой задержкой в простом конвейере.
Остаток вычисляется не mfhi
, а div
(выдаёт результат в специальных регистрах lo=quotient
и hi=remainder
). mfhi
это просто "Двигайся от HI"; он копирует из этого специального регистра в регистр общего назначения.
Имена взяты из инструкции mult
(которая, как и div
, имеет большую задержку, чем add
или любая другая целочисленная инструкция ALU, поддерживаемая оригинальным MIPS I), которая дает результат двойной ширины в LO и HI. ( Получение результата от Mult в MIPS и
В MIPS, что такое HI и LO ).
Если пункты назначения mult
и div
были регистрами общего назначения, то в цикле результаты были готовы, также может быть add
или lw
или любой другой результат, который необходим конвейеру. запись в файл реестра в том же цикле. И эти инструкции дают результаты в 2 слова каждый. Использование специальных регистров LO / HI позволяет избежать конфликтов обратной записи по обеим причинам.
Также помните, что MIPS расшифровывается как минимально заблокированные этапы конвейера, поэтому основной целью проектирования на ранних этапах MIPS было отсутствие аппаратной проверки даже на наличие зависимостей данных, и оставьте это на усмотрение программного обеспечения, чтобы он не пытался прочитать результат до его готовности , Создание mult
/ mfhi
/ mflo
специальными также помогает в этом, потому что нет никакой зависимости через обычный регистр GP.
Но более современные процессоры MIPS имеют гораздо больший бюджет транзисторов и могут поддерживать такие команды, как mul
и rem
, которые помещают свои результаты в регистры GP, даже если они имеют большую задержку, чем обычные инструкции ALU.
Я не уверен, когда они были добавлены в ISA; было ли это в эпоху высокопроизводительных процессоров MIPS с неупорядоченным исполнением, таких как r10000.