2001-12-03 Miguel de Icaza <miguel@ximian.com>
authorMiguel de Icaza <miguel@gnome.org>
Tue, 4 Dec 2001 07:31:31 +0000 (07:31 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Tue, 4 Dec 2001 07:31:31 +0000 (07:31 -0000)
* x86.brg, jit.c: Implement conv.ovf.u4, conv.ovf.u2, conv.ovf.i2,
conv.ovf.u8

svn path=/trunk/mono/; revision=1519

mono/jit/ChangeLog
mono/jit/TODO
mono/jit/jit.c
mono/jit/x86.brg

index 72a2206dd0fb039a6775ecb0e97a39dab6c10643..0b192d4e0e335eb9db62a907b3f45a0bc22c0098 100644 (file)
@@ -1,3 +1,7 @@
+2001-12-03  Miguel de Icaza  <miguel@ximian.com>
+
+       * x86.brg, jit.c: Implement conv.ovf.u4, conv.ovf.u2, conv.ovf.i2,
+       conv.ovf.u8 
 
 Mon Dec 3 17:16:36 CET 2001 Paolo Molaro <lupus@ximian.com>
 
index 7a19fc67539404d82dda765a48a3bc5f3185d5bc..76a29faad274211f5ed63152dfa4e536d3866f28 100644 (file)
 * document the functions and variables in the JIT 
 * implement a register set for FP registers (just count register usage on x86)
 
+* Calling conventions:
+
+       Implement fast call
+
+* Overflow conversions:
+
+       Implement CONV_OVF_XXX (constant) variants that emit either
+       loads or exceptions (as we can always tell)
+       
+       
\ No newline at end of file
index 8dcc7f6f56f765f9c3868697bde6e185ee3c6807..8f4d0a513fed86a59fd007f68d584e60c31d63ac 100644 (file)
@@ -2866,13 +2866,33 @@ mono_analyze_stack (MonoFlowGraph *cfg)
                        break;
                }
                case CEE_CONV_OVF_U4: {
-                       // fixme: raise exceptions ?
                        ++ip;
                        sp--;
-                       t1 = mono_ctree_new (mp, MB_TERM_CONV_I4, *sp, NULL);
+                       t1 = mono_ctree_new (mp, MB_TERM_CONV_OVF_U4, *sp, NULL);
                        PUSH_TREE (t1, VAL_I32);                
                        break;
                }
+               case CEE_CONV_OVF_I2: {
+                       ++ip;
+                       sp--;
+                       t1 = mono_ctree_new (mp, MB_TERM_CONV_OVF_I2, *sp, NULL);
+                       PUSH_TREE (t1, VAL_I32);
+                       break;
+               }
+               case CEE_CONV_OVF_U2: {
+                       ++ip;
+                       sp--;
+                       t1 = mono_ctree_new (mp, MB_TERM_CONV_OVF_U2, *sp, NULL);
+                       PUSH_TREE (t1, VAL_I32);
+                       break;
+               }
+               case CEE_CONV_OVF_U8: {
+                       ++ip;
+                       sp--;
+                       t1 = mono_ctree_new (mp, MB_TERM_CONV_OVF_U8, *sp, NULL);
+                       PUSH_TREE (t1, VAL_I32);
+                       break;
+               }
                case CEE_CONV_OVF_I4_UN: {
                        // fixme: raise exceptions ?
                        ++ip;
index f3da2dc4d213d35371ba6586a67d55e6842a8cb2..10e2b2f0c1052bfb0eab5372c91dbb61217434a8 100644 (file)
@@ -157,6 +157,7 @@ x86_pop_reg (s->code, X86_EAX);
 %term BLT BLT_UN BEQ BNE_UN BRTRUE BRFALSE BGE BGE_UN BLE BLE_UN BGT BGT_UN 
 %term CEQ CLT
 %term CONV_I4 CONV_I1 CONV_I2 CONV_I8 CONV_U8 CONV_R4 CONV_R8
+%term CONV_OVF_U4 CONV_OVF_I2 CONV_OVF_U2 CONV_OVF_U8
 %term INTF_ADDR VFUNC_ADDR NOP NEWARR NEWOBJ CPOBJ POP INITOBJ VTYPE ISINST CASTCLASS
 %term EXCEPTION THROW RETHROW HANDLER 
 %term LDLEN
@@ -561,6 +562,38 @@ reg: CONV_I4 (reg) {
        PRINT_REG ("CONV_I4", tree->left->reg1);
 } 
 
+reg: CONV_OVF_U4 (reg) {
+       x86_test_reg_imm (s->code, tree->left->reg1, 0x8000000);
+       x86_branch8 (s->code, X86_CC_EQ, 10, TRUE);
+       x86_mov_reg_imm (s->code, X86_ECX, get_exception_overflow ());
+       x86_call_code (s->code, get_throw_exception ());
+       if (tree->reg1 != tree->left->reg1)
+               x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+}
+
+reg: CONV_OVF_I2 (reg) {
+       /* Probe value to be within -32768 and 32767 */
+
+       x86_alu_reg_imm (s->code, X86_CMP, tree->reg1, 32767);
+       x86_branch8 (s->code, X86_CC_LE, 10, TRUE);
+       x86_mov_reg_imm (s->code, X86_ECX, get_exception_overflow ());
+       x86_call_code (s->code, get_throw_exception ());
+
+       x86_alu_reg_imm (s->code, X86_CMP, tree->reg1, -32768);
+       x86_branch8 (s->code, X86_CC_LT, -17, TRUE);
+       if (tree->reg1 != tree->left->reg1)
+               x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+}
+
+reg: CONV_OVF_U2 (reg) {
+       /* Probe value to be within 0 and 65535 */
+       x86_test_reg_imm (s->code, tree->left->reg1, 0xffff0000);
+       x86_branch8 (s->code, X86_CC_EQ, 10, TRUE);
+       x86_mov_reg_imm (s->code, X86_ECX, get_exception_overflow ());
+       x86_call_code (s->code, get_throw_exception ());
+       if (tree->reg1 != tree->left->reg1)
+               x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);     
+}
 
 reg: MUL (reg, reg) {
        if (tree->reg1 != tree->left->reg1)
@@ -1519,6 +1552,31 @@ lreg: CONV_U8 (CONST_I4) 1 {
        x86_alu_reg_reg (s->code, X86_XOR, tree->reg2, tree->reg2);
 }
 
+lreg: CONV_OVF_U8 (CONST_I4) {
+       if (tree->left->data.i < 0){
+               x86_mov_reg_imm (s->code, X86_ECX, get_exception_overflow ());
+               x86_call_code (s->code, get_throw_exception ());
+       } else {
+               x86_mov_reg_imm (s->code, tree->reg1, tree->left->data.i);
+               x86_alu_reg_reg (s->code, X86_XOR, tree->reg2, tree->reg2);
+       }
+}
+
+lreg: CONV_OVF_U8 (reg) {
+       /* 
+        * Buggy: notice that this assumes reg is an int, maybe I should
+        * generate a CONV_I8 node when the value on the stack is an int?
+        */
+       x86_test_reg_imm (s->code, tree->left->reg1, 0x8000000);
+       x86_branch8 (s->code, X86_CC_EQ, 10, TRUE);
+       x86_mov_reg_imm (s->code, X86_ECX, get_exception_overflow ());
+       x86_call_code (s->code, get_throw_exception ());
+
+       if (tree->reg1 != tree->left->reg1)
+               x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+       x86_alu_reg_reg (s->code, X86_XOR, tree->reg2, tree->reg2);
+}
+
 stmt: STIND_I8 (locaddr, lreg) {
        x86_mov_membase_reg (s->code, X86_EBP, tree->left->data.i,
                             tree->right->reg1, 4);