7 unidad aritmética y lógica prof. javier cañas r.2 números con signo y sin signo •en el...
TRANSCRIPT
Arquitecturas de Computadores7 Unidad Aritmética y Lógica
Prof. Javier Cañas R.
Temario
1. Introducción
2. Instrucciones Aritméticas
3. Interrupciones y Excepciones
4. Operaciones Lógicas y Desplazamientos
5. Coprocesadores Matemáticos: Multiplicaciones y Divisiones
1 Introducción
• En este capítulo profundizaremos la aritmética computacional.
• ¿Cómo realmente un computador suma, resta, multiplica y divide?.
• Comenzaremos esta discusión retomando algunas ideas de representación de números.
2 Números con signo y sin signo
• En el lenguaje C, es posible definir números con signo y sin signo:int x; //con signo
unsigned int y; //sin signo
• Ejemplo de números sin signo: Contadores, Direcciones de memoria
• La dificultad reside en las comparaciones.
Comparaciones con y sin signo
• Deben existir dos instrucciones de comparación. Con signo:slt (set on less than)
slti (set on less than inmediate)
• Sin signo:sltu (set on less than unsigned)
sltiu (set on less than inmediate unsigned)
...Comparaciones con y sin signo
• Ejemplo
sltu $t1,$s2,$s3
Interpretación: if($s2 < $s3) ! $t1=1 else! $t1=0
Ejemplo
• Si el contenido del registro $16 es:1111 1111 1111 1111 1111 1111 1111 1100
• Si el contenido del registro $17 es:0000 0000 0000 0000 0000 0000 0000 0001
slt $8,$16,$17 // $8 == 1sltu $9,$16,$17 //$9 ==0
3 Interrupciones y Excepciones: Tratamiento de Overflow
• La máquina MIPS detecta overflow vía una excepción.
• Las Interrupciones y excepciones son llamadas no planificadas a subrutinas.
• Se denomina interrupción a eventos externos que causan una llamada a subrutina y excepción a eventos internos.
...Interrupciones y Excepciones
• Interrupciones y excepciones son eventos que cambian el flujo normal de instrucciones.
• Ejemplo de excepción: overflow, división por cero
• Ejemplo de interrupción: término de transferencia de disco, falla de poder, llegada de un paquete de datos por el adaptador de red.
...Interrupciones y Excepciones
• Frente a una interrupción o excepción se realizan las siguientes acciones:
‣ Salvar el PC+4 en el registro EPC
‣ Transferir el control a direcciones específicas
• Es necesario también conocer la causa de la interrupción o excepción.
Detección de causas
• Hay dos métodos:
‣ Algunos procesadores tienen un registro de HW donde queda registrada la causa. En este caso se transfiere el control a una dirección única
‣ Interrupciones vectorizadas: la dirección a la cual se transfiere el control contiene la causa. Las direcciones están separadas en 8 palabras de 32b.
Vector de interrupción
• Normalmente el vector de interrupción está almacenado en la zona baja de memoria (IRQ en PC).
Vector de interrupción
Mapa de memoria
Tratamiento de Overflow
• La dirección de la instrucción que produjo overflow se guarda en un registro especial de la CPU llamado EPC (Exception Program Counter)
• La instrucción:
mfc0 $r1,$epc // se copia el EPC en el registro $r1 del archivo de registros.
• Con la instrucción jr se puede volver a la dirección original.
...Tratamiento de Overflow
• En el vector de interrupciones correspondiente a la dirección que corresponde a overflow se pone la dirección a la subrutina que atiende el overflow.
• En la máquina MIPS sólo causan excepciones de overflow las instrucciones aritméticas con signo.
...Tratamiento de Overflow
• Como los compiladores de C no consideran overflow, se genera código utilizando: addu, addiu, subu.
4 Operaciones Lógicas y corrimientos
• Adicionalmente a las instrucciones aritméticas, todos los procesadores incluyen instrucciones que permiten realizar corrimientos de bits y operaciones lógicas.
• La utilidad es muy variada, sirve para optimizar operaciones aritméticas y fundamentalmente para trabajar en bajo nivel programando drivers de dispositivos.
Instrucción de Desplazamiento
• Corrimiento lógico a la izquierda:
sll$t0,$s1,8 #$t0 ←$s1 <<8b←0
• sll es una instrucción tipo R. srl es equivalente a sll y corre a la derecha.
OP6b
rs5b
rt5b
rd5b
shamt5b
funct6b
0 0 16 10 8 0
$s1 $t0sll sll
Instrucciones Lógicas
• And
and $s1,$s2,$s3 #$s1 ←$s2 & $s3
• Or
or $s1,$s2,$s3 #$s1 ←$s2 | $s3
• and y or son instrucciones tipo R. Formas inmediatas: andi y ori.
Creación de Constantes
• Es frecuente la utilización de constantes en programas. Una opción es almacenar las constantes en memoria y cargar en registros al momento de utilizarlas.
• La instrucción lui, permite utilizar constantes evitando tiempos de acceso a memoria.
... Constantes• lui: load upper inmediate. Esta instrucción carga en
los 16 bits más significativos del registro destino una constante. Usando lui y ori se pueden crear constantes en forma rápida.
• Ejemplo. Si el contenido inicial de $s1 es:1111 1111 1111 1111 1111 1111 1111 1100
lui $s1,3
• Queda finalmente:
0000 0000 0000 0011 0000 0000 0000 0000
5 Coprocesadores Matemáticos
• Hasta ahora hemos visto como se realizan operaciones aritméticas y lógicas simples, ahora veremos como multiplicar y dividir.
• Hay dos estrategias:
- Por SW, generando bibliotecas.
- Por Hw utilizando coprocesadores
Solución por HW
• No hay duda que el hardware es mucho más rápido que el software, por esta razón todos los procesadores modernos incluyen poderosos coprocesadores que permiten realizar multiplicaciones y divisiones utilizando tiempos muy cortos.
La Multiplicación
• Revisaremos el algoritmo aprendido en nuestra educación básica:
1 0 0 0 X 1 0 0 1
1 0 0 00 0 0 0
0 0 0 01 0 0 0
1 0 0 1 0 0 0
Multiplicador
Producto
Multiplicando
Multiplicando: Mulo
64b
Multiplicador: Mulr
32b
64b
Producto: Prod
64bControl
Shift r
Mulr0Shift l
write
HW de multiplicación
Diagrama de flujoStart
¿Mulr0==0?
Prod ←Mulo+Prod
Mulo <<1
Mulr >>1
VF
¿32 veces?
V
F
Stop
Shift l
Multiplicación: Segunda versión
• La solución anterior necesita que el registro multiplicando sea de 64b. Esto significa que la ALU también debe ser de 64b.
• En otras palabras, se usa una ALU de 64b para generar un resultado de 32b. La segunda versión que se presenta sólo requiere de una ALU de 32b, pero es necesario hacer modificaciones en el HW
Multiplicación: HW v2Multiplicando: Mulo
32b
Multiplicador: Mulr
32b
32b
Prod
32bControl
Shift r
Mulr0
Shift r
write
Control V2Start
¿Mulr0==0?
Prod63..32 ← Prod63..32 + Mulo
Prod >>1
Mulr >>1
VF
¿32 veces?
V
F
Stop
Shift r
Multiplicación: V3
• Una optimización adicional que se puede lograr es ahorrar el registro Multiplicador (Mulr).
• Como este registro es de sólo lectura se puede poner en los 32 bits menos significativo del registro Producto (Prod).
• En la medida que se corre se va ganando espacio
Multiplicación: HW v3
Multiplicando: Mulo
32b
32b
Prod Mulr
32b
Control
Shift rwrite
Mulr0
Control v3Start
¿Prod0==0?
Prod63..32 ← Prod63..32 + Mulo
Prod >>1
VF
¿32 veces?
V
F
Stop
Shift r
La División
• Nuevamente, la forma más simple de dividir es aplicar lo aprendido en la educación básica.
• Ejemplo:1 0 1 0 : 1 0 0 0
1 0 0 0
Divisor
Cuociente Q
Signo positivo
= 1 0 0 10 1 0 0
1 0 1 0
1 0 0 0
1 0
Dividendo
División: HW v1
Divisor: Divsor
64b
Cuociente: Q
32b
64b
Dividendo: Divdo
64bControl
Shift l
Divdo63
Shift r
write
Control: v1Start
¿Divdo63==1?
Q<<1; Q0 ←1
Divsor >>1
VF
¿33 veces?
V
F
Stop
Divdo ←Divdo - Divsor
Divdo ←Divdo + DivsorQ<<1; Q0 ←0
División: v2
• La solución anterior necesita que la ALU sea de 64b.
• En vez de mover el Divisor resulta más conveniente mover el dividendo
• Una observación importante es que el primer paso del algoritmo no puede producir un uno en el cuociente. Es posible invertir las operaciones de corrimientos y restas
HW: v2
Divsor
32b
Q
32b
Divdo
32bControl
Shift l
Divdo63
write
Control: v2Start
¿Divdo63==1?
Q<<1; Q0 ←1
VF
¿32 veces?
V
F
Stop
Divdo << 1Divdo63..32 ← Divdo63..32 - Divsor
Divdo63..32 ← Divdo63..32 + DivsorQ<<1; Q0 ←0
División: Tercera versión
• Al igual que la multiplicación, es posible eliminar el registro Q utilizando la mitad menos significativa del Dividendo para almacenar Q.
• Como Q se mueve en conjunto con el resto, es necesario incorporar una fase correctiva al final
División HW:v3
Divsor
32b
32b
Divdo Q
32bControl
Divdo63
write
Shift l
Control: v3Start
¿Divdo63==1?
Divdo<<1; Divdo0 ←1
VF
¿32 veces?V
F
Stop
Divdo63..32 ← Divdo63..32 - Divsor
Divdo63..32 ← Divdo63..32 +DivsorDivdo<<1; Divdo0 ←0
Divdo << 1
Divdo63..32 >>1
Ejercicio: traza1000
0100 1010
Arquitecturas de Computadores7 Unidad Aritmética y Lógica
Prof. Javier Cañas R.