Prof. Rodrigo Araya E. raraya@inf.utfsm.cl Universidad Técnica Federico Santa María Departamento de Informática Valparaíso, 1 er Semestre 2006
1 2 3 4 5
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.
En el lenguaje C, es posible definir números con signo y sin signo: int x; unsigned int y; Ejemplo de números sin signo: Contadores Direcciones de memoria Cómo se comparan números sin signo? // con signo // sin signo
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
Comparaciones con y sin signo Ejemplo 2 Si el contenido del registro $16 es: 1111 1111 1111 1111 1111 1111 1111 1100 Y el contenido del registro $17 es: 0000 0000 0000 0000 0000 0000 0000 0001 slt $8, $16, $17 // $8 == 1 sltu $9, $16, $17 // $9 ==0
Comparaciones con y sin signo Tratamiento de Overflow La máquina MIPS detecta overflow vía una excepción. Las 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 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.
Tratamiento de Overflow Qué pasa frente a una interrupción o excepción? Salvar el PC+4 en el registro EPC. Transferir el control a direcciones específicas.
Tratamiento de Overflow Cómo se sabe la razón de la interrupción o excepción? 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.
Tratamiento de Overflow Normalmente el vector de interrupción está almacenado en la zona baja de memoria (IRQ en PC).
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 // Copia EPC en el registro $r1. Con la instrucción jr se puede volver a la dirección original.
Tratamiento de Overflow En la dirección del vector de interrupciones que corresponde al overflow, se pone la dirección de la subrutina que atiende el overflow. En la máquina MIPS sólo causan excepciones de overflow las instrucciones aritméticas con signo. Como los compiladores de C no consideran overflow, se genera código utilizando: addu, addiu, subu.
Además de las instrucciones aritméticas, todos los procesadores incluyen instrucciones que permiten realizar corrimientos de bits y operaciones lógicas. Estas instrucciones sirven, por ejemplo 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 La instrucción de corrimiento va llenando con ceros. sll es una instrucción tipo R La instrucción srl es equivalente a sll y corre a la derecha.
Instrucciones lógicas And: and $s1, $s2, $s3 # $s1 $s2&$s3 Or: or $s1, $s2, $s3 # $s1 $s2 $s3 Ambas instrucciones son del tipo R. Existen además instrucciones inmediatas: andi y ori.
Creación de Constantes Ejemplo La instrucción load upper inmediate (lui) carga una constante en los 16 bits más significativos del registro destino. Si el contenido inicial de $s1 es: 11111111111111111111111111111100 lui $s1, 3 Queda finalmente: 00000000000000110000000000000000 Los 16 bits menos significativos quedan con ceros. Esto es lo mismo que multiplicar por 2 16. Usando lui y ori se pueden crear constantes en forma rápida.
Hasta ahora sólo hemos visto como se realizan operaciones aritméticas y operaciones lógicas simples, pero Cómo se multiplica o divide? Existen dos estrategias: Software Hardware
Por software: Generar bibliotecas que mediante algoritmos puedan realizar operaciones más complejas en base a las operaciones básicas. Por Hardware: Utilizando unidades llamadas coprocesadores. Cuál es mejor?
No hay duda que el hardware es mucho más rápido que el software. Todos los procesadores modernos incluyen poderosos coprocesadores que permiten realizar multiplicaciones y divisiones utilizando tiempos muy cortos.
Multiplicación Como se multiplica por Hardware? La forma más simple es utilizar los algoritmos que usamos manualmente.
Multiplicación
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 (Segunda Versión)
Multiplicación (Segunda Versión)
Tercera Versión 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 (Tercera Versión)
Multiplicación (Tercera Versión)
División Contenido Cómo se divide por hardware? Nuevamente, la forma más simple es la que usamos para dividir a mano.
División Contenido
División Contenido
Segunda Versión La solución anterior necesita que la ALU sea de 64b. En lugar 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.
División (Segunda Versión)
División (Segunda Versión)
Tercera Versión Al igual que la multiplicación, es posible eliminar el registro Cuociente, utilizando la mitad menos significativa del Dividendo para almacenar el cuociente. Como el cuociente se mueve en conjunto con el resto, es necesario incorporar una fase correctiva al final.
División (Tercera Versión)
División (Tercera Versión)
Fin... Contenido Fin...