machinst: common up some instruction data helpers;
This commit is contained in:
@@ -18,6 +18,7 @@ use crate::isa;
|
||||
|
||||
use crate::bitset::BitSet;
|
||||
use crate::entity;
|
||||
use ir::condcodes::{FloatCC, IntCC};
|
||||
|
||||
/// Some instructions use an external list of argument values because there is not enough space in
|
||||
/// the 16-byte `InstructionData` struct. These value lists are stored in a memory pool in
|
||||
@@ -295,6 +296,33 @@ impl InstructionData {
|
||||
}
|
||||
}
|
||||
|
||||
/// If this is a control-flow instruction depending on an integer condition, gets its
|
||||
/// condition. Otherwise, return `None`.
|
||||
pub fn cond_code(&self) -> Option<IntCC> {
|
||||
match self {
|
||||
&InstructionData::IntCond { cond, .. }
|
||||
| &InstructionData::BranchIcmp { cond, .. }
|
||||
| &InstructionData::IntCompare { cond, .. }
|
||||
| &InstructionData::IntCondTrap { cond, .. }
|
||||
| &InstructionData::BranchInt { cond, .. }
|
||||
| &InstructionData::IntSelect { cond, .. }
|
||||
| &InstructionData::IntCompareImm { cond, .. } => Some(cond),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// If this is a control-flow instruction depending on a floating-point condition, gets its
|
||||
/// condition. Otherwise, return `None`.
|
||||
pub fn fp_cond_code(&self) -> Option<FloatCC> {
|
||||
match self {
|
||||
&InstructionData::BranchFloat { cond, .. }
|
||||
| &InstructionData::FloatCompare { cond, .. }
|
||||
| &InstructionData::FloatCond { cond, .. }
|
||||
| &InstructionData::FloatCondTrap { cond, .. } => Some(cond),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// If this is a trapping instruction, get an exclusive reference to its
|
||||
/// trap code. Otherwise, return `None`.
|
||||
pub fn trap_code_mut(&mut self) -> Option<&mut TrapCode> {
|
||||
@@ -307,6 +335,27 @@ impl InstructionData {
|
||||
}
|
||||
}
|
||||
|
||||
/// If this is an atomic read/modify/write instruction, return its subopcode.
|
||||
pub fn atomic_rmw_op(&self) -> Option<ir::AtomicRmwOp> {
|
||||
match self {
|
||||
&InstructionData::AtomicRmw { op, .. } => Some(op),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// If this is a load/store instruction, returns its immediate offset.
|
||||
pub fn load_store_offset(&self) -> Option<i32> {
|
||||
match self {
|
||||
&InstructionData::Load { offset, .. }
|
||||
| &InstructionData::StackLoad { offset, .. }
|
||||
| &InstructionData::LoadComplex { offset, .. }
|
||||
| &InstructionData::Store { offset, .. }
|
||||
| &InstructionData::StackStore { offset, .. }
|
||||
| &InstructionData::StoreComplex { offset, .. } => Some(offset.into()),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Return information about a call instruction.
|
||||
///
|
||||
/// Any instruction that can call another function reveals its call signature here.
|
||||
|
||||
Reference in New Issue
Block a user