En una máquina de 32 bits, una instrucción de "agregar con acarreo" utilizada como parte de una secuencia de suma de precisión múltiple necesita aceptar 65 bits de operandos y calcular una suma de 33 bits. Las especificaciones del registro de origen identificarán de dónde deberían provenir 64 bits de operando, y la especificación del registro de destino indicará a dónde deben ir los 32 bits inferiores del resultado, pero qué hacer con el operando "agregar un extra" o el bit superior del resultado? Ser permitido moderar como parte de la instrucción de dónde debe venir el operando adicional y hacia dónde debe ir el bit de resultado adicional sería moderadamente útil, pero generalmente no sería tan útil como para justificar un campo adicional en el código de operación. Tener una "ubicación" fija para manejar la bandera de transporte puede ser un poco incómodo desde una perspectiva de programación de instrucciones, pero '
Si uno intentara diseñar un conjunto de instrucciones para permitir la aritmética de precisión múltiple pero cada instrucción se limitara a dos operandos de 32 bits y un operando de destino de 32 bits, uno podría implementar un "agregar" de 64 bits en cuatro instrucciones: "conjunto r5 a 1 si r0 + r2 llevaría o cero de otra manera; calcule r4 = r1 + r3; calcule r5 = r4 + r5; calcule r4 = r0 + r2 ", pero ir más allá requeriría tres instrucciones para cada palabra adicional. Tener una bandera de transporte disponible como fuente y destino suplementarios reduce el costo a una instrucción por palabra.
Tenga en cuenta, por cierto, que tener un bit de instrucción controla si la instrucción actualiza el registro de bandera puede facilitar la ejecución fuera de orden, ya que las instrucciones que usan o modifican los bits de bandera deben mantener su secuencia entre sí, pero las instrucciones que no pueden ser reorganizado libremente. Dada la secuencia:
ldr r0,[r1]
add r0,r0,r2
eors r4,r5,r6
una unidad de ejecución podría reconocer con bastante facilidad que la tercera instrucción podría ejecutarse sin tener que esperar a que se lean los datos [r1]
, pero si la segunda instrucción hubiera sido adds r0,r0,r2
así, solo sería posible si la unidad de ejecución pudiera garantizar que para cuando algo intentara usar las banderas, la bandera cero mantendría el valor establecido en la tercera instrucción pero la bandera de acarreo mantendría el valor en la segunda.