ft: impl most arithmatic ops, dec, inc
This commit is contained in:
151
src/operands.rs
151
src/operands.rs
@@ -7,7 +7,7 @@ use crate::register::SegmentRegister;
|
||||
|
||||
use crate::{disasm::DisasmError, register::Register};
|
||||
use core::fmt;
|
||||
use std::ops::{Add, Div, Mul, Sub};
|
||||
use std::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Sub};
|
||||
|
||||
pub type Byte = u8; // b
|
||||
pub type IByte = i8; // used for displacements of memory access
|
||||
@@ -102,16 +102,17 @@ impl Add for ImmediateOperand {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb.wrapping_add(rhsb)),
|
||||
_ => panic!("Cannot add Word to Byte"),
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => lhsw.wrapping_add(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw.wrapping_add(rhsw)),
|
||||
ImmediateOperand::Byte(_) => {
|
||||
ImmediateOperand::Word(lhsw.wrapping_add(match other.sign_extend() {
|
||||
ImmediateOperand::Word(w) => w,
|
||||
_ => panic!("Sign-extended Word is a Byte"),
|
||||
}))
|
||||
}
|
||||
ImmediateOperand::Byte(_) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => lhsw.wrapping_add(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -142,6 +143,16 @@ impl Add<Displacement> for ImmediateOperand {
|
||||
}
|
||||
}
|
||||
|
||||
impl Add<Byte> for ImmediateOperand {
|
||||
type Output = ImmediateOperand;
|
||||
|
||||
fn add(self, imm: Byte) -> Self::Output {
|
||||
match self {
|
||||
Self::Byte(b) => Self::Byte(b.wrapping_add(imm)),
|
||||
Self::Word(w) => Self::Word(w.wrapping_add(imm as Word)),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Sub for ImmediateOperand {
|
||||
type Output = Self;
|
||||
|
||||
@@ -149,21 +160,32 @@ impl Sub for ImmediateOperand {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb.wrapping_sub(rhsb)),
|
||||
_ => panic!("Cannot substract Word from Byte"),
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => lhsw.wrapping_sub(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw.wrapping_sub(rhsw)),
|
||||
ImmediateOperand::Byte(_) => {
|
||||
ImmediateOperand::Word(lhsw.wrapping_sub(match other.sign_extend() {
|
||||
ImmediateOperand::Word(w) => w,
|
||||
_ => panic!("Sign-extended Word is a Byte"),
|
||||
}))
|
||||
}
|
||||
ImmediateOperand::Byte(_) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => lhsw.wrapping_sub(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub<Byte> for ImmediateOperand {
|
||||
type Output = ImmediateOperand;
|
||||
|
||||
fn sub(self, imm: Byte) -> Self::Output {
|
||||
match self {
|
||||
Self::Byte(b) => Self::Byte(b.wrapping_sub(imm)),
|
||||
Self::Word(w) => Self::Word(w.wrapping_sub(imm as Word)),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Mul for ImmediateOperand {
|
||||
type Output = Self;
|
||||
|
||||
@@ -171,16 +193,17 @@ impl Mul for ImmediateOperand {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb.wrapping_mul(rhsb)),
|
||||
_ => panic!("Cannot multiply Byte with Word"),
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => lhsw.wrapping_mul(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw.wrapping_mul(rhsw)),
|
||||
ImmediateOperand::Byte(_) => {
|
||||
ImmediateOperand::Word(lhsw.wrapping_mul(match other.sign_extend() {
|
||||
ImmediateOperand::Word(w) => w,
|
||||
_ => panic!("Sign-extended Word is a Byte"),
|
||||
}))
|
||||
}
|
||||
ImmediateOperand::Byte(_) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => lhsw.wrapping_mul(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -193,16 +216,86 @@ impl Div for ImmediateOperand {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb.wrapping_div(rhsb)),
|
||||
_ => panic!("Cannot divide Byte with Word"),
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => lhsw.wrapping_div(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw.wrapping_div(rhsw)),
|
||||
ImmediateOperand::Byte(_) => {
|
||||
ImmediateOperand::Word(lhsw.wrapping_div(match other.sign_extend() {
|
||||
ImmediateOperand::Word(w) => w,
|
||||
_ => panic!("Sign-extended Word is a Byte"),
|
||||
}))
|
||||
}
|
||||
ImmediateOperand::Byte(_) => ImmediateOperand::Word(match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => lhsw.wrapping_div(rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BitOr for ImmediateOperand {
|
||||
type Output = Self;
|
||||
|
||||
fn bitor(self, other: Self) -> Self {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb | rhsb),
|
||||
ImmediateOperand::Word(rhsw) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => ImmediateOperand::Word(lhsw | rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw | rhsw),
|
||||
ImmediateOperand::Byte(_) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw | rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BitAnd for ImmediateOperand {
|
||||
type Output = Self;
|
||||
|
||||
fn bitand(self, other: Self) -> Self {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb & rhsb),
|
||||
ImmediateOperand::Word(rhsw) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => ImmediateOperand::Word(lhsw & rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw & rhsw),
|
||||
ImmediateOperand::Byte(_) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw & rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BitXor for ImmediateOperand {
|
||||
type Output = Self;
|
||||
|
||||
fn bitxor(self, other: Self) -> Self {
|
||||
match self {
|
||||
ImmediateOperand::Byte(lhsb) => match other {
|
||||
ImmediateOperand::Byte(rhsb) => ImmediateOperand::Byte(lhsb ^ rhsb),
|
||||
ImmediateOperand::Word(rhsw) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(lhsw) => ImmediateOperand::Word(lhsw ^ rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
ImmediateOperand::Word(lhsw) => match other {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw ^ rhsw),
|
||||
ImmediateOperand::Byte(_) => match other.sign_extend() {
|
||||
ImmediateOperand::Word(rhsw) => ImmediateOperand::Word(lhsw ^ rhsw),
|
||||
_ => panic!("unreachable"),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user