Instrucciones
Last updated
Last updated
Suma el registro x[rs2]
al registro x[rs1]
y escribe el resultado en x[rd]
. Overflow aritmético ignorado.
Add
Operación: x[rd] = x[rs1] + x[rs2]
Tipo: R
Uso
Suma el inmediato sign-extended al registro x[rs1]
y escribe el resultado en x[rd]
. Overflow aritmético ignorado.
Add Immediate
Operación: x[rd] x[rs1] sext(immediate)
Tipo: I
Uso
Calcula el AND a nivel de bits de los registros x[rs1]
y x[rs2]
y escribe el resultado en x[rd]
.
AND
Tipo: R
Uso
Calcula el AND a nivel de bits del inmediato sign-extended y el registro x[rs1]
y escribe el resultado en x[rd]
.
AND Immediate
Tipo: I
Uso
Suma el inmediato sign-extended de 20 bits, corrido a la izquierda por 12 bits, al pc
, y escribe el resultado en x[rd]
.
AND Immediate
Tipo: U
Uso
Si el registro x[rs1]
es igual al registro x[rs2]
, asignar al pc
su valor actual más el offset
sign-extended.
Branch if Equal
Tipo: B
Uso
Si el registro x[rs1]
es por lo menos x[rs2]
, tratando los valores como números de complemento a dos, asignar al pc
su valor actual más el offset
sign-extended.
Branch if Greater Than or Equal
Tipo: B
Uso
Si el registro x[rs1]
es por lo menos x[rs2]
, tratando los valores como números sin signo, asignar al pc
su valor actual más el offset
unsign-extended.
Branch if Greater Than or Equal, Unsigned
Tipo: B
Uso
Si el registro x[rs1]
es menor que x[rs2]
, tratando los valores como números de complemento a dos, asignar al pc
su valor actual más el offset
sign-extended
Branch if Less Than
Tipo: B
Uso
Si el registro x[rs1]
es menor que x[rs2]
, tratando los valores como números sin signo, asignar al pc
su valor actual más el offset
unsign-extended.
Branch if Less Than, Unsigned
Tipo: B
Uso
Si el registro x[rs1]
no es igual al registro x[rs2]
, asignar al pc
su valor actual más el offset
sign-extended.
Branch if Not Equal
Tipo: B
Uso
Setea en t
el valor del control and status register csr
. Escribe el AND
a nivel de bits de t
y el complemento a uno de x[rs1]
en el csr
, luego escribe t
en el x[rd]
.
Control and Status Register Read and Clear
Tipo: I
Uso
Setea en t
el valor del control and status register csr
. Escribe el AND
a nivel de bits de t
y el complemento a uno del inmediato de cinco bits zero-extended zimm
en el csr
, luego escribe t
en el x[rd]
(Los bits del 5 en adelante en el csr no son modificados).
Control and Status Register Read and Clear Immediate
Tipo: I
Uso
Setea en t
el valor del control and status register csr
. Escribe el OR
a nivel de bits de t
y x[rs1]
en el csr
, luego escribe t
en el x[rd]
.
Control and Status Register Read and Set
Tipo: I
Uso
Setea en t
el valor del control and status register csr
. Escribe el OR
a nivel de bits de t
y y el inmediato de cinco bits zero-extended zimm
en el csr
, luego escribe t
en el x[rd]
. (Los bits del 5 en adelante en el csr no son modificados).
Control and Status Register Read and Set Immediate
Tipo: I
Uso
Setea en t
el valor del control and status register csr
. Copia el valor de x[rs1]
en el csr
, luego escribe el valor de t
en el x[rd]
.
Control and Status Register Read and Write
Tipo: I
Uso
Copia el valor del control and status register csr
en x[rd]
, luego escribe el inmediato de cinco bits zero-extended zimm
en el csr
.
Control and Status Register Read and Write Immediate
Tipo: I
Uso
Divide x[rs1]
entre x[rs2]
, redondeando hacia cero, tratando los valores como números de complemento a dos, y escribe el cociente en x[rd]
.
Divide
Tipo: R
Uso
Divide x[rs1]
entre x[rs2]
, redondeando hacia cero, tratando los valores como números sin signo, y escribe el cociente en x[rd]
.
Divide, Unsigned
Tipo: R
Uso
Hace una petición del debugger levantando una excepción de Breakpoint
.
Environment Breakpoint
Operación: RaiseException(Breakpoint)
Tipo: I
Uso
Hace una petición del ambiente de ejecución levantando una excepción de Environment Call
.
Environment Call
Operación: RaiseException(EnvironmentCall)
Tipo: I
Uso
Suma los números de punto flotante de precisión simple de los registros f[rs1]
y f[rs2]
y escribe la suma redondeada de precisión simple en f[rd]
.
Floating-point Add, Single-Precision
Tipo: R
Uso
Escribe en x[rd]
una máscara que indica la clase del número de punto flotante de precisión simple en f[rs1]
. Exactamente un bit en x[rd]
es puesto en 1
, de acuerdo a la siguiente tabla:
Floating-point Classify, Single-Precision
Tipo: R
Uso
Convierte el entero de 32 bits de complemento a dos en x[rs1]
en un número de punto flotante de precisión simple y lo escribe en f[rd]
.
Floating-point Convert to Single from Word
Tipo: R
Uso
Convierte el entero de 32 bits sin signo en x[rs1]
en un número de punto flotante de precisión simple y lo escribe en f[rd]
.
Floating-point Convert to Single from Unsigned Word
Tipo: R
Uso
Convierte el número de punto flotante de precisión simple en el registro f[rs1]
en un entero de 32 bits de complemento a dos y escribe el resultado sign-extended en x[rd]
.
Floating-point Convert to Word from Single
Tipo: R
Uso
Convierte el número de punto flotante de precisión simple en el registro f[rs1]
en un entero de 32 bits sin signo y escribe el resultado sign-extended en x[rd]
.
Floating-point Convert to Unsigned Word from Single
Tipo: R
Uso
Divide el número de punto flotante de precisión simple en el registro f[rs1]
entre f[rs2]
y escribe el cociente redondeado de precisión simple en f[rd]
.
Floating-point Divide, Single-Precision
Tipo: R
Uso
Vuelve los accesos previos a memoria e I/O en el conjunto predecessor
observables a otros threads y dispositivos antes de que los accesos subsiguientes a memoria e I/O en el conjunto successor
sean observables. Los bits 3, 2, 1 y 0 en estos conjuntos corresponden device input
, device output
, memory reads
y memory writes
, respectivamente. La instrucción fence r, rw
por ejemplo, ordena lecturas más antiguas con lecturas y escrituras más recientes, y se codifica con pred = 0010
y suc = 0011
. Si los argumentos son omitidos, se asume un fence iorw, iorw
completo.
Fence Memory and I/O
Operación: Fence(pred, succ)
Tipo: I
Uso
Escribe 1
en x[rd]
si el número de punto flotante de precisión simple en f[rs1]
es igual al número en f[rs2]
, y 0
si no.
Floating-point Equals, Single-Precision
Tipo: R
Uso
Escribe 1
en x[rd]
si el número de punto flotante de precisión simple en f[rs1]
es menor o igual que el número en f[rs2]
, y 0
si no.
Floating-point Less Than or Equal, Single-Precision
Tipo: R
Uso
Escribe 1
en x[rd]
si el número de punto flotante de precisión simple en f[rs1]
es menor que el número en f[rs2]
, y 0
si no.
Floating-point Less Than, Single-Precision
Tipo: R
Uso
Carga un número de punto flotante de precisión simple de la dirección de memoria x[rs1] + sign-extend(offset)
y lo escribe en f[rd]
.
Formas comprimidas: c.flwsp
rd, offset
; c.flw
rd, offset(rs1)
.
Floating-point Load Word
Tipo: I
Uso
Multiplica los números de punto flotante de precisión simple en f[rs1]
y f[rs2]
, suma el producto sin redondear al número de punto flotante de precisión simple en f[rs3]
, y escribe el resultado redondeado de precisión simple en f[rd]
.
Floating-point Fused Multiply-Add, Single-Precision
Tipo: R4
Uso
Copia el mayor de los números de punto flotante de precisión simple de los registros f[rs1]
y f[rs2]
a f[rd]
.
Floating-point Maximum, Single-Precision
Tipo: R
Uso
Copia el menor de los números de punto flotante de precisión simple de los registros f[rs1]
y f[rs2]
a f[rd]
.
Floating-point Minimum, Single-Precision
Tipo: R
Uso
Multiplica los números de punto flotante de precisión simple en f[rs1]
y f[rs2]
, resta el número de punto flotante de precisión simple en f[rs3]
del producto sin redondear, y escribe el resultado redondeado de precisión simple en f[rd]
.
Floating-point Fused Multiply-Subtract, Single-Precision
Tipo: R4
Uso
Multiplica los números de punto flotante de precisión simple en los registros f[rs1]
y f[rs2]
y escribe el producto redondeado de precisión simple en f[rd]
.
Floating-point Multiply, Single-Precision
Tipo: R
Uso
Copia el número de punto flotante de precisión simple en el registro x[rs1]
a f[rd]
.
Floating-point Move Word from Integer
Tipo: R
Uso
Copia el número de punto flotante de precisión simple en el registro f[rs1]
a x[rd]
, extendiendo en signo el resultado para RV64F
.
Floating-point Move Word to Integer
Tipo: R
Uso
Multiplica los números de punto flotante de precisión simple en f[rs1]
y f[rs2]
, niega el resultado, suma el número de punto flotante de precisión simple en f[rs3]
del producto sin redondear, y escribe el resultado redondeado de precisión simple en f[rd]
.
Floating-point Fused Negative Multiply-Add, Single-Precision
Tipo: R4
Uso
Multiplica los números de punto flotante de precisión simple en f[rs1]
y f[rs2]
, niega el resultado, resta el producto sin redondear al número de punto flotante de precisión simple en f[rs3]
, y escribe el resultado redondeado de precisión simple en f[rd]
.
Floating-point Fused Negative Multiply-Subtract, Single-Precision
Tipo: R4
Uso
Construye un nuevo número de punto flotante de precisión simple del exponente y significando de f[rs1]
tomando el signo de f[rs2]
, y lo escribe en f[rd]
.
Floating-point Sign Inject, Single-Precision
Tipo: R
Uso
Construye un nuevo número de punto flotante de precisión simple del exponente y significando de f[rs1]
tomando el signo opuesto de f[rs2]
, y lo escribe en f[rd]
.
Floating-point Sign Inject-Negate, Single-Precision
Tipo: R
Uso
Construye un nuevo número de punto flotante de precisión simple del exponente y significando de f[rs1]
tomando el signo del XOR
de los signos de f[rs1]
y f[rs2]
, y lo escribe en f[rd]
.
Floating-point Sign Inject-XOR, Single-Precision
Tipo: R
Uso
Calcula la raíz cuadrada del número de punto flotante de precisión doble en el registro f[rs1]
y escribe el resultado redondeado de precisión simple en f[rd]
.
Floating-point Square Root, Single-Precision
Tipo: R
Uso
Resta el número de punto flotante de precisión simple en el registro f[rs2]
de f[rs1]
y escribe la diferencia de precisión simple en f[rd]
.
Floating-point Subtract, Single-Precision
Tipo: R
Uso
Almacena el número de punto flotante de precisión simple del registro f[rs2]
a memoria en la dirección x[rs1] + sign-extend(offset)
.
Formas comprimidas: c.fswsp
rs2, offset
; c.fsw
rs2, offset(rs1)
.
Floating-point Store Word
Tipo: S
Uso
Escribe la dirección de la siguiente instrucción pc+4
en x[rd]
, luego asigna al pc
su valor actual más el offset
extendido en signo. Si rd
es omitido, se asume x1
.
Formas comprimidas: c.j
offset
; c.jal
offset
.
Jump and Link
Tipo: J
Uso
Escribe x[rs1] + sign-extend(offset)
al pc
, enmascarando a cero el bit menos significativo de la dirección calculada, luego escribe el valor previo del pc+4
en x[rd]
. Si rd
es omitido, se asume x1
.
Formas comprimidas: c.jr
rs1
; c.jalr
rs1
.
Jump and Link Register
Tipo: I
Uso
Carga un byte de memoria en la dirección x[rs1] + sign-extend(offset)
y lo escribe en x[rd]
, extendiendo en signo el resultado.
Load Byte
Tipo: I
Uso
Carga un byte de memoria en la dirección x[rs1] + sign-extend(offset)
y lo escribe en x[rd]
, extendiendo con cero el resultado.
Load Byte, Unsigned
Tipo: I
Uso
Carga dos bytes de memoria en la dirección x[rs1] + sign-extend(offset)
y los escribe en x[rd]
, extendiendo en signo el resultado.
Load Halfword
Tipo: I
Uso
Carga dos bytes de memoria en la dirección x[rs1] + sign-extend(offset)
y los escribe en x[rd]
, extendiendo con cero el resultado.
Load Halfword, Unsigned
Tipo: I
Uso
Carga cuatro bytes de memoria en la dirección x[rs1] + sign-extend(offset)
y los escribe en x[rd]
. Para RV64I
, el resultado es extendido en signo.
Formas comprimidas: c.lwsp
rd, offset
; c.lw
rd, offset(rs1)
Load Word
Tipo: I
Uso
Escribe el inmediato
de 20 bits extendido en signo, corrido a la izquierda por 12 bits, en x[rd]
, volviendo cero los 12 bits más bajos.
Formas comprimidas: c.lui
rd, imm
Load Upper Immediate
Tipo: I
Uso
Multiplica x[rs1]
por x[rs2]
y escribe el producto en f[rd]
. Overflow aritmético ignorado.
Multiply
Tipo: R
Uso
Multiplica x[rs1]
por x[rs2]
, tratando los valores como números de complemento a dos, y escribe la mitad alta del producto a f[rd]
.
Multiply High
Tipo: R
Uso
Multiplica x[rs1]
por x[rs2]
, tratando a x[rs1]
como un número de complemento a dos, y a x[rs2]
como un número sin signo, y escribe la mitad alta del producto a f[rd]
.
Multiply High Signed-Unsigned
Tipo: R
Uso
Multiplica x[rs1]
por x[rs2]
, tratando los valores como números sin signo, y escribe la mitad alta del producto a f[rd]
.
Multiply High Unsigned
Tipo: R
Uso
Calcula el OR
inclusivo a nivel de bits de los registros x[rs1]
y x[rs2]
y escribe el resultado en x[rd]
.
Formas comprimidas: c.or
rd, rs2
OR
Tipo: R
Uso
Calcula el OR
inclusivo a nivel de bits del inmediato sign-extended
y el registro x[rs1]
y escribe el resultado en x[rd]
.
OR Immediate
Tipo: R
Uso
Divide$\texttt{x[rs1]
entre x[rs2]
, redondeando hacia cero, tratando los valores como números de complemento a dos, y escribe el residuo en f[rd]
.
Remainder
Tipo: R
Uso
Divide x[rs1]
entre x[rs2]
, redondeando hacia cero, tratando los valores como números sin signo, y escribe el residuo en f[rd]
.
Remainder, Unsigned
Tipo: R
Uso
Almacena el byte menos significativo del registro x[rs2]
a memoria en la dirección x[rs1] + sign-extend(offset)
.
Store Byte
Tipo: S
Uso
Almacena los dos bytes menos significativos del registro x[rs2]
a memoria en la dirección x[rs1] + sign-extend(offset)
.
Store Halfword
Tipo: S
Uso
Corre el registro x[rs1]
a la izquierda por x[rs2]
posiciones de bits. Los bits liberados son reemplazados por ceros, y el resultado es escrito en x[rd]
. Los cinco bits menos significativos de x[rs2]
(o seis bits para RV64I
) forman la cantidad a correr; los bits altos son ignorados.
Shift Left Logical
Tipo: R
Uso
Corre el registro x[rs1]
a la izquierda por shamt
posiciones de bits. Los bits liberados son reemplazados por ceros, y el resultado es escrito en x[rd]
. Para RV32I
, la instrucción solo es legal cuando shamt[5]=0
.
Forma comprimida: c.slli
rd, shamt
Shift Left Logical Immediate
Tipo: I
Uso
Compara x[rs1]
con x[rs2]
como números de complemento a dos, y escribe en $\texttt{x[rd]
si x[rs1]
es menor, ó 0
si no.
Set if Less Than
Tipo: R
Uso
Compara x[rs1]
con el immediate sign-extended
como números de complemento a dos, y escribe 1
en x[rd]
si x[rs1]
es menor, ó 0
si no.
Set if Less Than Immediate
Tipo: I
Uso
Compara x[rs1]
con el immediate sign-extended
como números sin signo, y escribe 1
en x[rd]
si x[rs1]
es menor, ó 0
si no.
Set if Less Than Immediate, Unsigned
Tipo: I
Uso
Compara x[rs1]
con x[rs2]
como números sin signo, y escribe 1
en x[rd]
si x[rs1]
es menor, ó 0
si no.
Set if Less Than, Unsigned
Tipo: R
Uso
Corre el registro x[rs1]
a la derecha porx[rs2]
posiciones de bits. Los bits liberados son reemplazados por copias del bit más significativo de x[rs1]
, y el resultado es escrito en x[rd]
. Los cinco bits menos significativos de x[rs2]
(o seis bits para RV64I
) forman la cantidad a correr; los bits altos son ignorados.
Shift Right Arithmetic
Tipo: R
Uso
Corre el registro x[rs1]
a la derecha por shamt
posiciones de bits. Los bits liberados son reemplazados por copias del bit más significativo de x[rs1]
, y el resultado es escrito en x[rd]
. Para RV32I
, la instrucción solo es legal cuando shamt[5]=0
.
Forma comprimida: c.srai
rd, shamt
.
Shift Right Arithmetic Immediate
Tipo: I
Uso
Corre el registro x[rs1]
a la derecha por x[rs2]
posiciones de bits. Los bits liberados son reemplazados por ceros ceros, y el resultado es escrito en x[rd]
. Los cinco bits menos significativos de x[rs2]
(o seis bits para RV64I
) forman la cantidad a correr; los bits altos son ignorados.
Shift Right Logical
Tipo: R
Uso
Corre el registro x[rs1]
a la derecha por shamt
posiciones de bits. Los bits liberados son reemplazados por ceros, y el resultado es escrito en x[rd]
. Para RV32I
, la instrucción solo es legal cuando shamt[5]=0
.
Forma comprimida: c.srli
rd, shamt
.
Shift Right Logical Immediate
Tipo: I
Uso
Resta el registro x[rs2]
del registro x[rs1]
, trunca el resultado a 32 bits, y escribe el resultado de 32 bits, sign-extended, en x[rd]
. Overflow aritmético ignorado.
Forma comprimida: c.sub
rd, rs
.
Subtract
Tipo: R
Uso
Almacena los cuatro bytes menos significativos del registro x[rs2]
a memoria en la dirección x[rs1] + sign-extend(offset)
.
Formas comprimidas: c.swsp
rs2, offset
; c.sw
rs2, offset(rs1)
.
Store Word
Tipo: S
Uso
Calcula el OR
exclusivo a nivel de bits de los registros x[rs1]
y x[rs2]
y escribe el resultado en x[rd]
.
Forma comprimida: c.xor
rd, rs2
Exclusive-OR
Tipo: R
Uso
Calcula el OR
exclusivo a nivel de bits del immediate sign-extended
y el registro x[rs1]
y escribe el resultado en x[rd]
.
Exclusive-OR Immediate
Tipo: R
Uso
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] sext(immediate)
Operación: x[rd] pc sext( immediate[31:12] 12 )
Operación: if (rs1 rs2) then pc sext(offset)
Operación: if (rs1 rs2) pc sext( offset )
Operación: if (rs1 rs2) then pc sext( offset )
Operación: if (rs1 rs2) then pc sext( offset )
Operación: if (rs1 rs2) then pc sext( offset )
Operación: if (rs1 rs2) then pc sext( offset )
Operación: t CSRs[csr]; CSRs[csr] t x[rs1]; x[rd] t
Operación: t CSRs[csr]; CSRs[csr] t zimm; x[rd] t
Operación: t CSRs[csr]; CSRs[csr] t x[rs1]; x[rd] t
Operación: t CSRs[csr]; CSRs[csr] t zimm; x[rd] t
Operación: t CSRs[csr]; CSRs[csr] x[rs1]; x[rd] t
Operación: x[rd] CSRs[csr]; CSRs[csr] zimm
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] x[rs2]
Operación: f[rd] f[rs1] f[rs2]
Operación: x[rd] = (f[rs1])
Operación: f[rd] f32 ( x[rs1] )
Operación: f[rd] f32 ( x[rs1] )
Operación: x[rd] sext( s32 ( f[rs1] ) )
Operación: x[rd] sext( u32 ( f[rs1] ) )
Operación: f[rd] f[rs1] f[rs2]
Operación: x[rd] f[rs1] f[rs2]
Operación: x[rd] f[rs1] f[rs2]
Operación: x[rd] f[rs1] f[rs2]
Operación: f[rd] M[ x[rs1] sext( offset ) ] [31:0]
Operación: f[rd] f[rs1] f[rs2] f[rs3]
Operación: f[rd] ( f[rs1], f[rs2] )
Operación: f[rd] ( f[rs1], f[rs2] )
Operación: f[rd] f[rs1] f[rs2] f[rs3]
Operación: f[rd] f[rs1] f[rs2]
Operación: f[rd] x[rs1][31:0]
Operación: x[rd] sext( f[rs1][31:0] )
Operación: f[rd] f[rs1] f[rs2] f[rs3]
Operación: f[rd] = f[rs1] f[rs2] f[rs3]
Operación: f[rd] { f[rs2][31], f[rs1][30:0] }
Operación: f[rd] = { f[rs2][31], f[rs1][30:0] }
Operación: f[rd] { f[rs1][31] f[rs2][31], f[rs1][30:0] }
Operación: f[rd] { f[rs1] }
Operación: f[rd] f[rs1] f[rs2]
Operación: M[x[rs1] sext(offset)] f[rs2][31:0]
Operación: x[rd] pc 4; pc sext(offset)
Operación: t pc 4; pc (x[rs1] sext(offset)) & 1; x[rd] t
Operación: x[rd] sext( M[x[rs1] sext(offset)][7:0] )
Operación: x[rd] M[x[rs1] sext(offset)][7:0]
Operación: x[rd] sext( M[x[rs1] sext(offset)][15:0] )
Operación: x[rd] M[x[rs1] sext(offset)][15:0]
Operación: x[rd] sext( M[x[rs1] sext(offset)][31:0] )
Operación: x[rd] sext(immediate[31:12] 12)
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] = ( x[rs1] x[rs2] ) XLEN
Operación: x[rd] ( x[rs1] x[rs2] ) XLEN
Operación: x[rd] ( x[rs1] x[rs2] ) XLEN
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] sext(immediate)
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] x[rs2]
Operación: M[x[rs1] sext(offset)] x[rs2][7:0]
Operación: M[x[rs1] sext(offset)] x[rs2][15:0]
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] shamt
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] sext(immediate)
Operación: x[rd] x[rs1] sext(immediate)
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] shamt
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] shamt
Operación: $\texttt{x[rd] x[rs1] x[rs2]
Operación: M[x[rs1] sext(offset)] x[rs2][31:0]
Operación: x[rd] x[rs1] x[rs2]
Operación: x[rd] x[rs1] sext(immediate)
Bit en x[rd]
Significado
0
f[rs1]
es
1
f[rs1]
es un número negativo normal
2
f[rs1]
es un número negativo subnormal
3
f[rs1]
es
4
f[rs1]
es
5
f[rs1]
es un número positivo subnormal
6
f[rs1]
es un número positivo normal
7
f[rs1]
es
8
f[rs1]
es un simple