Add address deref, syntax, and deref sizes
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
@@ -50,6 +50,14 @@ pub enum SectionOrg {
|
||||
StartEnd(u64, u64),
|
||||
}
|
||||
|
||||
impl SectionOrg {
|
||||
pub fn start(&self) -> u64 {
|
||||
match self {
|
||||
SectionOrg::Start(start) | SectionOrg::StartEnd(start, _) => *start,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum DataLine {
|
||||
ValueDef(ValueDef),
|
||||
@@ -87,22 +95,24 @@ impl ValueDef {
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Value {
|
||||
// TODO : immediate int sizes
|
||||
// Int(u64, IntSize)
|
||||
Int(u64),
|
||||
Reg(Reg),
|
||||
Name(String),
|
||||
Here,
|
||||
Addr(Box<Value>, IntSize),
|
||||
//Array(Vec<Value>),
|
||||
//Deref(Value, IntSize),
|
||||
}
|
||||
|
||||
impl Value {
|
||||
pub fn len(&self) -> usize {
|
||||
match self {
|
||||
// TODO : immediate int sizes
|
||||
Value::Int(_) => 8,
|
||||
Value::Reg(_) => 1,
|
||||
Value::Name(_) => 8,
|
||||
Value::Here => 8,
|
||||
Value::Addr(v, _) => v.len(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,6 +120,24 @@ impl Value {
|
||||
match self {
|
||||
Value::Int(_) | Value::Name(_) | Value::Here => None,
|
||||
Value::Reg(_) => Some(inst::DEST_REG),
|
||||
// TODO : check reg vs int value, and use dest_reg_addr8/16/32/64 values
|
||||
Value::Addr(v, size) => {
|
||||
if let Value::Reg(_) = &**v {
|
||||
match size {
|
||||
IntSize::U64 => Some(inst::DEST_REG_ADDR64),
|
||||
IntSize::U32 => Some(inst::DEST_REG_ADDR32),
|
||||
IntSize::U16 => Some(inst::DEST_REG_ADDR16),
|
||||
IntSize::U8 => Some(inst::DEST_REG_ADDR8),
|
||||
}
|
||||
} else {
|
||||
match size {
|
||||
IntSize::U64 => Some(inst::DEST_ADDR64),
|
||||
IntSize::U32 => Some(inst::DEST_ADDR32),
|
||||
IntSize::U16 => Some(inst::DEST_ADDR16),
|
||||
IntSize::U8 => Some(inst::DEST_ADDR8),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,11 +145,37 @@ impl Value {
|
||||
match self {
|
||||
Value::Int(_) => inst::SOURCE_IMM64,
|
||||
Value::Reg(_) => inst::SOURCE_REG,
|
||||
// TODO : check reg vs int value, and use source_reg_addr8/16/32/64 values
|
||||
Value::Name(_) | Value::Here => inst::SOURCE_IMM64,
|
||||
Value::Addr(v, size) => {
|
||||
if let Value::Reg(_) = &**v {
|
||||
match size {
|
||||
IntSize::U64 => inst::SOURCE_REG_ADDR64,
|
||||
IntSize::U32 => inst::SOURCE_REG_ADDR32,
|
||||
IntSize::U16 => inst::SOURCE_REG_ADDR16,
|
||||
IntSize::U8 => inst::SOURCE_REG_ADDR8,
|
||||
}
|
||||
} else {
|
||||
match size {
|
||||
IntSize::U64 => inst::SOURCE_ADDR64,
|
||||
IntSize::U32 => inst::SOURCE_ADDR32,
|
||||
IntSize::U16 => inst::SOURCE_ADDR16,
|
||||
IntSize::U8 => inst::SOURCE_ADDR8,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum IntSize {
|
||||
U8,
|
||||
U16,
|
||||
U32,
|
||||
U64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Inst {
|
||||
Add(Value, Value),
|
||||
|
||||
@@ -5,13 +5,18 @@
|
||||
\.meta "DIR_META"
|
||||
\.section "DIR_SECTION"
|
||||
\.export "DIR_EXPORT"
|
||||
\( "LPAREN"
|
||||
\) "RPAREN"
|
||||
\{ "LBRACE"
|
||||
\} "RBRACE"
|
||||
\.\. "DOTDOT"
|
||||
: "COLON"
|
||||
, "COMMA"
|
||||
\$\$ "BUCKBUCK"
|
||||
[iu](8|16|32|64) "INT_TYPE"
|
||||
u8 "U8"
|
||||
u16 "U16"
|
||||
u32 "U32"
|
||||
u64 "U64"
|
||||
\.[iu](8|16|32|64) "INT_DEF"
|
||||
\.string "STR_DEF"
|
||||
\.zstring "ZSTR_DEF"
|
||||
|
||||
@@ -57,6 +57,11 @@ Value -> Value:
|
||||
| Reg { Value::Reg($1) }
|
||||
| Name { Value::Name($1) }
|
||||
| 'BUCKBUCK' { Value::Here }
|
||||
| 'LPAREN' Value 'RPAREN' { Value::Addr(Box::new($2), IntSize::U64) }
|
||||
| 'LPAREN' Value 'RPAREN' 'U8' { Value::Addr(Box::new($2), IntSize::U8) }
|
||||
| 'LPAREN' Value 'RPAREN' 'U16' { Value::Addr(Box::new($2), IntSize::U16) }
|
||||
| 'LPAREN' Value 'RPAREN' 'U32' { Value::Addr(Box::new($2), IntSize::U32) }
|
||||
| 'LPAREN' Value 'RPAREN' 'U64' { Value::Addr(Box::new($2), IntSize::U64) }
|
||||
;
|
||||
|
||||
Inst -> Inst:
|
||||
|
||||
Reference in New Issue
Block a user