add "_" pattern for explicitly specifying the "discard" destination (may be used for side effects)
This commit is contained in:
+8
-1
@@ -26,6 +26,8 @@ pub enum DataDisp {
|
|||||||
Register(Register),
|
Register(Register),
|
||||||
/// Pointer into memory, stored in a numbered register
|
/// Pointer into memory, stored in a numbered register
|
||||||
RegisterPtr(Register),
|
RegisterPtr(Register),
|
||||||
|
/// Discard the written value
|
||||||
|
Discard,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for DataDisp {
|
impl Display for DataDisp {
|
||||||
@@ -43,6 +45,9 @@ impl Display for DataDisp {
|
|||||||
DataDisp::RegisterPtr(r) => {
|
DataDisp::RegisterPtr(r) => {
|
||||||
write!(f, "@{}", r)
|
write!(f, "@{}", r)
|
||||||
}
|
}
|
||||||
|
DataDisp::Discard => {
|
||||||
|
write!(f, "_")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,7 +69,7 @@ impl From<DstDisp> for DataDisp {
|
|||||||
DstDisp::ImmediatePtr(x) => DataDisp::ImmediatePtr(x),
|
DstDisp::ImmediatePtr(x) => DataDisp::ImmediatePtr(x),
|
||||||
DstDisp::Register(x) => DataDisp::Register(x),
|
DstDisp::Register(x) => DataDisp::Register(x),
|
||||||
DstDisp::RegisterPtr(x) => DataDisp::RegisterPtr(x),
|
DstDisp::RegisterPtr(x) => DataDisp::RegisterPtr(x),
|
||||||
DstDisp::Discard => DataDisp::Immediate(0),
|
DstDisp::Discard => DataDisp::Discard,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -91,6 +96,7 @@ impl TryFrom<DataDisp> for SrcDisp {
|
|||||||
DataDisp::ImmediatePtr(x) => Ok(SrcDisp::ImmediatePtr(x)),
|
DataDisp::ImmediatePtr(x) => Ok(SrcDisp::ImmediatePtr(x)),
|
||||||
DataDisp::Register(x) => Ok(SrcDisp::Register(x)),
|
DataDisp::Register(x) => Ok(SrcDisp::Register(x)),
|
||||||
DataDisp::RegisterPtr(x) => Ok(SrcDisp::RegisterPtr(x)),
|
DataDisp::RegisterPtr(x) => Ok(SrcDisp::RegisterPtr(x)),
|
||||||
|
DataDisp::Discard => Err(AsmError::DiscardAsValue),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,6 +134,7 @@ impl TryFrom<DataDisp> for DstDisp {
|
|||||||
DataDisp::ImmediatePtr(x) => Ok(DstDisp::ImmediatePtr(x)),
|
DataDisp::ImmediatePtr(x) => Ok(DstDisp::ImmediatePtr(x)),
|
||||||
DataDisp::Register(x) => Ok(DstDisp::Register(x)),
|
DataDisp::Register(x) => Ok(DstDisp::Register(x)),
|
||||||
DataDisp::RegisterPtr(x) => Ok(DstDisp::RegisterPtr(x)),
|
DataDisp::RegisterPtr(x) => Ok(DstDisp::RegisterPtr(x)),
|
||||||
|
DataDisp::Discard => Ok(DstDisp::Discard),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ pub enum AsmError {
|
|||||||
UnevenOperandSize(Mask, Mask),
|
UnevenOperandSize(Mask, Mask),
|
||||||
#[error("Value provided as output argument")]
|
#[error("Value provided as output argument")]
|
||||||
ValueAsOutput,
|
ValueAsOutput,
|
||||||
|
#[error("Discard (_) provided as input argument")]
|
||||||
|
DiscardAsValue,
|
||||||
#[error("Conditional branch already defined for \"{0}\"")]
|
#[error("Conditional branch already defined for \"{0}\"")]
|
||||||
ConditionalAlreadyUsed(Cond),
|
ConditionalAlreadyUsed(Cond),
|
||||||
#[error("Label \"{0:?}\" not defined")]
|
#[error("Label \"{0:?}\" not defined")]
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ pub fn parse_data_disp(tok: Option<Sexp>) -> Result<DataDisp, Error> {
|
|||||||
Ok(DataDisp::Immediate(unsafe { std::mem::transmute(*val) }))
|
Ok(DataDisp::Immediate(unsafe { std::mem::transmute(*val) }))
|
||||||
},
|
},
|
||||||
Sexp::Atom(Atom::S(s)) => {
|
Sexp::Atom(Atom::S(s)) => {
|
||||||
|
if s == "_" {
|
||||||
|
return Ok(DataDisp::Discard);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(reference) = s.strip_prefix('@') {
|
if let Some(reference) = s.strip_prefix('@') {
|
||||||
if reference.starts_with(|c : char| c.is_ascii_digit()) {
|
if reference.starts_with(|c : char| c.is_ascii_digit()) {
|
||||||
let val : u64 = parse_u64(reference)?;
|
let val : u64 = parse_u64(reference)?;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ fn main() {
|
|||||||
let program = "
|
let program = "
|
||||||
(
|
(
|
||||||
(main
|
(main
|
||||||
|
(ld _ arg0)
|
||||||
(call fibo 5)
|
(call fibo 5)
|
||||||
(ld r0 res0)
|
(ld r0 res0)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user