(!1969) 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
							
								
									f89cf0c03b
								
							
						
					
					
						commit
						0f7fb5e338
					
				| 
						 | 
					@ -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