Myślę, że szukam odpowiedzi na pytanie o ciekawostki. Próbuję zrozumieć, dlaczego architektura MIPS używa jawnej wartości „zero” w rejestrze, skoro można osiągnąć to samo, po prostu XOR'ując dowolny rejestr przeciwko sobie. Można powiedzieć, że operacja jest już dla ciebie wykonana; jednak nie mogę sobie wyobrazić sytuacji, w której użyłbyś wielu wartości „zerowych”. Czytam oryginalne prace Hennesseya, a to po prostu przypisuje zero bez faktycznego uzasadnienia.
Czy istnieje logiczny powód, dla którego binarne przypisanie zerowe jest zakodowane na stałe?
aktualizacja: W 8k pliku wykonywalnego z xc32-gcc dla rdzenia MIPS w PIC32MZ mam jedno wystąpienie „zero”.
add t3,t1,zero
faktyczna odpowiedź: Nagrodę przyznałem osobie, która posiadała informacje o MIPS i kodach warunków. Odpowiedź leży w architekturze MIPS dla warunków. Chociaż początkowo nie chciałem na to poświęcać czasu, sprawdziłem architekturę dla Opensparc , MIPS-V i OpenPOWER (ten dokument był wewnętrzny) i oto podsumowanie wyników. Rejestr R0 niezbędny do porównania na oddziałach ze względu na architekturę rurociągu.
- liczba całkowita porównuje z zero i rozgałęzieniem (bgez, bgtz, blez, bltz)
- liczba całkowita porównaj dwa rejestry i gałąź (beq, bne)
- liczba całkowita porównaj dwa rejestry i pułapkę (teq, tge, tlt, tne)
- liczba całkowita porównaj rejestr i natychmiastowa oraz pułapka (teqi, tgei, tlti, tnei)
Po prostu sprowadza się to do wyglądu sprzętu we wdrożeniu. W podręczniku MIPS-V na stronie 68 znajduje się nieograniczony cytat:
Gałęzie warunkowe zostały zaprojektowane w taki sposób, aby zawierały operacje porównania arytmetycznego między dwoma rejestrami (jak również w PA-RISC i Xtensa ISA), zamiast używania kodów warunków (x86, ARM, SPARC, PowerPC), lub aby porównywać tylko jeden rejestr z zerem ( Alpha, MIPS) lub dwa rejestry tylko dla równości (MIPS). Ten projekt był motywowany obserwacją, że połączona instrukcja porównania i rozgałęzienia ts do zwykłego potoku, pozwala uniknąć dodatkowego stanu kodu warunkowego lub użycia rejestru tymczasowego oraz zmniejsza statyczny rozmiar kodu i dynamiczny przebieg pobierania instrukcji. Inną kwestią jest to, że porównania z zerem wymagają nietrywialnego opóźnienia obwodu (szczególnie po przejściu na logikę statyczną w zaawansowanych procesach), a zatem są prawie tak drogie, jak w porównaniu z wielkością arytmetyczną. Kolejną zaletą skondensowanej instrukcji porównania i rozgałęzienia jest to, że gałęzie są obserwowane wcześniej w strumieniu instrukcji frontonu, a zatem można je przewidzieć wcześniej. Być może zaletą jest projekt z kodami warunków w przypadku, gdy wiele gałęzi można pobrać na podstawie tych samych kodów warunków, ale uważamy, że ten przypadek jest stosunkowo rzadki.
Dokument MIPS-V nie trafia w autora cytowanej sekcji. Dziękuję wszystkim za poświęcony czas i uwagę.