1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#[macro_export] macro_rules! new_r64rm64 { ($opcode:ident, $r64:expr, $rm64:expr) => { Opcode::$opcode { r64: $r64, rm64: $rm64 } }; } #[macro_export] macro_rules! new_rm64r64 { ($opcode:ident, $rm64:expr, $r64:expr) => { Opcode::$opcode { rm64: $rm64, r64: $r64 } }; } #[macro_export] macro_rules! new_rm64imm32 { ($opcode:ident, $rm64:expr, $imm32:expr) => { Opcode::$opcode { rm64: $rm64, imm: $imm32 } }; } #[macro_export] macro_rules! new_r64{ ($opcode:ident, $r64:expr) => { Opcode::$opcode { r64: $r64 } }; } #[macro_export] macro_rules! new_rm64{ ($opcode:ident, $rm64:expr) => { Opcode::$opcode { rm64: $rm64 } }; } #[macro_export] macro_rules! new_imm32{ ($opcode:ident, $imm32:expr) => { Opcode::$opcode { imm: $imm32 } }; } #[cfg(test)] mod macros_tests { use crate::{ GeneralPurposeRegister as GPR, Operand, Opcode, Immediate, }; #[test] fn newr64rm64_test() { let inst = new_r64rm64!(MOVR64RM64, GPR::RAX, Operand::GENERALREGISTER(GPR::RBX)); assert_eq!("mov rax, rbx", inst.to_intel_string()); } #[test] fn newrm64r64_test() { let inst = new_rm64r64!(MOVRM64R64, Operand::GENERALREGISTER(GPR::RBX), GPR::RAX); assert_eq!("mov rbx, rax", inst.to_intel_string()); } #[test] fn newrm64imm32_test() { let inst = new_rm64imm32!(MOVRM64IMM32, Operand::GENERALREGISTER(GPR::RAX), Immediate::I32(30)); assert_eq!("mov rax, 30", inst.to_intel_string()); } #[test] fn newr64_test() { let inst = new_r64!(PUSHR64, GPR::RAX); assert_eq!("push rax", inst.to_intel_string()); } #[test] fn newrm64_test() { let inst = new_rm64!(INCRM64, Operand::GENERALREGISTER(GPR::RAX)); assert_eq!("inc rax", inst.to_intel_string()); } #[test] fn newimm32_test() { let inst = new_imm32!(PUSHIMM32, Immediate::I32(30)); assert_eq!("push 30", inst.to_intel_string()); } }