OPW instructions

This commit is contained in:
Baptiste 2022-11-16 17:59:09 +01:00
parent 98f4c0b67e
commit d021fc3565
2 changed files with 110 additions and 2 deletions

View File

@ -9,7 +9,8 @@ pub struct Machine {
pub pc : u32, pub pc : u32,
pub int_reg : [u32 ; 32], pub int_reg : [u32 ; 32],
pub instructions : [u32 ; 100], pub instructions : [u32 ; 100],
pub main_memory : [u8 ; MEM_SIZE] pub main_memory : [u8 ; MEM_SIZE],
pub shiftmask : [u32 ; 32]
// futur taille à calculer int memSize = g_cfg->NumPhysPages * g_cfg->PageSize; // futur taille à calculer int memSize = g_cfg->NumPhysPages * g_cfg->PageSize;
//creer une struct cfg(configuration) qui s'initialise avec valeur dans un fichier cfg //creer une struct cfg(configuration) qui s'initialise avec valeur dans un fichier cfg
} }
@ -18,12 +19,21 @@ pub struct Machine {
impl Machine { impl Machine {
pub fn _init_machine() -> Machine { pub fn _init_machine() -> Machine {
let mut shiftmask : [u32 ; 32] = [0 ; 32];
let mut value : u32 = 0xffff;
value = (value << 16) + value;
for i in 0..32 {
shiftmask[i] = value;
value = value >> 1;
}
Machine { Machine {
pc : 0, pc : 0,
instructions : [0 ; 100], instructions : [0 ; 100],
int_reg : [0 ; 32], int_reg : [0 ; 32],
main_memory : [0 ; MEM_SIZE] main_memory : [0 ; MEM_SIZE],
shiftmask : shiftmask
} }
} }
@ -68,6 +78,13 @@ impl Machine {
}, },
RISCV_OPI_SLLI => { RISCV_OPI_SLLI => {
machine.int_reg[inst.rd as usize] = machine.int_reg[inst.rs1 as usize] << inst.shamt; machine.int_reg[inst.rd as usize] = machine.int_reg[inst.rs1 as usize] << inst.shamt;
},
RISCV_OPI_SRI => {
if inst.funct7_smaller == RISCV_OPI_SRI_SRLI {
machine.int_reg[inst.rd as usize] = (machine.int_reg[inst.rs1 as usize] >> inst.shamt) & machine.shiftmask[inst.shamt as usize];
} else { // SRAI
machine.int_reg[inst.rd as usize] = (machine.int_reg[inst.rs1 as usize] >> inst.shamt);
}
} }
_ => { println!("{} inconnu", inst.funct3); } _ => { println!("{} inconnu", inst.funct3); }
} }
@ -123,6 +140,65 @@ impl Machine {
println!("RISCV_OP undefined case\n"); println!("RISCV_OP undefined case\n");
} }
} }
},
//******************************************************************************************
// Treatment for: OPW INSTRUCTIONS
RISCV_OPW => {
if inst.funct7 == 1 {
let localDataa = machine.int_reg[inst.rs1 as usize] & 0xffffffff;
let localDatab = machine.int_reg[inst.rs2 as usize] & 0xffffffff;
let localDataaUnsigned = machine.int_reg[inst.rs1 as usize] & 0xffffffff;
let localDatabUnsigned = machine.int_reg[inst.rs2 as usize] & 0xffffffff;
// Match case for multiplication operations (in standard extension RV32M)
match inst.funct3 {
RISCV_OPW_M_MULW => {
machine.int_reg[inst.rd as usize] = localDataa * localDatab;
},
RISCV_OPW_M_DIVW => {
machine.int_reg[inst.rd as usize] = localDataa / localDatab;
},
RISCV_OPW_M_DIVUW => {
machine.int_reg[inst.rd as usize] = localDataaUnsigned / localDatabUnsigned;
},
RISCV_OPW_M_REMW => {
machine.int_reg[inst.rd as usize] = localDataa % localDatab;
},
RISCV_OPW_M_REMUW => {
machine.int_reg[inst.rd as usize] = localDataaUnsigned % localDatabUnsigned;
},
_ => {
println!("this instruction ({}) doesn't exists", inst.value);
}
}
} else {
let localDataa = machine.int_reg[inst.rs1 as usize] & 0xffffffff;
let localDatab = machine.int_reg[inst.rs2 as usize] & 0xffffffff;
// Match case for base OP operation
match inst.funct3 {
RISCV_OPW_ADDSUBW => {
if inst.funct7 == RISCV_OPW_ADDSUBW_ADDW {
machine.int_reg[inst.rd as usize] = localDataa + localDatab;
} else { // SUBW
machine.int_reg[inst.rd as usize] = localDataa - localDatab;
}
},
RISCV_OPW_SLLW => {
machine.int_reg[inst.rd as usize] = localDataa << (localDatab & 0x1f);
},
RISCV_OPW_SRW => {
if inst.funct7 == RISCV_OPW_SRW_SRLW {
machine.int_reg[inst.rd as usize] = localDataa >> (localDatab & 0x1f) & machine.shiftmask[32 + localDatab as usize];
} else { // SRAW
machine.int_reg[inst.rd as usize] = localDataa >> (localDatab & 0x1f);
}
},
_ => {
println!("this instruction ({}) doesn't exists", inst.value);
}
}
}
} }
_ => { println!("{} opcode non géré", inst.opcode)}, _ => { println!("{} opcode non géré", inst.opcode)},
} }

View File

@ -130,6 +130,38 @@ pub const RISCV_FP_FCMP_FLE: u8 = 0;
pub const RISCV_FP_FMVW: u8 = 0x78; pub const RISCV_FP_FMVW: u8 = 0x78;
pub const RISCV_OP_M: u8 = 0x1;
pub const RISCV_OP_M_MUL: u8 = 0x0;
pub const RISCV_OP_M_MULH: u8 = 0x1;
pub const RISCV_OP_M_MULHSU: u8 = 0x2;
pub const RISCV_OP_M_MULHU: u8 = 0x3;
pub const RISCV_OP_M_DIV: u8 = 0x4;
pub const RISCV_OP_M_DIVU: u8 = 0x5;
pub const RISCV_OP_M_REM: u8 = 0x6;
pub const RISCV_OP_M_REMU: u8 = 0x7;
pub const RISCV_OPW_M_MULW: u8 = 0x0;
pub const RISCV_OPW_M_DIVW: u8 = 0x4;
pub const RISCV_OPW_M_DIVUW: u8 = 0x5;
pub const RISCV_OPW_M_REMW: u8 = 0x6;
pub const RISCV_OPW_M_REMUW: u8 = 0x7;
pub const RISCV_FENCE: u8 = 0x0f;
pub const RISCV_ATOM: u8 = 0x2f;
pub const RISCV_ATOM_LR: u8 = 0x2;
pub const RISCV_ATOM_SC: u8 = 0x3;
pub const RISCV_ATOM_SWAP: u8 = 0x1;
pub const RISCV_ATOM_ADD: u8 = 0;
pub const RISCV_ATOM_XOR: u8 = 0x4;
pub const RISCV_ATOM_AND: u8 = 0xc;
pub const RISCV_ATOM_OR: u8 = 0x8;
pub const RISCV_ATOM_MIN: u8 = 0x10;
pub const RISCV_ATOM_MAX: u8 = 0x14;
pub const RISCV_ATOM_MINU: u8 = 0x18;
pub const RISCV_ATOM_MAXU: u8 = 0x1c;
const names_op: [&str; 8] = ["add", "sll", "slt", "sltu", "xor", "sr", "or", "and"]; const names_op: [&str; 8] = ["add", "sll", "slt", "sltu", "xor", "sr", "or", "and"];
const names_opi: [&str; 8] = ["addi", "slli", "slti", "sltiu", "xori", "slri", "ori", "andi"]; const names_opi: [&str; 8] = ["addi", "slli", "slti", "sltiu", "xori", "slri", "ori", "andi"];