//
// Register bit constants.
//

#define X86_CR4_DEBUG_EXTENSIONS 0x8

#define X86_DR6_BREAK_03 0xf
#define X86_DR6_SINGLE_STEP 0x4000

#define X86_DR7_LOCAL_EXACT_ENABLE 0x100
#define X86_DR7_LEN0_SHIFT 18
#define X86_DR7_RW0_EXECUTE    0x00000
#define X86_DR7_RW0_WRITE      0x10000
#define X86_DR7_RW0_IO         0x20000
#define X86_DR7_RW0_READ_WRITE 0x30000
#define X86_DR7_L0_ENABLE 0x1
#define X86_DR7_ALL_ENABLES 0xff
// All control bits used by breaks 0-3.
#define X86_DR7_CTRL_03_MASK ((ULONG)0xffff00ff)

#define X86_IS_VM86(x) ((unsigned short)(((x) >> 17) & 1))

#define X86_BIT_FLAGOF (1 << 11)
#define X86_BIT_FLAGDF (1 << 10)
#define X86_BIT_FLAGIF (1 << 9)
#define X86_BIT_FLAGTF (1 << 8)
#define X86_BIT_FLAGSF (1 << 7)
#define X86_BIT_FLAGZF (1 << 6)
#define X86_BIT_FLAGAF (1 << 4)
#define X86_BIT_FLAGPF (1 << 2)
#define X86_BIT_FLAGCF (1 << 0)
#define X86_BIT_FLAGVIP (1 << 20)
#define X86_BIT_FLAGVIF (1 << 19)
#define X86_BIT_FLAGIOPL 3
#define X86_SHIFT_FLAGIOPL 12

//
// MSRs and their bits.
//

#define X86_MSR_DEBUG_CTL 0x1d9

#define X86_DEBUG_CTL_LAST_BRANCH_RECORD 0x0001
#define X86_DEBUG_CTL_BRANCH_TRACE       0x0002

#define X86_MSR_LAST_BRANCH_FROM_IP 0x1db
#define X86_MSR_LAST_BRANCH_TO_IP 0x1dc
#define X86_MSR_LAST_EXCEPTION_FROM_IP 0x1dd
#define X86_MSR_LAST_EXCEPTION_TO_IP 0x1de

//
// Native register values.  These register values are shared
// between plain X86 and AMD64.  In IA32 intregs have 32-bit values,
// in AMD64 they have 64-bit values.
// Logically they are the same register, though, and the shared
// disassembler uses them.
//

// 32/64 bit.
#define X86_NAX         1
#define X86_NBX         2
#define X86_NCX         3
#define X86_NDX         4
#define X86_NSI         5
#define X86_NDI         6
#define X86_NSP         7
#define X86_NBP         8
#define X86_NIP         9

// 32 bit.
#define X86_NFL         10

// 16 bit.  These must be a group of consecutive values.
#define X86_NCS         11
#define X86_NDS         12
#define X86_NES         13
#define X86_NFS         14
#define X86_NGS         15
#define X86_NSS         16

#define X86_NSEG_FIRST X86_NCS
#define X86_NSEG_LAST  X86_NSS

//
// IA32 definitions.
//

#define X86_GS          X86_NGS
#define X86_FS          X86_NFS
#define X86_ES          X86_NES
#define X86_DS          X86_NDS
#define X86_EDI         X86_NDI
#define X86_ESI         X86_NSI
#define X86_EBX         X86_NBX
#define X86_EDX         X86_NDX
#define X86_ECX         X86_NCX
#define X86_EAX         X86_NAX
#define X86_EBP         X86_NBP
#define X86_EIP         X86_NIP
#define X86_CS          X86_NCS
#define X86_EFL         X86_NFL
#define X86_ESP         X86_NSP
#define X86_SS          X86_NSS

#define X86_CR0         17
#define X86_CR2         18
#define X86_CR3         19
#define X86_CR4         20

#define X86_DR0         21
#define X86_DR1         22
#define X86_DR2         23
#define X86_DR3         24
#define X86_DR6         25
#define X86_DR7         26

#define X86_GDTR        27
#define X86_GDTL        28
#define X86_IDTR        29
#define X86_IDTL        30
#define X86_TR          31
#define X86_LDTR        32

// SSE registers:
#define X86_MXCSR       50

#define X86_XMM0        51
#define X86_XMM1        52
#define X86_XMM2        53
#define X86_XMM3        54
#define X86_XMM4        55
#define X86_XMM5        56
#define X86_XMM6        57
#define X86_XMM7        58

#define X86_XMM_FIRST   X86_XMM0
#define X86_XMM_LAST    X86_XMM7

// Floating-point registers:
#define X86_FPCW        60
#define X86_FPSW        61
#define X86_FPTW        62

#define X86_ST0         70
#define X86_ST1         71
#define X86_ST2         72
#define X86_ST3         73
#define X86_ST4         74
#define X86_ST5         75
#define X86_ST6         76
#define X86_ST7         77

#define X86_ST_FIRST    X86_ST0
#define X86_ST_LAST     X86_ST7

// MMX registers:
#define X86_MM0         80
#define X86_MM1         81
#define X86_MM2         82
#define X86_MM3         83
#define X86_MM4         84
#define X86_MM5         85
#define X86_MM6         86
#define X86_MM7         87

#define X86_MM_FIRST    X86_MM0
#define X86_MM_LAST     X86_MM7

#define X86_FLAGBASE    100
#define X86_DI          100
#define X86_SI          101
#define X86_BX          102
#define X86_DX          103
#define X86_CX          104
#define X86_AX          105
#define X86_BP          106
#define X86_IP          107
#define X86_FL          108
#define X86_SP          109
#define X86_BL          110
#define X86_DL          111
#define X86_CL          112
#define X86_AL          113
#define X86_BH          114
#define X86_DH          115
#define X86_CH          116
#define X86_AH          117
#define X86_IOPL        118
#define X86_OF          119
#define X86_DF          120
#define X86_IF          121
#define X86_TF          122
#define X86_SF          123
#define X86_ZF          124
#define X86_AF          125
#define X86_PF          126
#define X86_CF          127
#define X86_VIP         128
#define X86_VIF         129