Creo que estoy buscando una respuesta a una pregunta de trivia. Estoy tratando de entender por qué la arquitectura MIPS usa un valor explícito de "cero" en un registro cuando puede lograr lo mismo simplemente al XORAR cualquier registro en 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 utilizarías muchos valores "cero". Leí los artículos originales de Hennessey y, de hecho, solo asigna un cero sin ninguna justificación real.
¿Existe una razón lógica para que exista 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: Otorgué la recompensa a la persona que tenía la información sobre MIPS y los códigos de condición. La respuesta realmente radica en la arquitectura MIPS para las condiciones. Aunque inicialmente no quería asignar tiempo a esto, revisé la arquitectura de opensparc , MIPS-V , y OpenPOWER (este documento fue interno) y aquí están los resumen de los resultados. El registro R0 es necesario para la comparación en las sucursales debido a la arquitectura de la tubería.
- el número entero se compara con cero y la rama (bgez, bgtz, blez, bltz)
- entero compara dos registros y rama (beq, bne)
- los enteros comparan dos registros y captura (teq, tge, tlt, tne)
- registro de comparación de enteros e inmediato y captura (teqi, tgei, tlti, tnei)
Simplemente se reduce a cómo se ve el hardware en la implementación. En el manual 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 solo para comparar un registro con cero (Alpha, MIPS), o Dos registros solo para igualdad (MIPS). Este diseño fue motivado por la observación de que un la instrucción combinada de comparación y derivación de ts en una tubería regular evita la condición adicional Estado del código o uso de un registro temporal, y reduce el tamaño del código estático y la instrucción dinámica ir a buscar trac. Otro punto es que las comparaciones con cero requieren un retardo 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 caros como La magnitud aritmética se compara. Otra ventaja de una instrucción fusionada de comparación y ramificación es que las ramas se observan antes en el flujo de instrucciones de front-end, por lo que se pueden predecir más temprano. Quizás haya una ventaja para un diseño con códigos de condición en el caso de que múltiples Las sucursales pueden tomarse en base a los mismos códigos de condición, pero creemos que este caso es relativamente raro.
El documento MIPS-V no golpea al autor de la sección citada. Agradezco a todos por su tiempo y consideración.