Lines Matching refs:instruction

293     ZydisDecodedInstruction* instruction, ZyanU8* value)  in ZydisInputPeek()  argument
296 ZYAN_ASSERT(instruction); in ZydisInputPeek()
299 if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) in ZydisInputPeek()
323 static void ZydisInputSkip(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction) in ZydisInputSkip() argument
326 ZYAN_ASSERT(instruction); in ZydisInputSkip()
327 ZYAN_ASSERT(instruction->length < ZYDIS_MAX_INSTRUCTION_LENGTH); in ZydisInputSkip()
329 ++instruction->length; in ZydisInputSkip()
347 ZydisDecodedInstruction* instruction, ZyanU8* value) in ZydisInputNext() argument
350 ZYAN_ASSERT(instruction); in ZydisInputNext()
353 if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) in ZydisInputNext()
361 ++instruction->length; in ZydisInputNext()
384 ZydisDecodedInstruction* instruction, ZyanU8* value, ZyanU8 number_of_bytes) in ZydisInputNextBytes() argument
387 ZYAN_ASSERT(instruction); in ZydisInputNextBytes()
390 if (instruction->length + number_of_bytes > ZYDIS_MAX_INSTRUCTION_LENGTH) in ZydisInputNextBytes()
397 instruction->length += number_of_bytes; in ZydisInputNextBytes()
420 static void ZydisDecodeREX(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction, in ZydisDecodeREX() argument
423 ZYAN_ASSERT(instruction); in ZydisDecodeREX()
426 instruction->attributes |= ZYDIS_ATTRIB_HAS_REX; in ZydisDecodeREX()
427 instruction->raw.rex.W = (data >> 3) & 0x01; in ZydisDecodeREX()
428 instruction->raw.rex.R = (data >> 2) & 0x01; in ZydisDecodeREX()
429 instruction->raw.rex.X = (data >> 1) & 0x01; in ZydisDecodeREX()
430 instruction->raw.rex.B = (data >> 0) & 0x01; in ZydisDecodeREX()
433 context->cache.W = instruction->raw.rex.W; in ZydisDecodeREX()
434 context->cache.R = instruction->raw.rex.R; in ZydisDecodeREX()
435 context->cache.X = instruction->raw.rex.X; in ZydisDecodeREX()
436 context->cache.B = instruction->raw.rex.B; in ZydisDecodeREX()
449 ZydisDecodedInstruction* instruction, const ZyanU8 data[3]) in ZydisDecodeXOP() argument
451 ZYAN_ASSERT(instruction); in ZydisDecodeXOP()
454 ZYAN_ASSERT(instruction->raw.xop.offset == instruction->length - 3); in ZydisDecodeXOP()
456 instruction->attributes |= ZYDIS_ATTRIB_HAS_XOP; in ZydisDecodeXOP()
457 instruction->raw.xop.R = (data[1] >> 7) & 0x01; in ZydisDecodeXOP()
458 instruction->raw.xop.X = (data[1] >> 6) & 0x01; in ZydisDecodeXOP()
459 instruction->raw.xop.B = (data[1] >> 5) & 0x01; in ZydisDecodeXOP()
460 instruction->raw.xop.m_mmmm = (data[1] >> 0) & 0x1F; in ZydisDecodeXOP()
462 if ((instruction->raw.xop.m_mmmm < 0x08) || (instruction->raw.xop.m_mmmm > 0x0A)) in ZydisDecodeXOP()
468 instruction->raw.xop.W = (data[2] >> 7) & 0x01; in ZydisDecodeXOP()
469 instruction->raw.xop.vvvv = (data[2] >> 3) & 0x0F; in ZydisDecodeXOP()
470 instruction->raw.xop.L = (data[2] >> 2) & 0x01; in ZydisDecodeXOP()
471 instruction->raw.xop.pp = (data[2] >> 0) & 0x03; in ZydisDecodeXOP()
474 context->cache.W = instruction->raw.xop.W; in ZydisDecodeXOP()
475 context->cache.R = 0x01 & ~instruction->raw.xop.R; in ZydisDecodeXOP()
476 context->cache.X = 0x01 & ~instruction->raw.xop.X; in ZydisDecodeXOP()
477 context->cache.B = 0x01 & ~instruction->raw.xop.B; in ZydisDecodeXOP()
478 context->cache.L = instruction->raw.xop.L; in ZydisDecodeXOP()
479 context->cache.LL = instruction->raw.xop.L; in ZydisDecodeXOP()
480 context->cache.v_vvvv = (0x0F & ~instruction->raw.xop.vvvv); in ZydisDecodeXOP()
495 ZydisDecodedInstruction* instruction, const ZyanU8 data[3]) in ZydisDecodeVEX() argument
497 ZYAN_ASSERT(instruction); in ZydisDecodeVEX()
500 instruction->attributes |= ZYDIS_ATTRIB_HAS_VEX; in ZydisDecodeVEX()
504 ZYAN_ASSERT(instruction->raw.vex.offset == instruction->length - 3); in ZydisDecodeVEX()
505 instruction->raw.vex.size = 3; in ZydisDecodeVEX()
506 instruction->raw.vex.R = (data[1] >> 7) & 0x01; in ZydisDecodeVEX()
507 instruction->raw.vex.X = (data[1] >> 6) & 0x01; in ZydisDecodeVEX()
508 instruction->raw.vex.B = (data[1] >> 5) & 0x01; in ZydisDecodeVEX()
509 instruction->raw.vex.m_mmmm = (data[1] >> 0) & 0x1F; in ZydisDecodeVEX()
510 instruction->raw.vex.W = (data[2] >> 7) & 0x01; in ZydisDecodeVEX()
511 instruction->raw.vex.vvvv = (data[2] >> 3) & 0x0F; in ZydisDecodeVEX()
512 instruction->raw.vex.L = (data[2] >> 2) & 0x01; in ZydisDecodeVEX()
513 instruction->raw.vex.pp = (data[2] >> 0) & 0x03; in ZydisDecodeVEX()
516 ZYAN_ASSERT(instruction->raw.vex.offset == instruction->length - 2); in ZydisDecodeVEX()
517 instruction->raw.vex.size = 2; in ZydisDecodeVEX()
518 instruction->raw.vex.R = (data[1] >> 7) & 0x01; in ZydisDecodeVEX()
519 instruction->raw.vex.X = 1; in ZydisDecodeVEX()
520 instruction->raw.vex.B = 1; in ZydisDecodeVEX()
521 instruction->raw.vex.m_mmmm = 1; in ZydisDecodeVEX()
522 instruction->raw.vex.W = 0; in ZydisDecodeVEX()
523 instruction->raw.vex.vvvv = (data[1] >> 3) & 0x0F; in ZydisDecodeVEX()
524 instruction->raw.vex.L = (data[1] >> 2) & 0x01; in ZydisDecodeVEX()
525 instruction->raw.vex.pp = (data[1] >> 0) & 0x03; in ZydisDecodeVEX()
533 if ((instruction->raw.vex.m_mmmm == 0) || (instruction->raw.vex.m_mmmm > 0x03)) in ZydisDecodeVEX()
535 if (instruction->raw.vex.m_mmmm > 0x03) in ZydisDecodeVEX()
543 context->cache.W = instruction->raw.vex.W; in ZydisDecodeVEX()
544 context->cache.R = 0x01 & ~instruction->raw.vex.R; in ZydisDecodeVEX()
545 context->cache.X = 0x01 & ~instruction->raw.vex.X; in ZydisDecodeVEX()
546 context->cache.B = 0x01 & ~instruction->raw.vex.B; in ZydisDecodeVEX()
547 context->cache.L = instruction->raw.vex.L; in ZydisDecodeVEX()
548 context->cache.LL = instruction->raw.vex.L; in ZydisDecodeVEX()
549 context->cache.v_vvvv = (0x0F & ~instruction->raw.vex.vvvv); in ZydisDecodeVEX()
565 ZydisDecodedInstruction* instruction, const ZyanU8 data[4]) in ZydisDecodeEVEX() argument
567 ZYAN_ASSERT(instruction); in ZydisDecodeEVEX()
569 ZYAN_ASSERT(instruction->raw.evex.offset == instruction->length - 4); in ZydisDecodeEVEX()
571 instruction->attributes |= ZYDIS_ATTRIB_HAS_EVEX; in ZydisDecodeEVEX()
572 instruction->raw.evex.R = (data[1] >> 7) & 0x01; in ZydisDecodeEVEX()
573 instruction->raw.evex.X = (data[1] >> 6) & 0x01; in ZydisDecodeEVEX()
574 instruction->raw.evex.B = (data[1] >> 5) & 0x01; in ZydisDecodeEVEX()
575 instruction->raw.evex.R2 = (data[1] >> 4) & 0x01; in ZydisDecodeEVEX()
583 instruction->raw.evex.mm = (data[1] >> 0) & 0x03; in ZydisDecodeEVEX()
585 if (instruction->raw.evex.mm == 0x00) in ZydisDecodeEVEX()
591 instruction->raw.evex.W = (data[2] >> 7) & 0x01; in ZydisDecodeEVEX()
592 instruction->raw.evex.vvvv = (data[2] >> 3) & 0x0F; in ZydisDecodeEVEX()
596 instruction->raw.evex.pp = (data[2] >> 0) & 0x03; in ZydisDecodeEVEX()
597 instruction->raw.evex.z = (data[3] >> 7) & 0x01; in ZydisDecodeEVEX()
598 instruction->raw.evex.L2 = (data[3] >> 6) & 0x01; in ZydisDecodeEVEX()
599 instruction->raw.evex.L = (data[3] >> 5) & 0x01; in ZydisDecodeEVEX()
600 instruction->raw.evex.b = (data[3] >> 4) & 0x01; in ZydisDecodeEVEX()
601 instruction->raw.evex.V2 = (data[3] >> 3) & 0x01; in ZydisDecodeEVEX()
603 if (!instruction->raw.evex.V2 && in ZydisDecodeEVEX()
609 instruction->raw.evex.aaa = (data[3] >> 0) & 0x07; in ZydisDecodeEVEX()
611 if (instruction->raw.evex.z && !instruction->raw.evex.aaa) in ZydisDecodeEVEX()
617 context->cache.W = instruction->raw.evex.W; in ZydisDecodeEVEX()
618 context->cache.R = 0x01 & ~instruction->raw.evex.R; in ZydisDecodeEVEX()
619 context->cache.X = 0x01 & ~instruction->raw.evex.X; in ZydisDecodeEVEX()
620 context->cache.B = 0x01 & ~instruction->raw.evex.B; in ZydisDecodeEVEX()
622 context->cache.R2 = 0x01 & ~instruction->raw.evex.R2; in ZydisDecodeEVEX()
623 context->cache.V2 = 0x01 & ~instruction->raw.evex.V2; in ZydisDecodeEVEX()
625 ((0x01 & ~instruction->raw.evex.V2) << 4) | (0x0F & ~instruction->raw.evex.vvvv); in ZydisDecodeEVEX()
626 context->cache.mask = instruction->raw.evex.aaa; in ZydisDecodeEVEX()
628 if (!instruction->raw.evex.V2 && (context->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)) in ZydisDecodeEVEX()
632 if (!instruction->raw.evex.b && (context->cache.LL == 3)) in ZydisDecodeEVEX()
653 ZydisDecodedInstruction* instruction, const ZyanU8 data[4]) in ZydisDecodeMVEX() argument
655 ZYAN_ASSERT(instruction); in ZydisDecodeMVEX()
657 ZYAN_ASSERT(instruction->raw.mvex.offset == instruction->length - 4); in ZydisDecodeMVEX()
659 instruction->attributes |= ZYDIS_ATTRIB_HAS_MVEX; in ZydisDecodeMVEX()
660 instruction->raw.mvex.R = (data[1] >> 7) & 0x01; in ZydisDecodeMVEX()
661 instruction->raw.mvex.X = (data[1] >> 6) & 0x01; in ZydisDecodeMVEX()
662 instruction->raw.mvex.B = (data[1] >> 5) & 0x01; in ZydisDecodeMVEX()
663 instruction->raw.mvex.R2 = (data[1] >> 4) & 0x01; in ZydisDecodeMVEX()
664 instruction->raw.mvex.mmmm = (data[1] >> 0) & 0x0F; in ZydisDecodeMVEX()
666 if (instruction->raw.mvex.mmmm > 0x03) in ZydisDecodeMVEX()
672 instruction->raw.mvex.W = (data[2] >> 7) & 0x01; in ZydisDecodeMVEX()
673 instruction->raw.mvex.vvvv = (data[2] >> 3) & 0x0F; in ZydisDecodeMVEX()
677 instruction->raw.mvex.pp = (data[2] >> 0) & 0x03; in ZydisDecodeMVEX()
678 instruction->raw.mvex.E = (data[3] >> 7) & 0x01; in ZydisDecodeMVEX()
679 instruction->raw.mvex.SSS = (data[3] >> 4) & 0x07; in ZydisDecodeMVEX()
680 instruction->raw.mvex.V2 = (data[3] >> 3) & 0x01; in ZydisDecodeMVEX()
681 instruction->raw.mvex.kkk = (data[3] >> 0) & 0x07; in ZydisDecodeMVEX()
684 context->cache.W = instruction->raw.mvex.W; in ZydisDecodeMVEX()
685 context->cache.R = 0x01 & ~instruction->raw.mvex.R; in ZydisDecodeMVEX()
686 context->cache.X = 0x01 & ~instruction->raw.mvex.X; in ZydisDecodeMVEX()
687 context->cache.B = 0x01 & ~instruction->raw.mvex.B; in ZydisDecodeMVEX()
688 context->cache.R2 = 0x01 & ~instruction->raw.mvex.R2; in ZydisDecodeMVEX()
689 context->cache.V2 = 0x01 & ~instruction->raw.mvex.V2; in ZydisDecodeMVEX()
692 ((0x01 & ~instruction->raw.mvex.V2) << 4) | (0x0F & ~instruction->raw.mvex.vvvv); in ZydisDecodeMVEX()
693 context->cache.mask = instruction->raw.mvex.kkk; in ZydisDecodeMVEX()
705 static void ZydisDecodeModRM(ZydisDecodedInstruction* instruction, ZyanU8 data) in ZydisDecodeModRM() argument
707 ZYAN_ASSERT(instruction); in ZydisDecodeModRM()
708 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM)); in ZydisDecodeModRM()
709 ZYAN_ASSERT(instruction->raw.modrm.offset == instruction->length - 1); in ZydisDecodeModRM()
711 instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; in ZydisDecodeModRM()
712 instruction->raw.modrm.mod = (data >> 6) & 0x03; in ZydisDecodeModRM()
713 instruction->raw.modrm.reg = (data >> 3) & 0x07; in ZydisDecodeModRM()
714 instruction->raw.modrm.rm = (data >> 0) & 0x07; in ZydisDecodeModRM()
723 static void ZydisDecodeSIB(ZydisDecodedInstruction* instruction, ZyanU8 data) in ZydisDecodeSIB() argument
725 ZYAN_ASSERT(instruction); in ZydisDecodeSIB()
726 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisDecodeSIB()
727 ZYAN_ASSERT(instruction->raw.modrm.rm == 4); in ZydisDecodeSIB()
728 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB)); in ZydisDecodeSIB()
729 ZYAN_ASSERT(instruction->raw.sib.offset == instruction->length - 1); in ZydisDecodeSIB()
731 instruction->attributes |= ZYDIS_ATTRIB_HAS_SIB; in ZydisDecodeSIB()
732 instruction->raw.sib.scale = (data >> 6) & 0x03; in ZydisDecodeSIB()
733 instruction->raw.sib.index = (data >> 3) & 0x07; in ZydisDecodeSIB()
734 instruction->raw.sib.base = (data >> 0) & 0x07; in ZydisDecodeSIB()
749 ZydisDecodedInstruction* instruction, ZyanU8 size) in ZydisReadDisplacement() argument
752 ZYAN_ASSERT(instruction); in ZydisReadDisplacement()
753 ZYAN_ASSERT(instruction->raw.disp.size == 0); in ZydisReadDisplacement()
755 instruction->raw.disp.size = size; in ZydisReadDisplacement()
756 instruction->raw.disp.offset = instruction->length; in ZydisReadDisplacement()
763 ZYAN_CHECK(ZydisInputNext(context, instruction, &value)); in ZydisReadDisplacement()
764 instruction->raw.disp.value = *(ZyanI8*)&value; in ZydisReadDisplacement()
770 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 2)); in ZydisReadDisplacement()
771 instruction->raw.disp.value = *(ZyanI16*)&value; in ZydisReadDisplacement()
777 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 4)); in ZydisReadDisplacement()
778 instruction->raw.disp.value = *(ZyanI32*)&value; in ZydisReadDisplacement()
784 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 8)); in ZydisReadDisplacement()
785 instruction->raw.disp.value = *(ZyanI64*)&value; in ZydisReadDisplacement()
810 ZydisDecodedInstruction* instruction, ZyanU8 id, ZyanU8 size, ZyanBool is_signed, in ZydisReadImmediate() argument
814 ZYAN_ASSERT(instruction); in ZydisReadImmediate()
817 ZYAN_ASSERT(instruction->raw.imm[id].size == 0); in ZydisReadImmediate()
819 instruction->raw.imm[id].size = size; in ZydisReadImmediate()
820 instruction->raw.imm[id].offset = instruction->length; in ZydisReadImmediate()
821 instruction->raw.imm[id].is_signed = is_signed; in ZydisReadImmediate()
822 instruction->raw.imm[id].is_relative = is_relative; in ZydisReadImmediate()
828 ZYAN_CHECK(ZydisInputNext(context, instruction, &value)); in ZydisReadImmediate()
831 instruction->raw.imm[id].value.s = (ZyanI8)value; in ZydisReadImmediate()
834 instruction->raw.imm[id].value.u = value; in ZydisReadImmediate()
841 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 2)); in ZydisReadImmediate()
844 instruction->raw.imm[id].value.s = (ZyanI16)value; in ZydisReadImmediate()
847 instruction->raw.imm[id].value.u = value; in ZydisReadImmediate()
854 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 4)); in ZydisReadImmediate()
857 instruction->raw.imm[id].value.s = (ZyanI32)value; in ZydisReadImmediate()
860 instruction->raw.imm[id].value.u = value; in ZydisReadImmediate()
867 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 8)); in ZydisReadImmediate()
870 instruction->raw.imm[id].value.s = (ZyanI64)value; in ZydisReadImmediate()
873 instruction->raw.imm[id].value.u = value; in ZydisReadImmediate()
905 ZydisDecodedInstruction* instruction, ZydisRegisterEncoding encoding, in ZydisCalcRegisterId() argument
923 ZyanU8 value = (instruction->opcode & 0x0F); in ZydisCalcRegisterId()
931 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
932 return instruction->raw.modrm.reg; in ZydisCalcRegisterId()
936 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
937 return instruction->raw.modrm.rm; in ZydisCalcRegisterId()
939 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
940 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
941 if (instruction->raw.modrm.rm == 4) in ZydisCalcRegisterId()
943 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
944 return instruction->raw.sib.base; in ZydisCalcRegisterId()
946 return instruction->raw.modrm.rm; in ZydisCalcRegisterId()
948 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
949 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
950 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
951 return instruction->raw.sib.index; in ZydisCalcRegisterId()
953 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
954 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
955 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
959 return instruction->raw.sib.index; in ZydisCalcRegisterId()
961 return (instruction->raw.imm[0].value.u >> 4) & 0x07; in ZydisCalcRegisterId()
976 ZyanU8 value = (instruction->opcode & 0x0F); in ZydisCalcRegisterId()
985 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
986 ZyanU8 value = instruction->raw.modrm.reg; in ZydisCalcRegisterId()
1031 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
1032 ZyanU8 value = instruction->raw.modrm.rm; in ZydisCalcRegisterId()
1051 if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || in ZydisCalcRegisterId()
1052 (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) in ZydisCalcRegisterId()
1068 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
1069 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
1070 if (instruction->raw.modrm.rm == 4) in ZydisCalcRegisterId()
1072 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
1073 return instruction->raw.sib.base | (context->cache.B << 3); in ZydisCalcRegisterId()
1075 return instruction->raw.modrm.rm | (context->cache.B << 3); in ZydisCalcRegisterId()
1077 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
1078 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
1079 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
1080 return instruction->raw.sib.index | (context->cache.X << 3); in ZydisCalcRegisterId()
1082 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisCalcRegisterId()
1083 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCalcRegisterId()
1084 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisCalcRegisterId()
1089 return instruction->raw.sib.index | (context->cache.X << 3) | in ZydisCalcRegisterId()
1093 ZyanU8 value = (instruction->raw.imm[0].value.u >> 4) & 0x0F; in ZydisCalcRegisterId()
1096 if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || in ZydisCalcRegisterId()
1097 (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) in ZydisCalcRegisterId()
1104 value |= ((instruction->raw.imm[0].value.u & 0x08) << 1); in ZydisCalcRegisterId()
1132 ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, in ZydisSetOperandSizeAndElementInfo() argument
1136 ZYAN_ASSERT(instruction); in ZydisSetOperandSizeAndElementInfo()
1158 switch (instruction->encoding) in ZydisSetOperandSizeAndElementInfo()
1167 operand->size = instruction->address_width; in ZydisSetOperandSizeAndElementInfo()
1185 ZYAN_ASSERT(instruction->avx.vector_length); in ZydisSetOperandSizeAndElementInfo()
1190 if (instruction->avx.broadcast.mode) in ZydisSetOperandSizeAndElementInfo()
1195 operand->size = instruction->avx.vector_length; in ZydisSetOperandSizeAndElementInfo()
1199 if (instruction->avx.broadcast.mode) in ZydisSetOperandSizeAndElementInfo()
1204 operand->size = (ZyanU16)instruction->avx.vector_length / 2; in ZydisSetOperandSizeAndElementInfo()
1225 ZYAN_ASSERT(instruction->avx.vector_length == 512); in ZydisSetOperandSizeAndElementInfo()
1227 switch (instruction->avx.conversion.mode) in ZydisSetOperandSizeAndElementInfo()
1302 switch (instruction->avx.broadcast.mode) in ZydisSetOperandSizeAndElementInfo()
1328 ZYAN_ASSERT((instruction->raw.imm[0].size == 16) || in ZydisSetOperandSizeAndElementInfo()
1329 (instruction->raw.imm[0].size == 32)); in ZydisSetOperandSizeAndElementInfo()
1330 ZYAN_ASSERT( instruction->raw.imm[1].size == 16); in ZydisSetOperandSizeAndElementInfo()
1331 operand->size = instruction->raw.imm[0].size + instruction->raw.imm[1].size; in ZydisSetOperandSizeAndElementInfo()
1375 static ZyanStatus ZydisDecodeOperandRegister(ZydisDecodedInstruction* instruction, in ZydisDecodeOperandRegister() argument
1378 ZYAN_ASSERT(instruction); in ZydisDecodeOperandRegister()
1385 if ((instruction->attributes & ZYDIS_ATTRIB_HAS_REX) && (register_id >= 4)) in ZydisDecodeOperandRegister()
1419 ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, in ZydisDecodeOperandMemory() argument
1423 ZYAN_ASSERT(instruction); in ZydisDecodeOperandMemory()
1425 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); in ZydisDecodeOperandMemory()
1426 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisDecodeOperandMemory()
1427 ZYAN_ASSERT(!vidx_register_class || ((instruction->raw.modrm.rm == 4) && in ZydisDecodeOperandMemory()
1428 ((instruction->address_width == 32) || (instruction->address_width == 64)))); in ZydisDecodeOperandMemory()
1433 const ZyanU8 modrm_rm = instruction->raw.modrm.rm; in ZydisDecodeOperandMemory()
1435 switch (instruction->address_width) in ZydisDecodeOperandMemory()
1452 switch (instruction->raw.modrm.mod) in ZydisDecodeOperandMemory()
1474 operand->mem.base = ZYDIS_REGISTER_EAX + ZydisCalcRegisterId(context, instruction, in ZydisDecodeOperandMemory()
1476 switch (instruction->raw.modrm.mod) in ZydisDecodeOperandMemory()
1502 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisDecodeOperandMemory()
1505 ZydisCalcRegisterId(context, instruction, in ZydisDecodeOperandMemory()
1508 operand->mem.scale = (1 << instruction->raw.sib.scale); in ZydisDecodeOperandMemory()
1516 if (instruction->raw.modrm.mod == 0) in ZydisDecodeOperandMemory()
1520 displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; in ZydisDecodeOperandMemory()
1531 operand->mem.base = ZYDIS_REGISTER_RAX + ZydisCalcRegisterId(context, instruction, in ZydisDecodeOperandMemory()
1533 switch (instruction->raw.modrm.mod) in ZydisDecodeOperandMemory()
1559 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); in ZydisDecodeOperandMemory()
1562 ZydisCalcRegisterId(context, instruction, in ZydisDecodeOperandMemory()
1565 operand->mem.scale = (1 << instruction->raw.sib.scale);; in ZydisDecodeOperandMemory()
1574 if (instruction->raw.modrm.mod == 0) in ZydisDecodeOperandMemory()
1578 displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; in ZydisDecodeOperandMemory()
1592 ZYAN_ASSERT(instruction->raw.disp.size == displacement_size); in ZydisDecodeOperandMemory()
1594 operand->mem.disp.value = instruction->raw.disp.value; in ZydisDecodeOperandMemory()
1610 ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, in ZydisDecodeOperandImplicitRegister() argument
1614 ZYAN_ASSERT(instruction); in ZydisDecodeOperandImplicitRegister()
1639 (instruction->address_width == 16) ? ZYDIS_REGCLASS_GPR16 : in ZydisDecodeOperandImplicitRegister()
1640 (instruction->address_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64, in ZydisDecodeOperandImplicitRegister()
1652 (instruction->address_width == 16) ? ZYDIS_REGISTER_IP : in ZydisDecodeOperandImplicitRegister()
1653 (instruction->address_width == 32) ? ZYDIS_REGISTER_EIP : ZYDIS_REGISTER_RIP; in ZydisDecodeOperandImplicitRegister()
1683 ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, in ZydisDecodeOperandImplicitMemory() argument
1704 ZydisCalcRegisterId(context, instruction, ZYDIS_REG_ENCODING_REG, in ZydisDecodeOperandImplicitMemory()
1709 ZydisCalcRegisterId(context, instruction, ZYDIS_REG_ENCODING_RM, in ZydisDecodeOperandImplicitMemory()
1759 ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) in ZydisDecodeOperands() argument
1762 ZYAN_ASSERT(instruction); in ZydisDecodeOperands()
1767 instruction->operand_count = ZydisGetOperandDefinitions(definition, &operand); in ZydisDecodeOperands()
1769 ZYAN_ASSERT(instruction->operand_count <= ZYAN_ARRAY_LENGTH(instruction->operands)); in ZydisDecodeOperands()
1771 for (ZyanU8 i = 0; i < instruction->operand_count; ++i) in ZydisDecodeOperands()
1775 instruction->operands[i].id = i; in ZydisDecodeOperands()
1776 instruction->operands[i].visibility = operand->visibility; in ZydisDecodeOperands()
1777 instruction->operands[i].actions = operand->actions; in ZydisDecodeOperands()
1791 ZydisDecodeOperandImplicitRegister(context, instruction, &instruction->operands[i], in ZydisDecodeOperands()
1795 ZydisDecodeOperandImplicitMemory(context, instruction, &instruction->operands[i], in ZydisDecodeOperands()
1799 instruction->operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; in ZydisDecodeOperands()
1800 instruction->operands[i].size = 8; in ZydisDecodeOperands()
1801 instruction->operands[i].imm.value.u = 1; in ZydisDecodeOperands()
1802 instruction->operands[i].imm.is_signed = ZYAN_FALSE; in ZydisDecodeOperands()
1803 instruction->operands[i].imm.is_relative = ZYAN_FALSE; in ZydisDecodeOperands()
1808 if (instruction->operands[i].type) in ZydisDecodeOperands()
1813 instruction->operands[i].encoding = operand->op.encoding; in ZydisDecodeOperands()
1831 ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || in ZydisDecodeOperands()
1832 (instruction->operand_width == 64)); in ZydisDecodeOperands()
1834 (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR16 : ( in ZydisDecodeOperands()
1835 (instruction->operand_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); in ZydisDecodeOperands()
1838 ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || in ZydisDecodeOperands()
1839 (instruction->operand_width == 64)); in ZydisDecodeOperands()
1841 (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR32 : ( in ZydisDecodeOperands()
1842 (instruction->operand_width == 32) ? ZYDIS_REGCLASS_GPR32: ZYDIS_REGCLASS_GPR64); in ZydisDecodeOperands()
1845 ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || in ZydisDecodeOperands()
1846 (instruction->operand_width == 64)); in ZydisDecodeOperands()
1848 (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR16 : ZYDIS_REGCLASS_GPR32; in ZydisDecodeOperands()
1851 ZYAN_ASSERT((instruction->address_width == 16) || (instruction->address_width == 32) || in ZydisDecodeOperands()
1852 (instruction->address_width == 64)); in ZydisDecodeOperands()
1854 (instruction->address_width == 16) ? ZYDIS_REGCLASS_GPR16 : ( in ZydisDecodeOperands()
1855 (instruction->address_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); in ZydisDecodeOperands()
1897 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1899 context, instruction, ZYDIS_REG_ENCODING_REG, register_class))); in ZydisDecodeOperands()
1904 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1906 context, instruction, ZYDIS_REG_ENCODING_RM, register_class))); in ZydisDecodeOperands()
1911 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1913 context, instruction, ZYDIS_REG_ENCODING_OPCODE, register_class))); in ZydisDecodeOperands()
1918 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1920 context, instruction, ZYDIS_REG_ENCODING_NDSNDD, register_class))); in ZydisDecodeOperands()
1925 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1927 context, instruction, ZYDIS_REG_ENCODING_MASK, register_class))); in ZydisDecodeOperands()
1932 instruction, &instruction->operands[i], register_class, in ZydisDecodeOperands()
1934 context, instruction, ZYDIS_REG_ENCODING_IS4, register_class))); in ZydisDecodeOperands()
1949 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); in ZydisDecodeOperands()
1954 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_XMM)); in ZydisDecodeOperands()
1959 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_YMM)); in ZydisDecodeOperands()
1964 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_ZMM)); in ZydisDecodeOperands()
1967 ZYAN_ASSERT((instruction->raw.imm[0].size == 16) || in ZydisDecodeOperands()
1968 (instruction->raw.imm[0].size == 32)); in ZydisDecodeOperands()
1969 ZYAN_ASSERT( instruction->raw.imm[1].size == 16); in ZydisDecodeOperands()
1970 instruction->operands[i].type = ZYDIS_OPERAND_TYPE_POINTER; in ZydisDecodeOperands()
1971 instruction->operands[i].ptr.offset = (ZyanU32)instruction->raw.imm[0].value.u; in ZydisDecodeOperands()
1972 instruction->operands[i].ptr.segment = (ZyanU16)instruction->raw.imm[1].value.u; in ZydisDecodeOperands()
1975 instruction->operands[i].actions = 0; // TODO: Remove after generator update in ZydisDecodeOperands()
1978 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); in ZydisDecodeOperands()
1979 instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_AGEN; in ZydisDecodeOperands()
1982 ZYAN_ASSERT(instruction->raw.disp.size); in ZydisDecodeOperands()
1983 instruction->operands[i].type = ZYDIS_OPERAND_TYPE_MEMORY; in ZydisDecodeOperands()
1984 instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_MEM; in ZydisDecodeOperands()
1985 instruction->operands[i].mem.disp.has_displacement = ZYAN_TRUE; in ZydisDecodeOperands()
1986 instruction->operands[i].mem.disp.value = instruction->raw.disp.value; in ZydisDecodeOperands()
1989 instruction->operands[i].actions = 0; // TODO: Remove after generator update in ZydisDecodeOperands()
1992 context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); in ZydisDecodeOperands()
1993 instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_MIB; in ZydisDecodeOperands()
1995 if ((instruction->operands[i].mem.base == ZYDIS_REGISTER_EIP) || in ZydisDecodeOperands()
1996 (instruction->operands[i].mem.base == ZYDIS_REGISTER_RIP)) in ZydisDecodeOperands()
2004 if (instruction->operands[i].type) in ZydisDecodeOperands()
2008 if (((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || in ZydisDecodeOperands()
2009 (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) && in ZydisDecodeOperands()
2010 (instruction->raw.disp.size == 8)) in ZydisDecodeOperands()
2012 instruction->operands[i].mem.disp.value *= context->cd8_scale; in ZydisDecodeOperands()
2023 ZYAN_ASSERT(instruction->raw.imm[imm_id].is_relative); in ZydisDecodeOperands()
2026 instruction->operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; in ZydisDecodeOperands()
2027 instruction->operands[i].size = operand->size[context->eosz_index] * 8; in ZydisDecodeOperands()
2031 ZYAN_ASSERT(instruction->raw.imm[imm_id].size == 8); in ZydisDecodeOperands()
2032 instruction->operands[i].imm.value.u = in ZydisDecodeOperands()
2033 (ZyanU8)instruction->raw.imm[imm_id].value.u & 0x0F; in ZydisDecodeOperands()
2036 instruction->operands[i].imm.value.u = instruction->raw.imm[imm_id].value.u; in ZydisDecodeOperands()
2038 instruction->operands[i].imm.is_signed = instruction->raw.imm[imm_id].is_signed; in ZydisDecodeOperands()
2039 instruction->operands[i].imm.is_relative = instruction->raw.imm[imm_id].is_relative; in ZydisDecodeOperands()
2045 ZYAN_ASSERT(instruction->operands[i].type == ZYDIS_OPERAND_TYPE_IMMEDIATE); in ZydisDecodeOperands()
2049 if (instruction->operands[i].type == ZYDIS_OPERAND_TYPE_MEMORY) in ZydisDecodeOperands()
2051 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_CS) in ZydisDecodeOperands()
2053 instruction->operands[i].mem.segment = ZYDIS_REGISTER_CS; in ZydisDecodeOperands()
2055 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS) in ZydisDecodeOperands()
2057 instruction->operands[i].mem.segment = ZYDIS_REGISTER_SS; in ZydisDecodeOperands()
2059 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_DS) in ZydisDecodeOperands()
2061 instruction->operands[i].mem.segment = ZYDIS_REGISTER_DS; in ZydisDecodeOperands()
2063 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_ES) in ZydisDecodeOperands()
2065 instruction->operands[i].mem.segment = ZYDIS_REGISTER_ES; in ZydisDecodeOperands()
2067 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_FS) in ZydisDecodeOperands()
2069 instruction->operands[i].mem.segment = ZYDIS_REGISTER_FS; in ZydisDecodeOperands()
2071 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_GS) in ZydisDecodeOperands()
2073 instruction->operands[i].mem.segment = ZYDIS_REGISTER_GS; in ZydisDecodeOperands()
2076 if (instruction->operands[i].mem.segment == ZYDIS_REGISTER_NONE) in ZydisDecodeOperands()
2078 if ((instruction->operands[i].mem.base == ZYDIS_REGISTER_RSP) || in ZydisDecodeOperands()
2079 (instruction->operands[i].mem.base == ZYDIS_REGISTER_RBP) || in ZydisDecodeOperands()
2080 (instruction->operands[i].mem.base == ZYDIS_REGISTER_ESP) || in ZydisDecodeOperands()
2081 (instruction->operands[i].mem.base == ZYDIS_REGISTER_EBP) || in ZydisDecodeOperands()
2082 (instruction->operands[i].mem.base == ZYDIS_REGISTER_SP) || in ZydisDecodeOperands()
2083 (instruction->operands[i].mem.base == ZYDIS_REGISTER_BP)) in ZydisDecodeOperands()
2085 instruction->operands[i].mem.segment = ZYDIS_REGISTER_SS; in ZydisDecodeOperands()
2088 instruction->operands[i].mem.segment = ZYDIS_REGISTER_DS; in ZydisDecodeOperands()
2094 ZydisSetOperandSizeAndElementInfo(context, instruction, &instruction->operands[i], operand); in ZydisDecodeOperands()
2100 if (instruction->avx.mask.mode == ZYDIS_MASK_MODE_MERGING) in ZydisDecodeOperands()
2102 ZYAN_ASSERT(instruction->operand_count >= 1); in ZydisDecodeOperands()
2103 switch (instruction->operands[0].actions) in ZydisDecodeOperands()
2106 if (instruction->operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY) in ZydisDecodeOperands()
2108 instruction->operands[0].actions = ZYDIS_OPERAND_ACTION_CONDWRITE; in ZydisDecodeOperands()
2111 instruction->operands[0].actions = ZYDIS_OPERAND_ACTION_READ_CONDWRITE; in ZydisDecodeOperands()
2115 instruction->operands[0].actions = ZYDIS_OPERAND_ACTION_READ_CONDWRITE; in ZydisDecodeOperands()
2135 static void ZydisSetAttributes(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction, in ZydisSetAttributes() argument
2139 ZYAN_ASSERT(instruction); in ZydisSetAttributes()
2152 instruction->attributes |= mapping[definition->cpu_state]; in ZydisSetAttributes()
2165 instruction->attributes |= mapping[definition->fpu_state]; in ZydisSetAttributes()
2178 instruction->attributes |= mapping[definition->xmm_state]; in ZydisSetAttributes()
2181 switch (instruction->encoding) in ZydisSetAttributes()
2190 instruction->attributes |= ZYDIS_ATTRIB_IS_PRIVILEGED; in ZydisSetAttributes()
2194 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_LOCK; in ZydisSetAttributes()
2197 instruction->attributes |= ZYDIS_ATTRIB_HAS_LOCK; in ZydisSetAttributes()
2198 instruction->raw.prefixes[context->prefixes.offset_lock].type = in ZydisSetAttributes()
2204 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REP; in ZydisSetAttributes()
2208 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REPE; in ZydisSetAttributes()
2212 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REPNE; in ZydisSetAttributes()
2216 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_BND; in ZydisSetAttributes()
2220 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XACQUIRE; in ZydisSetAttributes()
2224 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XRELEASE; in ZydisSetAttributes()
2228 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK; in ZydisSetAttributes()
2234 if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REPNE) in ZydisSetAttributes()
2236 instruction->attributes |= ZYDIS_ATTRIB_HAS_REPNE; in ZydisSetAttributes()
2239 if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XACQUIRE) in ZydisSetAttributes()
2241 if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) || in ZydisSetAttributes()
2244 instruction->attributes |= ZYDIS_ATTRIB_HAS_XACQUIRE; in ZydisSetAttributes()
2249 instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_BND) in ZydisSetAttributes()
2251 instruction->attributes |= ZYDIS_ATTRIB_HAS_BND; in ZydisSetAttributes()
2256 if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REP) in ZydisSetAttributes()
2258 instruction->attributes |= ZYDIS_ATTRIB_HAS_REP; in ZydisSetAttributes()
2261 if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REPE) in ZydisSetAttributes()
2263 instruction->attributes |= ZYDIS_ATTRIB_HAS_REPE; in ZydisSetAttributes()
2266 if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XRELEASE) in ZydisSetAttributes()
2268 if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) || in ZydisSetAttributes()
2271 instruction->attributes |= ZYDIS_ATTRIB_HAS_XRELEASE; in ZydisSetAttributes()
2279 if ((instruction->raw.prefixes[context->prefixes.offset_group1].type == in ZydisSetAttributes()
2281 (instruction->attributes & ( in ZydisSetAttributes()
2285 instruction->raw.prefixes[context->prefixes.offset_group1].type = in ZydisSetAttributes()
2291 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS; in ZydisSetAttributes()
2295 instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN; in ZydisSetAttributes()
2296 instruction->raw.prefixes[context->prefixes.offset_group2].type = in ZydisSetAttributes()
2300 instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_TAKEN; in ZydisSetAttributes()
2301 instruction->raw.prefixes[context->prefixes.offset_group2].type = in ZydisSetAttributes()
2311 instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_SEGMENT; in ZydisSetAttributes()
2318 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_CS; in ZydisSetAttributes()
2321 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_SS; in ZydisSetAttributes()
2324 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_DS; in ZydisSetAttributes()
2327 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_ES; in ZydisSetAttributes()
2330 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_FS; in ZydisSetAttributes()
2333 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_GS; in ZydisSetAttributes()
2339 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT) in ZydisSetAttributes()
2341 instruction->raw.prefixes[context->prefixes.offset_segment].type = in ZydisSetAttributes()
2358 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_CS; in ZydisSetAttributes()
2361 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_SS; in ZydisSetAttributes()
2364 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_DS; in ZydisSetAttributes()
2367 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_ES; in ZydisSetAttributes()
2370 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_FS; in ZydisSetAttributes()
2373 instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_GS; in ZydisSetAttributes()
2378 if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT) in ZydisSetAttributes()
2380 instruction->raw.prefixes[context->prefixes.offset_segment].type = in ZydisSetAttributes()
2423 ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) in ZydisSetAVXInformation() argument
2426 ZYAN_ASSERT(instruction); in ZydisSetAVXInformation()
2429 switch (instruction->encoding) in ZydisSetAVXInformation()
2440 instruction->avx.vector_length = lookup[context->cache.LL]; in ZydisSetAVXInformation()
2452 instruction->avx.vector_length = lookup[context->cache.LL]; in ZydisSetAVXInformation()
2459 instruction->avx.broadcast.is_static = ZYAN_TRUE; in ZydisSetAVXInformation()
2470 instruction->avx.broadcast.mode = broadcasts[def->broadcast]; in ZydisSetAVXInformation()
2493 instruction->avx.vector_length = lookup[vector_length]; in ZydisSetAVXInformation()
2498 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisSetAVXInformation()
2514 const ZyanU8 evex_b = instruction->raw.evex.b; in ZydisSetAVXInformation()
2561 instruction->avx.broadcast.mode = broadcasts[evex_b][evex_w][vector_length]; in ZydisSetAVXInformation()
2566 const ZyanU8 evex_b = instruction->raw.evex.b; in ZydisSetAVXInformation()
2593 instruction->avx.broadcast.mode = broadcasts[evex_b][vector_length]; in ZydisSetAVXInformation()
2660 ZYAN_ASSERT((instruction->avx.vector_length == 256) || in ZydisSetAVXInformation()
2661 (instruction->avx.vector_length == 512)); in ZydisSetAVXInformation()
2673 ZYAN_ASSERT((instruction->avx.vector_length == 256) || in ZydisSetAVXInformation()
2674 (instruction->avx.vector_length == 512)); in ZydisSetAVXInformation()
2679 ZYAN_ASSERT(instruction->avx.vector_length == 512); in ZydisSetAVXInformation()
2688 ZYAN_ASSERT(instruction->avx.vector_length == 512); in ZydisSetAVXInformation()
2736 ZYAN_ASSERT(instruction->raw.modrm.mod == 3); in ZydisSetAVXInformation()
2742 ZYAN_ASSERT(!instruction->avx.broadcast.mode); in ZydisSetAVXInformation()
2743 instruction->avx.broadcast.is_static = ZYAN_TRUE; in ZydisSetAVXInformation()
2761 instruction->avx.broadcast.mode = broadcasts[def->broadcast]; in ZydisSetAVXInformation()
2765 if (instruction->raw.evex.b) in ZydisSetAVXInformation()
2774 instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + context->cache.LL; in ZydisSetAVXInformation()
2777 instruction->avx.has_sae = ZYAN_TRUE; in ZydisSetAVXInformation()
2785 instruction->avx.mask.reg = ZYDIS_REGISTER_K0 + instruction->raw.evex.aaa; in ZydisSetAVXInformation()
2789 instruction->avx.mask.mode = ZYDIS_MASK_MODE_MERGING + instruction->raw.evex.z; in ZydisSetAVXInformation()
2792 instruction->avx.mask.mode = ZYDIS_MASK_MODE_ZEROING; in ZydisSetAVXInformation()
2795 instruction->avx.mask.mode = ZYDIS_MASK_MODE_CONTROL + instruction->raw.evex.z; in ZydisSetAVXInformation()
2800 if (!instruction->raw.evex.aaa) in ZydisSetAVXInformation()
2802 instruction->avx.mask.mode = ZYDIS_MASK_MODE_DISABLED; in ZydisSetAVXInformation()
2813 instruction->avx.vector_length = 512; in ZydisSetAVXInformation()
2823 instruction->avx.broadcast.is_static = ZYAN_TRUE; in ZydisSetAVXInformation()
2827 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_8; in ZydisSetAVXInformation()
2831 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; in ZydisSetAVXInformation()
2835 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_8; in ZydisSetAVXInformation()
2839 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; in ZydisSetAVXInformation()
2875 ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); in ZydisSetAVXInformation()
2876 context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; in ZydisSetAVXInformation()
2890 ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); in ZydisSetAVXInformation()
2891 context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; in ZydisSetAVXInformation()
2905 ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); in ZydisSetAVXInformation()
2906 context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; in ZydisSetAVXInformation()
2918 ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); in ZydisSetAVXInformation()
2919 context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; in ZydisSetAVXInformation()
2931 ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); in ZydisSetAVXInformation()
2932 context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; in ZydisSetAVXInformation()
2952 instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + instruction->raw.mvex.SSS; in ZydisSetAVXInformation()
2955 if (instruction->raw.mvex.SSS >= 4) in ZydisSetAVXInformation()
2957 instruction->avx.has_sae = ZYAN_TRUE; in ZydisSetAVXInformation()
2962 instruction->avx.swizzle.mode = ZYDIS_SWIZZLE_MODE_DCBA + instruction->raw.mvex.SSS; in ZydisSetAVXInformation()
2967 switch (instruction->raw.mvex.SSS) in ZydisSetAVXInformation()
2972 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; in ZydisSetAVXInformation()
2975 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; in ZydisSetAVXInformation()
2978 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16; in ZydisSetAVXInformation()
2981 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; in ZydisSetAVXInformation()
2984 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; in ZydisSetAVXInformation()
2987 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; in ZydisSetAVXInformation()
2990 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; in ZydisSetAVXInformation()
2999 switch (instruction->raw.mvex.SSS) in ZydisSetAVXInformation()
3004 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; in ZydisSetAVXInformation()
3007 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; in ZydisSetAVXInformation()
3010 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; in ZydisSetAVXInformation()
3013 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; in ZydisSetAVXInformation()
3016 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; in ZydisSetAVXInformation()
3019 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; in ZydisSetAVXInformation()
3027 switch (instruction->raw.mvex.SSS) in ZydisSetAVXInformation()
3032 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_8; in ZydisSetAVXInformation()
3035 instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_8; in ZydisSetAVXInformation()
3043 switch (instruction->raw.mvex.SSS) in ZydisSetAVXInformation()
3048 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16; in ZydisSetAVXInformation()
3051 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; in ZydisSetAVXInformation()
3054 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; in ZydisSetAVXInformation()
3057 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; in ZydisSetAVXInformation()
3060 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; in ZydisSetAVXInformation()
3071 switch (instruction->raw.mvex.SSS) in ZydisSetAVXInformation()
3076 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; in ZydisSetAVXInformation()
3079 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; in ZydisSetAVXInformation()
3082 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; in ZydisSetAVXInformation()
3085 instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; in ZydisSetAVXInformation()
3099 if ((instruction->raw.modrm.mod != 3) && instruction->raw.mvex.E) in ZydisSetAVXInformation()
3101 instruction->avx.has_eviction_hint = ZYAN_TRUE; in ZydisSetAVXInformation()
3105 instruction->avx.mask.mode = ZYDIS_MASK_MODE_MERGING; in ZydisSetAVXInformation()
3106 instruction->avx.mask.reg = ZYDIS_REGISTER_K0 + instruction->raw.mvex.kkk; in ZydisSetAVXInformation()
3135 ZydisDecodedInstruction* instruction) in ZydisCollectOptionalPrefixes() argument
3138 ZYAN_ASSERT(instruction); in ZydisCollectOptionalPrefixes()
3139 ZYAN_ASSERT(instruction->raw.prefix_count == 0); in ZydisCollectOptionalPrefixes()
3147 ZYAN_CHECK(ZydisInputPeek(context, instruction, &prefix_byte)); in ZydisCollectOptionalPrefixes()
3195 instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; in ZydisCollectOptionalPrefixes()
3200 instruction->attributes |= ZYDIS_ATTRIB_HAS_ADDRESSSIZE; in ZydisCollectOptionalPrefixes()
3207 instruction->raw.rex.offset = offset; in ZydisCollectOptionalPrefixes()
3220 instruction->raw.rex.offset = 0; in ZydisCollectOptionalPrefixes()
3222 instruction->raw.prefixes[instruction->raw.prefix_count++].value = prefix_byte; in ZydisCollectOptionalPrefixes()
3223 ZydisInputSkip(context, instruction); in ZydisCollectOptionalPrefixes()
3228 if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) in ZydisCollectOptionalPrefixes()
3230 instruction->raw.prefixes[context->prefixes.offset_osz_override].type = in ZydisCollectOptionalPrefixes()
3233 if (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) in ZydisCollectOptionalPrefixes()
3235 instruction->raw.prefixes[context->prefixes.offset_asz_override].type = in ZydisCollectOptionalPrefixes()
3240 instruction->raw.prefixes[instruction->raw.rex.offset].type = ZYDIS_PREFIX_TYPE_EFFECTIVE; in ZydisCollectOptionalPrefixes()
3241 ZydisDecodeREX(context, instruction, rex); in ZydisCollectOptionalPrefixes()
3258 ZydisDecodedInstruction* instruction, const ZydisInstructionEncodingInfo* info) in ZydisDecodeOptionalInstructionParts() argument
3261 ZYAN_ASSERT(instruction); in ZydisDecodeOptionalInstructionParts()
3266 if (!instruction->raw.modrm.offset) in ZydisDecodeOptionalInstructionParts()
3268 instruction->raw.modrm.offset = instruction->length; in ZydisDecodeOptionalInstructionParts()
3270 ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); in ZydisDecodeOptionalInstructionParts()
3271 ZydisDecodeModRM(instruction, modrm_byte); in ZydisDecodeOptionalInstructionParts()
3277 switch (instruction->address_width) in ZydisDecodeOptionalInstructionParts()
3280 switch (instruction->raw.modrm.mod) in ZydisDecodeOptionalInstructionParts()
3283 if (instruction->raw.modrm.rm == 6) in ZydisDecodeOptionalInstructionParts()
3303 (instruction->raw.modrm.mod != 3) && (instruction->raw.modrm.rm == 4); in ZydisDecodeOptionalInstructionParts()
3304 switch (instruction->raw.modrm.mod) in ZydisDecodeOptionalInstructionParts()
3307 if (instruction->raw.modrm.rm == 5) in ZydisDecodeOptionalInstructionParts()
3311 instruction->attributes |= ZYDIS_ATTRIB_IS_RELATIVE; in ZydisDecodeOptionalInstructionParts()
3333 instruction->raw.sib.offset = instruction->length; in ZydisDecodeOptionalInstructionParts()
3335 ZYAN_CHECK(ZydisInputNext(context, instruction, &sib_byte)); in ZydisDecodeOptionalInstructionParts()
3336 ZydisDecodeSIB(instruction, sib_byte); in ZydisDecodeOptionalInstructionParts()
3337 if (instruction->raw.sib.base == 5) in ZydisDecodeOptionalInstructionParts()
3339 displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; in ZydisDecodeOptionalInstructionParts()
3344 ZYAN_CHECK(ZydisReadDisplacement(context, instruction, displacement_size)); in ZydisDecodeOptionalInstructionParts()
3352 context, instruction, info->disp.size[context->easz_index])); in ZydisDecodeOptionalInstructionParts()
3359 instruction->attributes |= ZYDIS_ATTRIB_IS_RELATIVE; in ZydisDecodeOptionalInstructionParts()
3361 ZYAN_CHECK(ZydisReadImmediate(context, instruction, 0, in ZydisDecodeOptionalInstructionParts()
3369 ZYAN_CHECK(ZydisReadImmediate(context, instruction, 1, in ZydisDecodeOptionalInstructionParts()
3387 ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) in ZydisSetEffectiveOperandWidth() argument
3390 ZYAN_ASSERT(instruction); in ZydisSetEffectiveOperandWidth()
3486 ZyanU8 index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 1 : 0; in ZydisSetEffectiveOperandWidth()
3509 instruction->operand_width = operand_size_map[definition->operand_size_map][index]; in ZydisSetEffectiveOperandWidth()
3511 switch (instruction->operand_width) in ZydisSetEffectiveOperandWidth()
3529 instruction->operand_width = 8; in ZydisSetEffectiveOperandWidth()
3541 ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) in ZydisSetEffectiveAddressWidth() argument
3544 ZYAN_ASSERT(instruction); in ZydisSetEffectiveAddressWidth()
3578 ZyanU8 index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 0; in ZydisSetEffectiveAddressWidth()
3596 instruction->address_width = address_size_map[definition->address_size_map][index]; in ZydisSetEffectiveAddressWidth()
3598 switch (instruction->address_width) in ZydisSetEffectiveAddressWidth()
3616 static ZyanStatus ZydisNodeHandlerXOP(ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerXOP() argument
3618 ZYAN_ASSERT(instruction); in ZydisNodeHandlerXOP()
3621 switch (instruction->encoding) in ZydisNodeHandlerXOP()
3627 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); in ZydisNodeHandlerXOP()
3628 *index = (instruction->raw.xop.m_mmmm - 0x08) + (instruction->raw.xop.pp * 3) + 1; in ZydisNodeHandlerXOP()
3636 static ZyanStatus ZydisNodeHandlerVEX(ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerVEX() argument
3638 ZYAN_ASSERT(instruction); in ZydisNodeHandlerVEX()
3641 switch (instruction->encoding) in ZydisNodeHandlerVEX()
3647 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); in ZydisNodeHandlerVEX()
3648 *index = instruction->raw.vex.m_mmmm + (instruction->raw.vex.pp << 2) + 1; in ZydisNodeHandlerVEX()
3656 static ZyanStatus ZydisNodeHandlerEMVEX(ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerEMVEX() argument
3658 ZYAN_ASSERT(instruction); in ZydisNodeHandlerEMVEX()
3661 switch (instruction->encoding) in ZydisNodeHandlerEMVEX()
3667 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); in ZydisNodeHandlerEMVEX()
3668 *index = instruction->raw.evex.mm + (instruction->raw.evex.pp << 2) + 1; in ZydisNodeHandlerEMVEX()
3671 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); in ZydisNodeHandlerEMVEX()
3672 *index = instruction->raw.mvex.mmmm + (instruction->raw.mvex.pp << 2) + 17; in ZydisNodeHandlerEMVEX()
3681 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerOpcode() argument
3684 ZYAN_ASSERT(instruction); in ZydisNodeHandlerOpcode()
3688 switch (instruction->encoding) in ZydisNodeHandlerOpcode()
3691 ZYAN_CHECK(ZydisInputNext(context, instruction, &instruction->opcode)); in ZydisNodeHandlerOpcode()
3692 switch (instruction->opcode_map) in ZydisNodeHandlerOpcode()
3695 switch (instruction->opcode) in ZydisNodeHandlerOpcode()
3698 instruction->opcode_map = ZYDIS_OPCODE_MAP_0F; in ZydisNodeHandlerOpcode()
3705 ZYAN_CHECK(ZydisInputPeek(context, instruction, &next_input)); in ZydisNodeHandlerOpcode()
3709 if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) in ZydisNodeHandlerOpcode()
3722 prefix_bytes[0] = instruction->opcode; in ZydisNodeHandlerOpcode()
3723 switch (instruction->opcode) in ZydisNodeHandlerOpcode()
3726 instruction->raw.vex.offset = instruction->length - 1; in ZydisNodeHandlerOpcode()
3728 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX)); in ZydisNodeHandlerOpcode()
3729 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, &prefix_bytes[1], 2)); in ZydisNodeHandlerOpcode()
3732 instruction->raw.vex.offset = instruction->length - 1; in ZydisNodeHandlerOpcode()
3734 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX)); in ZydisNodeHandlerOpcode()
3735 ZYAN_CHECK(ZydisInputNext(context, instruction, &prefix_bytes[1])); in ZydisNodeHandlerOpcode()
3740 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX)); in ZydisNodeHandlerOpcode()
3741 ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX)); in ZydisNodeHandlerOpcode()
3742 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, &prefix_bytes[1], 3)); in ZydisNodeHandlerOpcode()
3750 switch (instruction->opcode) in ZydisNodeHandlerOpcode()
3755 instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_VEX; in ZydisNodeHandlerOpcode()
3756 ZYAN_CHECK(ZydisDecodeVEX(context, instruction, prefix_bytes)); in ZydisNodeHandlerOpcode()
3757 instruction->opcode_map = in ZydisNodeHandlerOpcode()
3758 ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.vex.m_mmmm; in ZydisNodeHandlerOpcode()
3768 instruction->raw.mvex.offset = instruction->length - 4; in ZydisNodeHandlerOpcode()
3778 instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_MVEX; in ZydisNodeHandlerOpcode()
3779 ZYAN_CHECK(ZydisDecodeMVEX(context, instruction, prefix_bytes)); in ZydisNodeHandlerOpcode()
3780 instruction->opcode_map = in ZydisNodeHandlerOpcode()
3781 ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.mvex.mmmm; in ZydisNodeHandlerOpcode()
3788 instruction->raw.evex.offset = instruction->length - 4; in ZydisNodeHandlerOpcode()
3790 instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_EVEX; in ZydisNodeHandlerOpcode()
3791 ZYAN_CHECK(ZydisDecodeEVEX(context, instruction, prefix_bytes)); in ZydisNodeHandlerOpcode()
3792 instruction->opcode_map = in ZydisNodeHandlerOpcode()
3793 ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.evex.mm; in ZydisNodeHandlerOpcode()
3812 ZYAN_CHECK(ZydisInputPeek(context, instruction, &next_input)); in ZydisNodeHandlerOpcode()
3815 if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) in ZydisNodeHandlerOpcode()
3827 instruction->raw.xop.offset = instruction->length - 1; in ZydisNodeHandlerOpcode()
3830 ZYAN_CHECK(ZydisInputNextBytes(context, instruction, &prefixBytes[1], 2)); in ZydisNodeHandlerOpcode()
3832 instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_XOP; in ZydisNodeHandlerOpcode()
3833 ZYAN_CHECK(ZydisDecodeXOP(context, instruction, prefixBytes)); in ZydisNodeHandlerOpcode()
3834 instruction->opcode_map = in ZydisNodeHandlerOpcode()
3835 ZYDIS_OPCODE_MAP_XOP8 + instruction->raw.xop.m_mmmm - 0x08; in ZydisNodeHandlerOpcode()
3844 switch (instruction->opcode) in ZydisNodeHandlerOpcode()
3851 instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_3DNOW; in ZydisNodeHandlerOpcode()
3852 instruction->opcode_map = ZYDIS_OPCODE_MAP_0F0F; in ZydisNodeHandlerOpcode()
3855 instruction->opcode_map = ZYDIS_OPCODE_MAP_0F38; in ZydisNodeHandlerOpcode()
3858 instruction->opcode_map = ZYDIS_OPCODE_MAP_0F3A; in ZydisNodeHandlerOpcode()
3881 ZYAN_CHECK(ZydisInputNext(context, instruction, &instruction->opcode)); in ZydisNodeHandlerOpcode()
3885 *index = instruction->opcode; in ZydisNodeHandlerOpcode()
3924 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerModrmMod() argument
3927 ZYAN_ASSERT(instruction); in ZydisNodeHandlerModrmMod()
3930 if (!instruction->raw.modrm.offset) in ZydisNodeHandlerModrmMod()
3932 instruction->raw.modrm.offset = instruction->length; in ZydisNodeHandlerModrmMod()
3934 ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); in ZydisNodeHandlerModrmMod()
3935 ZydisDecodeModRM(instruction, modrm_byte); in ZydisNodeHandlerModrmMod()
3937 *index = instruction->raw.modrm.mod; in ZydisNodeHandlerModrmMod()
3942 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerModrmModCompact() argument
3944 ZYAN_CHECK(ZydisNodeHandlerModrmMod(context, instruction, index)); in ZydisNodeHandlerModrmModCompact()
3950 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerModrmReg() argument
3953 ZYAN_ASSERT(instruction); in ZydisNodeHandlerModrmReg()
3956 if (!instruction->raw.modrm.offset) in ZydisNodeHandlerModrmReg()
3958 instruction->raw.modrm.offset = instruction->length; in ZydisNodeHandlerModrmReg()
3960 ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); in ZydisNodeHandlerModrmReg()
3961 ZydisDecodeModRM(instruction, modrm_byte); in ZydisNodeHandlerModrmReg()
3963 *index = instruction->raw.modrm.reg; in ZydisNodeHandlerModrmReg()
3968 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerModrmRm() argument
3971 ZYAN_ASSERT(instruction); in ZydisNodeHandlerModrmRm()
3974 if (!instruction->raw.modrm.offset) in ZydisNodeHandlerModrmRm()
3976 instruction->raw.modrm.offset = instruction->length; in ZydisNodeHandlerModrmRm()
3978 ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); in ZydisNodeHandlerModrmRm()
3979 ZydisDecodeModRM(instruction, modrm_byte); in ZydisNodeHandlerModrmRm()
3981 *index = instruction->raw.modrm.rm; in ZydisNodeHandlerModrmRm()
3986 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerMandatoryPrefix() argument
3989 ZYAN_ASSERT(instruction); in ZydisNodeHandlerMandatoryPrefix()
3995 instruction->raw.prefixes[context->prefixes.offset_mandatory].type = in ZydisNodeHandlerMandatoryPrefix()
3997 instruction->attributes &= ~ZYDIS_ATTRIB_HAS_OPERANDSIZE; in ZydisNodeHandlerMandatoryPrefix()
4001 instruction->raw.prefixes[context->prefixes.offset_mandatory].type = in ZydisNodeHandlerMandatoryPrefix()
4006 instruction->raw.prefixes[context->prefixes.offset_mandatory].type = in ZydisNodeHandlerMandatoryPrefix()
4020 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerOperandSize() argument
4023 ZYAN_ASSERT(instruction); in ZydisNodeHandlerOperandSize()
4031 if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) in ZydisNodeHandlerOperandSize()
4033 instruction->raw.prefixes[context->prefixes.offset_osz_override].type = in ZydisNodeHandlerOperandSize()
4041 *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 1 : 0; in ZydisNodeHandlerOperandSize()
4046 *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 0 : 1; in ZydisNodeHandlerOperandSize()
4057 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerAddressSize() argument
4060 ZYAN_ASSERT(instruction); in ZydisNodeHandlerAddressSize()
4071 *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 0; in ZydisNodeHandlerAddressSize()
4074 *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 0 : 1; in ZydisNodeHandlerAddressSize()
4077 *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 2; in ZydisNodeHandlerAddressSize()
4086 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerVectorLength() argument
4089 ZYAN_ASSERT(instruction); in ZydisNodeHandlerVectorLength()
4092 switch (instruction->encoding) in ZydisNodeHandlerVectorLength()
4095 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); in ZydisNodeHandlerVectorLength()
4098 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); in ZydisNodeHandlerVectorLength()
4101 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); in ZydisNodeHandlerVectorLength()
4104 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); in ZydisNodeHandlerVectorLength()
4118 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerRexW() argument
4121 ZYAN_ASSERT(instruction); in ZydisNodeHandlerRexW()
4124 switch (instruction->encoding) in ZydisNodeHandlerRexW()
4130 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); in ZydisNodeHandlerRexW()
4133 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); in ZydisNodeHandlerRexW()
4136 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); in ZydisNodeHandlerRexW()
4139 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); in ZydisNodeHandlerRexW()
4149 ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerRexB() argument
4152 ZYAN_ASSERT(instruction); in ZydisNodeHandlerRexB()
4155 switch (instruction->encoding) in ZydisNodeHandlerRexB()
4161 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); in ZydisNodeHandlerRexB()
4164 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); in ZydisNodeHandlerRexB()
4167 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); in ZydisNodeHandlerRexB()
4170 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); in ZydisNodeHandlerRexB()
4180 static ZyanStatus ZydisNodeHandlerEvexB(ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerEvexB() argument
4182 ZYAN_ASSERT(instruction); in ZydisNodeHandlerEvexB()
4185 ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX); in ZydisNodeHandlerEvexB()
4186 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); in ZydisNodeHandlerEvexB()
4187 *index = instruction->raw.evex.b; in ZydisNodeHandlerEvexB()
4193 static ZyanStatus ZydisNodeHandlerMvexE(ZydisDecodedInstruction* instruction, ZyanU16* index) in ZydisNodeHandlerMvexE() argument
4195 ZYAN_ASSERT(instruction); in ZydisNodeHandlerMvexE()
4198 ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX); in ZydisNodeHandlerMvexE()
4199 ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); in ZydisNodeHandlerMvexE()
4200 *index = instruction->raw.mvex.E; in ZydisNodeHandlerMvexE()
4219 ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) in ZydisCheckErrorConditions() argument
4231 switch (instruction->encoding) in ZydisCheckErrorConditions()
4279 if ((instruction->raw.evex.z) && (!def->accepts_zero_mask)) in ZydisCheckErrorConditions()
4354 ZYAN_ASSERT(instruction->raw.mvex.SSS < 8); in ZydisCheckErrorConditions()
4355 if (!lookup[def->functionality][instruction->raw.mvex.SSS]) in ZydisCheckErrorConditions()
4382 if (instruction->raw.modrm.reg == 1) in ZydisCheckErrorConditions()
4389 if (instruction->raw.modrm.reg > 5) in ZydisCheckErrorConditions()
4399 const ZyanU8 value = instruction->raw.modrm.reg | (context->cache.R << 3); in ZydisCheckErrorConditions()
4429 if (context->cache.R || instruction->raw.modrm.reg > 3) in ZydisCheckErrorConditions()
4444 if (instruction->raw.modrm.rm == 1) in ZydisCheckErrorConditions()
4451 if (instruction->raw.modrm.rm > 6) in ZydisCheckErrorConditions()
4460 if (context->cache.B || context->cache.X || instruction->raw.modrm.rm > 3) in ZydisCheckErrorConditions()
4486 ZYAN_ASSERT(!has_VSIB || ((instruction->encoding != ZYDIS_INSTRUCTION_ENCODING_EVEX) && in ZydisCheckErrorConditions()
4487 (instruction->encoding != ZYDIS_INSTRUCTION_ENCODING_MVEX))); in ZydisCheckErrorConditions()
4511 ZYAN_ASSERT(instruction->raw.modrm.mod != 3); in ZydisCheckErrorConditions()
4512 ZYAN_ASSERT(instruction->raw.modrm.rm == 4); in ZydisCheckErrorConditions()
4514 ZyanU8 dest = instruction->raw.modrm.reg; in ZydisCheckErrorConditions()
4515 ZyanU8 index = instruction->raw.sib.index; in ZydisCheckErrorConditions()
4523 switch (instruction->encoding) in ZydisCheckErrorConditions()
4602 ZydisDecodedInstruction* instruction) in ZydisDecodeInstruction() argument
4605 ZYAN_ASSERT(instruction); in ZydisDecodeInstruction()
4626 instruction->raw.prefixes[context->prefixes.offset_mandatory].type = in ZydisDecodeInstruction()
4634 instruction->raw.prefixes[context->prefixes.offset_mandatory].type = in ZydisDecodeInstruction()
4637 instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; in ZydisDecodeInstruction()
4643 status = ZydisNodeHandlerXOP(instruction, &index); in ZydisDecodeInstruction()
4646 status = ZydisNodeHandlerVEX(instruction, &index); in ZydisDecodeInstruction()
4649 status = ZydisNodeHandlerEMVEX(instruction, &index); in ZydisDecodeInstruction()
4652 status = ZydisNodeHandlerOpcode(context, instruction, &index); in ZydisDecodeInstruction()
4661 status = ZydisNodeHandlerModrmMod(context, instruction, &index); in ZydisDecodeInstruction()
4664 status = ZydisNodeHandlerModrmModCompact(context, instruction, &index); in ZydisDecodeInstruction()
4667 status = ZydisNodeHandlerModrmReg(context, instruction, &index); in ZydisDecodeInstruction()
4670 status = ZydisNodeHandlerModrmRm(context, instruction, &index); in ZydisDecodeInstruction()
4676 status = ZydisNodeHandlerMandatoryPrefix(context, instruction, &index); in ZydisDecodeInstruction()
4683 status = ZydisNodeHandlerOperandSize(context, instruction, &index); in ZydisDecodeInstruction()
4686 status = ZydisNodeHandlerAddressSize(context, instruction, &index); in ZydisDecodeInstruction()
4689 status = ZydisNodeHandlerVectorLength(context, instruction, &index); in ZydisDecodeInstruction()
4692 status = ZydisNodeHandlerRexW(context, instruction, &index); in ZydisDecodeInstruction()
4695 status = ZydisNodeHandlerRexB(context, instruction, &index); in ZydisDecodeInstruction()
4699 status = ZydisNodeHandlerEvexB(instruction, &index); in ZydisDecodeInstruction()
4704 status = ZydisNodeHandlerMvexE(instruction, &index); in ZydisDecodeInstruction()
4735 ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition); in ZydisDecodeInstruction()
4736 ZydisSetEffectiveOperandWidth(context, instruction, definition); in ZydisDecodeInstruction()
4737 ZydisSetEffectiveAddressWidth(context, instruction, definition); in ZydisDecodeInstruction()
4741 ZYAN_CHECK(ZydisDecodeOptionalInstructionParts(context, instruction, info)); in ZydisDecodeInstruction()
4742 ZYAN_CHECK(ZydisCheckErrorConditions(context, instruction, definition)); in ZydisDecodeInstruction()
4744 if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) in ZydisDecodeInstruction()
4747 ZYAN_CHECK(ZydisInputNext(context, instruction, &instruction->opcode)); in ZydisDecodeInstruction()
4751 node = ZydisDecoderTreeGetChildNode(node, instruction->opcode); in ZydisDecodeInstruction()
4758 node, (instruction->raw.modrm.mod == 0x3) ? 0 : 1); in ZydisDecodeInstruction()
4760 ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition); in ZydisDecodeInstruction()
4763 instruction->mnemonic = definition->mnemonic; in ZydisDecodeInstruction()
4765 instruction->meta.category = definition->category; in ZydisDecodeInstruction()
4766 instruction->meta.isa_set = definition->isa_set; in ZydisDecodeInstruction()
4767 instruction->meta.isa_ext = definition->isa_ext; in ZydisDecodeInstruction()
4768 instruction->meta.branch_type = definition->branch_type; in ZydisDecodeInstruction()
4769 ZYAN_ASSERT((instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_NONE) || in ZydisDecodeInstruction()
4770 ((instruction->meta.category == ZYDIS_CATEGORY_CALL) || in ZydisDecodeInstruction()
4771 (instruction->meta.category == ZYDIS_CATEGORY_COND_BR) || in ZydisDecodeInstruction()
4772 (instruction->meta.category == ZYDIS_CATEGORY_UNCOND_BR) || in ZydisDecodeInstruction()
4773 (instruction->meta.category == ZYDIS_CATEGORY_RET))); in ZydisDecodeInstruction()
4774 instruction->meta.exception_class = definition->exception_class; in ZydisDecodeInstruction()
4778 ZydisSetAttributes(context, instruction, definition); in ZydisDecodeInstruction()
4779 switch (instruction->encoding) in ZydisDecodeInstruction()
4785 ZydisSetAVXInformation(context, instruction, definition); in ZydisDecodeInstruction()
4790 ZYAN_CHECK(ZydisDecodeOperands(context, instruction, definition)); in ZydisDecodeInstruction()
4794 instruction->attributes |= ZYDIS_ATTRIB_CPUFLAG_ACCESS; in ZydisDecodeInstruction()
4795 ZYAN_ASSERT((ZYAN_ARRAY_LENGTH(instruction->accessed_flags) == in ZydisDecodeInstruction()
4797 (sizeof (instruction->accessed_flags) == in ZydisDecodeInstruction()
4799 ZYAN_MEMCPY(&instruction->accessed_flags, &flags->action, in ZydisDecodeInstruction()
4894 ZyanUSize length, ZydisDecodedInstruction* instruction) in ZydisDecoderDecodeBuffer() argument
4896 if (!decoder || !instruction) in ZydisDecoderDecodeBuffer()
4912 ZYAN_MEMSET(instruction, 0, sizeof(*instruction)); in ZydisDecoderDecodeBuffer()
4913 instruction->machine_mode = decoder->machine_mode; in ZydisDecoderDecodeBuffer()
4918 instruction->stack_width = lookup[decoder->address_width]; in ZydisDecoderDecodeBuffer()
4920 ZYAN_CHECK(ZydisCollectOptionalPrefixes(&context, instruction)); in ZydisDecoderDecodeBuffer()
4921 ZYAN_CHECK(ZydisDecodeInstruction(&context, instruction)); in ZydisDecoderDecodeBuffer()