diff --git a/InstructionSets/x86/Decoder.cpp b/InstructionSets/x86/Decoder.cpp index e16668563..521f1c4dd 100644 --- a/InstructionSets/x86/Decoder.cpp +++ b/InstructionSets/x86/Decoder.cpp @@ -524,10 +524,10 @@ std::pair::InstructionT> Decoder::decode(con RequiresMin(i80386); MemRegReg(MOVZX, Reg_MemReg, DataSize::Word); break; - // TODO: 0xba: Grp8 Ev, Ib - case 0xbb: RequiresMin(i80386); MemRegReg(BTC, MemReg_Reg, data_size_); break; - case 0xbc: RequiresMin(i80386); MemRegReg(BSF, MemReg_Reg, data_size_); break; - case 0xbd: RequiresMin(i80386); MemRegReg(BSR, MemReg_Reg, data_size_); break; + case 0xba: RequiresMin(i80386); MemRegReg(Invalid, MemRegBT_to_BTC, data_size_); break; + case 0xbb: RequiresMin(i80386); MemRegReg(BTC, MemReg_Reg, data_size_); break; + case 0xbc: RequiresMin(i80386); MemRegReg(BSF, MemReg_Reg, data_size_); break; + case 0xbd: RequiresMin(i80386); MemRegReg(BSR, MemReg_Reg, data_size_); break; case 0xbe: RequiresMin(i80386); MemRegReg(MOVSX, Reg_MemReg, DataSize::Byte); @@ -776,6 +776,21 @@ std::pair::InstructionT> Decoder::decode(con } break; + case ModRegRMFormat::MemRegBT_to_BTC: + destination_ = memreg; + source_ = Source::Immediate; + operand_size_ = DataSize::Byte; + + switch(reg) { + default: undefined(); + + case 4: operation_ = Operation::BT; break; + case 5: operation_ = Operation::BTS; break; + case 6: operation_ = Operation::BTR; break; + case 7: operation_ = Operation::BTC; break; + } + break; + default: assert(false); } diff --git a/InstructionSets/x86/Decoder.hpp b/InstructionSets/x86/Decoder.hpp index 6f0c4a6aa..6c837df2a 100644 --- a/InstructionSets/x86/Decoder.hpp +++ b/InstructionSets/x86/Decoder.hpp @@ -156,7 +156,8 @@ template class Decoder { // 'Group 8' // - // TODO. + // Parse for mode and register/memory field, populating destination, + // and prepare to read a single byte as source. MemRegBT_to_BTC, } modregrm_format_ = ModRegRMFormat::MemReg_Reg;