length = v3_get_prefixes((uint8_t *)instr_ptr, &(instr->prefixes));
- // check for REX prefix
+ // REX prefix
+ if (v3_get_vm_cpu_mode(core) == LONG) {
+ uint8_t prefix = *(uint8_t *)(instr_ptr + length);
+
+ if ((prefix & 0xf0) == 0x40) {
+ instr->prefixes.rex = 1;
+
+ instr->prefixes.rex_rm = (prefix & 0x01);
+ instr->prefixes.rex_sib_idx = ((prefix & 0x02) >> 1);
+ instr->prefixes.rex_reg = ((prefix & 0x04) >> 2);
+ instr->prefixes.rex_op_size = ((prefix & 0x08) >> 3);
+
+ length += 1;
+ }
+ }
form = op_code_to_form((uint8_t *)(instr_ptr + length), &length);
case MOV_IMM2:{
uint8_t reg_code = 0;
- instr->dst_operand.size = operand_width;
-
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->dst_operand), ®_code);
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
if (ret == -1) {
PrintError("Error decoding operand\n");
case MOV_2MEM: {
uint8_t reg_code = 0;
- instr->dst_operand.size = operand_width;
-
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->dst_operand), ®_code);
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
if (ret == -1) {
PrintError("Error decoding operand\n");
case XOR_MEM2:
case MOV_MEM2: {
uint8_t reg_code = 0;
- instr->src_operand.size = operand_width;
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->src_operand), ®_code);
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand), ®_code);
if (ret == -1) {
PrintError("Error decoding operand\n");
case SUB_IMM2SX_8:
case XOR_IMM2SX_8: {
uint8_t reg_code = 0;
- instr->src_operand.size = operand_width;
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->src_operand), ®_code);
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand), ®_code);
if (ret == -1) {
PrintError("Error decoding operand\n");
case MOV_2CR: {
uint8_t reg_code = 0;
- instr->src_operand.size = operand_width;
-
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->src_operand),
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand),
®_code);
if (ret == -1) {
case MOV_CR2: {
uint8_t reg_code = 0;
- instr->dst_operand.size = operand_width;
-
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->dst_operand),
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand),
®_code);
if (ret == -1) {
// We use the dst operand here to maintain bug-for-bug compatibility with XED
- instr->dst_operand.size = operand_width;
-
- ret = decode_rm_operand(core, instr_ptr, instr, &(instr->dst_operand), ®_code);
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
if (ret == -1) {
PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));