81 lines
2.3 KiB
Plaintext
81 lines
2.3 KiB
Plaintext
|
import "RV32IBase.core_desc"
|
||
|
|
||
|
InsructionSet RV32M extends RV32IBase {
|
||
|
constants {
|
||
|
XLEN2
|
||
|
}
|
||
|
instructions{
|
||
|
MUL{
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||
|
X[rd]<= zext(res , XLEN);
|
||
|
}
|
||
|
}
|
||
|
MULH {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
val res[XLEN2] <= sext(X[rs1], XLEN2) * sext(X[rs2], XLEN2);
|
||
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||
|
}
|
||
|
}
|
||
|
MULHSU {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
val res[XLEN2] <= sext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||
|
}
|
||
|
}
|
||
|
MULHU {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||
|
}
|
||
|
}
|
||
|
DIV {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
if(X[rs2]!=0)
|
||
|
X[rd] <= sext(X[rs1], 32) / sext(X[rs2], 32);
|
||
|
else
|
||
|
X[rd] <= -1;
|
||
|
}
|
||
|
}
|
||
|
DIVU {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
if(X[rs2]!=0)
|
||
|
X[rd] <= zext(X[rs1], 32) / zext(X[rs2], 32);
|
||
|
else
|
||
|
X[rd] <= -1;
|
||
|
}
|
||
|
}
|
||
|
REM {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
if(X[rs2]!=0)
|
||
|
X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
|
||
|
else
|
||
|
X[rd] <= X[rs1];
|
||
|
}
|
||
|
}
|
||
|
REMU {
|
||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
|
||
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||
|
if(rd != 0){
|
||
|
if(X[rs2]!=0)
|
||
|
X[rd] <= zext(X[rs1], 32) % zext(X[rs2], 32);
|
||
|
else
|
||
|
X[rd] <= X[rs1];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|