public Instruction decode( byte[] bytesArray, int index, int instrStartIndex, int segmentOverride, int prefixes, X86InstructionFactory factory) { this.byteIndex = index; this.instrStartIndex = instrStartIndex; this.prefixes = prefixes; int ModRM = readByte(bytesArray, byteIndex); int rm = ModRM & 7; FPInstructionDecoder instrDecoder = null; instrDecoder = floatGRPMap[number][rm]; Instruction instr = null; if (instrDecoder != null) { instr = instrDecoder.decode( bytesArray, byteIndex, instrStartIndex, segmentOverride, prefixes, factory); byteIndex = instrDecoder.getCurrentIndex(); } else { instr = factory.newIllegalInstruction(); } return instr; }
public Instruction decode( BinaryInputBuffer bytesArray, int index, int instrStartIndex, int segmentOverride, int prefixes, X86InstructionFactory factory) { this.byteIndex = index; this.instrStartIndex = instrStartIndex; this.prefixes = prefixes; int ModRM = readByte(bytesArray, byteIndex); int reg = (ModRM >> 3) & 7; // int regOrOpcode = (ModRM >> 3) & 7; // int rm = ModRM & 7; int startIndexWithoutPrefix; // JK: FWAIT was broken if ((prefixes & PREFIX_FWAIT) != 0) startIndexWithoutPrefix = instrStartIndex + 1; else startIndexWithoutPrefix = instrStartIndex; int floatOpcode = InstructionDecoder.readByte(bytesArray, startIndexWithoutPrefix); FPInstructionDecoder instrDecoder = null; if (ModRM < 0xbf) { instrDecoder = floatMapOne[floatOpcode - 0xd8][reg]; } else { instrDecoder = floatMapTwo[floatOpcode - 0xd8][reg]; } Instruction instr = null; if (instrDecoder != null) { instr = instrDecoder.decode( bytesArray, byteIndex, instrStartIndex, segmentOverride, prefixes, factory); byteIndex = instrDecoder.getCurrentIndex(); } return instr; }