add "_" pattern for explicitly specifying the "discard" destination (may be used for side effects)

This commit is contained in:
2020-09-25 22:52:02 +02:00
parent 8e7689df48
commit f493cc102a
4 changed files with 15 additions and 1 deletions
+8 -1
View File
@@ -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),
} }
} }
} }
+2
View File
@@ -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")]
+4
View File
@@ -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)?;
+1
View File
@@ -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)
) )