2005-08-22 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / inssel-ia64.brg
1
2 %%
3
4 #
5 # inssel-ia64.brg: burg file for special IA64 instructions
6 #
7 # Author:
8 #   Zoltan Varga (vargaz@gmail.com)
9 #
10 # (C) 2002 Ximian, Inc.
11 #
12
13 reg: CEE_LDIND_I8 (OP_REGVAR) {
14         state->reg1 = state->left->tree->dreg;
15 }
16
17 stmt: CEE_STIND_I8 (OP_REGVAR, reg) {
18         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->left->tree->dreg, state->right->reg1);
19 }
20
21 reg: CEE_LDIND_I1 (OP_REGVAR) {
22         MONO_EMIT_UNALU (s, tree, OP_SEXT_I1, state->reg1, state->left->tree->dreg);}
23
24 reg: CEE_LDIND_I2 (OP_REGVAR) {
25         MONO_EMIT_UNALU (s, tree, OP_SEXT_I2, state->reg1, state->left->tree->dreg);}
26
27 stmt: CEE_BEQ (fpcflags) {
28         tree->opcode = OP_FBEQ;
29         mono_bblock_add_inst (s->cbb, tree);
30 }
31
32 stmt: CEE_BNE_UN (fpcflags) {
33         tree->opcode = OP_FBNE_UN;
34         mono_bblock_add_inst (s->cbb, tree);
35 }
36
37 stmt: CEE_BLT (fpcflags) {
38         tree->opcode = OP_FBLT;
39         mono_bblock_add_inst (s->cbb, tree);
40 }
41
42 stmt: CEE_BLT_UN (fpcflags) {
43         tree->opcode = OP_FBLT_UN;
44         mono_bblock_add_inst (s->cbb, tree);
45 }
46
47 stmt: CEE_BGT (fpcflags) {
48         tree->opcode = OP_FBGT;
49         mono_bblock_add_inst (s->cbb, tree);
50 }
51
52 stmt: CEE_BGT_UN (fpcflags) {
53         tree->opcode = OP_FBGT_UN;
54         mono_bblock_add_inst (s->cbb, tree);
55 }
56
57 stmt: CEE_BGE  (fpcflags) {
58         tree->opcode = OP_FBGE;
59         mono_bblock_add_inst (s->cbb, tree);
60 }
61
62 stmt: CEE_BGE_UN (fpcflags) {
63         tree->opcode = OP_FBGE_UN;
64         mono_bblock_add_inst (s->cbb, tree);
65 }
66
67 stmt: CEE_BLE  (fpcflags) {
68         tree->opcode = OP_FBLE;
69         mono_bblock_add_inst (s->cbb, tree);
70 }
71
72 stmt: CEE_BLE_UN (fpcflags) {
73         tree->opcode = OP_FBLE_UN;
74         mono_bblock_add_inst (s->cbb, tree);
75 }
76
77 fpcflags: OP_COMPARE (freg, freg) {
78         tree->opcode = OP_FCOMPARE;
79         mono_bblock_add_inst (s->cbb, tree);
80 }
81
82 reg: OP_CEQ (fpcflags) {        
83         tree->dreg = state->reg1;
84         tree->opcode = OP_FCEQ;
85         mono_bblock_add_inst (s->cbb, tree);
86 }
87
88 reg: OP_CLT (fpcflags) {        
89         tree->dreg = state->reg1;
90         tree->opcode = OP_FCLT;
91         mono_bblock_add_inst (s->cbb, tree);
92 }
93
94 reg: OP_CLT_UN (fpcflags) {     
95         tree->dreg = state->reg1;
96         tree->opcode = OP_FCLT_UN;
97         mono_bblock_add_inst (s->cbb, tree);
98 }
99
100 reg: OP_CGT (fpcflags) {        
101         tree->dreg = state->reg1;
102         tree->opcode = OP_FCGT;
103         mono_bblock_add_inst (s->cbb, tree);
104 }
105
106 reg: OP_CGT_UN (fpcflags) {     
107         tree->dreg = state->reg1;
108         tree->opcode = OP_FCGT_UN;
109         mono_bblock_add_inst (s->cbb, tree);
110 }
111
112 freg: OP_LCONV_TO_R8 (reg) {
113         /* FIXME: Move this inssel-long.brg */
114         tree->sreg1 = state->left->reg1;
115         tree->dreg = state->reg1;
116         mono_bblock_add_inst (s->cbb, tree);
117 }
118
119 freg: OP_LCONV_TO_R4 (reg) {
120         /* FIXME: Move this inssel-long.brg */
121         tree->sreg1 = state->left->reg1;
122         tree->dreg = state->reg1;
123         mono_bblock_add_inst (s->cbb, tree);
124 }
125
126 stmt: OP_OUTARG_REG (reg) {     
127         /* FIXME: Move this to inssel.brg */
128         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
129
130         tree->opcode = OP_MOVE;
131         tree->sreg1 = state->left->reg1;
132         tree->dreg = mono_regstate_next_int (s->rs);
133         mono_bblock_add_inst (s->cbb, tree);
134
135         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
136 }
137
138 stmt: OP_OUTARG_REG (CEE_LDIND_I (base)),
139 stmt: OP_OUTARG_REG (CEE_LDIND_REF (base)),
140 stmt: OP_OUTARG_REG (CEE_LDIND_I1 (base)),
141 stmt: OP_OUTARG_REG (CEE_LDIND_U1 (base)),
142 stmt: OP_OUTARG_REG (CEE_LDIND_I2 (base)),
143 stmt: OP_OUTARG_REG (CEE_LDIND_U2 (base)),
144 stmt: OP_OUTARG_REG (CEE_LDIND_I4 (base)),
145 stmt: OP_OUTARG_REG (CEE_LDIND_U4 (base)),
146 stmt: OP_OUTARG_REG (CEE_LDIND_I8 (base)) {
147         /* FIXME: Move this to inssel.brg or inssel-long.brg */
148         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
149         guint32 dreg;
150         MonoInst *base = state->left->left->tree;
151
152         dreg = mono_regstate_next_int (s->rs);
153         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, ldind_to_load_membase (state->left->tree->opcode),
154                                         dreg, base->inst_basereg, base->inst_offset);
155
156         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
157 }
158
159 stmt: OP_OUTARG_REG (OP_I8CONST),
160 stmt: OP_OUTARG_REG (OP_ICONST) {
161         /* FIXME: Move this to inssel.brg or inssel-long.brg */
162         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
163
164         tree->opcode = OP_ICONST;
165         tree->inst_c0 = state->left->tree->inst_c0;
166         tree->dreg = mono_regstate_next_int (s->rs);
167         mono_bblock_add_inst (s->cbb, tree);
168
169         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
170 }
171
172 stmt: OP_OUTARG_REG (CEE_LDIND_I (OP_REGVAR)),
173 stmt: OP_OUTARG_REG (CEE_LDIND_I8 (OP_REGVAR)),
174 stmt: OP_OUTARG_REG (CEE_LDIND_I4 (OP_REGVAR)),
175 stmt: OP_OUTARG_REG (CEE_LDIND_U4 (OP_REGVAR)),
176 stmt: OP_OUTARG_REG (CEE_LDIND_REF (OP_REGVAR)) {       
177         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
178
179         tree->opcode = OP_MOVE;
180         tree->sreg1 = state->left->left->tree->dreg;
181         tree->dreg = mono_regstate_next_int (s->rs);
182         mono_bblock_add_inst (s->cbb, tree);
183
184         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
185 }
186
187 stmt: OP_OUTARG_FREG (freg) {
188         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
189
190         tree->opcode = OP_FMOVE;
191         tree->sreg1 = state->left->reg1;
192         tree->dreg = mono_regstate_next_float (s->rs);
193         mono_bblock_add_inst (s->cbb, tree);
194
195         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, TRUE);
196 }
197
198 stmt: OP_OUTARG (reg) {
199         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI8_MEMBASE_REG, IA64_SP, tree->inst_imm, state->left->reg1);
200 }
201
202 stmt: OP_OUTARG (freg) {
203         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER8_MEMBASE_REG, IA64_SP, tree->inst_imm, state->left->reg1);
204 }
205
206 stmt: OP_OUTARG_R4 (freg) {
207         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER4_MEMBASE_REG, IA64_SP, tree->inst_imm, state->left->reg1);
208 }
209
210 stmt: OP_OUTARG_REG (OP_LDADDR (OP_REGOFFSET)),
211 stmt: OP_OUTARG_REG (CEE_LDOBJ (OP_REGOFFSET)) {
212         /* FIXME: Move this to inssel.brg */
213         MonoCallInst *call = (MonoCallInst*)tree->inst_right;
214
215         tree->opcode = OP_ADD_IMM;
216         tree->sreg1 = state->left->left->tree->inst_basereg;
217         tree->inst_imm = state->left->left->tree->inst_offset;
218         tree->dreg = mono_regstate_next_int (s->rs);
219         mono_bblock_add_inst (s->cbb, tree);
220
221         mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
222 }
223
224 stmt: OP_SETRET (reg) {
225         tree->opcode = OP_MOVE;
226         tree->sreg1 = state->left->reg1;
227         tree->dreg = MONO_ARCH_RETREG1;
228         mono_bblock_add_inst (s->cbb, tree);
229 }
230
231 stmt: OP_SETRET (freg) {
232         tree->opcode = OP_FMOVE;
233         tree->sreg1 = state->left->reg1;
234         tree->dreg = MONO_ARCH_FRETREG1;
235         mono_bblock_add_inst (s->cbb, tree);
236 }
237
238 # Optimized call instructions
239 reg: OP_LCALL_REG (OP_ICONST),
240 reg: OP_LCALL_REG (OP_I8CONST) {
241         /* FIXME: Move this to inssel-long.brg */
242         tree->opcode = OP_LCALL;
243         ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
244         tree->dreg = state->reg1;
245         mono_bblock_add_inst (s->cbb, tree);
246 }
247
248 stmt: OP_OUTARG_VT (CEE_LDOBJ (base), base) {
249         MonoInst *vt = state->left->left->tree;
250         MonoInst *stack_addr = state->right->tree;
251         int sz = stack_addr->inst_imm;
252
253         if (!sz)
254                 return;
255
256         mini_emit_memcpy (s, stack_addr->inst_basereg, stack_addr->inst_offset, vt->inst_basereg, vt->inst_offset, sz, 0);
257 }
258
259 # This handles trees like outarg_vt (refanytype)
260 stmt: OP_OUTARG_VT (reg, base) {
261         MonoInst *stack_addr = state->right->tree;
262
263         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI8_MEMBASE_REG, stack_addr->inst_basereg, stack_addr->inst_offset, state->left->reg1);
264 }
265
266 stmt: OP_START_HANDLER {
267      mono_bblock_add_inst (s->cbb, tree);
268 }
269
270 stmt: CEE_ENDFINALLY {
271      mono_bblock_add_inst (s->cbb, tree);
272 }
273
274 stmt: OP_ENDFILTER (reg) {
275         tree->sreg1 = state->left->reg1;
276         mono_bblock_add_inst (s->cbb, tree);
277 }
278
279 reg: OP_LOCALLOC (reg) {
280         tree->sreg1 = state->left->reg1;
281         tree->dreg = state->reg1;
282         mono_bblock_add_inst (s->cbb, tree);
283 }
284
285 reg: CEE_LDIND_REF (OP_REGVAR),
286 reg: CEE_LDIND_I (OP_REGVAR),
287 reg: CEE_LDIND_I8 (OP_REGVAR),
288 reg: CEE_LDIND_I4 (OP_REGVAR),
289 reg: CEE_LDIND_U4 (OP_REGVAR) "0" {
290         state->reg1 = state->left->tree->dreg;
291         tree->dreg = state->reg1;
292 }
293
294 %%