* src/vm/jit/x86_64/emit.c: Changed x86_64 function prefix to
[cacao.git] / src / vm / jit / x86_64 / md-emit.h
1 /* src/vm/jit/x86_64/md-emit.h - machine dependent 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: md-emit.h 4853 2006-04-27 12:33:20Z twisti $
32
33 */
34
35
36 #ifndef _MD_EMIT_H
37 #define _MD_EMIT_H
38
39 #include "vm/types.h"
40
41
42 /* macros to create code ******************************************************/
43
44 /* immediate data union */
45
46 typedef union {
47     s4 i;
48     s8 l;
49     float f;
50     double d;
51     void *a;
52     u1 b[8];
53 } imm_buf;
54
55
56 /* opcodes for alu instructions */
57
58 #define ALU_ADD      0
59 #define ALU_OR       1
60 #define ALU_ADC      2
61 #define ALU_SBB      3
62 #define ALU_AND      4
63 #define ALU_SUB      5
64 #define ALU_XOR      6
65 #define ALU_CMP      7
66
67
68 #define SHIFT_ROL    0
69 #define SHIFT_ROR    1
70 #define SHIFT_RCL    2
71 #define SHIFT_RCR    3
72 #define SHIFT_SHL    4
73 #define SHIFT_SHR    5
74 #define SHIFT_SAR    7
75
76
77 #define CC_O         0
78 #define CC_NO        1
79 #define CC_B         2
80 #define CC_C         2
81 #define CC_NAE       2
82 #define CC_AE        3
83 #define CC_NB        3
84 #define CC_NC        3
85 #define CC_E         4
86 #define CC_Z         4
87 #define CC_NE        5
88 #define CC_NZ        5
89 #define CC_BE        6
90 #define CC_NA        6
91 #define CC_A         7
92 #define CC_NBE       7
93 #define CC_S         8
94 #define CC_LZ        8
95 #define CC_NS        9
96 #define CC_GEZ       9
97 #define CC_P         0x0a
98 #define CC_PE        0x0a
99 #define CC_NP        0x0b
100 #define CC_PO        0x0b
101 #define CC_L         0x0c
102 #define CC_NGE       0x0c
103 #define CC_GE        0x0d
104 #define CC_NL        0x0d
105 #define CC_LE        0x0e
106 #define CC_NG        0x0e
107 #define CC_G         0x0f
108 #define CC_NLE       0x0f
109
110
111 #define IS_IMM8(imm) \
112     (((long) (imm) >= -128) && ((long) (imm) <= 127))
113
114
115 #define IS_IMM32(imm) \
116     (((long) (imm) >= (-2147483647-1)) && ((long) (imm) <= 2147483647))
117
118
119 /* modrm and stuff */
120
121 #define emit_address_byte(mod,reg,rm) \
122     *(cd->mcodeptr++) = ((((mod) & 0x03) << 6) | (((reg) & 0x07) << 3) | ((rm) & 0x07));
123
124
125 #define emit_reg(reg,rm) \
126     emit_address_byte(3,(reg),(rm));
127
128
129 #define emit_rex(size,reg,index,rm) \
130     if (((size) == 1) || ((reg) > 7) || ((index) > 7) || ((rm) > 7)) { \
131         *(cd->mcodeptr++) = (0x40 | (((size) & 0x01) << 3) | ((((reg) >> 3) & 0x01) << 2) | ((((index) >> 3) & 0x01) << 1) | (((rm) >> 3) & 0x01)); \
132     }
133
134
135 #define emit_byte_rex(reg,index,rm) \
136     *(cd->mcodeptr++) = (0x40 | ((((reg) >> 3) & 0x01) << 2) | ((((index) >> 3) & 0x01) << 1) | (((rm) >> 3) & 0x01));
137
138
139 #define emit_mem(r,disp) \
140     do { \
141         emit_address_byte(0,(r),5); \
142         emit_imm32((disp)); \
143     } while (0)
144
145
146 #define emit_membase(basereg,disp,dreg) \
147     do { \
148         if ((basereg) == REG_SP || (basereg) == R12) { \
149             if ((disp) == 0) { \
150                 emit_address_byte(0,(dreg),REG_SP); \
151                 emit_address_byte(0,REG_SP,REG_SP); \
152             } else if (IS_IMM8((disp))) { \
153                 emit_address_byte(1,(dreg),REG_SP); \
154                 emit_address_byte(0,REG_SP,REG_SP); \
155                 emit_imm8((disp)); \
156             } else { \
157                 emit_address_byte(2,(dreg),REG_SP); \
158                 emit_address_byte(0,REG_SP,REG_SP); \
159                 emit_imm32((disp)); \
160             } \
161             break; \
162         } \
163         if ((disp) == 0 && (basereg) != RBP && (basereg) != R13) { \
164             emit_address_byte(0,(dreg),(basereg)); \
165             break; \
166         } \
167         \
168         if ((basereg) == RIP) { \
169             emit_address_byte(0,(dreg),RBP); \
170             emit_imm32((disp)); \
171             break; \
172         } \
173         \
174         if (IS_IMM8((disp))) { \
175             emit_address_byte(1,(dreg),(basereg)); \
176             emit_imm8((disp)); \
177         } else { \
178             emit_address_byte(2,(dreg),(basereg)); \
179             emit_imm32((disp)); \
180         } \
181     } while (0)
182
183
184 #define emit_membase32(basereg,disp,dreg) \
185     do { \
186         if ((basereg) == REG_SP || (basereg) == R12) { \
187             emit_address_byte(2,(dreg),REG_SP); \
188             emit_address_byte(0,REG_SP,REG_SP); \
189             emit_imm32((disp)); \
190         } else {\
191             emit_address_byte(2,(dreg),(basereg)); \
192             emit_imm32((disp)); \
193         } \
194     } while (0)
195
196
197 #define emit_memindex(reg,disp,basereg,indexreg,scale) \
198     do { \
199         if ((basereg) == -1) { \
200             emit_address_byte(0,(reg),4); \
201             emit_address_byte((scale),(indexreg),5); \
202             emit_imm32((disp)); \
203         \
204         } else if ((disp) == 0 && (basereg) != RBP && (basereg) != R13) { \
205             emit_address_byte(0,(reg),4); \
206             emit_address_byte((scale),(indexreg),(basereg)); \
207         \
208         } else if (IS_IMM8((disp))) { \
209             emit_address_byte(1,(reg),4); \
210             emit_address_byte((scale),(indexreg),(basereg)); \
211             emit_imm8 ((disp)); \
212         \
213         } else { \
214             emit_address_byte(2,(reg),4); \
215             emit_address_byte((scale),(indexreg),(basereg)); \
216             emit_imm32((disp)); \
217         }    \
218      } while (0)
219
220
221 #define emit_imm8(imm) \
222     *(cd->mcodeptr++) = (u1) ((imm) & 0xff);
223
224
225 #define emit_imm16(imm) \
226     do { \
227         imm_buf imb; \
228         imb.i = (s4) (imm); \
229         *(cd->mcodeptr++) = imb.b[0]; \
230         *(cd->mcodeptr++) = imb.b[1]; \
231     } while (0)
232
233
234 #define emit_imm32(imm) \
235     do { \
236         imm_buf imb; \
237         imb.i = (s4) (imm); \
238         *(cd->mcodeptr++) = imb.b[0]; \
239         *(cd->mcodeptr++) = imb.b[1]; \
240         *(cd->mcodeptr++) = imb.b[2]; \
241         *(cd->mcodeptr++) = imb.b[3]; \
242     } while (0)
243
244
245 #define emit_imm64(imm) \
246     do { \
247         imm_buf imb; \
248         imb.l = (s8) (imm); \
249         *(cd->mcodeptr++) = imb.b[0]; \
250         *(cd->mcodeptr++) = imb.b[1]; \
251         *(cd->mcodeptr++) = imb.b[2]; \
252         *(cd->mcodeptr++) = imb.b[3]; \
253         *(cd->mcodeptr++) = imb.b[4]; \
254         *(cd->mcodeptr++) = imb.b[5]; \
255         *(cd->mcodeptr++) = imb.b[6]; \
256         *(cd->mcodeptr++) = imb.b[7]; \
257     } while (0)
258
259
260 /* function prototypes ********************************************************/
261
262 void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d);
263
264
265 /* code generation prototypes */
266
267 void emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
268 void emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
269 void emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
270 void emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
271 void emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
272 void emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
273 void emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
274 void emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
275 void emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
276 void emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
277 void emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
278 void emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
279
280
281 /* integer instructions */
282
283 void emit_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg);
284 void emit_mov_imm_reg(codegendata *cd, s8 imm, s8 reg);
285 void emit_movl_imm_reg(codegendata *cd, s8 imm, s8 reg);
286 void emit_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
287 void emit_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
288 void emit_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
289 void emit_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
290 void emit_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
291 void emit_mov_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
292 void emit_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
293 void emit_movl_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
294 void emit_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
295 void emit_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
296 void emit_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
297 void emit_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
298 void emit_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
299 void emit_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
300 void emit_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp);
301 void emit_mov_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp);
302 void emit_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp);
303 void emit_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp);
304 void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
305 void emit_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
306 void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
307 void emit_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
308 void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
309 void emit_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
310 void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
311 void emit_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
312 void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
313 void emit_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
314 void emit_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
315 void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
316 void emit_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
317 void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
318 void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
319 void emit_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
320 void emit_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
321 void emit_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp);
322 void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp);
323 void emit_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg);
324 void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg);
325 void emit_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
326 void emit_alu_imm32_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
327 void emit_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
328 void emit_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
329 void emit_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
330 void emit_test_reg_reg(codegendata *cd, s8 reg, s8 dreg);
331 void emit_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg);
332 void emit_test_imm_reg(codegendata *cd, s8 imm, s8 reg);
333 void emit_testw_imm_reg(codegendata *cd, s8 imm, s8 reg);
334 void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg);
335 void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
336 void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
337 void emit_inc_reg(codegendata *cd, s8 reg);
338 void emit_incl_reg(codegendata *cd, s8 reg);
339 void emit_inc_membase(codegendata *cd, s8 basereg, s8 disp);
340 void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp);
341 void emit_dec_reg(codegendata *cd, s8 reg);
342 void emit_decl_reg(codegendata *cd, s8 reg);
343 void emit_dec_membase(codegendata *cd, s8 basereg, s8 disp);
344 void emit_decl_membase(codegendata *cd, s8 basereg, s8 disp);
345 void emit_cltd(codegendata *cd);
346 void emit_cqto(codegendata *cd);
347 void emit_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg);
348 void emit_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg);
349 void emit_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
350 void emit_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
351 void emit_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg);
352 void emit_imul_imm_reg_reg(codegendata *cd, s8 imm,s8 reg, s8 dreg);
353 void emit_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg);
354 void emit_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg);
355 void emit_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg);
356 void emit_idiv_reg(codegendata *cd, s8 reg);
357 void emit_idivl_reg(codegendata *cd, s8 reg);
358 void emit_ret(codegendata *cd);
359 void emit_shift_reg(codegendata *cd, s8 opc, s8 reg);
360 void emit_shiftl_reg(codegendata *cd, s8 opc, s8 reg);
361 void emit_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
362 void emit_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
363 void emit_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
364 void emit_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
365 void emit_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
366 void emit_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
367 void emit_jmp_imm(codegendata *cd, s8 imm);
368 void emit_jmp_reg(codegendata *cd, s8 reg);
369 void emit_jcc(codegendata *cd, s8 opc, s8 imm);
370 void emit_setcc_reg(codegendata *cd, s8 opc, s8 reg);
371 void emit_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
372 void emit_cmovcc_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
373 void emit_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
374 void emit_neg_reg(codegendata *cd, s8 reg);
375 void emit_negl_reg(codegendata *cd, s8 reg);
376 void emit_neg_membase(codegendata *cd, s8 basereg, s8 disp);
377 void emit_negl_membase(codegendata *cd, s8 basereg, s8 disp);
378 void emit_push_reg(codegendata *cd, s8 reg);
379 void emit_push_imm(codegendata *cd, s8 imm);
380 void emit_pop_reg(codegendata *cd, s8 reg);
381 void emit_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg);
382 void emit_nop(codegendata *cd);
383 void emit_call_reg(codegendata *cd, s8 reg);
384 void emit_call_imm(codegendata *cd, s8 imm);
385 void emit_call_mem(codegendata *cd, ptrint mem);
386
387
388 /* floating point instructions (SSE2) */
389
390 void emit_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
391 void emit_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
392 void emit_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
393 void emit_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
394 void emit_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
395 void emit_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
396 void emit_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
397 void emit_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
398 void emit_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
399 void emit_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg);
400 void emit_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
401 void emit_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg);
402 void emit_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
403 void emit_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
404 void emit_movd_reg_freg(codegendata *cd, s8 reg, s8 freg);
405 void emit_movd_freg_reg(codegendata *cd, s8 freg, s8 reg);
406 void emit_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
407 void emit_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
408 void emit_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
409 void emit_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
410 void emit_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
411 void emit_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
412 void emit_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
413 void emit_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
414 void emit_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
415 void emit_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
416 void emit_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
417 void emit_movss_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
418 void emit_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
419 void emit_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
420 void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
421 void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
422 void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
423 void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
424 void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
425 void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
426 void emit_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
427 void emit_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
428 void emit_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
429 void emit_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
430 void emit_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
431 void emit_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
432 void emit_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
433 void emit_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
434 void emit_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
435 void emit_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
436 void emit_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg);
437 void emit_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
438 void emit_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
439 void emit_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
440
441
442 /* system instructions ********************************************************/
443
444 void emit_rdtsc(codegendata *cd);
445
446 #endif /* _MD_EMIT_H */
447
448
449 /*
450  * These are local overrides for various environment variables in Emacs.
451  * Please do not remove this and leave it at the end of the file, where
452  * Emacs will automagically detect them.
453  * ---------------------------------------------------------------------
454  * Local variables:
455  * mode: c
456  * indent-tabs-mode: t
457  * c-basic-offset: 4
458  * tab-width: 4
459  * End:
460  */