Added ModifiesReg for basic instructions.

This commit is contained in:
Filipe Rodrigues 2021-04-25 06:59:42 +01:00
parent 8bba037a35
commit 47454a636d
17 changed files with 155 additions and 17 deletions

View File

@ -17,7 +17,7 @@ pub mod store;
pub mod sys;
// Imports
use super::InstSize;
use super::{InstSize, Register};
use crate::inst::InstFmt;
/// Raw instruction
@ -182,6 +182,23 @@ impl Encodable for Inst {
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
match self {
Inst::Alu(inst) => inst.modifies_reg(reg),
Inst::Cond(inst) => inst.modifies_reg(reg),
Inst::Jmp(inst) => inst.modifies_reg(reg),
Inst::Load(inst) => inst.modifies_reg(reg),
Inst::Lui(inst) => inst.modifies_reg(reg),
Inst::Mult(inst) => inst.modifies_reg(reg),
Inst::Shift(inst) => inst.modifies_reg(reg),
Inst::Store(inst) => inst.modifies_reg(reg),
Inst::Sys(inst) => inst.modifies_reg(reg),
Inst::Co(inst) => inst.modifies_reg(reg),
}
}
}
// Any basic decodable instruction is 4 bytes
impl<T: Decodable> InstSize for T {
fn size(&self) -> usize {
@ -223,3 +240,9 @@ pub trait Encodable: Decodable {
#[must_use]
fn encode(&self) -> Self::Raw;
}
/// Register modifying instructions
pub trait ModifiesReg: Decodable {
/// Returns if this instruction modifies `reg`.
fn modifies_reg(&self, reg: Register) -> bool;
}

View File

@ -5,6 +5,7 @@ pub mod imm;
pub mod reg;
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt,
@ -60,3 +61,12 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: crate::inst::Register) -> bool {
match self {
Inst::Imm(inst) => inst.modifies_reg(reg),
Inst::Reg(inst) => inst.modifies_reg(reg),
}
}
}

View File

@ -2,7 +2,7 @@
// Imports
use crate::inst::{
basic::{Decodable, Encodable},
basic::{Decodable, Encodable, ModifiesReg},
InstFmt, Register,
};
use dcb_util::SignedHex;
@ -146,3 +146,9 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.dst == reg
}
}

View File

@ -1,10 +1,7 @@
//! Alu register instructions
// Imports
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
};
use crate::inst::{InstFmt, Register, basic::{Decodable, Encodable, ModifiesReg}};
/// Alu register instruction kind
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
@ -152,3 +149,9 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.dst == reg
}
}

View File

@ -1,6 +1,7 @@
//! Co-processor instructions
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
@ -190,3 +191,12 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
match self.kind {
Kind::MoveFrom { dst, .. } => dst == reg,
Kind::CopN { .. } | Kind::MoveTo { .. } | Kind::Branch { .. } | Kind::Load { .. } | Kind::Store { .. } => false,
}
}
}

View File

@ -1,6 +1,7 @@
//! Condition branches
// Imports
use super::ModifiesReg;
use crate::{
inst::{
basic::{Decodable, Encodable},
@ -154,3 +155,9 @@ impl InstTargetFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, _reg: Register) -> bool {
false
}
}

View File

@ -5,9 +5,10 @@ pub mod imm;
pub mod reg;
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt,
InstFmt, Register,
};
/// Raw representation
@ -60,3 +61,12 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
match self {
Inst::Imm(inst) => inst.modifies_reg(reg),
Inst::Reg(inst) => inst.modifies_reg(reg),
}
}
}

View File

@ -3,8 +3,8 @@
// Imports
use crate::{
inst::{
basic::{Decodable, Encodable},
InstTarget, InstTargetFmt,
basic::{Decodable, Encodable, ModifiesReg},
InstTarget, InstTargetFmt, Register,
},
Pos,
};
@ -97,3 +97,9 @@ impl InstTargetFmt for Inst {
write!(f, "{mnemonic} {target}")
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, _reg: Register) -> bool {
false
}
}

View File

@ -2,7 +2,7 @@
// Imports
use crate::inst::{
basic::{Decodable, Encodable},
basic::{Decodable, Encodable, ModifiesReg},
InstFmt, Register,
};
@ -92,3 +92,9 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, _reg: Register) -> bool {
false
}
}

View File

@ -1,6 +1,7 @@
//! Load instructions
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
@ -132,3 +133,9 @@ impl InstFmt for Inst {
write!(f, "{mnemonic} {value}, {:#}({addr})", SignedHex(offset))
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.value == reg
}
}

View File

@ -1,6 +1,7 @@
//! Lui instruction
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
@ -54,3 +55,9 @@ impl InstFmt for Inst {
write!(f, "lui {dst}, {value:#x}")
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.dst == reg
}
}

View File

@ -1,6 +1,7 @@
//! Multiplications
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
@ -184,3 +185,12 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
match self {
Inst::MoveFrom { dst, .. } => *dst == reg,
Inst::Mult { .. } | Inst::MoveTo { .. } => false,
}
}
}

View File

@ -5,9 +5,10 @@ pub mod imm;
pub mod reg;
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt,
InstFmt, Register,
};
/// Raw representation
@ -60,3 +61,12 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
match self {
Inst::Imm(inst) => inst.modifies_reg(reg),
Inst::Reg(inst) => inst.modifies_reg(reg),
}
}
}

View File

@ -2,7 +2,7 @@
// Imports
use crate::inst::{
basic::{Decodable, Encodable},
basic::{Decodable, Encodable, ModifiesReg},
InstFmt, Register,
};
use int_conv::{Truncated, ZeroExtended};
@ -111,3 +111,9 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.dst == reg
}
}

View File

@ -1,10 +1,7 @@
//! Shift register instructions
// Imports
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
};
use crate::inst::{InstFmt, Register, basic::{Decodable, Encodable, ModifiesReg}};
/// Shift register instruction kind
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
@ -110,3 +107,9 @@ impl InstFmt for Inst {
}
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, reg: Register) -> bool {
self.dst == reg
}
}

View File

@ -1,6 +1,7 @@
//! Store instructions
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt, Register,
@ -119,3 +120,9 @@ impl InstFmt for Inst {
write!(f, "{mnemonic} {value}, {:#}({addr})", SignedHex(offset))
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, _reg: Register) -> bool {
false
}
}

View File

@ -1,9 +1,10 @@
//! System calls
// Imports
use super::ModifiesReg;
use crate::inst::{
basic::{Decodable, Encodable},
InstFmt,
InstFmt, Register,
};
/// Sys instruction func
@ -82,3 +83,9 @@ impl InstFmt for Inst {
write!(f, "{mnemonic} {comment:#x}")
}
}
impl ModifiesReg for Inst {
fn modifies_reg(&self, _reg: Register) -> bool {
false
}
}