xfree86: x86emu: add extra assert()'s
The analyzer warnings (possible NULL dereference) are probably just false alarms. But for safety adding assert()'s, which don't cost us anything in non-debug builds. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
1436690a43
commit
88d561bf18
|
@ -38,6 +38,8 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "x86emu/x86emui.h"
|
#include "x86emu/x86emui.h"
|
||||||
|
|
||||||
#undef bswap_32
|
#undef bswap_32
|
||||||
|
@ -377,6 +379,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -390,6 +393,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -405,6 +409,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -418,6 +423,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -433,6 +439,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -446,6 +453,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -460,7 +468,10 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
|
assert(shiftreg);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -470,7 +481,9 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -507,6 +520,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, shift);
|
destval = shld_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -522,6 +536,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, shift);
|
destval = shld_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -539,6 +554,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, shift);
|
destval = shld_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -554,6 +570,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, shift);
|
destval = shld_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -571,6 +588,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, shift);
|
destval = shld_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -586,6 +604,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, shift);
|
destval = shld_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -601,6 +620,8 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
shift = fetch_byte_imm();
|
shift = fetch_byte_imm();
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shld_long(*destreg, *shiftreg, shift);
|
*destreg = shld_long(*destreg, *shiftreg, shift);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -613,6 +634,8 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
shift = fetch_byte_imm();
|
shift = fetch_byte_imm();
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shld_word(*destreg, *shiftreg, shift);
|
*destreg = shld_word(*destreg, *shiftreg, shift);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -646,6 +669,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -659,6 +683,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -674,6 +699,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -687,6 +713,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -702,6 +729,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -715,6 +743,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shld_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -728,6 +757,8 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shld_long(*destreg, *shiftreg, M.x86.R_CL);
|
*destreg = shld_long(*destreg, *shiftreg, M.x86.R_CL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -738,6 +769,8 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shld_word(*destreg, *shiftreg, M.x86.R_CL);
|
*destreg = shld_word(*destreg, *shiftreg, M.x86.R_CL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -800,6 +833,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -815,6 +849,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -832,6 +867,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -847,6 +883,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -864,7 +901,9 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
|
assert(shiftreg);
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
@ -879,6 +918,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -893,8 +933,10 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
u32 mask;
|
u32 mask;
|
||||||
|
|
||||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||||
|
assert(srcreg);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
|
assert(shiftreg);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
@ -909,8 +951,10 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
mask = (u16) (0x1 << bit);
|
mask = (u16) (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
*srcreg |= mask;
|
*srcreg |= mask;
|
||||||
}
|
}
|
||||||
|
@ -948,6 +992,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, shift);
|
destval = shrd_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -963,6 +1008,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, shift);
|
destval = shrd_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -980,6 +1026,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, shift);
|
destval = shrd_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -995,6 +1042,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, shift);
|
destval = shrd_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1012,6 +1060,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, shift);
|
destval = shrd_long(destval, *shiftreg, shift);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1027,6 +1076,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, shift);
|
destval = shrd_word(destval, *shiftreg, shift);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1042,6 +1092,8 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
shift = fetch_byte_imm();
|
shift = fetch_byte_imm();
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shrd_long(*destreg, *shiftreg, shift);
|
*destreg = shrd_long(*destreg, *shiftreg, shift);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1054,6 +1106,8 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
shift = fetch_byte_imm();
|
shift = fetch_byte_imm();
|
||||||
DECODE_PRINTF2("%d\n", shift);
|
DECODE_PRINTF2("%d\n", shift);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shrd_word(*destreg, *shiftreg, shift);
|
*destreg = shrd_word(*destreg, *shiftreg, shift);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1087,6 +1141,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1100,6 +1155,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1115,6 +1171,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1128,6 +1185,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1143,6 +1201,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_long(destoffset);
|
destval = fetch_data_long(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_long(destoffset, destval);
|
store_data_long(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1156,6 +1215,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = fetch_data_word(destoffset);
|
destval = fetch_data_word(destoffset);
|
||||||
|
assert(shiftreg);
|
||||||
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
|
||||||
store_data_word(destoffset, destval);
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
|
@ -1169,6 +1229,8 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shrd_long(*destreg, *shiftreg, M.x86.R_CL);
|
*destreg = shrd_long(*destreg, *shiftreg, M.x86.R_CL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1179,6 +1241,8 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
DECODE_PRINTF(",CL\n");
|
DECODE_PRINTF(",CL\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(shiftreg);
|
||||||
*destreg = shrd_word(*destreg, *shiftreg, M.x86.R_CL);
|
*destreg = shrd_word(*destreg, *shiftreg, M.x86.R_CL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1256,6 +1320,7 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm01_address(rl);
|
srcoffset = decode_rm01_address(rl);
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) srcval);
|
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) srcval);
|
||||||
if (res_hi != 0) {
|
if (res_hi != 0) {
|
||||||
SET_FLAG(F_CF);
|
SET_FLAG(F_CF);
|
||||||
|
@ -1277,6 +1342,7 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm01_address(rl);
|
srcoffset = decode_rm01_address(rl);
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
res = (s16) * destreg * (s16) srcval;
|
res = (s16) * destreg * (s16) srcval;
|
||||||
if (res > 0xFFFF) {
|
if (res > 0xFFFF) {
|
||||||
SET_FLAG(F_CF);
|
SET_FLAG(F_CF);
|
||||||
|
@ -1342,6 +1408,8 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(srcreg);
|
||||||
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) * srcreg);
|
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) * srcreg);
|
||||||
if (res_hi != 0) {
|
if (res_hi != 0) {
|
||||||
SET_FLAG(F_CF);
|
SET_FLAG(F_CF);
|
||||||
|
@ -1360,6 +1428,8 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
destreg = DECODE_RM_WORD_REGISTER(rh);
|
destreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
|
assert(destreg);
|
||||||
|
assert(srcreg);
|
||||||
res = (s16) * destreg * (s16) * srcreg;
|
res = (s16) * destreg * (s16) * srcreg;
|
||||||
if (res > 0xFFFF) {
|
if (res > 0xFFFF) {
|
||||||
SET_FLAG(F_CF);
|
SET_FLAG(F_CF);
|
||||||
|
@ -1398,6 +1468,7 @@ x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm00_address(rl);
|
srcoffset = decode_rm00_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_SS = fetch_data_word(srcoffset + 2);
|
M.x86.R_SS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1407,6 +1478,7 @@ x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm01_address(rl);
|
srcoffset = decode_rm01_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_SS = fetch_data_word(srcoffset + 2);
|
M.x86.R_SS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1451,6 +1523,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -1466,6 +1539,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -1483,6 +1557,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -1498,6 +1573,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -1515,6 +1591,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -1530,6 +1607,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -1547,8 +1625,10 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
*srcreg &= ~mask;
|
*srcreg &= ~mask;
|
||||||
}
|
}
|
||||||
|
@ -1560,8 +1640,10 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
mask = (u16) (0x1 << bit);
|
mask = (u16) (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
*srcreg &= ~mask;
|
*srcreg &= ~mask;
|
||||||
}
|
}
|
||||||
|
@ -1592,6 +1674,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm00_address(rl);
|
srcoffset = decode_rm00_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1601,6 +1684,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm01_address(rl);
|
srcoffset = decode_rm01_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1610,6 +1694,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm10_address(rl);
|
srcoffset = decode_rm10_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
M.x86.R_FS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1651,6 +1736,7 @@ x86emuOp2_lgs_R_IMM(u8 X86EMU_UNUSED(op2))
|
||||||
srcoffset = decode_rm01_address(rl);
|
srcoffset = decode_rm01_address(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(dstreg);
|
||||||
*dstreg = fetch_data_word(srcoffset);
|
*dstreg = fetch_data_word(srcoffset);
|
||||||
M.x86.R_GS = fetch_data_word(srcoffset + 2);
|
M.x86.R_GS = fetch_data_word(srcoffset + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -1722,6 +1808,7 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = fetch_data_byte(srcoffset);
|
srcval = fetch_data_byte(srcoffset);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1734,6 +1821,7 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = fetch_data_byte(srcoffset);
|
srcval = fetch_data_byte(srcoffset);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1773,6 +1861,8 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(srcreg);
|
||||||
*destreg = *srcreg;
|
*destreg = *srcreg;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1784,6 +1874,8 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(srcreg);
|
||||||
|
assert(destreg);
|
||||||
*destreg = *srcreg;
|
*destreg = *srcreg;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1816,6 +1908,7 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -1825,6 +1918,7 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -1834,6 +1928,8 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(srcreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 3: /* register to register */
|
case 3: /* register to register */
|
||||||
|
@ -1842,6 +1938,8 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
|
assert(srcreg);
|
||||||
*destreg = *srcreg;
|
*destreg = *srcreg;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2057,6 +2155,7 @@ x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
bit = shift & 0x1F;
|
bit = shift & 0x1F;
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
switch (rh) {
|
switch (rh) {
|
||||||
case 5:
|
case 5:
|
||||||
|
@ -2083,6 +2182,7 @@ x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
bit = shift & 0xF;
|
bit = shift & 0xF;
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
switch (rh) {
|
switch (rh) {
|
||||||
case 5:
|
case 5:
|
||||||
|
@ -2128,6 +2228,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -2143,6 +2244,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -2160,6 +2262,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -2175,6 +2278,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -2192,6 +2296,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
disp = (s16) * shiftreg >> 5;
|
disp = (s16) * shiftreg >> 5;
|
||||||
srcval = fetch_data_long(srcoffset + disp);
|
srcval = fetch_data_long(srcoffset + disp);
|
||||||
|
@ -2207,6 +2312,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
disp = (s16) * shiftreg >> 4;
|
disp = (s16) * shiftreg >> 4;
|
||||||
srcval = fetch_data_word(srcoffset + disp);
|
srcval = fetch_data_word(srcoffset + disp);
|
||||||
|
@ -2224,8 +2330,10 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
shiftreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0x1F;
|
bit = *shiftreg & 0x1F;
|
||||||
mask = (0x1 << bit);
|
mask = (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
*srcreg ^= mask;
|
*srcreg ^= mask;
|
||||||
}
|
}
|
||||||
|
@ -2237,8 +2345,10 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
shiftreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(shiftreg);
|
||||||
bit = *shiftreg & 0xF;
|
bit = *shiftreg & 0xF;
|
||||||
mask = (u16) (0x1 << bit);
|
mask = (u16) (0x1 << bit);
|
||||||
|
assert(srcreg);
|
||||||
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
|
||||||
*srcreg ^= mask;
|
*srcreg ^= mask;
|
||||||
}
|
}
|
||||||
|
@ -2272,6 +2382,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2285,6 +2396,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2300,6 +2412,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2313,6 +2426,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2328,6 +2442,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2341,6 +2456,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2348,25 +2464,27 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
||||||
break;
|
break;
|
||||||
case 3: /* register to register */
|
case 3: /* register to register */
|
||||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||||
u32 srcval, *dstreg;
|
u32* dec = DECODE_RM_LONG_REGISTER(rl);
|
||||||
|
assert(dec);
|
||||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
u32 srcval = *dec;
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
u32 *dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
u16 srcval, *dstreg;
|
u16 *dec = DECODE_RM_WORD_REGISTER(rl);
|
||||||
|
assert(dec);
|
||||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
u16 srcval = *DECODE_RM_WORD_REGISTER(rl);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
u16 *dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2401,6 +2519,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2414,6 +2533,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2429,6 +2549,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2442,6 +2563,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2457,6 +2579,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_long(srcoffset);
|
srcval = fetch_data_long(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2470,6 +2593,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
srcval = fetch_data_word(srcoffset);
|
srcval = fetch_data_word(srcoffset);
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2477,25 +2601,27 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
||||||
break;
|
break;
|
||||||
case 3: /* register to register */
|
case 3: /* register to register */
|
||||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||||
u32 srcval, *dstreg;
|
u32 *dec = DECODE_RM_LONG_REGISTER(rl);
|
||||||
|
assert(dec);
|
||||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
u32 srcval = *dec;
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
u32 *dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
u16 srcval, *dstreg;
|
u16 *dec = DECODE_RM_WORD_REGISTER(rl);
|
||||||
|
assert(dec);
|
||||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
u16 srcval = *dec;
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
u16 *dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||||
|
assert(dstreg);
|
||||||
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||||
if ((srcval >> *dstreg) & 1)
|
if ((srcval >> *dstreg) & 1)
|
||||||
break;
|
break;
|
||||||
|
@ -2543,6 +2669,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2557,6 +2684,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s32) ((s8) fetch_data_byte(srcoffset));
|
srcval = (s32) ((s8) fetch_data_byte(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2569,6 +2697,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2583,6 +2712,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s32) ((s8) fetch_data_byte(srcoffset));
|
srcval = (s32) ((s8) fetch_data_byte(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2595,6 +2725,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
srcval = (s16) ((s8) fetch_data_byte(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2604,8 +2735,10 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
u8 *srcreg;
|
u8 *srcreg;
|
||||||
|
|
||||||
destreg = DECODE_RM_LONG_REGISTER(rh);
|
destreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
|
assert(destreg);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
||||||
|
assert(srcreg);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
*destreg = (s32) ((s8) * srcreg);
|
*destreg = (s32) ((s8) * srcreg);
|
||||||
|
@ -2615,8 +2748,10 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
u8 *srcreg;
|
u8 *srcreg;
|
||||||
|
|
||||||
destreg = DECODE_RM_WORD_REGISTER(rh);
|
destreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
|
assert(destreg);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
srcreg = DECODE_RM_BYTE_REGISTER(rl);
|
||||||
|
assert(srcreg);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
*destreg = (s16) ((s8) * srcreg);
|
*destreg = (s16) ((s8) * srcreg);
|
||||||
|
@ -2651,6 +2786,7 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -2660,6 +2796,7 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -2669,12 +2806,15 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
srcval = (s32) ((s16) fetch_data_word(srcoffset));
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
|
assert(destreg);
|
||||||
*destreg = srcval;
|
*destreg = srcval;
|
||||||
break;
|
break;
|
||||||
case 3: /* register to register */
|
case 3: /* register to register */
|
||||||
destreg = DECODE_RM_LONG_REGISTER(rh);
|
destreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
|
assert(destreg);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
|
assert(srcreg);
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
*destreg = (s32) ((s16) * srcreg);
|
*destreg = (s32) ((s16) * srcreg);
|
||||||
|
|
Loading…
Reference in New Issue