main
gen_x86.h
1/*
2 Copyright 2013 Michael Pavone
3 This file is part of BlastEm.
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
5*/
6#ifndef GEN_X86_H_
7#define GEN_X86_H_
8
9#include <stdint.h>
10#include "gen.h"
11
12enum {
13 RAX = 0,
14 RCX,
15 RDX,
16 RBX,
17 RSP,
18 RBP,
19 RSI,
20 RDI,
21 AH,
22 CH,
23 DH,
24 BH,
25 R8,
26 R9,
27 R10,
28 R11,
29 R12,
30 R13,
31 R14,
32 R15
33};
34
35enum {
36 CC_O = 0,
37 CC_NO,
38 CC_C,
39 CC_B = CC_C,
40 CC_NC,
41 CC_NB = CC_NC,
42 CC_Z,
43 CC_NZ,
44 CC_BE,
45 CC_A,
46 CC_S,
47 CC_NS,
48 CC_P,
49 CC_NP,
50 CC_L,
51 CC_GE,
52 CC_LE,
53 CC_G
54};
55
56enum {
57 SZ_B = 0,
58 SZ_W,
59 SZ_D,
60 SZ_Q
61};
62
63#ifdef X86_64
64#define SZ_PTR SZ_Q
65#define MAX_INST_LEN 14
66#else
67#define SZ_PTR SZ_D
68#define MAX_INST_LEN 11
69#endif
70
71enum {
72 MODE_REG_INDIRECT = 0,
73 MODE_REG_INDEXED = 4,
74 MODE_REG_DISPLACE8 = 0x40,
75 MODE_REG_INDEXED_DISPLACE8 = 0x44,
76 MODE_REG_DISPLACE32 = 0x80,
77 MODE_REG_INDEXED_DIPSLACE32 = 0x84,
78 MODE_REG_DIRECT = 0xC0,
79//"phony" mode
80 MODE_IMMED = 0xFF
81};
82
83void rol_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
84void ror_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
85void rcl_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
86void rcr_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
87void shl_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
88void shr_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
89void sar_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
90void rol_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
91void ror_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
92void rcl_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
93void rcr_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
94void shl_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
95void shr_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
96void sar_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size);
97void rol_clr(code_info *code, uint8_t dst, uint8_t size);
98void ror_clr(code_info *code, uint8_t dst, uint8_t size);
99void rcl_clr(code_info *code, uint8_t dst, uint8_t size);
100void rcr_clr(code_info *code, uint8_t dst, uint8_t size);
101void shl_clr(code_info *code, uint8_t dst, uint8_t size);
102void shr_clr(code_info *code, uint8_t dst, uint8_t size);
103void sar_clr(code_info *code, uint8_t dst, uint8_t size);
104void rol_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
105void ror_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
106void rcl_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
107void rcr_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
108void shl_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
109void shr_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
110void sar_clrdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
111void add_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
112void adc_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
113void or_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
114void xor_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
115void and_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
116void sub_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
117void sbb_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
118void cmp_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
119void add_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
120void adc_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
121void or_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
122void xor_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
123void and_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
124void sub_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
125void sbb_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
126void cmp_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
127void add_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
128void adc_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
129void or_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
130void xor_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
131void and_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
132void sub_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
133void sbb_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
134void cmp_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
135void add_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
136void adc_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
137void add_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
138void adc_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
139void or_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
140void or_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
141void xor_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
142void xor_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
143void and_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
144void and_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
145void sub_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
146void sub_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
147void sbb_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
148void sbb_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
149void cmp_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
150void cmp_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
151void imul_irr(code_info *code, int32_t val, uint8_t src, uint8_t dst, uint8_t size);
152void imul_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
153void imul_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
154void imul_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
155void not_r(code_info *code, uint8_t dst, uint8_t size);
156void neg_r(code_info *code, uint8_t dst, uint8_t size);
157void not_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
158void neg_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
159void mul_r(code_info *code, uint8_t dst, uint8_t size);
160void imul_r(code_info *code, uint8_t dst, uint8_t size);
161void div_r(code_info *code, uint8_t dst, uint8_t size);
162void idiv_r(code_info *code, uint8_t dst, uint8_t size);
163void mul_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
164void imul_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
165void div_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
166void idiv_rdisp(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size);
167void test_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
168void test_ir(code_info *code, int32_t val, uint8_t dst, uint8_t size);
169void test_irdisp(code_info *code, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size);
170void test_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
171void test_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
172void mov_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
173void mov_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t disp, uint8_t size);
174void mov_rdispr(code_info *code, uint8_t src_base, int32_t disp, uint8_t dst, uint8_t size);
175void mov_rrindex(code_info *code, uint8_t src, uint8_t dst_base, uint8_t dst_index, uint8_t scale, uint8_t size);
176void mov_rindexr(code_info *code, uint8_t src_base, uint8_t src_index, uint8_t scale, uint8_t dst, uint8_t size);
177void mov_rrind(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
178void mov_rindr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
179void mov_ir(code_info *code, int64_t val, uint8_t dst, uint8_t size);
180void mov_irdisp(code_info *code, int32_t val, uint8_t dst, int32_t disp, uint8_t size);
181void mov_irind(code_info *code, int32_t val, uint8_t dst, uint8_t size);
182void movsx_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t src_size, uint8_t size);
183void movsx_rdispr(code_info *code, uint8_t src, int32_t disp, uint8_t dst, uint8_t src_size, uint8_t size);
184void movzx_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t src_size, uint8_t size);
185void movzx_rdispr(code_info *code, uint8_t src, int32_t disp, uint8_t dst, uint8_t src_size, uint8_t size);
186void xchg_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
187void pushf(code_info *code);
188void popf(code_info *code);
189void push_r(code_info *code, uint8_t reg);
190void push_rdisp(code_info *code, uint8_t base, int32_t disp);
191void pop_r(code_info *code, uint8_t reg);
192void pop_rind(code_info *code, uint8_t reg);
193void setcc_r(code_info *code, uint8_t cc, uint8_t dst);
194void setcc_rind(code_info *code, uint8_t cc, uint8_t dst);
195void setcc_rdisp(code_info *code, uint8_t cc, uint8_t dst, int32_t disp);
196void bt_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
197void bt_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size);
198void bt_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
199void bt_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
200void bts_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
201void bts_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size);
202void bts_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
203void bts_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
204void btr_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
205void btr_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size);
206void btr_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
207void btr_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
208void btc_rr(code_info *code, uint8_t src, uint8_t dst, uint8_t size);
209void btc_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size);
210void btc_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
211void btc_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
212void jcc(code_info *code, uint8_t cc, code_ptr dest);
213void jmp_rind(code_info *code, uint8_t dst);
214void call_noalign(code_info *code, code_ptr fun);
215void call_r(code_info *code, uint8_t dst);
216void retn(code_info *code);
217void cdq(code_info *code);
218void loop(code_info *code, code_ptr dst);
219uint8_t is_mov_ir(code_ptr inst);
220
221#endif //GEN_X86_H_