internal void DecodeRegisterPair(x86Instruction instruction, byte registerToken, out x86Register register1, out x86Register register2)
{
byte registerToken1 = (byte)(registerToken >> 4 << 4); // high bits.
byte registerToken2 = (byte)(registerToken - registerToken1); // lower bits.
while (registerToken1 >= 0x40)
registerToken1 -= 0x40;
registerToken1 /= 8;
if (registerToken2 > 0x7)
{
registerToken2 -= 8;
registerToken1++;
}
switch (instruction.OpCode.OperandType)
{
case x86OperandType.Multiple16Register:
// add bit16 mask
registerToken1 |= (byte)x86Register.Bit16Mask;
registerToken2 |= (byte)x86Register.Bit16Mask;
break;
case x86OperandType.Multiple32Or8Register:
// Not sure if right or not
byte mask1;
byte mask2;
GetDoubleRegisterMask(registerToken, out mask1, out mask2);
registerToken1 |= mask1;
registerToken2 |= mask2;
break;
case x86OperandType.Multiple32Register:
// do nothing, normal registers are used.
break;
}
// notice inverted registers.
register2 = (x86Register)registerToken1;
register1 = (x86Register)registerToken2;
}