diff options
-rw-r--r-- | src/insn.rs | 16 | ||||
-rw-r--r-- | src/insn/cmovnz.rs | 8 | ||||
-rw-r--r-- | src/insn/cmovz.rs | 8 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/insn.rs b/src/insn.rs index 60004d2..c02206c 100644 --- a/src/insn.rs +++ b/src/insn.rs @@ -2,6 +2,8 @@ mod add; mod call; +mod cmovnz; +mod cmovz; mod cmp; mod dec; mod jmp; @@ -26,6 +28,20 @@ pub trait Call<T> { fn call(&mut self, op1: T); } +pub trait Cmovnz<T, U> { + /// Emit a (conditional) move if not zero instruction. + /// + /// Move is only commited if (ZF=0). + fn cmovnz(&mut self, op1: T, op2: U); +} + +pub trait Cmovz<T, U> { + /// Emit a (conditional) move if zero instruction. + /// + /// Move is only commited if (ZF=1). + fn cmovz(&mut self, op1: T, op2: U); +} + /// Trait for [`cmp`](https://www.felixcloutier.com/x86/cmp) instruction kinds. pub trait Cmp<T, U> { /// Emit a compare instruction. diff --git a/src/insn/cmovnz.rs b/src/insn/cmovnz.rs new file mode 100644 index 0000000..3e7f21c --- /dev/null +++ b/src/insn/cmovnz.rs @@ -0,0 +1,8 @@ +use super::Cmovnz; +use crate::{Asm, Reg64}; + +impl Cmovnz<Reg64, Reg64> for Asm { + fn cmovnz(&mut self, op1: Reg64, op2: Reg64) { + self.encode_rr(&[0x0f, 0x45], op2, op1); + } +} diff --git a/src/insn/cmovz.rs b/src/insn/cmovz.rs new file mode 100644 index 0000000..c49aa35 --- /dev/null +++ b/src/insn/cmovz.rs @@ -0,0 +1,8 @@ +use super::Cmovz; +use crate::{Asm, Reg64}; + +impl Cmovz<Reg64, Reg64> for Asm { + fn cmovz(&mut self, op1: Reg64, op2: Reg64) { + self.encode_rr(&[0x0f, 0x44], op2, op1); + } +} |