* Updated header: Added 2006. Changed address of FSF. Changed email
[cacao.git] / src / vm / jit / x86_64 / emitfuncs.h
1 /* src/vm/jit/x86_64/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: emitfuncs.h 4357 2006-01-22 23:33:38Z twisti $
32
33 */
34
35
36 #ifndef _EMITFUNCS_H
37 #define _EMITFUNCS_H
38
39 #include "vm/types.h"
40
41
42 /* code generation prototypes */
43
44 void x86_64_emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
45 void x86_64_emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
46 void x86_64_emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
47 void x86_64_emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
48 void x86_64_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
49 void x86_64_emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
50 void x86_64_emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
51 void x86_64_emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
52 void x86_64_emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
53 void x86_64_emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
54 void x86_64_emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
55 void x86_64_emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
56
57
58 /* integer instructions */
59
60 void x86_64_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg);
61 void x86_64_mov_imm_reg(codegendata *cd, s8 imm, s8 reg);
62 void x86_64_movl_imm_reg(codegendata *cd, s8 imm, s8 reg);
63 void x86_64_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
64 void x86_64_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
65 void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
66 void x86_64_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
67 void x86_64_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
68 void x86_64_mov_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
69 void x86_64_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
70 void x86_64_movl_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
71 void x86_64_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
72 void x86_64_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
73 void x86_64_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
74 void x86_64_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
75 void x86_64_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
76 void x86_64_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
77 void x86_64_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp);
78 void x86_64_mov_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp);
79 void x86_64_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp);
80 void x86_64_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp);
81 void x86_64_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
82 void x86_64_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
83 void x86_64_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
84 void x86_64_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
85 void x86_64_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
86 void x86_64_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
87 void x86_64_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
88 void x86_64_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
89 void x86_64_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
90 void x86_64_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
91 void x86_64_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
92 void x86_64_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
93 void x86_64_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
94 void x86_64_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
95 void x86_64_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
96 void x86_64_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
97 void x86_64_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
98 void x86_64_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp);
99 void x86_64_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp);
100 void x86_64_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg);
101 void x86_64_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg);
102 void x86_64_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
103 void x86_64_alu_imm32_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
104 void x86_64_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
105 void x86_64_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
106 void x86_64_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
107 void x86_64_test_reg_reg(codegendata *cd, s8 reg, s8 dreg);
108 void x86_64_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg);
109 void x86_64_test_imm_reg(codegendata *cd, s8 imm, s8 reg);
110 void x86_64_testw_imm_reg(codegendata *cd, s8 imm, s8 reg);
111 void x86_64_testb_imm_reg(codegendata *cd, s8 imm, s8 reg);
112 void x86_64_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
113 void x86_64_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
114 void x86_64_inc_reg(codegendata *cd, s8 reg);
115 void x86_64_incl_reg(codegendata *cd, s8 reg);
116 void x86_64_inc_membase(codegendata *cd, s8 basereg, s8 disp);
117 void x86_64_incl_membase(codegendata *cd, s8 basereg, s8 disp);
118 void x86_64_dec_reg(codegendata *cd, s8 reg);
119 void x86_64_decl_reg(codegendata *cd, s8 reg);
120 void x86_64_dec_membase(codegendata *cd, s8 basereg, s8 disp);
121 void x86_64_decl_membase(codegendata *cd, s8 basereg, s8 disp);
122 void x86_64_cltd(codegendata *cd);
123 void x86_64_cqto(codegendata *cd);
124 void x86_64_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg);
125 void x86_64_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg);
126 void x86_64_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
127 void x86_64_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
128 void x86_64_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg);
129 void x86_64_imul_imm_reg_reg(codegendata *cd, s8 imm,s8 reg, s8 dreg);
130 void x86_64_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg);
131 void x86_64_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg);
132 void x86_64_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg);
133 void x86_64_idiv_reg(codegendata *cd, s8 reg);
134 void x86_64_idivl_reg(codegendata *cd, s8 reg);
135 void x86_64_ret(codegendata *cd);
136 void x86_64_shift_reg(codegendata *cd, s8 opc, s8 reg);
137 void x86_64_shiftl_reg(codegendata *cd, s8 opc, s8 reg);
138 void x86_64_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
139 void x86_64_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
140 void x86_64_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
141 void x86_64_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg);
142 void x86_64_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
143 void x86_64_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp);
144 void x86_64_jmp_imm(codegendata *cd, s8 imm);
145 void x86_64_jmp_reg(codegendata *cd, s8 reg);
146 void x86_64_jcc(codegendata *cd, s8 opc, s8 imm);
147 void x86_64_setcc_reg(codegendata *cd, s8 opc, s8 reg);
148 void x86_64_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp);
149 void x86_64_cmovcc_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
150 void x86_64_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg);
151 void x86_64_neg_reg(codegendata *cd, s8 reg);
152 void x86_64_negl_reg(codegendata *cd, s8 reg);
153 void x86_64_neg_membase(codegendata *cd, s8 basereg, s8 disp);
154 void x86_64_negl_membase(codegendata *cd, s8 basereg, s8 disp);
155 void x86_64_push_reg(codegendata *cd, s8 reg);
156 void x86_64_push_imm(codegendata *cd, s8 imm);
157 void x86_64_pop_reg(codegendata *cd, s8 reg);
158 void x86_64_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg);
159 void x86_64_nop(codegendata *cd);
160 void x86_64_call_reg(codegendata *cd, s8 reg);
161 void x86_64_call_imm(codegendata *cd, s8 imm);
162 void x86_64_call_mem(codegendata *cd, s8 mem);
163
164
165 /* floating point instructions (SSE2) */
166
167 void x86_64_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
168 void x86_64_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
169 void x86_64_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
170 void x86_64_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
171 void x86_64_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
172 void x86_64_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
173 void x86_64_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
174 void x86_64_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
175 void x86_64_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
176 void x86_64_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg);
177 void x86_64_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
178 void x86_64_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg);
179 void x86_64_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
180 void x86_64_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
181 void x86_64_movd_reg_freg(codegendata *cd, s8 reg, s8 freg);
182 void x86_64_movd_freg_reg(codegendata *cd, s8 freg, s8 reg);
183 void x86_64_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
184 void x86_64_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
185 void x86_64_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
186 void x86_64_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
187 void x86_64_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
188 void x86_64_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
189 void x86_64_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
190 void x86_64_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
191 void x86_64_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
192 void x86_64_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
193 void x86_64_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
194 void x86_64_movss_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
195 void x86_64_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
196 void x86_64_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
197 void x86_64_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
198 void x86_64_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
199 void x86_64_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
200 void x86_64_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
201 void x86_64_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
202 void x86_64_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
203 void x86_64_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
204 void x86_64_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
205 void x86_64_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
206 void x86_64_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);
207 void x86_64_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
208 void x86_64_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
209 void x86_64_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
210 void x86_64_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
211 void x86_64_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg);
212 void x86_64_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
213 void x86_64_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg);
214 void x86_64_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
215 void x86_64_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg);
216 void x86_64_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
217
218 #endif /* _EMITFUNCS_H */
219
220
221 /*
222  * These are local overrides for various environment variables in Emacs.
223  * Please do not remove this and leave it at the end of the file, where
224  * Emacs will automagically detect them.
225  * ---------------------------------------------------------------------
226  * Local variables:
227  * mode: c
228  * indent-tabs-mode: t
229  * c-basic-offset: 4
230  * tab-width: 4
231  * End:
232  */