2.2 Tipos de instrucciones (Última modificación el 03/03/08) RISC versus CISC A finales de los años setenta se efectuaron muchos experimentos con instrucciones muy complejas. Hubieron varios grupos que se opusieron a esta tendencia, y simplificaron el repertorio de instrucciones. Ellos acuñaron el término RISC para este concepto. La idea inicial era hacer instrucciones simples que pudieran ejecutarse con rapidez. Pronto se vio que la clave para un buen rendimiento era diseñar instrucciones que pudieran ejecutarse rápidamente. El tiempo real que una instrucción tardaba era menos importante que el número de instrucciones que podían ejecutarse por segundo. 1 La característica que llamó la atención fue el número relativamente pequeño de instrucciones disponibles, por lo regular unas 50. Este número era mucho menor que las 200 o 300 que tenían computadoras como la DEC VAX. El acrónimo RISC significa computadora de conjunto de instrucciones reducido (Reduced Instruction Set Computer), lo que contrasta con CISC que signifca computadora de conjunto de instrucciones complejo (Complex Intruction Set Computer). Hoy en día poca gente piensa que el tamaño del conjunto de instrucciones sea crucial, pero el nombre ha persistido. 2 Las instrucciones soportadas por la mayoría de las arquitecturas pueden clasificarse según la siguiente tabla: 3 (I) Aritméticas y lógicas (1) Aritméticas En la mayoría de los computadores: suma, resta, multiplicación y división. Tipos de operandos: (1) Todas con enteros con signo. (2) Algunas con enteros sin signo. En la MIPS: (1) Addition (with overflow) add rd, rs, rt (2) Addition (without overflow) Put the sum of registers rs and rt into register rd. addu rd, rs, rt 4 Otras operaciones aritméticas posibles (un solo operando): - Valor absoluto. En la MIPS: Absolute value Put the absolute value of register rsrc in register rdest. abs rdest, rsrc pseudoinstruction - Cambio de signo. En la MIPS: Negate value (with overflow) neg rdest, rsrc pseudoinstruction Negate value (without overflow) negu rdest, rsrc pseudoinstruction Put the negative of register rsrc into register rdest. - Incremento y decremento. 5 (2) Lógicas Son operaciones sobre datos lógicos: operaciones lógicas bit a bit. En la MIPS: AND, OR, NOR y XOR. AND: Put the logical AND of registers rs and rt into register rd. and rd, rs, rt Ejemplo: rs = 0000 0000 1010 0101 rt = 0000 0000 0000 1111 rd = 0000 0000 0000 0101 (3) Operaciones de desplazamiento y rotación 6 7 Ejemplos en la MIPS : Format: SRA rd, rt, sa Purpose: To arithmetic right shift a word by a fixed number of bits. Description: rd ĸ rt >> sa (arithmetic) The contents of the low-order 32-bit word of GPR rt are shifted right, duplicating the sign-bit (bit 31) in the emptied bits; the word result is placed in GPR rd. The bit shift count is specified by sa. Format: SRL rd, rt, sa Purpose: To logical right shift a word by a fixed number of bits. Description: rd ĸ rt >> sa (logical) The contents of the low-order 32-bit word of GPR rt are shifted right, inserting zeros into the emptied bits; the word result is placed in GPR rd. 8 (II) Transferencia de datos Operación: copiar un dato de un sitio (registro o memoria) a otro. Debe especificar: - Operandos fuente y destino. - Longitud del dato a transferir. El tamaño del dato se especifica en el código de operación. En la MIPS: lb, lh ó lw. - Load word: Load the 32-bit quantity (word) at address into register rt. lw rt, address - Load byte: Load the byte at address into register rt. lb rt, address Operación muy sencilla en el caso registro-registro. Si es con memoria, habrá que calcular la dirección del dato y hacer el acceso a memoria (más lenta que los registros). 9 (III) Control (de flujo de ejecución) En las instrucciones vistas hasta ahora la instrucción que se ejecutará a continuación es la siguiente en memoria. Las instrucciones de control cambian esta secuencia de ejecución (ruptura de secuencia). Para ello tendrán que especificar qué instrucción se ejecutará a continuación. La operación que realiza la CPU es actualizar el registro contador de programa (PC) para que contenga la dirección en memoria de la próxima instrucción a ejecutar. 10 Tipos de rupturas de secuencia: (1) Bifurcaciones (branch): rupturas de secuencia condicionales. La condición puede ser: - El valor de un bit de estado. - La comparación (con cero) del valor de un registro (MIPS): bgez rs, label. - La comparación de los valores de 2 registros (MIPS): beq rs, rt, label. Asociadas con estas instrucciones pueden haber otras de comparación (MIPS): slt rd, rs, rt. (2) Saltos (jump): rupturas de secuencia no condicionales. 11 (3) Llamadas y retornos de procedimientos: para ejecutar un procedimiento y retornar al programa principal: 12 (IV) Sistema Llamadas al sistema operativo (MIPS:syscall) para que realice algún servicio: entrada/salida, detener la ejecución del programa,… en la MIPS 13 (V) Punto flotante Operaciones con reales. En casi todas las máquinas, la MIPS las tiene. Floating-point addition double add.d fd, fs, ft Floating-point addition single add.s fd, fs, ft Compute the sum of the floating-point doubles (singles) in registers fs and ft and put it in register fd. (VI) Decimal Para operar con datos BCD. La MIPS no las tiene. (VII) Cadenas Para copiar o mover cadenas de caracteres. La MIPS no las tiene. 14 Veamos un resumen del repertorio de instrucciones de la MIPS: MIPS IV Instruction Set (1) Arithmetic and Logical Instructions (2) Constant-Manipulating Instructions (3) Comparison Instructions (4) Branch Instructions (5) Jump Instructions (6) Load Instructions (7) Store Instructions (8) Data Movement Instructions (9) Floating-Point Instructions (10) Exception and Interrupt Instructions 15 (1) Arithmetic and Logical Instructions Addition (with overflow) add rd, rs, rt Put the sum of registers rs and rt into register rd. Addition immediate (with overflow) addi rt, rs, imm Put the sum of register rs and the sign-extended immediate (16 bits) into register rt. If the addition results in 32-bit 2’s complement arithmetic overflow then the destination register is not modified and an Integer Overflow exception occurs. 16 AND and rd, rs, rt Put the logical AND of registers rs and rt into register rd. AND immediate andi rt, rs, imm Put the logical AND of register rs and the zero-extended immediate into register rt. Divide div rs, rt Divide register rs by register rt. Leave the quotient in register lo and the remainder in register hi. Multiply mult rs, rt Multiply registers rs and rt. Leave the low-order word of the product in register lo and the high-order word in register hi. 17 NOR nor rd, rs, rt Put the logical NOR of registers rs and rt into register rd. OR or rd, rs, rt Put the logical OR of registers rs and rt into register rd. OR immediate ori rt, rs, imm Put the logical OR of register rs and the zero-extended immediate into register rt. 18 Shift left logical sll rd, rt, shamt Shift left logical variable sllv rd, rt, rs Shift right arithmetic sra rd, rt, shamt Shift right arithmetic variable srav rd, rt, rs Shift right logical srl rd, rt, shamt Shift right logical variable srlv rd, rt, rs Shift register rt left (right) by the distance indicated by immediate shamt or the register rs and put the result in register rd. 19 Subtract (with overflow) sub rd, rs, rt Put the difference of registers rs and rt into register rd. If the subtraction results in 32-bit 2’s complement arithmetic overflow then the destination register is not modified and an Integer Overflow exception occurs. Exclusive OR xor rd, rs, rt Put the logical XOR of registers rs and rt into register rd. XOR immediate xori rt, rs, imm Put the logical XOR of register rs and the zero-extended immediate into register rt. 20 (2) Constant-Manipulating Instructions Load upper immediate lui rt, imm Load the lower halfword of the immediate imm into the upper halfword of register rt. The lower bits of the register are set to 0. Cargar una palabra inmediata en un registro No hay una instrucción máquina para ello Se puede hacer con un lui y un ori. Por ejemplo lui $t0, 0x1234 # t0=0x12340000 ori $t1, $t0, 0x5678 # t1=0x12340000 OR 0x00005678 cargaría la palabra 0x12345678 en el registro t1. 21 (3) Comparison Instructions Set less than slt rd, rs, rt Set register rd to 1 if register rs is less than rt, and to 0 otherwise. Set less than immediate slti rt, rs, imm Set register rt to 1 if register rs is less than the sign-extended immediate, and to 0 otherwise. 22 (4) Branch Instructions Branch on equal beq rs, rt, label Conditionally branch to instruction specified by label if register rs equals rt. Branch on greater than equal zero bgez rs, label Conditionally branch to instruction specified by label if register rs is greater than or equal to 0. Branch on greater than zero bgtz rs, label Conditionally branch to instruction specified by label if register rs is greater than 0. 23 Branch on less than equal zero blez rs, label Conditionally branch to instruction specified by label if register rs is less than or equal to 0. Branch on less than zero bltz rs, label Conditionally branch to instruction specified by label if register rs is less than 0. Branch on not equal bne rs, rt, label Conditionally branch to instruction specified by label if register rs is not equal to rt. 24 (5) Jump instructions Jump j target Unconditionally jump to the instruction at target. Jump and link jal target Unconditionally jump to the instruction at target; save the address of the next instruction in register $ra. Jump register jr rs Unconditionally jump to the instruction whose address is in register rs. 25 (6) Load Instructions Load byte lb rt, address Load unsigned byte lbu rt, address Load the byte at address into register rt; the byte is sign-extended by lb, but not by lbu. 26 Load halfword lh rt, address Load unsigned halfword lhu rt, address Load the 16-bit quantity (halfword) at address into register rt; the halfword is sign-extended by lh, but not by lhu. Load word lw rt, address Load the 32-bit quantity (word) at address into register rt. 27 (7) Store Instructions Store byte sb rt, address Store the low byte from register rt at address. Store halfword sh rt, address Store the low halfword from register rt at address. Store word sw rt, address Store the word from register rt at address. 28 (8) Data Movement Instructions Move from hi mfhi rd Move from lo mflo rd Move the hi (lo) register to register rd. Move to hi mthi rs Move to lo mtlo rs Move register rs to the hi (lo) register. Mover un registro a otro No existe una instrucción máquina para ello. Se puede hacer con un add rd, rs, $zero #rd=rs+0 29 (9) Floating-Point Instructions No las veremos. (10) Exception and Interrupt Instructions System call syscall Register $v0 contains the number of the system call (see Figure A.17) provided by SPIM. 30