Instrucciones de Multiplicación
Estas instrucciones, permiten multiplicar dos enteros.
Todas las instrucciones de multiplicación realizan esta operación con dos registros, no permite directamente multiplicar un registro con una constante, esto es debido a que realizar una multiplicación por medio de una instrucción de suma y corrimiento o resta y corrimiento es mas eficiente.
Podemos distinguir dos tipo de instrucciones de multiplicación
Denominación |
Tamaño op. |
Resultado |
Normal |
32bits x 32bits |
32 bits (inferiores) |
Long |
32bits x 32bits |
64bits. |
Instrucciones de Multiplicación
Multiplicación Normal MUL y MLA
Realizan la multiplicación de dos registro y guardan el resultado en un tercero, el resultado es trucado a los 32 bits menos significativos.
La instrucción MLA además suma al resultado el contenido de un cuarto registro.
Se opera tanto con números con o sin signo, al solo utilizar los 32 bits mas bajos, el signo del resultado no es afectado
MUL{cond}{S} Rd, Rm, Rs ; Rd = Rm x Rs MLA{cond}{S} Rd, Rm, Rs, Rn ; Rd = Rm x Rs + Rn
Multiplicación Long UMULL,UMLAL,SMULL,SMLAL
Estas instrucciones producen un resultado de 64 bits.
Se multiplica el valor de dos registros y el resultado es guardado en dos registros que forman los 64bits.
En este caso debemos separar en dos grupos las instrucciones
- UMULL y UMLAL operan con números sin signo
- SMULL y SMLAL operan con números con signo
La variantes con acumulación son UMLAL y SMLAL para variables sin y con signo respectivamente, las cuales realizan la multiplicación de dos registros, le suma los 64 bits contenidos en el tercer y cuarto registro y guarda el resultado final en esos mismos registros (tercero y cuarto).
Ademas, como regla general los registros Rm y RdLo o RdHi no deben ser los mismos, tampoco RdLo y RdHi deben ser iguales
UMULL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = Rm x Rs UMLAL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = Rm x Rs SMULL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = RdHi RdLo + Rm x Rs SMLAL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = RdHi RdLo + Rm x Rs
Ejemplos
MULS R4, R2, R1 ; R4 = R2 x R1, modifica las banderas de N y Z MLA R7, R8, R9, R3 ; R7 = R8 x R9 + R3 SMULL R4, R8, R2, R3 ; R4 = bits 0 to 31 of R2 x R3 R8 = bits 32 to 63 of R2 x R3 (con signo) UMULL R6, R8, R0, R1 ; R8, R6 = R0 x R1 sin signo UMLAL R5, R8, R0, R1 ; R8, R5 = R0 x R1 + R8, R5 sin signo
Código Instrucciones
MUL opcode = 0 0 0 0
MLA opcode = 0 0 0 1
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
0 |
0 |
0 |
opcode |
S |
Rd |
Rn o ceros |
Rs |
1 |
0 |
0 |
1 |
Rm |
SMLAL opcode = 0 1 1 1
SMULL opcode = 0 1 1 0
UMULL opcode = 0 1 0 0
UMLAL opcode = 0 1 0 1
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
0 |
0 |
0 |
opcode |
S |
RdHi |
RdLo |
Rs |
1 |
0 |
0 |
1 |
Rm |