mirror of
https://github.com/Zenithsiz/dcb.git
synced 2026-02-04 08:23:13 +00:00
Added ModifiesReg for basic instructions.
This commit is contained in:
parent
8bba037a35
commit
47454a636d
@ -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;
|
||||
}
|
||||
|
||||
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user