diff options
author | iximeow <me@iximeow.net> | 2019-07-20 11:44:49 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-01-12 16:10:13 -0800 |
commit | 8a15ee38aa0ac8f3ba474fc99fb3722eed582aeb (patch) | |
tree | ca503732d9862643de59abb4c4c07ede3dfb5773 | |
parent | b067453904acbfd84aa41a94adae65fb27521e5b (diff) |
even MORE smaller
-rw-r--r-- | src/lib.rs | 550 |
1 files changed, 124 insertions, 426 deletions
@@ -774,86 +774,32 @@ fn read_opcode_f20f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: & match bytes_iter.next() { Some(b) => { *length += 1; - match b { - 0x10 => { - instruction.opcode = Opcode::MOVSD; - Ok(OperandCode::G_E_xmm) - }, - 0x11 => { - instruction.opcode = Opcode::MOVSD; - Ok(OperandCode::E_G_xmm) - }, - 0x12 => { - instruction.opcode = Opcode::MOVDDUP; - Ok(OperandCode::G_E_xmm) - }, - 0x2a => { - instruction.opcode = Opcode::CVTSI2SD; - Ok(OperandCode::G_E_xmm) - }, - 0x2c => { - instruction.opcode = Opcode::CVTTSD2SI; - Ok(OperandCode::G_E_xmm) - }, - 0x2d => { - instruction.opcode = Opcode::CVTSD2SI; - Ok(OperandCode::G_E_xmm) - }, + let (opcode, operand_code) = match b { + 0x10 => { (Opcode::MOVSD, OperandCode::G_E_xmm) }, + 0x11 => { (Opcode::MOVSD, OperandCode::E_G_xmm) }, + 0x12 => { (Opcode::MOVDDUP, OperandCode::G_E_xmm) }, + 0x2a => { (Opcode::CVTSI2SD, OperandCode::G_E_xmm) }, + 0x2c => { (Opcode::CVTTSD2SI, OperandCode::G_E_xmm) }, + 0x2d => { (Opcode::CVTSD2SI, OperandCode::G_E_xmm) }, 0x38 => { /* * There are a handful of instruction variants here, but * in the f20f opcode map, only the CRC32 instruction is valid */ - Err("x86_64 CRC32 not currently supported".to_string()) - } - 0x51 => { - instruction.opcode = Opcode::SQRTSD; - Ok(OperandCode::G_E_xmm) - }, - 0x58 => { - instruction.opcode = Opcode::ADDSD; - Ok(OperandCode::G_E_xmm) - }, - 0x59 => { - instruction.opcode = Opcode::MULSD; - Ok(OperandCode::G_E_xmm) - }, - 0x5a => { - instruction.opcode = Opcode::CVTSD2SS; - Ok(OperandCode::G_E_xmm) - }, - 0x5c => { - instruction.opcode = Opcode::SUBSD; - Ok(OperandCode::G_E_xmm) - }, - 0x5d => { - instruction.opcode = Opcode::MINSD; - Ok(OperandCode::G_E_xmm) - }, - 0x5e => { - instruction.opcode = Opcode::DIVSD; - Ok(OperandCode::G_E_xmm) - }, - 0x5f => { - instruction.opcode = Opcode::MAXSD; - Ok(OperandCode::G_E_xmm) - }, - 0x7c => { - instruction.opcode = Opcode::HADDPS; - Ok(OperandCode::G_E_xmm) - }, - 0x7d => { - instruction.opcode = Opcode::HSUBPS; - Ok(OperandCode::G_E_xmm) - }, - 0xD0 => { - instruction.opcode = Opcode::ADDSUBPS; - Ok(OperandCode::G_E_xmm) - }, - 0xf0 => { - instruction.opcode = Opcode::LDDQU; - Ok(OperandCode::G_E_xmm) - }, + return Err("x86_64 CRC32 not currently supported".to_string()) + } + 0x51 => { (Opcode::SQRTSD, OperandCode::G_E_xmm) }, + 0x58 => { (Opcode::ADDSD, OperandCode::G_E_xmm) }, + 0x59 => { (Opcode::MULSD, OperandCode::G_E_xmm) }, + 0x5a => { (Opcode::CVTSD2SS, OperandCode::G_E_xmm) }, + 0x5c => { (Opcode::SUBSD, OperandCode::G_E_xmm) }, + 0x5d => { (Opcode::MINSD, OperandCode::G_E_xmm) }, + 0x5e => { (Opcode::DIVSD, OperandCode::G_E_xmm) }, + 0x5f => { (Opcode::MAXSD, OperandCode::G_E_xmm) }, + 0x7c => { (Opcode::HADDPS, OperandCode::G_E_xmm) }, + 0x7d => { (Opcode::HSUBPS, OperandCode::G_E_xmm) }, + 0xD0 => { (Opcode::ADDSUBPS, OperandCode::G_E_xmm) }, + 0xf0 => { (Opcode::LDDQU, OperandCode::G_E_xmm) }, /* 0x70 PSHUFLW 0xc2 CMPSD @@ -862,9 +808,11 @@ fn read_opcode_f20f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: & */ _ => { instruction.opcode = Opcode::Invalid; - Err("Invalid opcode".to_string()) + return Err("Invalid opcode".to_string()) } - } + }; + instruction.opcode = opcode; + Ok(operand_code) } None => { Err("No more bytes".to_owned()) @@ -875,68 +823,28 @@ fn read_opcode_f30f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: & match bytes_iter.next() { Some(b) => { *length += 1; - match b { - 0x10 => { - instruction.opcode = Opcode::MOVSS; - Ok(OperandCode::G_E_xmm) - }, - 0x11 => { - instruction.opcode = Opcode::MOVSS; - Ok(OperandCode::E_G_xmm) - }, - 0x12 => { - instruction.opcode = Opcode::MOVSLDUP; - Ok(OperandCode::G_E_xmm) - }, - 0x2a => { - instruction.opcode = Opcode::CVTSI2SS; - Ok(OperandCode::G_E_xmm) - }, - 0x2c => { - instruction.opcode = Opcode::CVTTSS2SI; - Ok(OperandCode::G_E_xmm) - }, - 0x2d => { - instruction.opcode = Opcode::CVTSS2SI; - Ok(OperandCode::G_E_xmm) - }, - 0x51 => { - instruction.opcode = Opcode::SQRTSS; - Ok(OperandCode::G_E_xmm) - }, - 0x58 => { - instruction.opcode = Opcode::ADDSS; - Ok(OperandCode::G_E_xmm) - }, - 0x59 => { - instruction.opcode = Opcode::MULSS; - Ok(OperandCode::G_E_xmm) - }, - 0x5a => { - instruction.opcode = Opcode::CVTSS2SD; - Ok(OperandCode::G_E_xmm) - }, - 0x5c => { - instruction.opcode = Opcode::SUBSS; - Ok(OperandCode::G_E_xmm) - }, - 0x5d => { - instruction.opcode = Opcode::MINSS; - Ok(OperandCode::G_E_xmm) - }, - 0x5e => { - instruction.opcode = Opcode::DIVSS; - Ok(OperandCode::G_E_xmm) - }, - 0x5f => { - instruction.opcode = Opcode::MAXSS; - Ok(OperandCode::G_E_xmm) - }, + let (opcode, operand_code) = match b { + 0x10 => { (Opcode::MOVSS, OperandCode::G_E_xmm) }, + 0x11 => { (Opcode::MOVSS, OperandCode::E_G_xmm) }, + 0x12 => { (Opcode::MOVSLDUP, OperandCode::G_E_xmm) }, + 0x2a => { (Opcode::CVTSI2SS, OperandCode::G_E_xmm) }, + 0x2c => { (Opcode::CVTTSS2SI, OperandCode::G_E_xmm) }, + 0x2d => { (Opcode::CVTSS2SI, OperandCode::G_E_xmm) }, + 0x51 => { (Opcode::SQRTSS, OperandCode::G_E_xmm) }, + 0x58 => { (Opcode::ADDSS, OperandCode::G_E_xmm) }, + 0x59 => { (Opcode::MULSS, OperandCode::G_E_xmm) }, + 0x5a => { (Opcode::CVTSS2SD, OperandCode::G_E_xmm) }, + 0x5c => { (Opcode::SUBSS, OperandCode::G_E_xmm) }, + 0x5d => { (Opcode::MINSS, OperandCode::G_E_xmm) }, + 0x5e => { (Opcode::DIVSS, OperandCode::G_E_xmm) }, + 0x5f => { (Opcode::MAXSS, OperandCode::G_E_xmm) }, _ => { instruction.opcode = Opcode::Invalid; - Err("Invalid opcode".to_string()) + return Err("Invalid opcode".to_string()); } - } + }; + instruction.opcode = opcode; + Ok(operand_code) } None => { Err("No more bytes".to_owned()) @@ -947,215 +855,61 @@ fn read_opcode_0f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mu match bytes_iter.next() { Some(b) => { *length += 1; - match b { - 0x00 => { - Ok(OperandCode::ModRM_0x0f00) - } - 0x01 => { - Ok(OperandCode::ModRM_0x0f01) - } - 0x02 => { - instruction.opcode = Opcode::LAR; - Ok(OperandCode::Gv_M) - } - 0x03 => { - instruction.opcode = Opcode::LSL; - Ok(OperandCode::Gv_M) - } - 0x05 => { - instruction.opcode = Opcode::SYSCALL; - Ok(OperandCode::Nothing) - } - 0x06 => { - instruction.opcode = Opcode::CLTS; - Ok(OperandCode::Nothing) - } - 0x07 => { - instruction.opcode = Opcode::SYSRET; - Ok(OperandCode::Nothing) - } - 0x08 => { - instruction.opcode = Opcode::INVD; - Ok(OperandCode::Nothing) - } - 0x09 => { - instruction.opcode = Opcode::WBINVD; - Ok(OperandCode::Nothing) - } - 0x0b => { - instruction.opcode = Opcode::UD2; - Ok(OperandCode::Nothing) - } - 0x0d => { - instruction.opcode = Opcode::NOP; - Ok(OperandCode::Ev) - } - 0x1f => { - instruction.opcode = Opcode::NOP; - Ok(OperandCode::Ev) - }, - 0x20 => { - instruction.opcode = Opcode::MOV; - Ok(OperandCode::Rq_Cq_0) - }, - 0x21 => { - instruction.opcode = Opcode::MOV; - Ok(OperandCode::Rq_Dq_0) - }, - 0x22 => { - instruction.opcode = Opcode::MOV; - Ok(OperandCode::Cq_Rq_0) - }, - 0x23 => { - instruction.opcode = Opcode::MOV; - Ok(OperandCode::Dq_Rq_0) - }, - 0x30 => { - instruction.opcode = Opcode::WRMSR; - Ok(OperandCode::Nothing) - }, - 0x31 => { - instruction.opcode = Opcode::RDTSC; - Ok(OperandCode::Nothing) - }, - 0x32 => { - instruction.opcode = Opcode::RDMSR; - Ok(OperandCode::Nothing) - }, - 0x33 => { - instruction.opcode = Opcode::RDPMC; - Ok(OperandCode::Nothing) - }, - 0x40 => { - instruction.opcode = Opcode::CMOVO; - Ok(OperandCode::Gv_Ev) - }, - 0x41 => { - instruction.opcode = Opcode::CMOVNO; - Ok(OperandCode::Gv_Ev) - }, - 0x42 => { - instruction.opcode = Opcode::CMOVB; - Ok(OperandCode::Gv_Ev) - }, - 0x43 => { - instruction.opcode = Opcode::CMOVNB; - Ok(OperandCode::Gv_Ev) - }, - 0x44 => { - instruction.opcode = Opcode::CMOVZ; - Ok(OperandCode::Gv_Ev) - }, - 0x45 => { - instruction.opcode = Opcode::CMOVNZ; - Ok(OperandCode::Gv_Ev) - }, - 0x46 => { - instruction.opcode = Opcode::CMOVNA; - Ok(OperandCode::Gv_Ev) - }, - 0x47 => { - instruction.opcode = Opcode::CMOVA; - Ok(OperandCode::Gv_Ev) - }, - 0x48 => { - instruction.opcode = Opcode::CMOVS; - Ok(OperandCode::Gv_Ev) - }, - 0x49 => { - instruction.opcode = Opcode::CMOVNS; - Ok(OperandCode::Gv_Ev) - }, - 0x4a => { - instruction.opcode = Opcode::CMOVP; - Ok(OperandCode::Gv_Ev) - }, - 0x4b => { - instruction.opcode = Opcode::CMOVNP; - Ok(OperandCode::Gv_Ev) - }, - 0x4c => { - instruction.opcode = Opcode::CMOVL; - Ok(OperandCode::Gv_Ev) - }, - 0x4d => { - instruction.opcode = Opcode::CMOVGE; - Ok(OperandCode::Gv_Ev) - }, - 0x4e => { - instruction.opcode = Opcode::CMOVLE; - Ok(OperandCode::Gv_Ev) - }, - 0x4f => { - instruction.opcode = Opcode::CMOVG; - Ok(OperandCode::Gv_Ev) - }, - 0x80 => { - instruction.opcode = Opcode::JO; - Ok(OperandCode::Jvds) - }, - 0x81 => { - instruction.opcode = Opcode::JNO; - Ok(OperandCode::Jvds) - }, - 0x82 => { - instruction.opcode = Opcode::JB; - Ok(OperandCode::Jvds) - }, - 0x83 => { - instruction.opcode = Opcode::JNB; - Ok(OperandCode::Jvds) - }, - 0x84 => { - instruction.opcode = Opcode::JZ; - Ok(OperandCode::Jvds) - }, - 0x85 => { - instruction.opcode = Opcode::JNZ; - Ok(OperandCode::Jvds) - }, - 0x86 => { - instruction.opcode = Opcode::JNA; - Ok(OperandCode::Jvds) - }, - 0x87 => { - instruction.opcode = Opcode::JA; - Ok(OperandCode::Jvds) - }, - 0x88 => { - instruction.opcode = Opcode::JS; - Ok(OperandCode::Jvds) - }, - 0x89 => { - instruction.opcode = Opcode::JNS; - Ok(OperandCode::Jvds) - }, - 0x8a => { - instruction.opcode = Opcode::JP; - Ok(OperandCode::Jvds) - }, - 0x8b => { - instruction.opcode = Opcode::JNP; - Ok(OperandCode::Jvds) - }, - 0x8c => { - instruction.opcode = Opcode::JL; - Ok(OperandCode::Jvds) - }, - 0x8d => { - instruction.opcode = Opcode::JGE; - Ok(OperandCode::Jvds) - }, - 0x8e => { - instruction.opcode = Opcode::JLE; - Ok(OperandCode::Jvds) - }, - 0x8f => { - instruction.opcode = Opcode::JG; - Ok(OperandCode::Jvds) - }, + let (opcode, operand_code) = match b { + 0x00 => { (Opcode::Invalid, OperandCode::ModRM_0x0f00) }, + 0x01 => { (Opcode::Invalid, OperandCode::ModRM_0x0f01) }, + 0x02 => { (Opcode::LAR, OperandCode::Gv_M) }, + 0x03 => { (Opcode::LSL, OperandCode::Gv_M) }, + 0x05 => { (Opcode::SYSCALL, OperandCode::Nothing) }, + 0x06 => { (Opcode::CLTS, OperandCode::Nothing) }, + 0x07 => { (Opcode::SYSRET, OperandCode::Nothing) }, + 0x08 => { (Opcode::INVD, OperandCode::Nothing) }, + 0x09 => { (Opcode::WBINVD, OperandCode::Nothing) }, + 0x0b => { (Opcode::UD2, OperandCode::Nothing) }, + 0x0d => { (Opcode::NOP, OperandCode::Ev) }, + 0x1f => { (Opcode::NOP, OperandCode::Ev) }, + 0x20 => { (Opcode::MOV, OperandCode::Rq_Cq_0) }, + 0x21 => { (Opcode::MOV, OperandCode::Rq_Dq_0) }, + 0x22 => { (Opcode::MOV, OperandCode::Cq_Rq_0) }, + 0x23 => { (Opcode::MOV, OperandCode::Dq_Rq_0) }, + 0x30 => { (Opcode::WRMSR, OperandCode::Nothing) }, + 0x31 => { (Opcode::RDTSC, OperandCode::Nothing) }, + 0x32 => { (Opcode::RDMSR, OperandCode::Nothing) }, + 0x33 => { (Opcode::RDPMC, OperandCode::Nothing) }, + 0x40 => { (Opcode::CMOVO, OperandCode::Gv_Ev) }, + 0x41 => { (Opcode::CMOVNO, OperandCode::Gv_Ev) }, + 0x42 => { (Opcode::CMOVB, OperandCode::Gv_Ev) }, + 0x43 => { (Opcode::CMOVNB, OperandCode::Gv_Ev) }, + 0x44 => { (Opcode::CMOVZ, OperandCode::Gv_Ev) }, + 0x45 => { (Opcode::CMOVNZ, OperandCode::Gv_Ev) }, + 0x46 => { (Opcode::CMOVNA, OperandCode::Gv_Ev) }, + 0x47 => { (Opcode::CMOVA, OperandCode::Gv_Ev) }, + 0x48 => { (Opcode::CMOVS, OperandCode::Gv_Ev) }, + 0x49 => { (Opcode::CMOVNS, OperandCode::Gv_Ev) }, + 0x4a => { (Opcode::CMOVP, OperandCode::Gv_Ev) }, + 0x4b => { (Opcode::CMOVNP, OperandCode::Gv_Ev) }, + 0x4c => { (Opcode::CMOVL, OperandCode::Gv_Ev) }, + 0x4d => { (Opcode::CMOVGE, OperandCode::Gv_Ev) }, + 0x4e => { (Opcode::CMOVLE, OperandCode::Gv_Ev) }, + 0x4f => { (Opcode::CMOVG, OperandCode::Gv_Ev) }, + 0x80 => { (Opcode::JO, OperandCode::Jvds) }, + 0x81 => { (Opcode::JNO, OperandCode::Jvds) }, + 0x82 => { (Opcode::JB, OperandCode::Jvds) }, + 0x83 => { (Opcode::JNB, OperandCode::Jvds) }, + 0x84 => { (Opcode::JZ, OperandCode::Jvds) }, + 0x85 => { (Opcode::JNZ, OperandCode::Jvds) }, + 0x86 => { (Opcode::JNA, OperandCode::Jvds) }, + 0x87 => { (Opcode::JA, OperandCode::Jvds) }, + 0x88 => { (Opcode::JS, OperandCode::Jvds) }, + 0x89 => { (Opcode::JNS, OperandCode::Jvds) }, + 0x8a => { (Opcode::JP, OperandCode::Jvds) }, + 0x8b => { (Opcode::JNP, OperandCode::Jvds) }, + 0x8c => { (Opcode::JL, OperandCode::Jvds) }, + 0x8d => { (Opcode::JGE, OperandCode::Jvds) }, + 0x8e => { (Opcode::JLE, OperandCode::Jvds) }, + 0x8f => { (Opcode::JG, OperandCode::Jvds) }, x if x < 0xa0 => { - instruction.opcode = [ + let op = [ Opcode::SETO, Opcode::SETNO, Opcode::SETB, @@ -1173,90 +927,34 @@ fn read_opcode_0f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mu Opcode::SETLE, Opcode::SETG ][(x & 0xf) as usize]; - Ok(OperandCode::Eb_R0) - } - 0xa0 => { - instruction.opcode = Opcode::PUSH; - Ok(OperandCode::FS) - } - 0xa1 => { - instruction.opcode = Opcode::POP; - Ok(OperandCode::GS) - } - 0xa2 => { - instruction.opcode = Opcode::CPUID; - Ok(OperandCode::Nothing) - } - 0xa3 => { - instruction.opcode = Opcode::BT; - Ok(OperandCode::Gv_Ev) - } - 0xa8 => { - instruction.opcode = Opcode::PUSH; - Ok(OperandCode::Nothing) - } - 0xa9 => { - instruction.opcode = Opcode::PUSH; - Ok(OperandCode::GS) - } - 0xae => { - Ok(OperandCode::ModRM_0x0fae) - } - 0xaf => { - instruction.opcode = Opcode::IMUL; - Ok(OperandCode::Gv_Ev) - } - 0xb0 => { - instruction.opcode = Opcode::CMPXCHG; - Ok(OperandCode::Eb_Gb) - }, - 0xb1 => { - instruction.opcode = Opcode::CMPXCHG; - Ok(OperandCode::Ev_Gv) - } - 0xb6 => { - instruction.opcode = Opcode::MOVZX_b; - Ok(OperandCode::Gv_Eb) - }, - 0xb7 => { - instruction.opcode = Opcode::MOVZX_w; - Ok(OperandCode::Gv_Ew) - } - 0xba => { - Ok(OperandCode::ModRM_0x0fba) - } - 0xbb => { - instruction.opcode = Opcode::BTC; - Ok(OperandCode::Gv_Ev) - } - 0xbc => { - instruction.opcode = Opcode::BSF; - Ok(OperandCode::Gv_Ev) - } - 0xbd => { - instruction.opcode = Opcode::BSR; - Ok(OperandCode::Gv_Ev) - } - 0xbe => { - instruction.opcode = Opcode::MOVSX_b; - Ok(OperandCode::Gv_Eb) - } - 0xbf => { - instruction.opcode = Opcode::MOVSX_w; - Ok(OperandCode::Gv_Ew) - } - 0xc0 => { - instruction.opcode = Opcode::XADD; - Ok(OperandCode::Eb_Gb) - } - 0xc1 => { - instruction.opcode = Opcode::XADD; - Ok(OperandCode::Ev_Gv) - } + (op, OperandCode::Eb_R0) + } + 0xa0 => { (Opcode::PUSH, OperandCode::FS) }, + 0xa1 => { (Opcode::POP, OperandCode::GS) }, + 0xa2 => { (Opcode::CPUID, OperandCode::Nothing) }, + 0xa3 => { (Opcode::BT, OperandCode::Gv_Ev) }, + 0xa8 => { (Opcode::PUSH, OperandCode::Nothing) }, + 0xa9 => { (Opcode::PUSH, OperandCode::GS) }, + 0xae => { (Opcode::Invalid, OperandCode::ModRM_0x0fae) }, + 0xaf => { (Opcode::IMUL, OperandCode::Gv_Ev) }, + 0xb0 => { (Opcode::CMPXCHG, OperandCode::Eb_Gb) }, + 0xb1 => { (Opcode::CMPXCHG, OperandCode::Ev_Gv) }, + 0xb6 => { (Opcode::MOVZX_b, OperandCode::Gv_Eb) }, + 0xb7 => { (Opcode::MOVZX_w, OperandCode::Gv_Ew) }, + 0xba => { (Opcode::Invalid, OperandCode::ModRM_0x0fba) }, + 0xbb => { (Opcode::BTC, OperandCode::Gv_Ev) }, + 0xbc => { (Opcode::BSF, OperandCode::Gv_Ev) }, + 0xbd => { (Opcode::BSR, OperandCode::Gv_Ev) }, + 0xbe => { (Opcode::MOVSX_b, OperandCode::Gv_Eb) }, + 0xbf => { (Opcode::MOVSX_w, OperandCode::Gv_Ew) }, + 0xc0 => { (Opcode::XADD, OperandCode::Eb_Gb) }, + 0xc1 => { (Opcode::XADD, OperandCode::Ev_Gv) }, _ => { - Err(format!("Unknown opcode: 0f{:x}", b)) + return Err(format!("Unknown opcode: 0f{:x}", b)) } - } + }; + instruction.opcode = opcode; + Ok(operand_code) }, None => { Err("No more bytes".to_owned()) |