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_