aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/lib.rs
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2023-02-27 21:16:40 +0100
committerJohannes Stoelp <johannes.stoelp@gmail.com>2023-02-27 21:16:40 +0100
commitab5711a77e2a6872ca1392c1dbc2f545f7d3ab3b (patch)
tree0ecab4660bbbf0faeb5199bbc80ee53243d641ee /src/lib.rs
parent957663f5d483b1abaa3f5af25e32c274218319d5 (diff)
downloadjuicebox-asm-ab5711a77e2a6872ca1392c1dbc2f545f7d3ab3b.tar.gz
juicebox-asm-ab5711a77e2a6872ca1392c1dbc2f545f7d3ab3b.zip
Add ADD, DEC, TEST, RET instructions
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index e38da14..27164ad 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -107,8 +107,8 @@ impl Asm {
Self: EncodeRI<T>,
{
// MI operand encoding.
- // op1 -> modrm.rm
- // op2 -> modrm.reg
+ // op1 -> modrm.rm
+ // opc extension -> modrm.reg
let modrm = modrm(
0b11, /* mod */
opc_ext, /* reg */
@@ -123,6 +123,26 @@ impl Asm {
self.emit(op2.bytes());
}
+ fn encode_r<T: Reg>(&mut self, opc: u8, opc_ext: u8, op1: T)
+ where
+ Self: EncodeRI<T>,
+ {
+ // M operand encoding.
+ // op1 -> modrm.rm
+ // opc extension -> modrm.reg
+ let modrm = modrm(
+ 0b11, /* mod */
+ opc_ext, /* reg */
+ op1.idx(), /* rm */
+ );
+
+ let prefix = <Self as EncodeRI<T>>::legacy_prefix();
+ let rex = <Self as EncodeRI<T>>::rex(op1);
+
+ self.emit_optional(&[prefix, rex]);
+ self.emit(&[opc, modrm]);
+ }
+
fn encode_mr<T: Reg>(&mut self, opc: u8, op1: MemOp, op2: T)
where
Self: EncodeMR<T>,