2008-08-19 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / inssel-long.brg
1 %%
2
3 #
4 # inssel-long.brg: burg file for 64bit architectures
5 #
6 # Author:
7 #   Dietmar Maurer (dietmar@ximian.com)
8 #
9 # (C) 2002 Ximian, Inc.
10 #
11
12 reg: OP_I8CONST {
13         MONO_EMIT_NEW_I8CONST (s, state->reg1, tree->inst_l);
14 }
15
16 reg: CEE_LDIND_I8 (base) {
17         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI8_MEMBASE, state->reg1, 
18                                    state->left->tree->inst_basereg, state->left->tree->inst_offset);
19 }
20
21 stmt: CEE_STIND_I8 (base, reg) {
22         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STOREI8_MEMBASE_REG, state->left->tree->inst_basereg,
23                                  state->left->tree->inst_offset, state->right->reg1);
24 }
25
26 stmt: CEE_STIND_REF (base, OP_I8CONST),
27 stmt: CEE_STIND_I (base, OP_I8CONST),
28 stmt: CEE_STIND_I8 (base, OP_I8CONST),
29 stmt: CEE_STIND_REF (base, OP_ICONST),
30 stmt: CEE_STIND_I (base, OP_ICONST),
31 stmt: CEE_STIND_I8 (base, OP_ICONST) {
32         MONO_EMIT_STORE_MEMBASE_IMM (s, tree, OP_STOREI8_MEMBASE_IMM, state->left->tree->inst_basereg,
33                                      state->left->tree->inst_offset, state->right->tree->inst_l);
34 }
35
36 stmt: CEE_STIND_I8 (reg, reg) {
37         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STOREI8_MEMBASE_REG, state->left->tree->inst_basereg,
38                                  state->left->tree->inst_offset, state->right->reg1);
39 }
40
41 base: OP_LADD (base, OP_ICONST) "0" {
42         tree->inst_offset = state->left->tree->inst_offset + state->right->tree->inst_c0;
43         tree->inst_basereg = state->left->tree->inst_basereg;
44 }
45
46 base: OP_LADD (CEE_LDIND_REF (OP_REGVAR), OP_ICONST),
47 base: OP_LADD (CEE_LDIND_I (OP_REGVAR), OP_ICONST) "0" {
48         tree->inst_offset = state->right->tree->inst_c0;
49         tree->inst_basereg = state->left->left->tree->dreg;
50 }
51
52 reg: OP_LADD (reg, reg) {
53         MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1);
54 }
55
56 reg: OP_LADD (reg, OP_ICONST) {
57         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
58 }
59
60 reg: OP_LADD (reg, OP_ICONST) {
61         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
62 }
63
64 reg: OP_LADD (CEE_LDIND_I (OP_REGVAR), OP_ICONST),
65 reg: OP_LADD (CEE_LDIND_REF (OP_REGVAR), OP_ICONST) {
66         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->left->tree->dreg, state->right->tree->inst_c0);
67 }
68
69 reg: OP_LSUB (reg, reg) {
70         MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1);
71 }
72
73 reg: OP_LNEG (reg) {
74         MONO_EMIT_NEW_UNALU (s, CEE_NEG, state->reg1, state->left->reg1);
75 }
76
77 reg: OP_LNOT (reg) {
78         MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg1, state->left->reg1);
79 }
80
81 reg: OP_LAND (reg, reg) {
82         MONO_EMIT_NEW_BIALU (s, CEE_AND, state->reg1, state->left->reg1, state->right->reg1);
83 }
84
85 reg: OP_LOR (reg, reg) {
86         MONO_EMIT_NEW_BIALU (s, CEE_OR, state->reg1, state->left->reg1, state->right->reg1);
87 }
88
89 reg: OP_LXOR (reg, reg) {
90         MONO_EMIT_NEW_BIALU (s, CEE_XOR, state->reg1, state->left->reg1, state->right->reg1);
91 }
92
93
94 reg: OP_LADD_OVF (reg, reg) {
95         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
96         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
97 }
98
99 reg: OP_LADD_OVF_UN (reg, reg) {
100         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
101         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
102 }
103
104 reg: OP_LSUB_OVF (reg, reg) {
105         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
106         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
107 }
108
109 reg: OP_LSUB_OVF_UN (reg, reg) {
110         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
111         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
112 }
113
114 reg: OP_LSHR_UN_32 (reg) {
115         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, 32);
116 }
117
118 #
119 # shift operations
120 #
121
122 reg: OP_LSHL (reg, reg) {
123         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
124 }
125
126 reg: OP_LSHL (reg, OP_ICONST) {
127         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
128 }
129
130 reg: OP_LSHR (reg, reg) {
131         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
132 }
133
134 reg: OP_LSHR (reg, OP_ICONST) {
135         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
136 }
137
138 reg: OP_LSHR_UN (reg, reg) {
139         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
140 }
141
142 reg: OP_LSHR_UN (reg, OP_ICONST) {
143         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
144 }
145
146 #
147 # Conversions
148 #
149
150 reg: CEE_CONV_I8 (reg) {
151         /* Sign extend the value in the lower word into the upper word */
152         tree->sreg1 = state->left->reg1;
153         tree->dreg = state->reg1;
154         mono_bblock_add_inst (s->cbb, tree);    
155 }
156
157 reg: CEE_CONV_U8 (reg) {
158         /* Clean out the upper word */
159         /* Sign extend the value in the lower word into the upper word */
160         tree->sreg1 = state->left->reg1;
161         tree->dreg = state->reg1;
162         mono_bblock_add_inst (s->cbb, tree);
163 }
164
165 i8con: CEE_CONV_U8 (OP_ICONST) "0" {
166         /*
167          * This is needed since constant propagation eliminates some 
168      * stind.i4/ldind.i4 pairs, along with the conversions done by them.
169          */
170         int data = state->left->tree->inst_c0;
171         tree->opcode = OP_I8CONST;
172         tree->inst_ls_word = data;
173         tree->inst_ms_word = 0;
174 }
175
176 reg: OP_FCONV_TO_I8 (freg) {
177         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
178 }
179
180 reg: OP_FCONV_TO_U8 (freg) {
181         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
182 }
183
184 reg: OP_LCONV_TO_I4 (i8con) {
185      MONO_EMIT_NEW_ICONST (s, state->reg1, state->left->tree->inst_ls_word);
186 }
187
188 reg: OP_LCONV_TO_I4 (reg) {
189         /* Sign extend the value in the lower word into the upper word */
190         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, 0);
191 }
192
193 reg: OP_LCONV_TO_U4 (reg) {
194         /* Clean out the upper word */
195         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, 0);
196 }
197
198 reg: OP_LCONV_TO_U8 (reg) {
199         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
200 }
201
202 reg: OP_LCONV_TO_I8 (reg) {
203         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
204 }
205
206 reg: OP_LCONV_TO_U (reg) {
207         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
208 }
209
210 reg: OP_LCONV_TO_I (reg) {
211         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
212 }
213
214 reg: OP_LCONV_TO_I1 (reg) {
215         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
216 }
217
218 reg: OP_LCONV_TO_U1 (reg) {
219         MONO_EMIT_UNALU (s, tree, CEE_CONV_U1, state->reg1, state->left->reg1);
220 }
221
222 reg: OP_LCONV_TO_I2 (reg) {
223         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
224 }
225
226 reg: OP_LCONV_TO_U2 (reg) {
227         MONO_EMIT_UNALU (s, tree, CEE_CONV_U2, state->reg1, state->left->reg1);
228 }
229
230 reg: OP_LCONV_TO_OVF_I1 (reg) {
231         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 127, "OverflowException");
232         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -128, "OverflowException");
233         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
234 }
235
236 reg: OP_LCONV_TO_OVF_I1_UN (reg) {
237         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 127, "OverflowException");
238         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
239 }
240
241 reg: OP_LCONV_TO_OVF_U1 (reg) {
242         /* probe value to be within 0 to 255 */
243         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException");
244         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
245 }
246
247 reg: OP_LCONV_TO_OVF_U1_UN (reg) {
248         /* probe value to be within 0 to 255 */
249         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException");
250         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
251 }
252
253 reg: OP_LCONV_TO_OVF_I2 (reg) {
254         /* Probe value to be within -32768 and 32767 */
255         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 32767, "OverflowException");
256         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -32768, "OverflowException");
257         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
258 }
259
260 reg: OP_LCONV_TO_OVF_I2_UN (reg) {
261         /* Probe value to be within 0 and 32767 */
262         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 32767, "OverflowException");
263         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
264 }
265
266 reg: OP_LCONV_TO_OVF_U2 (reg) {
267         /* Probe value to be within 0 and 65535 */
268         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException");
269         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
270 }
271
272 reg: OP_LCONV_TO_OVF_U2_UN (reg) {
273         /* Probe value to be within 0 and 65535 */
274         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException");
275         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
276 }
277
278 reg: OP_LCONV_TO_OVF_I4 (reg) {
279         /* The int cast is needed for the VS compiler.  See Compiler Warning (level 2) C4146. */
280         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0x7fffffff, "OverflowException");
281         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, ((int)-2147483648), "OverflowException");
282         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
283 }
284
285 reg: OP_LCONV_TO_OVF_I4_UN (reg) {
286         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0x7fffffff, "OverflowException");
287         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
288 }
289
290 reg: OP_LCONV_TO_OVF_U4 (reg) {
291         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0xffffffffUL, "OverflowException");
292         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
293         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
294 }
295
296 reg: OP_LCONV_TO_OVF_U4_UN (reg) {
297         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffffffff, "OverflowException");
298         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
299 }
300
301 reg: OP_LCONV_TO_OVF_I_UN (reg),
302 reg: OP_LCONV_TO_OVF_I8_UN (reg) {
303         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
304         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
305 }
306
307 reg: OP_LCONV_TO_OVF_U8 (reg),
308 reg: OP_LCONV_TO_OVF_U (reg) {
309         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
310         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
311 }
312
313 reg: OP_LCONV_TO_OVF_I8 (reg),
314 reg: OP_LCONV_TO_OVF_U_UN (reg) {
315         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
316 }
317
318 reg: OP_LCONV_TO_OVF_U8_UN (reg) {
319         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
320 }
321
322 reg: OP_LCONV_TO_OVF_I (reg) {
323         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
324 }
325
326 freg: OP_LCONV_TO_R_UN (lreg) {
327         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
328 }
329
330 reg: CEE_CONV_OVF_I8 (reg),
331 reg: CEE_CONV_OVF_I (reg) {
332         /* Sign extend the value in the lower word into the upper word */
333         MONO_EMIT_UNALU (s, tree, CEE_CONV_I8, state->reg1, state->left->reg1);
334 }
335
336 reg: CEE_CONV_OVF_I8_UN (reg),
337 reg: CEE_CONV_OVF_U8_UN (reg),
338 reg: CEE_CONV_OVF_I_UN (reg),
339 reg: CEE_CONV_OVF_U_UN (reg) {
340         /* an unsigned 32 bit num always fits in an (un)signed 64 bit one */
341         /* Clean out the upper word */
342         MONO_EMIT_UNALU (s, tree, CEE_CONV_U8, state->reg1, state->left->reg1);
343 }
344
345 reg: CEE_CONV_OVF_U8 (reg),
346 reg: CEE_CONV_OVF_U (reg) {
347         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
348         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
349 }
350
351 reg: OP_LCALLVIRT (reg) {
352         mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE);
353 }
354
355 reg: OP_LCALLVIRT_IMT (reg, reg) {
356         tree->opcode = OP_LCALLVIRT;
357         mini_emit_virtual_imt_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE, state->right->reg1);
358 }
359
360 reg: OP_LCALL {
361         tree->dreg = state->reg1;
362         mono_bblock_add_inst (s->cbb, tree);
363 }
364
365 reg: OP_LCALL_RGCTX (reg) {
366         emit_rgctx_argument (s, tree, state->left->reg1, OP_LCALL);
367
368         tree->dreg = state->reg1;
369         mono_bblock_add_inst (s->cbb, tree);
370 }
371
372 reg: OP_LCALL_REG (reg) {
373         tree->sreg1 = state->left->reg1;
374         tree->dreg = state->reg1;
375         mono_bblock_add_inst (s->cbb, tree);
376 }
377
378 reg: OP_LCALL_REG_RGCTX (reg, reg) {
379         emit_rgctx_argument (s, tree, state->right->reg1, OP_LCALL_REG);
380
381         tree->sreg1 = state->left->reg1;
382         tree->dreg = state->reg1;
383         mono_bblock_add_inst (s->cbb, tree);
384 }
385
386 reg: OP_LCALL_REG (OP_ICONST),
387 reg: OP_LCALL_REG (OP_I8CONST) {
388         tree->opcode = OP_LCALL;
389         ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
390         tree->dreg = state->reg1;
391         mono_bblock_add_inst (s->cbb, tree);
392 }
393
394 stmt: CEE_STIND_I4 (OP_REGVAR, OP_ICONST) {
395         tree->inst_c0 = state->right->tree->inst_c0;
396         tree->opcode = OP_ICONST;
397         tree->dreg = state->left->tree->dreg;
398         mono_bblock_add_inst (s->cbb, tree);
399 }
400
401 stmt: CEE_STIND_I4 (OP_REGVAR, reg) {
402         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->reg1);
403 }
404
405 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (OP_REGVAR)) {
406         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->left->tree->dreg);
407 }
408
409 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (base)) {
410         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->left->tree->dreg, 
411                                    state->right->left->tree->inst_basereg, 
412                                    state->right->left->tree->inst_offset);
413 }
414
415 cflags: OP_LCOMPARE (reg, reg) {
416         tree->sreg1 = state->left->reg1;
417         tree->sreg2 = state->right->reg1;
418         mono_bblock_add_inst (s->cbb, tree);
419 }
420
421 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), reg) {
422         tree->sreg1 = state->left->left->tree->dreg;
423         tree->sreg2 = state->right->reg1;
424         mono_bblock_add_inst (s->cbb, tree);
425 }
426
427 cflags: OP_LCOMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
428         tree->sreg1 = state->left->left->tree->dreg;
429         tree->sreg2 = state->right->left->tree->dreg;
430         mono_bblock_add_inst (s->cbb, tree);
431 }
432
433 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), OP_ICONST) {
434         tree->opcode = OP_COMPARE_IMM;
435         tree->sreg1 = state->left->left->tree->dreg;
436         tree->inst_imm = state->right->tree->inst_c0;
437         mono_bblock_add_inst (s->cbb, tree);
438 } cost {
439         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
440
441         return 0;
442 }       
443
444 cflags: OP_LCOMPARE (reg, OP_ICONST) {
445         tree->opcode = OP_COMPARE_IMM;
446         tree->sreg1 = state->left->reg1;
447         tree->inst_imm = state->right->tree->inst_c0;
448         mono_bblock_add_inst (s->cbb, tree);
449 } cost {
450         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
451
452         return 0;
453 }       
454
455 cflags: OP_LCOMPARE (reg, OP_I8CONST) {
456         tree->opcode = OP_COMPARE_IMM;
457         tree->sreg1 = state->left->reg1;
458         tree->inst_imm = state->right->tree->inst_l;
459         mono_bblock_add_inst (s->cbb, tree);
460 } cost {
461         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_l));
462
463         return 0;
464 }       
465
466 stmt: CEE_BNE_UN (cflags) {
467         mono_bblock_add_inst (s->cbb, tree);
468 }
469
470 stmt: CEE_BEQ (cflags) {
471         mono_bblock_add_inst (s->cbb, tree);
472 }
473
474 stmt: CEE_BLT (cflags) {
475         mono_bblock_add_inst (s->cbb, tree);
476 }
477
478 stmt: CEE_BLT_UN (cflags) {
479         mono_bblock_add_inst (s->cbb, tree);
480 }
481
482 stmt: CEE_BGT (cflags) {
483         mono_bblock_add_inst (s->cbb, tree);
484 }
485
486 stmt: CEE_BGT_UN (cflags) {
487         mono_bblock_add_inst (s->cbb, tree);
488 }
489
490 stmt: CEE_BGE  (cflags) {
491         mono_bblock_add_inst (s->cbb, tree);
492 }
493
494 stmt: CEE_BGE_UN (cflags) {
495         mono_bblock_add_inst (s->cbb, tree);
496 }
497
498 stmt: CEE_BLE  (cflags) {
499         mono_bblock_add_inst (s->cbb, tree);
500 }
501
502 stmt: CEE_BLE_UN (cflags) {
503         mono_bblock_add_inst (s->cbb, tree);
504 }
505
506 #
507 # 32 bit rules
508 #
509
510 #
511 # basic alu operations
512 #
513
514 reg: CEE_AND (reg, reg) {
515         MONO_EMIT_BIALU (s, tree, OP_IAND, state->reg1, state->left->reg1, state->right->reg1);
516 }
517
518 reg: CEE_AND (reg, OP_ICONST) {
519         MONO_EMIT_BIALU_IMM (s, tree, OP_IAND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
520 }
521
522 reg: CEE_OR (reg, reg) {
523         MONO_EMIT_BIALU (s, tree, OP_IOR, state->reg1, state->left->reg1, state->right->reg1);
524 }
525
526 reg: CEE_OR (reg, OP_ICONST) {
527         MONO_EMIT_BIALU_IMM (s, tree, OP_IOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
528 }
529
530 reg: CEE_XOR (reg, reg) {
531         MONO_EMIT_BIALU (s, tree, OP_IXOR, state->reg1, state->left->reg1, state->right->reg1);
532 }
533
534 reg: CEE_XOR (reg, OP_ICONST) {
535         MONO_EMIT_BIALU_IMM (s, tree, OP_IXOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
536 }
537
538 reg: CEE_NEG (reg) {
539         MONO_EMIT_UNALU (s, tree, OP_INEG, state->reg1, state->left->reg1);
540 }
541
542 reg: CEE_NOT (reg) {
543         MONO_EMIT_UNALU (s, tree, OP_INOT, state->reg1, state->left->reg1);
544 }
545
546 reg: CEE_ADD (reg, reg) {
547         MONO_EMIT_BIALU (s, tree, OP_IADD, state->reg1, state->left->reg1, state->right->reg1);
548 }
549
550 reg: CEE_ADD (reg, OP_ICONST) {
551         MONO_EMIT_BIALU_IMM (s, tree, OP_IADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
552 }
553
554 reg: CEE_ADD_OVF (reg, reg) {
555         MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
556         MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
557 }
558
559 reg: CEE_ADD_OVF_UN (reg, reg) {
560         MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
561         MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
562 }
563
564 reg: CEE_SUB (reg, reg) {
565         MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->reg1);
566 }
567
568 reg: CEE_SUB (reg, CEE_LDIND_I4 (OP_REGVAR)) {
569         MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->left->tree->dreg);
570 }
571
572 reg: CEE_SUB (reg, OP_ICONST) {
573         MONO_EMIT_BIALU_IMM (s, tree, OP_ISUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
574 }
575
576 reg: CEE_SUB_OVF (reg, reg) {
577         MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
578         MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
579 }
580
581 reg: CEE_SUB_OVF_UN (reg, reg) {
582         MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
583         MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
584 }
585
586 #
587 # shift operations
588 #
589
590 reg: CEE_SHL (reg, reg) {
591         MONO_EMIT_BIALU (s, tree, OP_ISHL, state->reg1, state->left->reg1, state->right->reg1);
592 }
593
594 reg: CEE_SHL (reg, OP_ICONST) {
595         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
596 }
597
598 reg: CEE_SHR (reg, reg) {
599         MONO_EMIT_BIALU (s, tree, OP_ISHR, state->reg1, state->left->reg1, state->right->reg1);
600 }
601
602 reg: CEE_SHR (reg, OP_ICONST) {
603         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
604 }
605
606 reg: CEE_SHR_UN (reg, reg) {
607         MONO_EMIT_BIALU (s, tree, OP_ISHR_UN, state->reg1, state->left->reg1, state->right->reg1);
608 }
609
610 reg: CEE_SHR_UN (reg, OP_ICONST) {
611         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
612 }
613
614 #
615 # mult/div operations
616 #
617
618 reg: CEE_MUL (reg, reg) {
619         MONO_EMIT_BIALU (s, tree, OP_IMUL, state->reg1, state->left->reg1, state->right->reg1);
620 }
621
622 reg: CEE_MUL (reg, OP_ICONST) {
623         MONO_EMIT_BIALU_IMM (s, tree, OP_IMUL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
624 }
625
626 reg: CEE_MUL_OVF (reg, reg) {
627         MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF, state->reg1, state->left->reg1, state->right->reg1);
628 }
629
630 reg: CEE_MUL_OVF_UN (reg, reg) {
631         MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF_UN, state->reg1, state->left->reg1, state->right->reg1);
632 }
633
634 reg: CEE_DIV (reg, reg) {
635         MONO_EMIT_BIALU (s, tree, OP_IDIV, state->reg1, state->left->reg1, state->right->reg1);
636 }
637
638 #reg: CEE_DIV (reg, OP_ICONST) {
639 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
640 #}
641
642 reg: CEE_DIV_UN (reg, reg) {
643         MONO_EMIT_BIALU (s, tree, OP_IDIV_UN, state->reg1, state->left->reg1, state->right->reg1);
644 }
645
646 #reg: CEE_DIV_UN (reg, OP_ICONST) {
647 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
648 #}
649
650 reg: CEE_REM (reg, reg) {
651         MONO_EMIT_BIALU (s, tree, OP_IREM, state->reg1, state->left->reg1, state->right->reg1);
652 }
653
654 #reg: CEE_REM (reg, OP_ICONST) {
655 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
656 #}
657
658 reg: CEE_REM_UN (reg, reg) {
659         MONO_EMIT_BIALU (s, tree, OP_IREM_UN, state->reg1, state->left->reg1, state->right->reg1);
660 }
661
662 #reg: CEE_REM_UN (reg, OP_ICONST) {
663 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
664 #}
665
666 reg: OP_IMUL_IMM (reg) {
667         tree->sreg1 = state->left->reg1;
668         tree->dreg = state->reg1;
669         mono_bblock_add_inst (s->cbb, tree);
670 }
671
672 reg: OP_LMUL_IMM (reg) {
673         tree->sreg1 = state->left->reg1;
674         tree->dreg = state->reg1;
675         mono_bblock_add_inst (s->cbb, tree);
676 }
677
678 c32flags: OP_COMPARE (reg, reg) {
679         tree->opcode = OP_ICOMPARE;
680         tree->sreg1 = state->left->reg1;
681         tree->sreg2 = state->right->reg1;
682         mono_bblock_add_inst (s->cbb, tree);
683 }
684
685 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
686         tree->opcode = OP_ICOMPARE;
687         tree->sreg1 = state->left->left->tree->dreg;
688         tree->sreg2 = state->right->left->tree->dreg;
689         mono_bblock_add_inst (s->cbb, tree);
690 }
691
692 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), OP_ICONST) {
693         tree->opcode = OP_ICOMPARE_IMM;
694         tree->sreg1 = state->left->left->tree->dreg;
695         tree->inst_imm = state->right->tree->inst_c0;
696         mono_bblock_add_inst (s->cbb, tree);
697 }
698
699 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), reg) {
700         tree->opcode = OP_ICOMPARE;
701         tree->sreg1 = state->left->left->tree->dreg;
702         tree->sreg2 = state->right->reg1;
703         mono_bblock_add_inst (s->cbb, tree);
704 }
705
706 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST) {
707         tree->opcode = OP_ICOMPARE_IMM;
708         tree->sreg1 = state->left->left->tree->dreg;
709         tree->inst_imm = state->right->tree->inst_c0;
710         mono_bblock_add_inst (s->cbb, tree);
711 }
712
713 c32flags: OP_COMPARE (reg, OP_ICONST) {
714         tree->opcode = OP_ICOMPARE_IMM;
715         tree->sreg1 = state->left->reg1;
716         tree->inst_imm = state->right->tree->inst_c0;
717         mono_bblock_add_inst (s->cbb, tree);
718 }
719
720 stmt: CEE_BNE_UN (c32flags) {
721         tree->opcode = OP_IBNE_UN;
722         mono_bblock_add_inst (s->cbb, tree);
723 }
724
725 stmt: CEE_BEQ (c32flags) {
726         tree->opcode = OP_IBEQ;
727         mono_bblock_add_inst (s->cbb, tree);
728 }
729
730 stmt: CEE_BLT (c32flags) {
731         tree->opcode = OP_IBLT;
732         mono_bblock_add_inst (s->cbb, tree);
733 }
734
735 stmt: CEE_BLT_UN (c32flags) {
736         tree->opcode = OP_IBLT_UN;
737         mono_bblock_add_inst (s->cbb, tree);
738 }
739
740 stmt: CEE_BGT (c32flags) {
741         tree->opcode = OP_IBGT;
742         mono_bblock_add_inst (s->cbb, tree);
743 }
744
745 stmt: CEE_BGT_UN (c32flags) {
746         tree->opcode = OP_IBGT_UN;
747         mono_bblock_add_inst (s->cbb, tree);
748 }
749
750 stmt: CEE_BGE  (c32flags) {
751         tree->opcode = OP_IBGE;
752         mono_bblock_add_inst (s->cbb, tree);
753 }
754
755 stmt: CEE_BGE_UN (c32flags) {
756         tree->opcode = OP_IBGE_UN;
757         mono_bblock_add_inst (s->cbb, tree);
758 }
759
760 stmt: CEE_BLE  (c32flags) {
761         tree->opcode = OP_IBLE;
762         mono_bblock_add_inst (s->cbb, tree);
763 }
764
765 stmt: CEE_BLE_UN (c32flags) {
766         tree->opcode = OP_IBLE_UN;
767         mono_bblock_add_inst (s->cbb, tree);
768 }
769
770 reg: OP_CEQ (c32flags) {        
771         tree->opcode = OP_ICEQ;
772         tree->dreg = state->reg1;
773         mono_bblock_add_inst (s->cbb, tree);
774 }
775
776 reg: OP_CLT (c32flags) {        
777         tree->opcode = OP_ICLT;
778         tree->dreg = state->reg1;
779         mono_bblock_add_inst (s->cbb, tree);
780 }
781
782 reg: OP_CLT_UN (c32flags) {     
783         tree->opcode = OP_ICLT_UN;
784         tree->dreg = state->reg1;
785         mono_bblock_add_inst (s->cbb, tree);
786 }
787
788 reg: OP_CGT (c32flags) {        
789         tree->opcode = OP_ICGT;
790         tree->dreg = state->reg1;
791         mono_bblock_add_inst (s->cbb, tree);
792 }
793
794 reg: OP_CGT_UN (c32flags) {     
795         tree->opcode = OP_ICGT_UN;
796         tree->dreg = state->reg1;
797         mono_bblock_add_inst (s->cbb, tree);
798 }
799
800 %%