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