diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-03-18 22:58:34 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-03-18 22:58:34 +0100 |
commit | f0b70fe1774a0da0cd6148fb28b933d6dfb122f8 (patch) | |
tree | 8b263f1cb3f1bc1861824366ec00c3ceee04bae2 | |
parent | d65d1327459a5f3866c8803fb1d9fbdb2de96f75 (diff) | |
download | juicebox-asm-f0b70fe1774a0da0cd6148fb28b933d6dfb122f8.tar.gz juicebox-asm-f0b70fe1774a0da0cd6148fb28b933d6dfb122f8.zip |
asm: add cmovnz/cmovz instructions
-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); + } +} |