1 |
dpavlin |
1 |
/* |
2 |
|
|
* HT Editor |
3 |
|
|
* x86opc.h |
4 |
|
|
* |
5 |
|
|
* Copyright (C) 1999-2002 Stefan Weyergraf |
6 |
|
|
* |
7 |
|
|
* This program is free software; you can redistribute it and/or modify |
8 |
|
|
* it under the terms of the GNU General Public License version 2 as |
9 |
|
|
* published by the Free Software Foundation. |
10 |
|
|
* |
11 |
|
|
* This program is distributed in the hope that it will be useful, |
12 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
|
|
* GNU General Public License for more details. |
15 |
|
|
* |
16 |
|
|
* You should have received a copy of the GNU General Public License |
17 |
|
|
* along with this program; if not, write to the Free Software |
18 |
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
#ifndef __X86OPC_H__ |
22 |
|
|
#define __X86OPC_H__ |
23 |
|
|
|
24 |
|
|
#include "system/types.h" |
25 |
|
|
|
26 |
|
|
#define X86_PREFIX_NO -1 |
27 |
|
|
|
28 |
|
|
#define X86_PREFIX_LOCK 0 /* f0 */ |
29 |
|
|
|
30 |
|
|
#define X86_PREFIX_ES 0 /* 26 */ |
31 |
|
|
#define X86_PREFIX_CS 1 /* 2e */ |
32 |
|
|
#define X86_PREFIX_SS 2 /* 36 */ |
33 |
|
|
#define X86_PREFIX_DS 3 /* 3e */ |
34 |
|
|
#define X86_PREFIX_FS 4 /* 64 */ |
35 |
|
|
#define X86_PREFIX_GS 5 /* 65 */ |
36 |
|
|
|
37 |
|
|
#define X86_PREFIX_REPNZ 0 /* f2 */ |
38 |
|
|
#define X86_PREFIX_REPZ 1 /* f3 */ |
39 |
|
|
|
40 |
|
|
#define X86_OPSIZEUNKNOWN -1 |
41 |
|
|
#define X86_OPSIZE16 0 |
42 |
|
|
#define X86_OPSIZE32 1 |
43 |
|
|
|
44 |
|
|
#define X86_ADDRSIZEUNKNOWN -1 |
45 |
|
|
#define X86_ADDRSIZE16 0 |
46 |
|
|
#define X86_ADDRSIZE32 1 |
47 |
|
|
|
48 |
|
|
#define X86_OPTYPE_EMPTY 0 |
49 |
|
|
#define X86_OPTYPE_IMM 1 |
50 |
|
|
#define X86_OPTYPE_REG 2 |
51 |
|
|
#define X86_OPTYPE_SEG 3 |
52 |
|
|
#define X86_OPTYPE_MEM 4 |
53 |
|
|
#define X86_OPTYPE_CRX 5 |
54 |
|
|
#define X86_OPTYPE_DRX 6 |
55 |
|
|
#define X86_OPTYPE_TRX 7 |
56 |
|
|
#define X86_OPTYPE_STX 8 |
57 |
|
|
#define X86_OPTYPE_MMX 9 |
58 |
|
|
#define X86_OPTYPE_FARPTR 10 |
59 |
|
|
|
60 |
|
|
// user defined types start here |
61 |
|
|
#define X86_OPTYPE_USER 32 |
62 |
|
|
|
63 |
|
|
union int_or_ptr { |
64 |
|
|
int i; |
65 |
|
|
void *p; |
66 |
|
|
}; |
67 |
|
|
|
68 |
|
|
#define dword uint32 |
69 |
|
|
|
70 |
|
|
struct x86_insn_op { |
71 |
|
|
int type; |
72 |
|
|
int size; |
73 |
|
|
union { |
74 |
|
|
struct { |
75 |
|
|
dword seg; |
76 |
|
|
dword offset; |
77 |
|
|
} farptr; |
78 |
|
|
dword imm; |
79 |
|
|
int reg; |
80 |
|
|
int seg; |
81 |
|
|
struct { |
82 |
|
|
int floatptr; |
83 |
|
|
int hasdisp; |
84 |
|
|
dword disp; |
85 |
|
|
int base; |
86 |
|
|
int index; |
87 |
|
|
int scale; |
88 |
|
|
int addrsize; |
89 |
|
|
} mem; |
90 |
|
|
int crx; |
91 |
|
|
int drx; |
92 |
|
|
int trx; |
93 |
|
|
int stx; |
94 |
|
|
int mmx; |
95 |
|
|
int_or_ptr user[4]; |
96 |
|
|
}; |
97 |
|
|
}; |
98 |
|
|
|
99 |
|
|
#define TYPE_0 0 |
100 |
|
|
#define TYPE_A 1 /* direct address without ModR/M (generally |
101 |
|
|
like imm, but can be 16:32 = 48 bit) */ |
102 |
|
|
#define TYPE_C 2 /* reg of ModR/M picks control register */ |
103 |
|
|
#define TYPE_D 3 /* reg of ModR/M picks debug register */ |
104 |
|
|
#define TYPE_E 4 /* ModR/M (general reg or memory) */ |
105 |
|
|
#define TYPE_G 5 /* reg of ModR/M picks general register */ |
106 |
|
|
#define TYPE_Is 6 /* signed immediate */ |
107 |
|
|
#define TYPE_I 7 /* unsigned immediate */ |
108 |
|
|
#define TYPE_Ix 8 /* fixed immediate */ |
109 |
|
|
#define TYPE_J 9 /* relative branch offset */ |
110 |
|
|
#define TYPE_M 10 /* ModR/M (memory only) */ |
111 |
|
|
#define TYPE_O 11 /* direct memory without ModR/M */ |
112 |
|
|
#define TYPE_P 12 /* reg of ModR/M picks MMX register */ |
113 |
|
|
#define TYPE_Q 13 /* ModR/M (MMX reg or memory) */ |
114 |
|
|
#define TYPE_R 14 /* rm of ModR/M picks general register */ |
115 |
|
|
#define TYPE_Rx 15 /* extra picks register */ |
116 |
|
|
#define TYPE_S 16 /* reg of ModR/M picks segment register */ |
117 |
|
|
#define TYPE_Sx 17 /* extra picks segment register */ |
118 |
|
|
#define TYPE_T 18 /* reg of ModR/M picks test register */ |
119 |
|
|
#define TYPE_F 19 /* r/m of ModR/M picks a fpu register */ |
120 |
|
|
#define TYPE_Fx 20 /* extra picks a fpu register */ |
121 |
|
|
|
122 |
|
|
/* when name is == 0, the first op has a special meaning (layout see x86_insn_op_special) */ |
123 |
|
|
#define SPECIAL_TYPE_INVALID 0 |
124 |
|
|
#define SPECIAL_TYPE_PREFIX 1 |
125 |
|
|
#define SPECIAL_TYPE_GROUP 2 |
126 |
|
|
#define SPECIAL_TYPE_FGROUP 3 |
127 |
|
|
|
128 |
|
|
#define SIZE_0 '0' /* size unimportant */ |
129 |
|
|
#define SIZE_B 'b' /* byte */ |
130 |
|
|
#define SIZE_W 'w' /* word */ |
131 |
|
|
#define SIZE_D 'd' /* dword */ |
132 |
|
|
#define SIZE_Q 'q' /* qword */ |
133 |
|
|
#define SIZE_C 'c' /* byte OR word */ |
134 |
|
|
#define SIZE_V 'v' /* word OR dword */ |
135 |
|
|
#define SIZE_P 'p' /* word:word OR word:dword, memory only ! */ |
136 |
|
|
#define SIZE_S 's' /* short/single real (32-bit) */ |
137 |
|
|
#define SIZE_L 'l' /* long/double real (64-bit) */ |
138 |
|
|
#define SIZE_T 't' /* temp/extended real (80-bit) */ |
139 |
|
|
#define SIZE_A 'a' /* packed decimal (80-bit BCD) */ |
140 |
|
|
|
141 |
|
|
struct x86opc_insn_op { |
142 |
|
|
char type; |
143 |
|
|
char extra; |
144 |
|
|
char size; |
145 |
|
|
char extendedsize; |
146 |
|
|
}; |
147 |
|
|
|
148 |
|
|
struct x86opc_insn_op_special { |
149 |
|
|
char type; |
150 |
|
|
char data; |
151 |
|
|
char res1; |
152 |
|
|
char res2; |
153 |
|
|
}; |
154 |
|
|
|
155 |
|
|
struct x86opc_insn { |
156 |
|
|
char *name; |
157 |
|
|
x86opc_insn_op op[3]; |
158 |
|
|
}; |
159 |
|
|
|
160 |
|
|
/* this can be a group (group!=0), an insn (group==0) && (insn.name!=0) or |
161 |
|
|
(otherwise) a reserved instruction. */ |
162 |
|
|
struct x86opc_finsn { |
163 |
|
|
x86opc_insn *group; |
164 |
|
|
x86opc_insn insn; |
165 |
|
|
}; |
166 |
|
|
|
167 |
|
|
#define X86_REG_INVALID -2 |
168 |
|
|
#define X86_REG_NO -1 |
169 |
|
|
#define X86_REG_AX 0 |
170 |
|
|
#define X86_REG_CX 1 |
171 |
|
|
#define X86_REG_DX 2 |
172 |
|
|
#define X86_REG_BX 3 |
173 |
|
|
#define X86_REG_SP 4 |
174 |
|
|
#define X86_REG_BP 5 |
175 |
|
|
#define X86_REG_SI 6 |
176 |
|
|
#define X86_REG_DI 7 |
177 |
|
|
|
178 |
|
|
#define X86_GROUPS 20 |
179 |
|
|
|
180 |
|
|
extern char *x86_regs[3][8]; |
181 |
|
|
extern char *x86_segs[8]; |
182 |
|
|
extern x86opc_insn x86_insns[256]; |
183 |
|
|
extern x86opc_insn x86_insns_ext[256]; |
184 |
|
|
extern x86opc_insn x86_group_insns[X86_GROUPS][8]; |
185 |
|
|
|
186 |
|
|
extern x86opc_insn x86_modfloat_group_insns[8][8]; |
187 |
|
|
extern x86opc_finsn x86_float_group_insns[8][8]; |
188 |
|
|
|
189 |
|
|
#endif /* __X86OPC_H__ */ |