libemei/insts/riscv/
untils.rs1use super::{registers::Reg, *};
2
3
4pub fn branch(funct: u8, rs1: Reg, rs2: Reg, imm: i16) -> Inst {
5 let imm11 = ((imm >> 11) & 0b1) as u8;
6 let imm1_4 = ((imm >> 1) & 0b1111) as u8;
7 let imm5_10 = ((imm >> 5) & 0b111111) as u8;
8 let imm12 = ((imm >> 15) & 0b1) as u8;
9 b(0b1100011, imm11, imm1_4, funct, rs1, rs2, imm5_10, imm12)
10}
11
12
13pub fn load_data(funct: u8, rd: Reg, rs1: Reg, imm: u16) -> Inst {
14 i(0b0000011, rd, funct, rs1, imm)
15}
16
17#[macro_export]
18macro_rules! ld_impl {
19 ($name:ident, $funct:expr) => {
20 pub fn $name(rd: Reg, rs1: Reg, imm: u16) -> Inst {
21 load_data($funct, rd, rs1, imm)
22 }
23 };
24}
25
26pub fn store_data(funct: u8, rs1: Reg, rs2: Reg, imm: u16) -> Inst {
27 let imm0_4 = (imm & 0b1111) as u8;
28 let imm5_11 = ((imm >> 5) & 0b1111111) as u8;
29 s(0b0100011, imm0_4, funct, rs1, rs2, imm5_11)
30}
31
32#[macro_export]
33macro_rules! st_impl {
34 ($name:ident, $funct:expr) => {
35 pub fn $name(rs1: Reg, rs2: Reg, imm: u16) -> Inst {
36 store_data($funct, rs1, rs2, imm)
37 }
38 };
39}
40
41pub fn fmathi(rm: u8, rd: Reg, rs1: Reg, rs2: Reg, imm: u8) -> Inst {
42 r(0b1010011, rd, rm, rs1, rs2, imm)
43}