Creo que estoy buscando una respuesta a una pregunta de trivia. Estoy tratando de entender por qué la arquitectura MIPS usa un valor "cero" explícito en un registro cuando puede lograr lo mismo simplemente haciendo XOR de cualquier registro contra sí mismo. Se podría decir que la operación ya está hecha para usted; sin embargo, realmente no puedo imaginar una situación en la que usarías muchos valores "cero". Leí los documentos originales de Hennessey, y simplemente asigna un cero de hecho sin ninguna justificación real.
¿Existe una razón lógica para tener una asignación binaria codificada de cero?
Actualización: en 8k de un ejecutable de xc32-gcc para el núcleo MIPS en el PIC32MZ, tengo una sola instancia de "cero".
add t3,t1,zero
la respuesta real: otorgé la recompensa a la persona que tenía la información sobre MIPS y los códigos de condición. La respuesta en realidad radica en la arquitectura MIPS para las condiciones. Aunque inicialmente no quería asignar tiempo a esto, revisé la arquitectura para opensparc , MIPS-V y OpenPOWER (este documento era interno) y aquí están los resultados resumidos. El registro R0 es necesario para la comparación en ramas debido a la arquitectura de la tubería.
- comparación de enteros contra cero y rama (bgez, bgtz, blez, bltz)
- entero compara dos registros y rama (beq, bne)
- entero compara dos registros y trap (teq, tge, tlt, tne)
- entero comparar registro e inmediato y trampa (teqi, tgei, tlti, tnei)
Simplemente se reduce a cómo se ve el hardware en la implementación. Del manual de MIPS-V, hay una cita sin referencia en la página 68:
Las ramas condicionales fueron diseñadas para incluir operaciones de comparación aritmética entre dos registros (como también se hace en PA-RISC y Xtensa ISA), en lugar de usar códigos de condición (x86, ARM, SPARC, PowerPC), o para comparar solo un registro contra cero ( Alfa, MIPS), o dos registros solo para igualdad (MIPS). Este diseño fue motivado por la observación de que una instrucción combinada de comparación y ramificación se convierte en una tubería regular, evita el estado del código de condición adicional o el uso de un registro temporal, y reduce el tamaño del código estático y el seguimiento de búsqueda de instrucciones dinámicas. Otro punto es que las comparaciones contra cero requieren un retraso de circuito no trivial (especialmente después del cambio a la lógica estática en procesos avanzados) y, por lo tanto, son casi tan caras como la magnitud aritmética. Otra ventaja de una instrucción fusionada de comparar y bifurcar es que las bifurcaciones se observan antes en el flujo de instrucciones de front-end y, por lo tanto, se pueden predecir antes. Quizás haya una ventaja en un diseño con códigos de condición en el caso de que se puedan tomar varias ramas en función de los mismos códigos de condición, pero creemos que este caso es relativamente raro.
El documento MIPS-V no afecta al autor de la sección citada. Agradezco a todos por su tiempo y consideración.