Introduce the 'true' and 'false' conditions
This commit is contained in:
@@ -98,6 +98,8 @@ These keywords (among others) are used in conditional branches to specify flag t
|
|||||||
- `nem`, `nempty` … Not empty
|
- `nem`, `nempty` … Not empty
|
||||||
- `eof` … EOF
|
- `eof` … EOF
|
||||||
- `neof` … Not EOF
|
- `neof` … Not EOF
|
||||||
|
- `true`, `always`, `else` … Always true
|
||||||
|
- `false`, `never` … Always false
|
||||||
|
|
||||||
# Syntax
|
# Syntax
|
||||||
|
|
||||||
@@ -207,6 +209,7 @@ Conditonal branches are written like this:
|
|||||||
then only one branch is taken - there is no fall-through.
|
then only one branch is taken - there is no fall-through.
|
||||||
- The definition order is preserved, i.e. if the `inval` flag is to be checked, it should be done
|
- The definition order is preserved, i.e. if the `inval` flag is to be checked, it should be done
|
||||||
before checking e.g. `nz`, which is, incidentally, true by default, because most flags are cleared by instructions that affects flags.
|
before checking e.g. `nz`, which is, incidentally, true by default, because most flags are cleared by instructions that affects flags.
|
||||||
|
- `else` can be used as a final choice of branch that will always be taken.
|
||||||
|
|
||||||
## Routines
|
## Routines
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,10 @@ pub enum Cond {
|
|||||||
Eof,
|
Eof,
|
||||||
/// Not empty
|
/// Not empty
|
||||||
NotEof,
|
NotEof,
|
||||||
|
// Always true, for eg. (else? ...)
|
||||||
|
True,
|
||||||
|
/// Always false
|
||||||
|
False,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_cond(text: &str, pos: &SourcePosition) -> Result<Cond, CrsnError> {
|
pub fn parse_cond(text: &str, pos: &SourcePosition) -> Result<Cond, CrsnError> {
|
||||||
@@ -134,6 +138,8 @@ pub fn parse_cond(text: &str, pos: &SourcePosition) -> Result<Cond, CrsnError> {
|
|||||||
"neof" => Cond::NotEof,
|
"neof" => Cond::NotEof,
|
||||||
"ov" => Cond::Overflow,
|
"ov" => Cond::Overflow,
|
||||||
"nov" => Cond::NotOverflow,
|
"nov" => Cond::NotOverflow,
|
||||||
|
"true" | "always" | "else" => Cond::True,
|
||||||
|
"false" | "never" => Cond::False,
|
||||||
_ => {
|
_ => {
|
||||||
return Err(CrsnError::Parse(format!("Unknown cond: {}", text).into(), pos.clone()));
|
return Err(CrsnError::Parse(format!("Unknown cond: {}", text).into(), pos.clone()));
|
||||||
}
|
}
|
||||||
@@ -174,6 +180,8 @@ impl Display for Cond {
|
|||||||
Cond::Valid => "valid",
|
Cond::Valid => "valid",
|
||||||
Cond::Eof => "eof",
|
Cond::Eof => "eof",
|
||||||
Cond::NotEof => "neof",
|
Cond::NotEof => "neof",
|
||||||
|
Cond::True => "true",
|
||||||
|
Cond::False => "false",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -214,6 +222,9 @@ impl Not for Cond {
|
|||||||
|
|
||||||
Cond::NotEof => Cond::Eof,
|
Cond::NotEof => Cond::Eof,
|
||||||
Cond::Eof => Cond::NotEof,
|
Cond::Eof => Cond::NotEof,
|
||||||
|
|
||||||
|
Cond::True => Cond::False,
|
||||||
|
Cond::False => Cond::True,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,6 +115,8 @@ impl StatusFlags {
|
|||||||
Cond::NotEmpty => !self.empty,
|
Cond::NotEmpty => !self.empty,
|
||||||
Cond::Eof => self.eof,
|
Cond::Eof => self.eof,
|
||||||
Cond::NotEof => !self.eof,
|
Cond::NotEof => !self.eof,
|
||||||
|
Cond::True => true,
|
||||||
|
Cond::False => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
(
|
||||||
|
(ld r8 0)
|
||||||
|
|
||||||
|
(ld r0 1
|
||||||
|
(true? (add r8 1))
|
||||||
|
)
|
||||||
|
|
||||||
|
(sub r0 1
|
||||||
|
(pos? (fault))
|
||||||
|
(else? (add r8 1))
|
||||||
|
)
|
||||||
|
|
||||||
|
(nop
|
||||||
|
(always? (add r8 1))
|
||||||
|
)
|
||||||
|
|
||||||
|
(nop
|
||||||
|
(never? (fault))
|
||||||
|
)
|
||||||
|
|
||||||
|
(cmp r8 3
|
||||||
|
(ne? (fault))
|
||||||
|
)
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user