remove unused "mask" code
This commit is contained in:
@@ -1,65 +0,0 @@
|
|||||||
//! Mask applied to a data source or destination
|
|
||||||
|
|
||||||
use crate::asm::error::AsmError;
|
|
||||||
|
|
||||||
/// Bit mask to apply to a value
|
|
||||||
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
|
|
||||||
pub struct Mask {
|
|
||||||
/// Length of the selected bit slice
|
|
||||||
len: u8,
|
|
||||||
/// Offset of the selected bit slice from bit zero
|
|
||||||
offset: u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Mask {
|
|
||||||
fn default() -> Self {
|
|
||||||
Mask {
|
|
||||||
len: 64,
|
|
||||||
offset: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Mask {
|
|
||||||
pub const BYTE: Mask = Mask {
|
|
||||||
len: 8,
|
|
||||||
offset: 0,
|
|
||||||
};
|
|
||||||
pub const HALF_WORD: Mask = Mask {
|
|
||||||
len: 16,
|
|
||||||
offset: 0,
|
|
||||||
};
|
|
||||||
pub const WORD: Mask = Mask {
|
|
||||||
len: 32,
|
|
||||||
offset: 0,
|
|
||||||
};
|
|
||||||
pub const DOUBLE_WORD: Mask = Mask {
|
|
||||||
len: 64,
|
|
||||||
offset: 0,
|
|
||||||
};
|
|
||||||
pub const FULL: Mask = Self::DOUBLE_WORD;
|
|
||||||
|
|
||||||
pub fn new(len: u8, offset: u8) -> Result<Self, AsmError> {
|
|
||||||
if len == 0 || offset >= 64 {
|
|
||||||
// create the invalid mask to display it in the error
|
|
||||||
return Err(AsmError::BadMask(Mask {
|
|
||||||
len,
|
|
||||||
offset,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self {
|
|
||||||
len: len.min(64 - offset),
|
|
||||||
offset,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get a binary mask representing the span
|
|
||||||
pub fn as_bitmask(self) -> u64 {
|
|
||||||
((1 << self.len) - 1) << self.offset
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_default(self) -> bool {
|
|
||||||
self == Self::default()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@ use std::convert::TryFrom;
|
|||||||
use std::fmt::{Debug, Display, Formatter};
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
pub use mask::Mask;
|
|
||||||
pub use rd::Rd;
|
pub use rd::Rd;
|
||||||
pub use rd::RdObj;
|
pub use rd::RdObj;
|
||||||
pub use reg::Register;
|
pub use reg::Register;
|
||||||
@@ -14,7 +13,6 @@ use super::error::AsmError;
|
|||||||
|
|
||||||
pub mod literal;
|
pub mod literal;
|
||||||
pub mod reg;
|
pub mod reg;
|
||||||
pub mod mask;
|
|
||||||
|
|
||||||
mod rd;
|
mod rd;
|
||||||
|
|
||||||
|
|||||||
+6
-20
@@ -1,28 +1,22 @@
|
|||||||
use std::fmt::{Debug, Display, Formatter};
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use crate::asm::data::{DataDisp, Mask, RdData, Register};
|
use crate::asm::data::{RdData, Register};
|
||||||
use crate::asm::data::literal::Value;
|
use crate::asm::data::literal::Value;
|
||||||
|
|
||||||
/// Data source argument (read-only)
|
/// Data source argument (read-only)
|
||||||
#[derive(Clone, Copy, Eq, PartialEq)]
|
#[derive(Clone, Copy, Eq, PartialEq)]
|
||||||
pub struct Rd(pub RdData, pub Mask);
|
pub struct Rd(pub RdData);
|
||||||
|
|
||||||
impl Rd {
|
impl Rd {
|
||||||
pub const fn new(src: RdData) -> Self {
|
pub const fn new(src: RdData) -> Self {
|
||||||
Rd(src, Mask::FULL)
|
Rd(src)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn data(self) -> RdData {
|
pub const fn data(self) -> RdData {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn mask(self) -> Mask {
|
|
||||||
self.1
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const fn immediate(val: Value) -> Rd {
|
pub const fn immediate(val: Value) -> Rd {
|
||||||
Rd(RdData::Immediate(val), Mask::FULL)
|
Rd(RdData::Immediate(val))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,13 +28,7 @@ impl Display for Rd {
|
|||||||
|
|
||||||
impl Debug for Rd {
|
impl Debug for Rd {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "Rd(")?;
|
write!(f, "Rd({})", self.0)
|
||||||
let disp: DataDisp = self.0.into();
|
|
||||||
write!(f, "{}", disp)?;
|
|
||||||
if !self.mask().is_default() {
|
|
||||||
write!(f, ",{:?}", self.mask())?;
|
|
||||||
}
|
|
||||||
write!(f, ")")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,8 +54,6 @@ impl Display for RdObj {
|
|||||||
|
|
||||||
impl Debug for RdObj {
|
impl Debug for RdObj {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "Obj(")?;
|
write!(f, "Obj({})", self.reg())
|
||||||
write!(f, "{}", self.reg())?;
|
|
||||||
write!(f, ")")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-16
@@ -1,28 +1,25 @@
|
|||||||
use std::fmt::{Debug, Display, Formatter};
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use crate::asm::data::{DataDisp, Mask, Rd, WrData};
|
use crate::asm::data::{Rd, WrData};
|
||||||
|
|
||||||
/// Data destination argument (read-write)
|
/// Data destination argument (read-write)
|
||||||
#[derive(Clone, Copy, Eq, PartialEq)]
|
#[derive(Clone, Copy, Eq, PartialEq)]
|
||||||
pub struct Wr(WrData, Mask);
|
pub struct Wr(WrData);
|
||||||
|
|
||||||
impl Wr {
|
impl Wr {
|
||||||
pub fn new(dst: WrData) -> Self {
|
pub fn new(dst: WrData) -> Self {
|
||||||
Wr(dst, Mask::default())
|
Wr(dst)
|
||||||
}
|
}
|
||||||
pub fn d(self) -> WrData {
|
pub fn d(self) -> WrData {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
pub fn mask(self) -> Mask {
|
|
||||||
self.1
|
|
||||||
}
|
|
||||||
pub fn as_rd(self) -> Rd {
|
pub fn as_rd(self) -> Rd {
|
||||||
Rd(self.0.into(), self.1)
|
Rd(self.0.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn discard() -> Wr {
|
pub fn discard() -> Wr {
|
||||||
Wr(WrData::Discard, Mask::default())
|
Wr(WrData::Discard)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_discard(self) -> bool {
|
pub fn is_discard(self) -> bool {
|
||||||
@@ -35,18 +32,12 @@ impl Wr {
|
|||||||
|
|
||||||
impl Display for Wr {
|
impl Display for Wr {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "{}", self.0) // TODO mask, when implemented
|
write!(f, "{}", self.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for Wr {
|
impl Debug for Wr {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "Wr(")?;
|
write!(f, "Wr({})", self.0)
|
||||||
let disp: DataDisp = self.0.into();
|
|
||||||
write!(f, "{}", disp)?;
|
|
||||||
if !self.mask().is_default() {
|
|
||||||
write!(f, ",{:?}", self.mask())?;
|
|
||||||
}
|
|
||||||
write!(f, ")")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use thiserror::Error;
|
|||||||
|
|
||||||
use sexp::SourcePosition;
|
use sexp::SourcePosition;
|
||||||
|
|
||||||
use crate::asm::data::{Mask, Register};
|
use crate::asm::data::{Register};
|
||||||
use crate::asm::data::literal::Label;
|
use crate::asm::data::literal::Label;
|
||||||
use crate::asm::instr::Cond;
|
use crate::asm::instr::Cond;
|
||||||
|
|
||||||
@@ -27,10 +27,6 @@ pub enum CrsnError {
|
|||||||
pub enum AsmError {
|
pub enum AsmError {
|
||||||
#[error("Unknown instruction")]
|
#[error("Unknown instruction")]
|
||||||
UnknownInstruction,
|
UnknownInstruction,
|
||||||
#[error("Bad bit mask")]
|
|
||||||
BadMask(Mask),
|
|
||||||
#[error("Uneven operand size")]
|
|
||||||
UnevenOperandSize(Mask, Mask),
|
|
||||||
#[error("Value provided as output argument")]
|
#[error("Value provided as output argument")]
|
||||||
ValueAsOutput,
|
ValueAsOutput,
|
||||||
#[error("Discard (_) provided as input argument")]
|
#[error("Discard (_) provided as input argument")]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use sexp::{Sexp, SourcePosition};
|
use sexp::{Sexp, SourcePosition};
|
||||||
|
|
||||||
use crate::asm::data::{Mask, Rd, RdData, RdObj, Wr};
|
use crate::asm::data::{Rd, RdData, RdObj, Wr};
|
||||||
use crate::asm::error::CrsnError;
|
use crate::asm::error::CrsnError;
|
||||||
use crate::asm::parse::parse_data::{parse_rd, parse_wr};
|
use crate::asm::parse::parse_data::{parse_rd, parse_wr};
|
||||||
use crate::asm::parse::ParserContext;
|
use crate::asm::parse::ParserContext;
|
||||||
@@ -93,7 +93,7 @@ impl<'a> TokenParser<'a> {
|
|||||||
/// Get the next entry as an object location
|
/// Get the next entry as an object location
|
||||||
pub fn next_rdobj(&mut self) -> Result<RdObj, CrsnError> {
|
pub fn next_rdobj(&mut self) -> Result<RdObj, CrsnError> {
|
||||||
match parse_rd(self.next_or_err()?, self.pcx)? {
|
match parse_rd(self.next_or_err()?, self.pcx)? {
|
||||||
Rd(RdData::RegObject(reg), Mask::FULL) => {
|
Rd(RdData::RegObject(reg)) => {
|
||||||
Ok(RdObj::new(reg))
|
Ok(RdObj::new(reg))
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ pub use eval_res::EvalRes;
|
|||||||
use sexp::{Sexp, SourcePosition};
|
use sexp::{Sexp, SourcePosition};
|
||||||
|
|
||||||
use crate::asm::data::literal::Value;
|
use crate::asm::data::literal::Value;
|
||||||
use crate::asm::data::Mask;
|
|
||||||
use crate::asm::error::CrsnError;
|
use crate::asm::error::CrsnError;
|
||||||
use crate::asm::instr::Flatten;
|
use crate::asm::instr::Flatten;
|
||||||
use crate::asm::instr::op::OpKind;
|
use crate::asm::instr::op::OpKind;
|
||||||
@@ -107,7 +106,7 @@ pub trait CrsnExtension: Debug + Send + Sync + 'static {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Run-time method called to read an object (using the object handle syntax)
|
/// Run-time method called to read an object (using the object handle syntax)
|
||||||
fn read_obj(&self, state: &mut RunState, handle: Value, _mask: Mask)
|
fn read_obj(&self, state: &mut RunState, handle: Value)
|
||||||
-> Result<Option<Value>, Fault>
|
-> Result<Option<Value>, Fault>
|
||||||
{
|
{
|
||||||
// Default impl - we do not support reading this object
|
// Default impl - we do not support reading this object
|
||||||
@@ -115,7 +114,7 @@ pub trait CrsnExtension: Debug + Send + Sync + 'static {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Run-time method called to write an object (using the object handle syntax)
|
/// Run-time method called to write an object (using the object handle syntax)
|
||||||
fn write_obj(&self, state: &mut RunState, handle: Value, _mask: Mask, value: Value) -> Result<Option<()>, Fault>
|
fn write_obj(&self, state: &mut RunState, handle: Value, value: Value) -> Result<Option<()>, Fault>
|
||||||
{
|
{
|
||||||
// Default impl - we do not support writing this object
|
// Default impl - we do not support writing this object
|
||||||
Ok(None)
|
Ok(None)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::asm::data::{Rd, RdData, RdObj, Register, Wr, WrData, Mask};
|
use crate::asm::data::{Rd, RdData, RdObj, Register, Wr, WrData};
|
||||||
use crate::asm::data::literal::{Addr, Value};
|
use crate::asm::data::literal::{Addr, Value};
|
||||||
use crate::asm::instr::Cond;
|
use crate::asm::instr::Cond;
|
||||||
use crate::runtime::fault::Fault;
|
use crate::runtime::fault::Fault;
|
||||||
@@ -122,22 +122,22 @@ impl RunState {
|
|||||||
}
|
}
|
||||||
RdData::RegObject(register) => {
|
RdData::RegObject(register) => {
|
||||||
let reference = self.read(Rd::new(RdData::Register(register)))?;
|
let reference = self.read(Rd::new(RdData::Register(register)))?;
|
||||||
self.read_object(reference, rd.mask())
|
self.read_object(reference)
|
||||||
}
|
}
|
||||||
RdData::ImmObject(reference) => {
|
RdData::ImmObject(reference) => {
|
||||||
self.read_object(reference, rd.mask())
|
self.read_object(reference)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_object(&mut self, reference: Value, mask: Mask) -> Result<Value, Fault> {
|
fn read_object(&mut self, reference: Value) -> Result<Value, Fault> {
|
||||||
// This is a shitty dirty hack to allow iterating over the extensions while passing a mutable reference
|
// This is a shitty dirty hack to allow iterating over the extensions while passing a mutable reference
|
||||||
// to self to the reading methods. Since the extensions array is in an Arc, it can't be mutated internally
|
// to self to the reading methods. Since the extensions array is in an Arc, it can't be mutated internally
|
||||||
// anyway, and we know it will still live after the method returns - unless someone does something incredibly stupid.
|
// anyway, and we know it will still live after the method returns - unless someone does something incredibly stupid.
|
||||||
let ti: &ThreadInfo = unsafe { &*(self.thread_info.as_ref() as *const _) }; // If this fails, just clone the arc for the loop...
|
let ti: &ThreadInfo = unsafe { &*(self.thread_info.as_ref() as *const _) }; // If this fails, just clone the arc for the loop...
|
||||||
|
|
||||||
for ext in ti.extensions.iter() {
|
for ext in ti.extensions.iter() {
|
||||||
if let Some(value) = ext.read_obj(self, reference, mask)? {
|
if let Some(value) = ext.read_obj(self, reference)? {
|
||||||
return Ok(value);
|
return Ok(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,14 +145,14 @@ impl RunState {
|
|||||||
Err(Fault::ObjectNotExist(reference))
|
Err(Fault::ObjectNotExist(reference))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_object(&mut self, reference: Value, mask: Mask, value: Value) -> Result<(), Fault> {
|
fn write_object(&mut self, reference: Value, value: Value) -> Result<(), Fault> {
|
||||||
// This is a shitty dirty hack to allow iterating over the extensions while passing a mutable reference
|
// This is a shitty dirty hack to allow iterating over the extensions while passing a mutable reference
|
||||||
// to self to the reading methods. Since the extensions array is in an Arc, it can't be mutated internally
|
// to self to the reading methods. Since the extensions array is in an Arc, it can't be mutated internally
|
||||||
// anyway, and we know it will still live after the method returns - unless someone does something incredibly stupid.
|
// anyway, and we know it will still live after the method returns - unless someone does something incredibly stupid.
|
||||||
let ti: &ThreadInfo = unsafe { &*(self.thread_info.as_ref() as *const _) }; // If this fails, just clone the arc for the loop...
|
let ti: &ThreadInfo = unsafe { &*(self.thread_info.as_ref() as *const _) }; // If this fails, just clone the arc for the loop...
|
||||||
|
|
||||||
for ext in ti.extensions.iter() {
|
for ext in ti.extensions.iter() {
|
||||||
if ext.write_obj(self, reference, mask, value)?.is_some() {
|
if ext.write_obj(self, reference, value)?.is_some() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -193,10 +193,10 @@ impl RunState {
|
|||||||
}
|
}
|
||||||
WrData::RegObject(register) => {
|
WrData::RegObject(register) => {
|
||||||
let reference = self.read(Rd::new(RdData::Register(register)))?;
|
let reference = self.read(Rd::new(RdData::Register(register)))?;
|
||||||
self.write_object(reference, wr.mask(), val)
|
self.write_object(reference, val)
|
||||||
}
|
}
|
||||||
WrData::ImmObject(reference) => {
|
WrData::ImmObject(reference) => {
|
||||||
self.write_object(reference, wr.mask(), val)
|
self.write_object(reference, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ use crsn::module::{CrsnExtension, ParseRes, CrsnUniq};
|
|||||||
use crsn::runtime::fault::Fault;
|
use crsn::runtime::fault::Fault;
|
||||||
use crsn::runtime::run_thread::{RunState};
|
use crsn::runtime::run_thread::{RunState};
|
||||||
use crsn::sexp::SourcePosition;
|
use crsn::sexp::SourcePosition;
|
||||||
use crsn::asm::data::Mask;
|
|
||||||
use std::io::{Write};
|
use std::io::{Write};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use crsn::asm::instr::Cond;
|
use crsn::asm::instr::Cond;
|
||||||
@@ -66,7 +65,7 @@ impl CrsnExtension for StdioOps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Run-time method called to read an object (using the object handle syntax)
|
/// Run-time method called to read an object (using the object handle syntax)
|
||||||
fn read_obj(&self, state: &mut RunState, handle: Value, _mask: Mask)
|
fn read_obj(&self, state: &mut RunState, handle: Value)
|
||||||
-> Result<Option<Value>, Fault>
|
-> Result<Option<Value>, Fault>
|
||||||
{
|
{
|
||||||
if handle == self.hdl_stdin {
|
if handle == self.hdl_stdin {
|
||||||
@@ -82,7 +81,7 @@ impl CrsnExtension for StdioOps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Run-time method called to write an object (using the object handle syntax)
|
/// Run-time method called to write an object (using the object handle syntax)
|
||||||
fn write_obj(&self, state: &mut RunState, handle: Value, _mask: Mask, value: Value) -> Result<Option<()>, Fault>
|
fn write_obj(&self, state: &mut RunState, handle: Value, value: Value) -> Result<Option<()>, Fault>
|
||||||
{
|
{
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user