Я не фанат псевдоинструкций MIPS. Если у вас есть архитектурный регистр, «предназначенный» для использования в качестве скрытого временного, у вас может быть слишком много регистров ... (Хотя, честно говоря, интересно иметь пару архитектурных регистров, которые ядру разрешено асинхронно прерывать для обработчиков быстрых прерываний включая обработчики TLB-miss. Это означает, что обработка прерываний может быть проще с архитектурной точки зрения; IDK работает так, но, возможно, она помещает старый ПК в один из этих регистров.)

юбопытно, почему нам не разрешают использовать регистры в качестве смещений в MIPS. Я знаю, что выне может используйте регистры как смещения, как это:lw $t3, $t1($t4); Мне просто любопытноПочему это тот случай.

Это аппаратное ограничение? Или просто часть ISA?

 Peter Cordes22 окт. 2017 г., 23:28
Википедия говоритMIPS IV добавил индексированные режимы адресации, Хм, но они упоминают это только для загрузок / магазинов FP.Текущий набор инструкций MIPS, быстрый ref только перечисляетoff(Rs) режимы для целочисленных загрузок / хранилищ, включая невыровненные и LL / SC.
 Raymond Chen22 окт. 2017 г., 22:57
Вот как они это спроектировали. Вам нужно будет спросить дизайнеров, почему они решили против этого.
 Peter Cordes22 окт. 2017 г., 23:54
Я предполагаю, что мотивация была частью всей философии RISC. MIPS был одним из самых первых проектов RISC.
 Peter Cordes22 окт. 2017 г., 23:50
lwpc новое в версии 6 MIPSи использует обычныйsign_extend( offset << 2 ) кодирование, но сPC вместо георадара. Этот же документ документирует индексированные загрузки FP (например,lwxc1, который используетGPR[base] + GPR[index]). Так что да, MIPS ISA все еще не включает индексированные целочисленные загрузки. Вы должны сделать адрес самостоятельно. По крайней мере, есть инструкция сдвига и добавления (lsa) для генерации адреса с масштабированным индексом (например, дляint[]).
 Peter Cordes22 окт. 2017 г., 23:23
Думаю позже MIPSделает имеют индексированные нагрузки (а также относящиеся к ПК).tkt.cs.tut.fi/kurssit/3200/S05/Luennot/Lec_notes05/..., Вероятно, поддержка относительного ПК означала, что в AGU требовался сумматор с 2-мя регистрами, поэтому можно было бы также разрешить 2 произвольных регистра вместо просто ПК + регистр.MIPS первого поколения у меня было толькоодин режим адресации: база + смещение (который может быть нулем, конечно). Очевидно, что это упрощает декодирование и генерацию адресов.

Ответы на вопрос(1)

Решение Вопроса

почему нам не разрешают использовать регистры в качестве смещений в MIPS.

Я не уверен, имеете ли вы в виду «почему сборка MIPS не позволяет вам написать эту форму» или «почему базовый ISA не предлагает эту форму».

Если это первое, то ответ заключается в том, что базовый ISA не имеет никаких машинных инструкций, которые предлагают такую ​​функциональность, и, очевидно, дизайнеры не решили предлагать какие-либопсевдо-инструкция что бы реализовать это за кулисами.2

Если вы спрашиваете, почему ISA не предлагает его в первую очередь, это просто выбор дизайна. Предлагая меньше или более простые режимы адресации, вы получаете следующие преимущества:

Для кодирования более ограниченного набора возможностей требуется меньше места, поэтому вы экономите место для кодирования для большего количества кодов операций, более коротких инструкций и т. Д.Аппаратное обеспечение может быть проще или быстрее. Например, разрешение двух регистров при вычислении адреса может привести к:Необходимость дополнительного порта чтения в файле реестра1.Дополнительные соединения между файлом регистров и AGU для получения значений обоих регистров.Необходимость делать сложение полной ширины (32 или 64 бита), а не упрощение адреса на стороне + 16-битное сложение для смещения.Необходимость иметь ALU с тремя входами, если вы все еще хотите поддерживать немедленное смещение с адресами из 2 регистров (и они менее полезны, если вы этого не сделаете).Дополнительная сложность в декодировании команд и генерации адресов, поскольку вам может потребоваться поддержка двух совершенно разных путей для генерации адресов.

Конечно, все эти компромиссы могут очень хорошо окупиться в некоторых контекстах, в которых можно было бы эффективно использовать 2-регистровую адресацию с меньшим или более быстрым кодом, но оригинальный дизайн, который был в значительной степени вдохновлен философией RISC, не включал его , Как отмечает Питерв комментариях, новые режимы адресацииимеют впоследствии был добавлен для некоторых случаев, хотя, по-видимому, не является общим режимом 2-рег адресации для загрузки или сохранения.

Это аппаратное ограничение? Или просто часть ISA?

Там есть немного ложной дихотомии. Конечно, это не аппаратное ограничение в том смысле, что аппаратное обеспечениемог Конечно, это поддерживается, даже когда MIPS был разработан. Похоже, это подразумевает, что какое-то существующее оборудование имело это ограничение, и поэтому MIPS ISA каким-то образом его унаследовал. Я подозреваю, что все было наоборот: ISA был определен таким образом, основываясь на анализе вероятности реализации аппаратного обеспечения, а затем сталаппаратное упрощение поскольку аппаратное обеспечение MIPS не должно поддерживать ничего, кроме того, что есть в ISA MIPS.

1 Например, для поддержки инструкций магазина, которые должны быть прочитаны из 3 регистров.

2 Конечно, стоит спросить, является ли такая псевдоинструкция хорошей идеей или нет: она, вероятно, расширится до добавления двух регистров во временный регистр, а затемlw с результатом. Всегда существует опасность, что это скрывает «слишком много» работы. Поскольку это частично затмевает разницу между истинной нагрузкой, отображающей 1: 1, на аппаратную нагрузку, и версией, которая выполняет дополнительную арифметику за укрытиями, легко представить, что это может привести к принятию оптимальных решений.

Возьмите классический пример линейного доступа к двум массивам одинакового размера элемента в цикле. При 2-регистровой адресации естественно записать этот цикл как два 2-регистровых доступа (каждый с различным базовым регистром и общим регистром смещения). Единственным «накладным расходом» для обслуживания смещения является единичное приращение смещения. Это скрывает тот факт, что внутренне существует два скрытых добавления, необходимых для поддержки режима адресации: было бы просто лучше увеличить каждую базу напрямую и не использовать смещение. Кроме того, как только издержки будут сняты, вы можете увидеть, что развертывание цикла и использование немедленных смещений может еще больше уменьшить издержки.

 BeeOnRope23 окт. 2017 г., 03:30
... логика которого не совсем соответствует некоторым существующим псевдоинструкциям, таким какdiv а такжеrem которые определенно скрывают вещи, которые могут потратить впустую усилия (например, если вам нужны оба из них, вам гораздо лучше написать это самостоятельно и сохранитьdiv). Фактическиdiv отвечает на вопрос, который у меня был выше: у них, очевидно, были псевдоинструкции с той же мнемоникой, которые были либо «псевдо», либо «реальными», в зависимости, например, от количества аргументов. Интересно. Слишком подлый для меня, хотя.
 Peter Cordes23 окт. 2017 г., 03:09
Но в любом случае, я думал об аргументе порта чтения-чтения как о хорошем объяснении того, почему MIPSВсе еще не имеет индексированной целой загрузки / хранения. Осталось много места для кодирования, и MIPS Release 6 переназначил некоторые коды операций, чтобы освободить место для новых инструкций (например, ветвления без слота задержки ветвления)! Так что это совсем не то же самое, что x86, так как пространство кодирования и обратное вычисление пролистывают справочное руководство по набору команд (поискindex) было интересно. (И порты объясняют, почему он проиндексировал загрузку / хранение FP, потому что это другой файл реестра.)
 Peter Cordes23 окт. 2017 г., 03:04
li с небольшими константами есть только одна инструкция, такая же дляlw с небольшими смещениями.lw это машинная инструкция с обычным загрузочным словом. Я думаю, что некоторые ассемблеры MIPS имеют не псевдо-режим, который вы можете использовать, если хотите убедиться, что вы случайно не использовали несколько инструкций.
 BeeOnRope23 окт. 2017 г., 03:24
@PeterCordes - да, хорошая точка зрения о сегодняшних причинах. Многие другие затраты уменьшаются со временем, но стоимость добавления дополнительного порта чтения все еще потенциально непомерно высока, так как он может составлять большую часть области простых микросхем, он является неотъемлемой частью большинства важных критических путей. и может ограничивать время цикла и может влиять на такие вещи, как переименование (если чип достаточно хорош, чтобы его использовать). Я добавил слишком длинную сноску о том, была ли бы псевдоинструкция хорошей идеей.
 Peter Cordes23 окт. 2017 г., 03:37
Я не фанат псевдоинструкций MIPS. Если у вас есть архитектурный регистр, «предназначенный» для использования в качестве скрытого временного, у вас может быть слишком много регистров ... (Хотя, честно говоря, интересно иметь пару архитектурных регистров, которые ядру разрешено асинхронно прерывать для обработчиков быстрых прерываний включая обработчики TLB-miss. Это означает, что обработка прерываний может быть проще с архитектурной точки зрения; IDK работает так, но, возможно, она помещает старый ПК в один из этих регистров.)

Ваш ответ на вопрос