// Tables for DS: 32-bit instructions // (ie. no FS:, but DATA: specified) /*++ Copyright (c) 1995 Microsoft Corporation Module Name: ds16tbl.c Abstract: Dispatch tables for instructions with DATA: override. It is used for both DS: and FS: overrides. Author: 29-Jun-1995 BarryBo Revision History: --*/ #include #include #include #include #include #include "threadst.h" #include "instr.h" #include "decoderp.h" #include "bytefns.h" #include "wordfns.h" #include "miscfns.h" #include "floatfns.h" pfnDispatchInstruction Dispatch16[256] = { // 0 add_m_r8, add_m_r16, add_r_m8, add_r_m16, add_a_i8, add_a_i16, push_es, pop_es, // 8 or_m_r8, or_m_r16, or_r_m8, or_r_m16, or_a_i8, or_a_i16, push_cs, dispatch216, // 10 adc_m_r8, adc_m_r16, adc_r_m8, adc_r_m16, adc_a_i8, adc_a_i16, push_ss, pop_ss, // 18 sbb_m_r8, sbb_m_r16, sbb_r_m8, sbb_r_m16, sbb_a_i8, sbb_a_i16, push_ds, pop_ds, // 20 and_m_r8, and_m_r16, and_r_m8, and_r_m16, and_a_i8, and_a_i16, ProcessPrefixes, // es: daa, // 28 sub_m_r8, sub_m_r16, sub_r_m8, sub_r_m16, sub_a_i8, sub_a_i16, ProcessPrefixes, // cs: das, // 30 xor_m_r8, xor_m_r16, xor_r_m8, xor_r_m16, xor_a_i8, xor_a_i16, ProcessPrefixes, // ss: aaa, // 38 cmp_m_r8, cmp_m_r16, cmp_r_m8, cmp_r_m16, cmp_a_i8, cmp_a_i16, ProcessPrefixes, // ds: aas, // 40 inc_ax16, inc_cx16, inc_dx16, inc_bx16, inc_sp16, inc_bp16, inc_si16, inc_di16, // 48 dec_ax16, dec_cx16, dec_dx16, dec_bx16, dec_sp16, dec_bp16, dec_si16, dec_di16, // 50 push_ax16, push_cx16, push_dx16, push_bx16, push_sp16, push_bp16, push_si16, push_di16, // 58 pop_ax16, pop_cx16, pop_dx16, pop_bx16, pop_sp16, pop_bp16, pop_si16, pop_di16, // 60 pusha16, popa16, bound16, privileged, // arpl ProcessPrefixes, // fs: ProcessPrefixes, // gs: ProcessPrefixes, // data: prefix ProcessPrefixes, // adr: prefix // 68 push_iw16, imul_rw_m_iw16, push_ibs16, imul_rw_m_ib16, privileged, // in_ib_dx privileged, // in_iw_dx privileged, // out_ib_dx privileged, // out_iw_dx // 70 jo8, jno8, jb8, jae8, je8, jne8, jbe8, ja8, // 78 js8, jns8, jp8, jnp8, jl8, jnl8, jle8, jg8, // 80 GROUP_18, GROUP_116, bad, GROUP_1WS16, test_r_m8, test_r_m16, xchg_r_m8, xchg_r_m16, // 88 mov_m_r8, mov_m_r16, mov_r_m8, mov_r_m16, mov_mw_seg, lea_rw_mw16, mov_seg_mw, pop_mw16, // 90 nop, xchg_ax_cx16, xchg_ax_dx16, xchg_ax_bx16, xchg_ax_sp16, xchg_ax_bp16, xchg_ax_si16, xchg_ax_di16, // 98 cbw16, cwd16, call_md, wait, pushf16, popf16, sahf, lahf, // a0 mov_a_m8, mov_a_m16, mov_m_a8, mov_m_a16, movs8, movs16, cmps8, cmps16, // a8 test_a_i8, test_a_i16, stos8, stos16, lods8, lods16, scas8, scas16, // b0 mov_a_i8, mov_c_i8, mov_d_i8, mov_b_i8, mov_ah_ib, mov_ch_ib, mov_dh_ib, mov_bh_ib, // b8 mov_a_i16, mov_c_i16, mov_d_i16, mov_b_i16, mov_sp_iw16, mov_bp_iw16, mov_si_iw16, mov_di_iw16, // c0 GROUP_28, GROUP_216, retn_i16, retn16, les_rw_mw16, lds_rw_mw16, mov_m_i8, mov_m_i16, // c8 enter16, leave16, retf_i16, retf16, int3, int_ib, into, iret, // d0 GROUP_2_18, GROUP_2_116, GROUP_2_CL8, GROUP_2_CL16, aam_ib, aad_ib, bad, xlat, // d8 FLOAT_GP0, FLOAT_GP1, FLOAT_GP2, FLOAT_GP3, FLOAT_GP4, FLOAT_GP5, FLOAT_GP6, FLOAT_GP7, // e0 loopne_b16, loope_b16, loop_b16, jcxz_b16, privileged, // in_al_memb privileged, // in_ax_memb privileged, // out_memb_al privileged, // out_memb_ax // e8 call_rel16, jmp_rel16, jmpf_md, jmp_jb, privileged, // in_al_dx privileged, // in_ax_dx privileged, // out_dx_al privileged, // out_dx_ax // f0 ProcessPrefixes, // lock: prefix bad, ProcessPrefixes, // repnz prefix ProcessPrefixes, // repz prefix privileged, // halt cmc, GROUP_38, GROUP_316, // f8 clc, stc, privileged, // cli privileged, // sti cld, std, GROUP_4, GROUP_516 }; pfnDispatchInstruction Dispatch216[256] = { // 0 GROUP_6, GROUP_7, lar16, lsl16, bad, bad, privileged, // clts bad, // 8 bad, bad, bad, bad, bad, bad, bad, bad, // 10 bad, bad, bad, bad, bad, bad, bad, bad, // 18 bad, bad, bad, bad, bad, bad, bad, bad, // 20 privileged, // mov reg2W, eeeControl privileged, // mov reg2W, eeeDebug privileged, // mov eeeControl, reg2W privileged, // mov eeeDebug, reg2W privileged, // mov reg2W, eeeTest bad, privileged, // mov eeeTest, reg2W bad, // 28 bad, bad, bad, bad, bad, bad, bad, bad, // 30 bad, rdtsc, bad, bad, bad, bad, bad, bad, // 38 bad, bad, bad, bad, bad, bad, bad, bad, // 40 bad, bad, bad, bad, bad, bad, bad, bad, // 48 bad, bad, bad, bad, bad, bad, bad, bad, // 50 bad, bad, bad, bad, bad, bad, bad, bad, // 58 bad, bad, bad, bad, bad, bad, bad, bad, // 60 bad, bad, bad, bad, bad, bad, bad, bad, // 68 bad, bad, bad, bad, bad, bad, bad, bad, // 70 bad, bad, bad, bad, bad, bad, bad, bad, // 78 bad, bad, bad, bad, bad, bad, bad, bad, // 80 jo16, jno16, jb16, jae16, je16, jne16, jbe16, ja16, // 88 js16, jns16, jp16, jnp16, jl16, jnl16, jle16, jg16, // 90 seto_modrmb, setno_modrmb, setb_modrmb, setae_modrmb, sete_modrmb, setne_modrmb, setbe_modrmb, seta_modrmb, // 98 sets_modrmb, setns_modrmb, setp_modrmb, setnp_modrmb, setl_modrmb, setge_modrmb, setle_modrmb, setg_modrmb, // a0 push_fs, pop_fs, bad, bt_m_r16, shld_regw_modrmw_immb16, shld_regw_modrmw_cl16, bad, bad, // a8 push_gs, pop_gs, bad, bts_m_r16, shrd_regw_modrmw_immb16, shrd_regw_modrmw_cl16, bad, imul_regw_modrmw16, // b0 cmpxchg_m_r8, cmpxchg_m_r16, lss_rw_mw16, btr_m_r16, lfs_rw_mw16, lgs_rw_mw16, movzx_regw_modrmb16, movzx_regw_modrmw, // b8 bad, bad, GROUP_816, btc_m_r16, bsf_modrmw_regw16, bsr_modrmw_regw16, movsx_regw_modrmb16, movsx_regw_modrmw, // c0 xadd_m_r8, xadd_m_r16, bad, bad, bad, bad, bad, bad, // c8 bswap_eax, bswap_ecx, bswap_edx, bswap_ebx, bswap_esp, bswap_ebp, bswap_esi, bswap_edi, // d0 bad, bad, bad, bad, bad, bad, bad, bad, // d8 bad, bad, bad, bad, bad, bad, bad, bad, // e0 bad, bad, bad, bad, bad, bad, bad, bad, // e8 bad, bad, bad, bad, bad, bad, bad, bad, // f0 bad, bad, bad, bad, bad, bad, bad, bad, // f8 bad, bad, bad, bad, bad, bad, bad, bad };