Eu acho que estou procurando uma resposta para uma pergunta trivial. Estou tentando entender por que a arquitetura MIPS usa um valor "zero" explícito em um registro, quando você pode conseguir a mesma coisa apenas usando XOR em qualquer registro. Pode-se dizer que a operação já foi feita para você; no entanto, não consigo imaginar uma situação em que você usaria muitos valores "zero". Li os artigos originais de Hennessey e, na verdade, atribui um zero sem nenhuma justificativa real.
Existe uma razão lógica para ter uma atribuição binária codificada de zero?
atualização: em 8k de um executável do xc32-gcc para o núcleo MIPS no PIC32MZ, tenho uma única instância de "zero".
add t3,t1,zero
a resposta real: concedeu a recompensa à pessoa que tinha as informações sobre MIPS e códigos de condição. A resposta realmente está na arquitetura MIPS para condições. Embora eu inicialmente não quisesse atribuir tempo para isso, revisei a arquitetura do opensparc , MIPS-V e OpenPOWER (este documento era interno) e aqui estão os resultados resumidos. O registro R0 é necessário para comparação nas filiais devido à arquitetura do pipeline.
- número inteiro comparado com zero e ramo (bgez, bgtz, blez, bltz)
- número inteiro compara dois registros e ramificações (beq, bne)
- número inteiro compara dois registros e armadilha (teq, tge, tlt, tne)
- integer compare register e imediato e trap (teqi, tgei, tlti, tnei)
Simplesmente se resume à aparência do hardware na implementação. No manual do MIPS-V, há uma cotação não referenciada na página 68:
As ramificações condicionais foram projetadas para incluir operações de comparação aritmética entre dois registros (como também são feitas no PA-RISC e no Xtensa ISA), em vez de usar códigos de condição (x86, ARM, SPARC, PowerPC) ou para comparar apenas um registro contra zero ( Alpha, MIPS) ou dois registros apenas para igualdade (MIPS). Esse projeto foi motivado pela observação de que uma instrução combinada de comparação e ramificação se transforma em um pipeline regular, evita o estado adicional do código de condição ou o uso de um registro temporário e reduz o tamanho do código estático e o rastreamento dinâmico de busca de instruções. Outro ponto é que as comparações com zero requerem atraso não trivial do circuito (especialmente após a mudança para a lógica estática em processos avançados) e, portanto, são quase tão caras quanto a magnitude aritmética compara. Outra vantagem de uma instrução de comparação e ramificação fundida é que as ramificações são observadas mais cedo no fluxo de instruções front-end e, portanto, podem ser previstas mais cedo. Talvez haja uma vantagem em um projeto com códigos de condição no caso em que várias ramificações podem ser obtidas com base nos mesmos códigos de condição, mas acreditamos que esse caso seja relativamente raro.
O documento MIPS-V não é encontrado no autor da seção citada. Agradeço a todos pelo tempo e consideração.