d497c2ba1454b9e2ee2d616d2c8ccc22a25fd28a
[cacao.git] / src / vm / jit / i386 / emit.h
1 /* src/vm/jit/i386/emitfuncs.h - emit function prototypes
2
3    Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25    Contact: cacao@cacaojvm.org
26
27    Authors: Christian Thalinger
28
29    Changes:
30
31    $Id: emit.h 6049 2006-11-27 14:20:57Z edwin $
32
33 */
34
35
36 #ifndef _EMITFUNCS_H
37 #define _EMITFUNCS_H
38
39 #include "vm/types.h"
40
41 #include "vm/jit/codegen-common.h"
42
43
44 #define REG_AL       0
45 #define REG_CL       1
46 #define REG_DL       2
47 #define REG_BL       3
48 #define REG_AH       4
49 #define REG_CH       5
50 #define REG_DH       6
51 #define REG_BH       7
52
53
54 /* opcodes for alu instructions */
55
56 #define ALU_ADD      0
57 #define ALU_OR       1
58 #define ALU_ADC      2
59 #define ALU_SBB      3
60 #define ALU_AND      4
61 #define ALU_SUB      5
62 #define ALU_XOR      6
63 #define ALU_CMP      7
64
65
66 #define SHIFT_ROL    0
67 #define SHIFT_ROR    1
68 #define SHIFT_RCL    2
69 #define SHIFT_RCR    3
70 #define SHIFT_SHL    4
71 #define SHIFT_SHR    5
72 #define SHIFT_SAR    7
73
74
75 #define CC_O         0
76 #define CC_NO        1
77 #define CC_B         2
78 #define CC_C         2
79 #define CC_NAE       2
80 #define CC_AE        3
81 #define CC_NB        3
82 #define CC_NC        3
83 #define CC_E         4
84 #define CC_Z         4
85 #define CC_NE        5
86 #define CC_NZ        5
87 #define CC_BE        6
88 #define CC_NA        6
89 #define CC_A         7
90 #define CC_NBE       7
91 #define CC_S         8
92 #define CC_LZ        8
93 #define CC_NS        9
94 #define CC_GEZ       9
95 #define CC_P         0x0a
96 #define CC_PE        0x0a
97 #define CC_NP        0x0b
98 #define CC_PO        0x0b
99 #define CC_L         0x0c
100 #define CC_NGE       0x0c
101 #define CC_GE        0x0d
102 #define CC_NL        0x0d
103 #define CC_LE        0x0e
104 #define CC_NG        0x0e
105 #define CC_G         0x0f
106 #define CC_NLE       0x0f
107
108
109 /* modrm and stuff */
110
111 #define emit_address_byte(mod,reg,rm) \
112     do { \
113         *(cd->mcodeptr++) = ((((mod) & 0x03) << 6) | (((reg) & 0x07) << 3) | (((rm) & 0x07))); \
114     } while (0)
115
116
117 #define emit_imm8(imm) \
118     do { \
119         *(cd->mcodeptr++) = (u1) ((imm) & 0xff); \
120     } while (0)
121
122
123 #define emit_imm16(imm) \
124     do { \
125         imm_union imb; \
126         imb.i = (int) (imm); \
127         *(cd->mcodeptr++) = imb.b[0]; \
128         *(cd->mcodeptr++) = imb.b[1]; \
129     } while (0)
130
131
132 #define emit_imm32(imm) \
133     do { \
134         imm_union imb; \
135         imb.i = (int) (imm); \
136         *(cd->mcodeptr++) = imb.b[0]; \
137         *(cd->mcodeptr++) = imb.b[1]; \
138         *(cd->mcodeptr++) = imb.b[2]; \
139         *(cd->mcodeptr++) = imb.b[3]; \
140     } while (0)
141
142
143 #define emit_mem(r,mem) \
144     do { \
145         emit_address_byte(0,(r),5); \
146         emit_imm32((mem)); \
147     } while (0)
148
149
150 /* convenience macros *********************************************************/
151
152 #define emit_reg(reg,rm)                emit_address_byte(3,(reg),(rm))
153
154
155 /* integer instructions */
156
157 void emit_mov_reg_reg(codegendata *cd, s4 reg, s4 dreg);
158 void emit_mov_imm_reg(codegendata *cd, s4 imm, s4 dreg);
159 void emit_movb_imm_reg(codegendata *cd, s4 imm, s4 dreg);
160 void emit_mov_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg);
161 void emit_mov_membase32_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg);
162 void emit_mov_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
163 void emit_mov_reg_membase32(codegendata *cd, s4 reg, s4 basereg, s4 disp);
164 void emit_mov_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
165 void emit_mov_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
166 void emit_movw_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
167 void emit_movb_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
168 void emit_mov_reg_mem(codegendata *cd, s4 reg, s4 mem);
169 void emit_mov_mem_reg(codegendata *cd, s4 mem, s4 dreg);
170 void emit_mov_imm_mem(codegendata *cd, s4 imm, s4 mem);
171 void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
172 void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp);
173 void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
174 void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
175 void emit_movswl_reg_reg(codegendata *cd, s4 a, s4 b);
176 void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
177 void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b);
178 void emit_movzwl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
179 void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
180 void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
181 void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
182
183 void emit_alu_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg);
184 void emit_alu_reg_membase(codegendata *cd, s4 opc, s4 reg, s4 basereg, s4 disp);
185 void emit_alu_membase_reg(codegendata *cd, s4 opc, s4 basereg, s4 disp, s4 reg);
186 void emit_alu_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
187 void emit_alu_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
188 void emit_alu_imm_membase(codegendata *cd, s4 opc, s4 imm, s4 basereg, s4 disp);
189 void emit_alu_imm_memabs(codegendata *cd, s4 opc, s4 imm, s4 disp);
190 void emit_test_reg_reg(codegendata *cd, s4 reg, s4 dreg);
191 void emit_test_imm_reg(codegendata *cd, s4 imm, s4 dreg);
192 void emit_dec_mem(codegendata *cd, s4 mem);
193 void emit_cltd(codegendata *cd);
194 void emit_imul_reg_reg(codegendata *cd, s4 reg, s4 dreg);
195 void emit_imul_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 dreg);
196 void emit_imul_imm_reg(codegendata *cd, s4 imm, s4 reg);
197 void emit_imul_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
198 void emit_imul_imm_membase_reg(codegendata *cd, s4 imm, s4 basereg, s4 disp, s4 dreg);
199 void emit_mul_reg(codegendata *cd, s4 reg);
200 void emit_idiv_reg(codegendata *cd, s4 reg);
201 void emit_ret(codegendata *cd);
202 void emit_shift_reg(codegendata *cd, s4 opc, s4 reg);
203 void emit_shift_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
204 void emit_shld_reg_reg(codegendata *cd, s4 reg, s4 dreg);
205 void emit_shld_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
206 void emit_shld_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
207 void emit_shrd_reg_reg(codegendata *cd, s4 reg, s4 dreg);
208 void emit_shrd_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
209 void emit_shrd_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
210 void emit_jmp_imm(codegendata *cd, s4 imm);
211 void emit_jmp_reg(codegendata *cd, s4 reg);
212 void emit_jcc(codegendata *cd, s4 opc, s4 imm);
213 void emit_setcc_reg(codegendata *cd, s4 opc, s4 reg);
214 void emit_setcc_membase(codegendata *cd, s4 opc, s4 basereg, s4 disp);
215 void emit_xadd_reg_mem(codegendata *cd, s4 reg, s4 mem);
216 void emit_neg_reg(codegendata *cd, s4 reg);
217 void emit_push_imm(codegendata *cd, s4 imm);
218 void emit_pop_reg(codegendata *cd, s4 reg);
219 void emit_push_reg(codegendata *cd, s4 reg);
220 void emit_nop(codegendata *cd);
221 void emit_lock(codegendata *cd);
222 void emit_call_reg(codegendata *cd, s4 reg);
223 void emit_call_imm(codegendata *cd, s4 imm);
224 void emit_call_mem(codegendata *cd, s4 mem);
225
226
227 /* floating point instructions */
228
229 void emit_fld1(codegendata *cd);
230 void emit_fldz(codegendata *cd);
231 void emit_fld_reg(codegendata *cd, s4 reg);
232 void emit_flds_membase(codegendata *cd, s4 basereg, s4 disp);
233 void emit_flds_membase32(codegendata *cd, s4 basereg, s4 disp);
234 void emit_fldl_membase(codegendata *cd, s4 basereg, s4 disp);
235 void emit_fldl_membase32(codegendata *cd, s4 basereg, s4 disp);
236 void emit_fldt_membase(codegendata *cd, s4 basereg, s4 disp);
237 void emit_flds_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
238 void emit_fldl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
239 void emit_flds_mem(codegendata *cd, s4 mem);
240 void emit_fldl_mem(codegendata *cd, s4 mem);
241 void emit_fildl_membase(codegendata *cd, s4 basereg, s4 disp);
242 void emit_fildll_membase(codegendata *cd, s4 basereg, s4 disp);
243 void emit_fst_reg(codegendata *cd, s4 reg);
244 void emit_fsts_membase(codegendata *cd, s4 basereg, s4 disp);
245 void emit_fstl_membase(codegendata *cd, s4 basereg, s4 disp);
246 void emit_fsts_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
247 void emit_fstl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
248 void emit_fstp_reg(codegendata *cd, s4 reg);
249 void emit_fstps_membase(codegendata *cd, s4 basereg, s4 disp);
250 void emit_fstps_membase32(codegendata *cd, s4 basereg, s4 disp);
251 void emit_fstpl_membase(codegendata *cd, s4 basereg, s4 disp);
252 void emit_fstpl_membase32(codegendata *cd, s4 basereg, s4 disp);
253 void emit_fstpt_membase(codegendata *cd, s4 basereg, s4 disp);
254 void emit_fstps_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
255 void emit_fstpl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
256 void emit_fstps_mem(codegendata *cd, s4 mem);
257 void emit_fstpl_mem(codegendata *cd, s4 mem);
258 void emit_fistl_membase(codegendata *cd, s4 basereg, s4 disp);
259 void emit_fistpl_membase(codegendata *cd, s4 basereg, s4 disp);
260 void emit_fistpll_membase(codegendata *cd, s4 basereg, s4 disp);
261 void emit_fchs(codegendata *cd);
262 void emit_faddp(codegendata *cd);
263 void emit_fadd_reg_st(codegendata *cd, s4 reg);
264 void emit_fadd_st_reg(codegendata *cd, s4 reg);
265 void emit_faddp_st_reg(codegendata *cd, s4 reg);
266 void emit_fadds_membase(codegendata *cd, s4 basereg, s4 disp);
267 void emit_faddl_membase(codegendata *cd, s4 basereg, s4 disp);
268 void emit_fsub_reg_st(codegendata *cd, s4 reg);
269 void emit_fsub_st_reg(codegendata *cd, s4 reg);
270 void emit_fsubp_st_reg(codegendata *cd, s4 reg);
271 void emit_fsubp(codegendata *cd);
272 void emit_fsubs_membase(codegendata *cd, s4 basereg, s4 disp);
273 void emit_fsubl_membase(codegendata *cd, s4 basereg, s4 disp);
274 void emit_fmul_reg_st(codegendata *cd, s4 reg);
275 void emit_fmul_st_reg(codegendata *cd, s4 reg);
276 void emit_fmulp(codegendata *cd);
277 void emit_fmulp_st_reg(codegendata *cd, s4 reg);
278 void emit_fmuls_membase(codegendata *cd, s4 basereg, s4 disp);
279 void emit_fmull_membase(codegendata *cd, s4 basereg, s4 disp);
280 void emit_fdiv_reg_st(codegendata *cd, s4 reg);
281 void emit_fdiv_st_reg(codegendata *cd, s4 reg);
282 void emit_fdivp(codegendata *cd);
283 void emit_fdivp_st_reg(codegendata *cd, s4 reg);
284 void emit_fxch(codegendata *cd);
285 void emit_fxch_reg(codegendata *cd, s4 reg);
286 void emit_fprem(codegendata *cd);
287 void emit_fprem1(codegendata *cd);
288 void emit_fucom(codegendata *cd);
289 void emit_fucom_reg(codegendata *cd, s4 reg);
290 void emit_fucomp_reg(codegendata *cd, s4 reg);
291 void emit_fucompp(codegendata *cd);
292 void emit_fnstsw(codegendata *cd);
293 void emit_sahf(codegendata *cd);
294 void emit_finit(codegendata *cd);
295 void emit_fldcw_mem(codegendata *cd, s4 mem);
296 void emit_fldcw_membase(codegendata *cd, s4 basereg, s4 disp);
297 void emit_wait(codegendata *cd);
298 void emit_ffree_reg(codegendata *cd, s4 reg);
299 void emit_fdecstp(codegendata *cd);
300 void emit_fincstp(codegendata *cd);
301
302 #endif /* _EMITFUNCS_H */
303
304
305 /*
306  * These are local overrides for various environment variables in Emacs.
307  * Please do not remove this and leave it at the end of the file, where
308  * Emacs will automagically detect them.
309  * ---------------------------------------------------------------------
310  * Local variables:
311  * mode: c
312  * indent-tabs-mode: t
313  * c-basic-offset: 4
314  * tab-width: 4
315  * End:
316  */