BRANCHING (TURING COMPLETE????)
This commit is contained in:
@@ -22,6 +22,7 @@ pub const IMM_OP: u32 = 0b0010011;
|
||||
pub const OP: u32 = 0b0110011;
|
||||
pub const JAL: u32 = 0b1101111;
|
||||
pub const JALR: u32 = 0b1100111;
|
||||
pub const BRANCH: u32 = 0b1100011;
|
||||
|
||||
pub type Funct3 = Bits32<2, 0>;
|
||||
pub type Funct7 = Bits32<6, 0>;
|
||||
@@ -59,7 +60,7 @@ pub const fn b_type(rs2: Reg, rs1: Reg, funct3: Funct3, imm: Bits32<12, 1>, opco
|
||||
+ (imm.bits(10, 5) << 25)
|
||||
+ (rs2.val() << 20)
|
||||
+ (rs1.val() << 15)
|
||||
+ (funct3.val() << 8)
|
||||
+ (funct3.val() << 12)
|
||||
+ (imm.bits(4, 1) << 8)
|
||||
+ (imm.bit(11) << 7)
|
||||
+ opcode)
|
||||
|
||||
@@ -63,6 +63,28 @@ pub mod width {
|
||||
}
|
||||
}
|
||||
|
||||
pub mod branch {
|
||||
use super::*;
|
||||
pub const EQ: Funct3 = Funct3::new(0b000);
|
||||
pub const NE: Funct3 = Funct3::new(0b001);
|
||||
pub const LT: Funct3 = Funct3::new(0b100);
|
||||
pub const GE: Funct3 = Funct3::new(0b101);
|
||||
pub const LTU: Funct3 = Funct3::new(0b110);
|
||||
pub const GEU: Funct3 = Funct3::new(0b111);
|
||||
|
||||
pub fn str(f: Funct3) -> &'static str {
|
||||
match f {
|
||||
EQ => "eq",
|
||||
NE => "ne",
|
||||
LT => "lt",
|
||||
GE => "ge",
|
||||
LTU => "ltu",
|
||||
GEU => "geu",
|
||||
_ => "?",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub const fn ecall() -> RawInstruction {
|
||||
i_type(Bits32::new(0), zero, Bits32::new(0), zero, SYSTEM)
|
||||
}
|
||||
@@ -94,3 +116,7 @@ pub const fn j(offset: BitsI32<20, 1>) -> RawInstruction {
|
||||
pub const fn ret() -> RawInstruction {
|
||||
jalr(zero, BitsI32::new(0), ra)
|
||||
}
|
||||
|
||||
pub const fn branch(typ: Funct3, left: Reg, right: Reg, offset: BitsI32<12, 1>) -> RawInstruction {
|
||||
b_type(right, left, typ, offset.to_u(), BRANCH)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user