Я думаю, что я ищу ответ на вопрос о пустяках. Я пытаюсь понять, почему архитектура MIPS использует явное «нулевое» значение в регистре, когда вы можете достичь того же, просто XOR'и любой регистр против самого себя. Можно сказать, что операция уже сделана для вас; тем не менее, я не могу себе представить ситуацию, когда вы использовали бы много «нулевых» значений. Я читаю оригинальные статьи Хеннесси, и это просто присваивает ноль на самом деле без какого-либо реального оправдания.
Существует ли логическая причина иметь жестко запрограммированное двоичное присвоение нуля?
обновление: в 8k исполняемого файла из xc32-gcc для ядра MIPS в PIC32MZ у меня есть один экземпляр "ноль".
add t3,t1,zero
фактический ответ: я присудил награду человеку, который имел информацию о MIPS и кодах условий. Ответ на самом деле лежит в архитектуре MIPS для условий. Хотя изначально я не хотел выделять на это время, я рассмотрел архитектуру для opensparc , MIPS-V и OpenPOWER (этот документ был внутренним), и вот краткие выводы. Регистр R0 необходим для сравнения по веткам из-за архитектуры конвейера.
- целочисленное сравнение с нулем и ответвлением (bgez, bgtz, blez, bltz)
- целочисленное сравнение двух регистров и ветви (beq, bne)
- целочисленное сравнение двух регистров и trap (teq, tge, tlt, tne)
- регистр сравнения целых чисел и немедленный и trap (teqi, tgei, tlti, tnei)
Это просто сводится к тому, как аппаратное обеспечение выглядит в реализации. Из руководства MIPS-V на странице 68 есть ссылка, на которую нет ссылок:
Условные ветви были разработаны так, чтобы включать операции арифметического сравнения между двумя регистрами (как это также делается в PA-RISC и Xtensa ISA), а не использовать коды условий (x86, ARM, SPARC, PowerPC) или сравнивать только один регистр с нулем ( Альфа, MIPS) или два регистра только для равенства (MIPS). Эта конструкция была мотивирована наблюдением, что объединенная команда сравнения и ветвления ts в обычный конвейер позволяет избежать дополнительного состояния кода условия или использования временного регистра и уменьшает размер статического кода и динамическую трассировку выборки команд. Другой момент заключается в том, что для сравнения с нулем требуется нетривиальная задержка контура (особенно после перехода к статической логике в сложных процессах), и поэтому она почти такая же дорогая, как и арифметическая величина. Другое преимущество объединенной команды сравнения и ветвления состоит в том, что ответвления наблюдаются раньше в потоке внешних команд и поэтому могут быть предсказаны ранее. Возможно, есть преимущество для схемы с кодами условий в том случае, когда можно использовать несколько ветвей на основе одних и тех же кодов условий, но мы считаем, что этот случай является относительно редким.
Документ MIPS-V не попадает в автора цитируемого раздела. Я благодарю всех за их время и внимание.