* mini-s390[x].c (is_regsize_var): Support PTR/FNPTR too.
[mono.git] / mono / mini / inssel-long32.brg
blobb5909257bf9cb1e6f37662be892684d7b26f5fb6
1 %%
4 # inssel-long32.brg: burg file for integer instructions on 32bit architectures
6 # Author:
7 #   Dietmar Maurer (dietmar@ximian.com)
9 # (C) 2002 Ximian, Inc.
13 # 32 bit rules
17 # basic alu operations
20 reg: CEE_AND (reg, reg),
21 reg: CEE_OR (reg, reg),
22 reg: CEE_XOR (reg, reg),
23 reg: CEE_ADD (reg, reg),
24 reg: CEE_SUB (reg, reg),
25 reg: CEE_MUL (reg, reg),
26 reg: CEE_MUL_OVF (reg, reg),
27 reg: CEE_MUL_OVF_UN (reg, reg),
28 reg: CEE_DIV (reg, reg),
29 reg: CEE_DIV_UN (reg, reg),
30 reg: CEE_REM (reg, reg),
31 reg: CEE_REM_UN (reg, reg),
32 reg: CEE_SHL (reg, reg),
33 reg: CEE_SHR (reg, reg),
34 reg: CEE_SHR_UN (reg, reg) {
35         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
38 reg: CEE_NEG (reg),
39 reg: CEE_NOT (reg) {
40         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
44 reg: CEE_AND (reg, OP_ICONST) {
45         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
48 reg: CEE_OR (reg, OP_ICONST) {
49         MONO_EMIT_BIALU_IMM (s, tree, OP_OR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
52 reg: CEE_XOR (reg, OP_ICONST) {
53         MONO_EMIT_BIALU_IMM (s, tree, OP_XOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
56 reg: CEE_ADD (reg, OP_ICONST) {
57         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
60 reg: CEE_SUB (reg, OP_ICONST) {
61         MONO_EMIT_BIALU_IMM (s, tree, OP_SUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
64 reg: CEE_MUL (reg, OP_ICONST) {
65         MONO_EMIT_BIALU_IMM (s, tree, OP_MUL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
68 reg: CEE_SHL (reg, OP_ICONST) {
69         MONO_EMIT_BIALU_IMM (s, tree, OP_SHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
72 reg: CEE_SHR (reg, OP_ICONST) {
73         MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
76 reg: CEE_SHR_UN (reg, OP_ICONST) {
77         MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
80 reg: CEE_ADD_OVF (reg, reg) {
81         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
82         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
85 reg: CEE_ADD_OVF_UN (reg, reg) {
86         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
87         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
90 reg: CEE_SUB (reg, CEE_LDIND_I4 (OP_REGVAR)) {
91         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->left->tree->dreg);
94 reg: CEE_SUB_OVF (reg, reg) {
95         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
96         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
99 reg: CEE_SUB_OVF_UN (reg, reg) {
100         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
101         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
104 cflags: OP_COMPARE (reg, reg) {
105         tree->sreg1 = state->left->reg1;
106         tree->sreg2 = state->right->reg1;
107         mono_bblock_add_inst (s->cbb, tree);
110 cflags: OP_COMPARE (CEE_LDIND_REF (OP_REGVAR), reg),
111 cflags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), reg),
112 cflags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), reg),
113 cflags: OP_COMPARE (CEE_LDIND_U4 (OP_REGVAR), reg) {
114         tree->sreg1 = state->left->left->tree->dreg;
115         tree->sreg2 = state->right->reg1;
116         mono_bblock_add_inst (s->cbb, tree);
119 cflags: OP_COMPARE (CEE_LDIND_REF (OP_REGVAR), CEE_LDIND_REF (OP_REGVAR)),
120 cflags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)),
121 cflags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), CEE_LDIND_I4 (OP_REGVAR)),
122 cflags: OP_COMPARE (CEE_LDIND_U4 (OP_REGVAR), CEE_LDIND_U4 (OP_REGVAR)) {
123         tree->sreg1 = state->left->left->tree->dreg;
124         tree->sreg2 = state->right->left->tree->dreg;
125         mono_bblock_add_inst (s->cbb, tree);
128 cflags: OP_COMPARE (CEE_LDIND_REF (OP_REGVAR), OP_ICONST),
129 cflags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), OP_ICONST),
130 cflags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST),
131 cflags: OP_COMPARE (CEE_LDIND_U4 (OP_REGVAR), OP_ICONST) {
132         tree->opcode = OP_COMPARE_IMM;
133         tree->sreg1 = state->left->left->tree->dreg;
134         tree->inst_imm = state->right->tree->inst_c0;
135         mono_bblock_add_inst (s->cbb, tree);
138 cflags: OP_COMPARE (reg, OP_ICONST) {
139         tree->opcode = OP_COMPARE_IMM;
140         tree->sreg1 = state->left->reg1;
141         tree->inst_imm = state->right->tree->inst_c0;
142         mono_bblock_add_inst (s->cbb, tree);
145 stmt: CEE_BNE_UN (cflags),
146 stmt: CEE_BEQ (cflags),
147 stmt: CEE_BLT (cflags),
148 stmt: CEE_BLT_UN (cflags),
149 stmt: CEE_BGT (cflags),
150 stmt: CEE_BGT_UN (cflags),
151 stmt: CEE_BGE  (cflags),
152 stmt: CEE_BGE_UN (cflags),
153 stmt: CEE_BLE  (cflags),
154 stmt: CEE_BLE_UN (cflags) {
155         mono_bblock_add_inst (s->cbb, tree);
158 reg: OP_CEQ (cflags),
159 reg: OP_CLT (cflags),
160 reg: OP_CLT_UN (cflags),
161 reg: OP_CGT (cflags),
162 reg: OP_CGT_UN (cflags) {       
163         tree->dreg = state->reg1;
164         mono_bblock_add_inst (s->cbb, tree);
168 # 64 bit rules
172 # We use a new non-terminal called "lreg" for 64bit registers, and
173 # emulate lreg with 2 32bit registers.
176 stmt: CEE_POP (lreg) {
177         /* do nothing */
180 i8con: CEE_CONV_I8 (OP_ICONST) "0" {
181        int data = state->left->tree->inst_c0;
182         tree->opcode = OP_I8CONST;
183         tree->inst_ls_word = data;
184         if (data < 0)
185                 tree->inst_ms_word = -1;
186         else
187                 tree->inst_ms_word = 0;
190 i8con: CEE_CONV_U8 (OP_ICONST) "0" {
191         int data = state->left->tree->inst_c0;
192         tree->opcode = OP_I8CONST;
193         tree->inst_ls_word = data;
194         tree->inst_ms_word = 0;
197 i8con: OP_I8CONST "0"
199 lreg: OP_ICONST {
200        int data = state->tree->inst_c0;
202        MONO_EMIT_NEW_ICONST (s, state->reg1, data);
204        if (data >= 0)
205                MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
206        else 
207                MONO_EMIT_NEW_ICONST (s, state->reg2, -1);
210 lreg: OP_I8CONST {
211         MONO_EMIT_NEW_ICONST (s, state->reg1, tree->inst_ls_word);
212         MONO_EMIT_NEW_ICONST (s, state->reg2, tree->inst_ms_word);
215 lreg: CEE_LDIND_I8 (base) {
216         MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
217                                        state->left->tree->inst_basereg, state->left->tree->inst_offset + MINI_LS_WORD_OFFSET);
218         MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg2, 
219                                        state->left->tree->inst_basereg, state->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
222 stmt: CEE_STIND_I8 (base, lreg) {
223         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, state->left->tree->inst_basereg,
224                                      state->left->tree->inst_offset + MINI_MS_WORD_OFFSET, state->right->reg2);
225         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, state->left->tree->inst_basereg,
226                                      state->left->tree->inst_offset + MINI_LS_WORD_OFFSET, state->right->reg1);
229 stmt: CEE_STIND_I8 (base, i8con) {
230         MONO_EMIT_NEW_STORE_MEMBASE_IMM (s, OP_STOREI4_MEMBASE_IMM, state->left->tree->inst_basereg,
231                                          state->left->tree->inst_offset + MINI_MS_WORD_OFFSET, state->right->tree->inst_ms_word);
232         MONO_EMIT_NEW_STORE_MEMBASE_IMM (s, OP_STOREI4_MEMBASE_IMM, state->left->tree->inst_basereg,
233                                          state->left->tree->inst_offset + MINI_LS_WORD_OFFSET, state->right->tree->inst_ls_word);
236 lreg: OP_BIGMUL (reg, reg),
237 lreg: OP_BIGMUL_UN (reg, reg) {
238         MONO_EMIT_NEW_BIALU (s, tree->opcode, state->reg1, state->left->reg1, state->right->reg1); 
241 lreg: OP_LONG_SHRUN_32 (lreg) {
242         /* just move the upper half to the lower and zero the high word */
243         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg2);
244         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
247 reg: OP_LCONV_TO_I4 (OP_LONG_SHRUN_32 (lreg)),
248 reg: OP_LCONV_TO_U4 (OP_LONG_SHRUN_32 (lreg)) {
249         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->left->reg2);
253 lreg: OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base)) {
254         /* just move the upper half to the lower and zero the high word */
255         MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
256                                        state->left->left->tree->inst_basereg, state->left->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
257         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
260 reg: OP_LCONV_TO_I4 (OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base))),
261 reg: OP_LCONV_TO_U4 (OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base))) {
262         /* just move the upper half to the lower and zero the high word */
263         MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
264                                        state->left->left->left->tree->inst_basereg,
265                                        state->left->left->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
268 lreg: OP_LADD (lreg, lreg) {
269         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
270         MONO_EMIT_BIALU (s, tree, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
273 lreg: OP_LADD_OVF (lreg, lreg) {
274         /* ADC sets the condition code */
275         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
276         MONO_EMIT_NEW_BIALU (s, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
277         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
280 lreg: OP_LADD_OVF_UN (lreg, lreg) {
281         /* ADC sets the condition code */
282         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
283         MONO_EMIT_NEW_BIALU (s, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
284         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
287 lreg: OP_LADD (lreg, i8con) {
288         MONO_EMIT_NEW_BIALU_IMM (s, OP_ADDCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
289         MONO_EMIT_BIALU_IMM (s, tree, OP_ADC_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
292 lreg: OP_LSUB (lreg, lreg) {
293         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
294         MONO_EMIT_BIALU (s, tree, OP_SBB, state->reg2, state->left->reg2, state->right->reg2);
297 lreg: OP_LSUB (lreg, i8con) {
298         MONO_EMIT_NEW_BIALU_IMM (s, OP_SUBCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
299         MONO_EMIT_BIALU_IMM (s, tree, OP_SBB_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
302 lreg: OP_LSUB_OVF (lreg, lreg) {
303         /* SBB sets the condition code */
304         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
305         MONO_EMIT_NEW_BIALU (s, OP_SBB, state->reg2, state->left->reg2, state->right->reg2);
306         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
309 lreg: OP_LSUB_OVF_UN (lreg, lreg) {
310         /* SBB sets the condition code */
311         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
312         MONO_EMIT_NEW_BIALU (s, OP_SBB, state->reg2, state->left->reg2, state->right->reg2);
313         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
316 lreg: OP_LAND (lreg, lreg) {    
317         MONO_EMIT_NEW_BIALU (s, CEE_AND, state->reg1, state->left->reg1, state->right->reg1);
318         MONO_EMIT_BIALU (s, tree, CEE_AND, state->reg2, state->left->reg2, state->right->reg2);
321 lreg: OP_LAND (lreg, i8con) {   
322         MONO_EMIT_NEW_BIALU_IMM (s, OP_AND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
323         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
326 lreg: OP_LOR (lreg, lreg) {
327         MONO_EMIT_NEW_BIALU (s, CEE_OR, state->reg1, state->left->reg1, state->right->reg1);
328         MONO_EMIT_BIALU (s, tree, CEE_OR, state->reg2, state->left->reg2, state->right->reg2);
331 lreg: OP_LOR (lreg, i8con) {
332         MONO_EMIT_NEW_BIALU_IMM (s, OP_OR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
333         MONO_EMIT_BIALU_IMM (s, tree, OP_OR_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
336 lreg: OP_LXOR (lreg, lreg) {
337         MONO_EMIT_NEW_BIALU (s, CEE_XOR, state->reg1, state->left->reg1, state->right->reg1);
338         MONO_EMIT_BIALU (s, tree, CEE_XOR, state->reg2, state->left->reg2, state->right->reg2);
341 lreg: OP_LXOR (lreg, i8con) {
342         MONO_EMIT_NEW_BIALU_IMM (s, OP_XOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
343         MONO_EMIT_BIALU_IMM (s, tree, OP_XOR_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
346 lreg: OP_LNOT (lreg) {
347         MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg1, state->left->reg1);
348         MONO_EMIT_UNALU (s, tree, CEE_NOT, state->reg2, state->left->reg2);
351 lreg: OP_LNEG (lreg) "4" {
352         MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg1, state->left->reg1);
353         MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg2, state->left->reg2);
354         /* ADC sets the condition codes */
355         MONO_EMIT_NEW_BIALU_IMM (s, OP_ADC_IMM, state->reg1, state->reg1, 1);
356         MONO_EMIT_BIALU_IMM (s, tree, OP_ADC_IMM, state->reg2, state->reg2, 0);
359 reg: OP_CEQ (OP_LCOMPARE (lreg, lreg)) {        
360         MonoInst *word_differs;
361         
362         MONO_NEW_LABEL (s, word_differs);
364         MONO_EMIT_NEW_ICONST (s, state->reg1, 0);
365         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
366         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, word_differs);
367         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
368         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, word_differs);
369         MONO_EMIT_NEW_ICONST (s, state->reg1, 1);
370         
371         mono_bblock_add_inst (s->cbb, word_differs);
374 reg: OP_CLT (OP_LCOMPARE (lreg, lreg)) {        
375         MonoInst *set_to_0, *set_to_1;
376         
377         MONO_NEW_LABEL (s, set_to_0);
378         MONO_NEW_LABEL (s, set_to_1);
380         MONO_EMIT_NEW_ICONST (s, state->reg1, 0);
381         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
382         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGT, set_to_0);
383         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, set_to_1);
384         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
385         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGE_UN, set_to_0);
386         mono_bblock_add_inst (s->cbb, set_to_1);
387         MONO_EMIT_NEW_ICONST (s, state->reg1, 1);
388         mono_bblock_add_inst (s->cbb, set_to_0);
389 }       
391 reg: OP_CLT_UN (OP_LCOMPARE (lreg, lreg)) {     
392         MonoInst *set_to_0, *set_to_1;
393         
394         MONO_NEW_LABEL (s, set_to_0);
395         MONO_NEW_LABEL (s, set_to_1);
397         MONO_EMIT_NEW_ICONST (s, state->reg1, 0);
398         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
399         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGT_UN, set_to_0);
400         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, set_to_1);
401         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
402         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGE_UN, set_to_0);
403         mono_bblock_add_inst (s->cbb, set_to_1);
404         MONO_EMIT_NEW_ICONST (s, state->reg1, 1);
405         mono_bblock_add_inst (s->cbb, set_to_0);
406 }       
408 reg: OP_CGT (OP_LCOMPARE (lreg, lreg)) {        
409         MonoInst *set_to_0, *set_to_1;
410         
411         MONO_NEW_LABEL (s, set_to_0);
412         MONO_NEW_LABEL (s, set_to_1);
414         MONO_EMIT_NEW_ICONST (s, state->reg1, 0);
415         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->right->reg2, state->left->left->reg2);
416         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGT, set_to_0);
417         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, set_to_1);
418         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->right->reg1, state->left->left->reg1);
419         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGE_UN, set_to_0);
420         mono_bblock_add_inst (s->cbb, set_to_1);
421         MONO_EMIT_NEW_ICONST (s, state->reg1, 1);
422         mono_bblock_add_inst (s->cbb, set_to_0);
423 }       
425 reg: OP_CGT_UN (OP_LCOMPARE (lreg, lreg)) {     
426         MonoInst *set_to_0, *set_to_1;
427         
428         MONO_NEW_LABEL (s, set_to_0);
429         MONO_NEW_LABEL (s, set_to_1);
431         MONO_EMIT_NEW_ICONST (s, state->reg1, 0);
432         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->right->reg2, state->left->left->reg2);
433         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGT_UN, set_to_0);
434         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BNE_UN, set_to_1);
435         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->right->reg1, state->left->left->reg1);
436         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BGE_UN, set_to_0);
437         mono_bblock_add_inst (s->cbb, set_to_1);
438         MONO_EMIT_NEW_ICONST (s, state->reg1, 1);
439         mono_bblock_add_inst (s->cbb, set_to_0);
440 }       
442 stmt: CEE_BNE_UN (OP_LCOMPARE (lreg, lreg)) {
443         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
444         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_true_bb);
445         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
446         mono_bblock_add_inst (s->cbb, tree);
449 stmt: CEE_BNE_UN (OP_LCOMPARE (lreg, i8con)) {
450         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
451         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_true_bb);
452         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
453         mono_bblock_add_inst (s->cbb, tree);
456 stmt: CEE_BEQ (OP_LCOMPARE (lreg, lreg)) {
457         
458         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
459         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
460         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
461         mono_bblock_add_inst (s->cbb, tree);
464 stmt: CEE_BEQ (OP_LCOMPARE (lreg, i8con)) {
465         
466         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
467         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
468         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
469         mono_bblock_add_inst (s->cbb, tree);
472 stmt: CEE_BLE (OP_LCOMPARE (lreg, lreg)) {
474         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
475         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT, tree->inst_true_bb);
476         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
477         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
478         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLE_UN, tree->inst_true_bb);
481 stmt: CEE_BLE (OP_LCOMPARE (lreg, i8con)) {
483         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
484         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT, tree->inst_true_bb);
485         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
486         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
487         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLE_UN, tree->inst_true_bb);
490 stmt: CEE_BLE_UN (OP_LCOMPARE (lreg, lreg)) {
492         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
493         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
494         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
495         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
496         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLE_UN, tree->inst_true_bb);
499 stmt: CEE_BLE_UN (OP_LCOMPARE (lreg, i8con)) {
501         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
502         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
503         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
504         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
505         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLE_UN, tree->inst_true_bb);
508 stmt: CEE_BGE (OP_LCOMPARE (lreg, lreg)) {
510         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
511         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT, tree->inst_true_bb);
512         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
513         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
514         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGE_UN, tree->inst_true_bb);
517 stmt: CEE_BGE (OP_LCOMPARE (lreg, i8con)) {
519         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
520         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT, tree->inst_true_bb);
521         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
522         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
523         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGE_UN, tree->inst_true_bb);
526 stmt: CEE_BGE_UN (OP_LCOMPARE (lreg, lreg)) {
528         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
529         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
530         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
531         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
532         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGE_UN, tree->inst_true_bb);
535 stmt: CEE_BGE_UN (OP_LCOMPARE (lreg, i8con)) {
537         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
538         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
539         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
540         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
541         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGE_UN, tree->inst_true_bb);
544 stmt: CEE_BLT (OP_LCOMPARE (lreg, lreg)) {
546         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
547         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT, tree->inst_true_bb);
548         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
549         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
550         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
553 stmt: CEE_BLT (OP_LCOMPARE (lreg, i8con)) {
555         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
556         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT, tree->inst_true_bb);
557         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
558         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
559         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
562 stmt: CEE_BLT_UN (OP_LCOMPARE (lreg, lreg)) {
564         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
565         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
566         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
567         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
568         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
571 stmt: CEE_BLT_UN (OP_LCOMPARE (lreg, i8con)) {
573         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
574         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
575         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
576         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
577         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BLT_UN, tree->inst_true_bb);
580 stmt: CEE_BGT (OP_LCOMPARE (lreg, lreg)) {
582         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
583         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT, tree->inst_true_bb);
584         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
585         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
586         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
589 stmt: CEE_BGT (OP_LCOMPARE (lreg, i8con)) {
591         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
592         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT, tree->inst_true_bb);
593         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
594         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
595         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
598 stmt: CEE_BGT_UN (OP_LCOMPARE (lreg, lreg)) {
600         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg2, state->left->right->reg2);
601         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
602         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
603         MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, state->left->left->reg1, state->left->right->reg1);
604         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
607 stmt: CEE_BGT_UN (OP_LCOMPARE (lreg, i8con)) {
609         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg2, state->left->right->tree->inst_ms_word);
610         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
611         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BNE_UN, tree->inst_false_bb);
612         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->left->reg1, state->left->right->tree->inst_ls_word);
613         MONO_EMIT_NEW_BRANCH_BLOCK (s, CEE_BGT_UN, tree->inst_true_bb);
616 lreg: CEE_CONV_I8 (OP_ICONST) {
617         int data = state->left->tree->inst_c0;
619        MONO_EMIT_NEW_ICONST (s, state->reg1, data);
621        if (data >= 0)
622                MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
623        else 
624                MONO_EMIT_NEW_ICONST (s, state->reg2, -1);
627 lreg: CEE_CONV_I8 (reg) {
628         int tmpreg = mono_regstate_next_int (s->rs);
629         
630         /* branchless code:
631          * low = reg;
632          * tmp = low > -1 ? 1: 0;
633          * high = tmp - 1; if low is zero or pos high becomes 0, else -1
634          */
635         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
636         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->reg1, -1);
637         tree->dreg = tmpreg;
638         tree->opcode = OP_CGT;
639         mono_bblock_add_inst (s->cbb, tree);
640         MONO_EMIT_NEW_BIALU_IMM (s, OP_SUB_IMM, state->reg2, tmpreg, 1);
643 lreg: CEE_CONV_U8 (reg) {
644         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
645         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
648 lreg: CEE_CONV_OVF_U8 (reg) {
649         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0);
650         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
651         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
652         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
655 lreg: CEE_CONV_OVF_I8 (reg) {
656         /* a signed 32 bit num always fits in a signed 64 bit one */
657         MONO_EMIT_NEW_BIALU_IMM (s, OP_SHR_IMM, state->reg2, state->left->reg1, 31);
658         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
661 lreg: CEE_CONV_OVF_I8_UN (reg) {
662         /* an unsigned 32 bit num always fits in a signed 64 bit one */
663         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
664         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
667 lreg: CEE_CONV_OVF_U8_UN (reg) {
668         MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
669         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
672 freg: OP_LCONV_TO_R_UN (lreg) {
673         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->left->reg2);
676 lreg: OP_FCONV_TO_I8 (freg) {
677         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
680 lreg: OP_FCONV_TO_U8 (freg) {
681         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
684 reg: OP_LCONV_TO_I4 (i8con) {
685         MONO_EMIT_NEW_ICONST (s, state->reg1, state->left->tree->inst_ls_word);
688 reg: OP_LCONV_TO_I4 (lreg),
689 reg: OP_LCONV_TO_U4 (lreg) {
690         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
693 reg: OP_LCONV_TO_I4 (CEE_LDIND_I8 (base)),
694 reg: OP_LCONV_TO_U4 (CEE_LDIND_I8 (base)) {
695         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->reg1, 
696                                    state->left->left->tree->inst_basereg, 
697                                    state->left->left->tree->inst_offset + MINI_LS_WORD_OFFSET);
700 lreg: OP_LCONV_TO_U8 (lreg),
701 lreg: OP_LCONV_TO_I8 (lreg) {
702         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
703         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
706 reg: OP_LCONV_TO_U (lreg),
707 reg: OP_LCONV_TO_I (lreg) {
708         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
711 reg: OP_LCONV_TO_I1 (lreg) {
712         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
715 reg: OP_LCONV_TO_U1 (lreg) {
716         MONO_EMIT_UNALU (s, tree, CEE_CONV_U1, state->reg1, state->left->reg1);
719 reg: OP_LCONV_TO_I2 (lreg) {
720         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
723 reg: OP_LCONV_TO_U2 (lreg) {
724         MONO_EMIT_UNALU (s, tree, CEE_CONV_U2, state->reg1, state->left->reg1);
727 reg: OP_LCONV_TO_OVF_I1_UN (lreg) {
728         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
729         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
731         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127);
732         MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
733         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128);
734         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
735         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
738 reg: OP_LCONV_TO_OVF_I1 (lreg) {
739         MonoInst *is_negative, *end_label;
741         MONO_NEW_LABEL (s, is_negative);
742         MONO_NEW_LABEL (s, end_label);
744         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
745         MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
746         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, -1);
747         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
749         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
750         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BLT, is_negative);
752         /* Positive */
753         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127);
754         MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
755         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BR, end_label);
757         /* Negative */
758         mono_bblock_add_inst (s->cbb, is_negative);
759         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128);
760         MONO_EMIT_NEW_COND_EXC (s, LT_UN, "OverflowException");
761         mono_bblock_add_inst (s->cbb, end_label);
763         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
766 reg: OP_LCONV_TO_OVF_U1_UN (lreg),
767 reg: OP_LCONV_TO_OVF_U1 (lreg) {
768         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
769         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
771         /* probe value to be within 0 to 255 */
772         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 255);
773         MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
774         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
777 reg: OP_LCONV_TO_OVF_I2 (lreg) {
778         MonoInst *is_negative, *end_label;
780         MONO_NEW_LABEL (s, is_negative);
781         MONO_NEW_LABEL (s, end_label);
783         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
784         MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
785         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, -1);
786         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
788         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
789         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BLT, is_negative);
791         /* Positive */
792         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 32767);
793         MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
794         MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BR, end_label);
796         /* Negative */
797         mono_bblock_add_inst (s->cbb, is_negative);
798         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -32768);
799         MONO_EMIT_NEW_COND_EXC (s, LT_UN, "OverflowException");
800         mono_bblock_add_inst (s->cbb, end_label);
802         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
805 reg: OP_LCONV_TO_OVF_I2_UN (lreg) {
806         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
807         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
809         /* Probe value to be within -32768 and 32767 */
810         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 32767);
811         MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
812         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -32768);
813         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
814         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
817 reg: OP_LCONV_TO_OVF_U2_UN (lreg),
818 reg: OP_LCONV_TO_OVF_U2 (lreg) {
819         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
820         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
822         /* Probe value to be within 0 and 65535 */
823         MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffff);
824         MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
825         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
829 reg: OP_LCONV_TO_OVF_U4_UN (lreg) {
830         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
831         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
832         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
835 reg: OP_LCONV_TO_OVF_I_UN (lreg) {
836         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
837         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
838         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
841 reg: OP_LCONV_TO_OVF_U4 (lreg) {
842         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
843         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
844         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
847 reg: OP_LCONV_TO_OVF_I (lreg) {
848         tree->dreg = state->reg1;
849         tree->sreg1 = state->left->reg1;
850         tree->sreg2 = state->left->reg2;
851         mono_bblock_add_inst (s->cbb, tree);
854 reg: OP_LCONV_TO_OVF_I4_UN (lreg) {
855         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
856         MONO_EMIT_NEW_COND_EXC (s, NE_UN, "OverflowException");
857         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0);
858         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
859         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
862 reg: OP_LCONV_TO_OVF_I4 (lreg) {
863         tree->dreg = state->reg1;
864         tree->sreg1 = state->left->reg1;
865         tree->sreg2 = state->left->reg2;
866         tree->opcode = OP_LCONV_TO_OVF_I;
867         mono_bblock_add_inst (s->cbb, tree);
870 lreg: OP_LCONV_TO_OVF_I8_UN (lreg) {
871         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
872         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
874         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
875         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
878 lreg: OP_LCONV_TO_OVF_U8 (lreg) {
879         MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
880         MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
882         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
883         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
886 lreg: OP_LCONV_TO_OVF_I8 (lreg) {
887         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
888         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
891 lreg: OP_LCONV_TO_OVF_U8_UN (lreg) {
892         MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
893         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
896 lreg: OP_LCALLVIRT (reg) {
897         mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE);
900 lreg: OP_LCALL {
901         tree->dreg = state->reg1;
902         mono_bblock_add_inst (s->cbb, tree);
905 lreg: OP_LCALL_REG (reg) {
906         tree->sreg1 = state->left->reg1;
907         tree->dreg = state->reg1;
908         mono_bblock_add_inst (s->cbb, tree);
911 lreg: OP_LCALL_REG (OP_ICONST) {
912         tree->opcode = OP_LCALL;
913         ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
914         tree->dreg = state->reg1;
915         mono_bblock_add_inst (s->cbb, tree);