/* ==================================================================== * * ==================================================================== */ void __bea_callspec__ G13_(PDISASM pMyDisasm) { Int32 MyNumber; GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_))) >> 3) & 0x7; if (GV.REGOPCODE == 2) { GV.ImmediatSize = 8; if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) { PrefOpSizeMandatory(pMyDisasm); (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm); } else { (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm); } (*pMyDisasm).Argument1.AccessMode = READ+WRITE; if (GV.MOD_== 0x3) { (*pMyDisasm).Instruction.Mnemonic = I_PSRLD; } else { FailDecode(pMyDisasm); } GV.EIP_ += 2; if (!Security(0, pMyDisasm)) return; MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); (*pMyDisasm).Instruction.Immediat = MyNumber; (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; (*pMyDisasm).Argument2.ArgSize = 8; } else if (GV.REGOPCODE == 4) { GV.ImmediatSize = 8; if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) { PrefOpSizeMandatory(pMyDisasm); (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; (*pMyDisasm).Argument1.ArgSize = 128; MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm); } else { (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm); } (*pMyDisasm).Argument1.AccessMode = READ+WRITE; if (GV.MOD_== 0x3) { (*pMyDisasm).Instruction.Mnemonic = I_PSRAD; } else { FailDecode(pMyDisasm); } GV.EIP_ += 2; if (!Security(0, pMyDisasm)) return; MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); (*pMyDisasm).Instruction.Immediat = MyNumber; (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; (*pMyDisasm).Argument2.ArgSize = 8; } else if (GV.REGOPCODE == 6) { GV.ImmediatSize = 8; if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) { PrefOpSizeMandatory(pMyDisasm); (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; (*pMyDisasm).Argument1.ArgSize = 128; MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm); } else { (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm); } (*pMyDisasm).Argument1.AccessMode = READ+WRITE; if (GV.MOD_== 0x3) { (*pMyDisasm).Instruction.Mnemonic = I_PSLLD; } else { FailDecode(pMyDisasm); } GV.EIP_ += 2; if (!Security(0, pMyDisasm)) return; MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); (*pMyDisasm).Instruction.Immediat = MyNumber; (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; (*pMyDisasm).Argument2.ArgSize = 8; } else { FailDecode(pMyDisasm); } }
/* ==================================================================== * MMX reg, MMX r/m * ==================================================================== */ void __bea_callspec__ MMregMMrm(PDISASM pMyDisasm) { MOD_RM_MMX(&(*pMyDisasm).Argument2, pMyDisasm); RegMMX_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); GV.EIP_ += GV.DECALAGE_EIP; }