libemei/insts/riscv/
untils.rs

1use 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}