diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2023-02-27 21:16:40 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2023-02-27 21:16:40 +0100 |
commit | ab5711a77e2a6872ca1392c1dbc2f545f7d3ab3b (patch) | |
tree | 0ecab4660bbbf0faeb5199bbc80ee53243d641ee /src/lib.rs | |
parent | 957663f5d483b1abaa3f5af25e32c274218319d5 (diff) | |
download | juicebox-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.rs | 24 |
1 files changed, 22 insertions, 2 deletions
@@ -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>, |