aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/lib.rs
diff options
context:
space:
mode:
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>,