1 /* src/vm/jit/i386/emit.h - machine dependent emit function prototypes
3 Copyright (C) 1996-2005, 2006
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
32 #include "vm/jit/codegen-common.hpp"
45 /* opcodes for alu instructions */
100 /* modrm and stuff */
102 #define emit_address_byte(mod,reg,rm) \
104 *(cd->mcodeptr++) = ((((mod) & 0x03) << 6) | (((reg) & 0x07) << 3) | (((rm) & 0x07))); \
108 #define emit_imm8(imm) \
110 *(cd->mcodeptr++) = (u1) ((imm) & 0xff); \
114 #define emit_imm16(imm) \
117 imb.i = (int) (imm); \
118 *(cd->mcodeptr++) = imb.b[0]; \
119 *(cd->mcodeptr++) = imb.b[1]; \
123 #define emit_imm32(imm) \
126 imb.i = (int) (imm); \
127 *(cd->mcodeptr++) = imb.b[0]; \
128 *(cd->mcodeptr++) = imb.b[1]; \
129 *(cd->mcodeptr++) = imb.b[2]; \
130 *(cd->mcodeptr++) = imb.b[3]; \
134 #define emit_mem(r,mem) \
136 emit_address_byte(0,(r),5); \
141 /* convenience macros *********************************************************/
143 #define emit_reg(reg,rm) emit_address_byte(3,(reg),(rm))
149 /* integer instructions */
151 void emit_mov_reg_reg(codegendata *cd, s4 reg, s4 dreg);
152 void emit_mov_imm_reg(codegendata *cd, s4 imm, s4 dreg);
153 void emit_mov_imm2_reg(codegendata *cd, s4 imm, s4 dreg);
154 void emit_movb_imm_reg(codegendata *cd, s4 imm, s4 dreg);
155 void emit_mov_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg);
156 void emit_mov_membase32_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg);
157 void emit_mov_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
158 void emit_mov_reg_membase32(codegendata *cd, s4 reg, s4 basereg, s4 disp);
159 void emit_mov_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
160 void emit_mov_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
161 void emit_movw_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
162 void emit_movb_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale);
163 void emit_mov_reg_mem(codegendata *cd, s4 reg, s4 mem);
164 void emit_mov_mem_reg(codegendata *cd, s4 mem, s4 dreg);
165 void emit_mov_imm_mem(codegendata *cd, s4 imm, s4 mem);
166 void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
167 void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp);
168 void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
169 void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b);
170 void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
171 void emit_movswl_reg_reg(codegendata *cd, s4 a, s4 b);
172 void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
173 void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b);
174 void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b);
175 void emit_movzwl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
176 void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
177 void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
178 void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
180 void emit_alu_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg);
181 void emit_alu_reg_membase(codegendata *cd, s4 opc, s4 reg, s4 basereg, s4 disp);
182 void emit_alu_membase_reg(codegendata *cd, s4 opc, s4 basereg, s4 disp, s4 reg);
183 void emit_alu_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
184 void emit_alu_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
185 void emit_alu_imm_membase(codegendata *cd, s4 opc, s4 imm, s4 basereg, s4 disp);
186 void emit_alu_imm_memabs(codegendata *cd, s4 opc, s4 imm, s4 disp);
187 void emit_alu_memindex_reg(codegendata *cd, s4 opc, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
188 void emit_inc_reg(codegendata *cd, s4 reg);
189 void emit_test_reg_reg(codegendata *cd, s4 reg, s4 dreg);
190 void emit_test_imm_reg(codegendata *cd, s4 imm, s4 dreg);
191 void emit_dec_mem(codegendata *cd, s4 mem);
192 void emit_imul_reg_reg(codegendata *cd, s4 reg, s4 dreg);
193 void emit_imul_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 dreg);
194 void emit_imul_imm_reg(codegendata *cd, s4 imm, s4 reg);
195 void emit_imul_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
196 void emit_imul_imm_membase_reg(codegendata *cd, s4 imm, s4 basereg, s4 disp, s4 dreg);
197 void emit_mul_reg(codegendata *cd, s4 reg);
198 void emit_idiv_reg(codegendata *cd, s4 reg);
199 void emit_shift_reg(codegendata *cd, s4 opc, s4 reg);
200 void emit_shift_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 reg);
201 void emit_shld_reg_reg(codegendata *cd, s4 reg, s4 dreg);
202 void emit_shld_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
203 void emit_shld_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
204 void emit_shrd_reg_reg(codegendata *cd, s4 reg, s4 dreg);
205 void emit_shrd_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg);
206 void emit_shrd_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp);
207 void emit_jmp_imm(codegendata *cd, s4 imm);
208 void emit_jmp_reg(codegendata *cd, s4 reg);
209 void emit_jcc(codegendata *cd, s4 opc, s4 imm);
210 void emit_setcc_reg(codegendata *cd, s4 opc, s4 reg);
211 void emit_setcc_membase(codegendata *cd, s4 opc, s4 basereg, s4 disp);
212 void emit_xadd_reg_mem(codegendata *cd, s4 reg, s4 mem);
213 void emit_neg_reg(codegendata *cd, s4 reg);
214 void emit_push_imm(codegendata *cd, s4 imm);
215 void emit_pop_reg(codegendata *cd, s4 reg);
216 void emit_push_reg(codegendata *cd, s4 reg);
217 void emit_lock(codegendata *cd);
218 void emit_call_reg(codegendata *cd, s4 reg);
219 void emit_call_imm(codegendata *cd, s4 imm);
220 void emit_call_mem(codegendata *cd, s4 mem);
223 /* floating point instructions */
225 void emit_fld1(codegendata *cd);
226 void emit_fldz(codegendata *cd);
227 void emit_fld_reg(codegendata *cd, s4 reg);
228 void emit_flds_membase(codegendata *cd, s4 basereg, s4 disp);
229 void emit_flds_membase32(codegendata *cd, s4 basereg, s4 disp);
230 void emit_fldl_membase(codegendata *cd, s4 basereg, s4 disp);
231 void emit_fldl_membase32(codegendata *cd, s4 basereg, s4 disp);
232 void emit_fldt_membase(codegendata *cd, s4 basereg, s4 disp);
233 void emit_flds_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
234 void emit_fldl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
235 void emit_flds_mem(codegendata *cd, s4 mem);
236 void emit_fldl_mem(codegendata *cd, s4 mem);
237 void emit_fildl_membase(codegendata *cd, s4 basereg, s4 disp);
238 void emit_fildll_membase(codegendata *cd, s4 basereg, s4 disp);
239 void emit_fst_reg(codegendata *cd, s4 reg);
240 void emit_fsts_membase(codegendata *cd, s4 basereg, s4 disp);
241 void emit_fstl_membase(codegendata *cd, s4 basereg, s4 disp);
242 void emit_fsts_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
243 void emit_fstl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
244 void emit_fstp_reg(codegendata *cd, s4 reg);
245 void emit_fstps_membase(codegendata *cd, s4 basereg, s4 disp);
246 void emit_fstps_membase32(codegendata *cd, s4 basereg, s4 disp);
247 void emit_fstpl_membase(codegendata *cd, s4 basereg, s4 disp);
248 void emit_fstpl_membase32(codegendata *cd, s4 basereg, s4 disp);
249 void emit_fstpt_membase(codegendata *cd, s4 basereg, s4 disp);
250 void emit_fstps_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
251 void emit_fstpl_memindex(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale);
252 void emit_fstps_mem(codegendata *cd, s4 mem);
253 void emit_fstpl_mem(codegendata *cd, s4 mem);
254 void emit_fistl_membase(codegendata *cd, s4 basereg, s4 disp);
255 void emit_fistpl_membase(codegendata *cd, s4 basereg, s4 disp);
256 void emit_fistpll_membase(codegendata *cd, s4 basereg, s4 disp);
257 void emit_fchs(codegendata *cd);
258 void emit_faddp(codegendata *cd);
259 void emit_fadd_reg_st(codegendata *cd, s4 reg);
260 void emit_fadd_st_reg(codegendata *cd, s4 reg);
261 void emit_faddp_st_reg(codegendata *cd, s4 reg);
262 void emit_fadds_membase(codegendata *cd, s4 basereg, s4 disp);
263 void emit_faddl_membase(codegendata *cd, s4 basereg, s4 disp);
264 void emit_fsub_reg_st(codegendata *cd, s4 reg);
265 void emit_fsub_st_reg(codegendata *cd, s4 reg);
266 void emit_fsubp_st_reg(codegendata *cd, s4 reg);
267 void emit_fsubp(codegendata *cd);
268 void emit_fsubs_membase(codegendata *cd, s4 basereg, s4 disp);
269 void emit_fsubl_membase(codegendata *cd, s4 basereg, s4 disp);
270 void emit_fmul_reg_st(codegendata *cd, s4 reg);
271 void emit_fmul_st_reg(codegendata *cd, s4 reg);
272 void emit_fmulp(codegendata *cd);
273 void emit_fmulp_st_reg(codegendata *cd, s4 reg);
274 void emit_fmuls_membase(codegendata *cd, s4 basereg, s4 disp);
275 void emit_fmull_membase(codegendata *cd, s4 basereg, s4 disp);
276 void emit_fdiv_reg_st(codegendata *cd, s4 reg);
277 void emit_fdiv_st_reg(codegendata *cd, s4 reg);
278 void emit_fdivp(codegendata *cd);
279 void emit_fdivp_st_reg(codegendata *cd, s4 reg);
280 void emit_fxch(codegendata *cd);
281 void emit_fxch_reg(codegendata *cd, s4 reg);
282 void emit_fprem(codegendata *cd);
283 void emit_fprem1(codegendata *cd);
284 void emit_fucom(codegendata *cd);
285 void emit_fucom_reg(codegendata *cd, s4 reg);
286 void emit_fucomp_reg(codegendata *cd, s4 reg);
287 void emit_fucompp(codegendata *cd);
288 void emit_fnstsw(codegendata *cd);
289 void emit_sahf(codegendata *cd);
290 void emit_finit(codegendata *cd);
291 void emit_fldcw_mem(codegendata *cd, s4 mem);
292 void emit_fldcw_membase(codegendata *cd, s4 basereg, s4 disp);
293 void emit_wait(codegendata *cd);
294 void emit_ffree_reg(codegendata *cd, s4 reg);
295 void emit_fdecstp(codegendata *cd);
296 void emit_fincstp(codegendata *cd);
298 #if defined(ENABLE_ESCAPE_CHECK)
299 void emit_escape_check(codegendata *cd, s4 reg);
300 void emit_escape_annotate_object(codegendata *cd, methodinfo *m);
305 * Emit code to recompute the procedure vector. This is a nop,
306 * because we do not use a procedure vector.
308 static inline void emit_recompute_pv(codegendata* cd) {}
315 #endif /* _MD_EMIT_H */
319 * These are local overrides for various environment variables in Emacs.
320 * Please do not remove this and leave it at the end of the file, where
321 * Emacs will automagically detect them.
322 * ---------------------------------------------------------------------
325 * indent-tabs-mode: t