2002-01-11 Dietmar Maurer <dietmar@ximian.com>
authorDietmar Maurer <dietmar@mono-cvs.ximian.com>
Fri, 11 Jan 2002 07:22:53 +0000 (07:22 -0000)
committerDietmar Maurer <dietmar@mono-cvs.ximian.com>
Fri, 11 Jan 2002 07:22:53 +0000 (07:22 -0000)
* x86.brg (LDLEN): emit null_reference exception
(BLE_UN): bug fix.

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

mono/jit/ChangeLog
mono/jit/emit-x86.c
mono/jit/jit.c
mono/jit/x86.brg
mono/tests/jit-float.cs

index 1573b7831c21074c320179f78dc77c22032c6591..91a0736e24d35847c3253c018150335a7f7973bf 100644 (file)
@@ -1,3 +1,8 @@
+2002-01-11  Dietmar Maurer  <dietmar@ximian.com>
+
+       * x86.brg (LDLEN): emit null_reference exception
+       (BLE_UN): bug fix. 
+
 2002-01-04  Dietmar Maurer  <dietmar@ximian.com>
 
        * x86.brg: bug fix in CASTCLASS
index b746216f41130515430d333edcbc8824f496bd46..d0247added8faa68be8c8772934788cf3417ed09 100644 (file)
@@ -923,7 +923,7 @@ arch_compile_method (MonoMethod *method)
                mono_compute_branches (cfg);
                
                if (mono_jit_dump_asm) {
-                       char *id = g_strdup_printf ("%s_%s__%s", method->klass->name_space,
+                       char *id = g_strdup_printf ("%s.%s_%s", method->klass->name_space,
                                                    method->klass->name, method->name);
                        mono_disassemble_code (cfg->start, cfg->code - cfg->start, id);
                        g_free (id);
@@ -1085,6 +1085,9 @@ arch_handle_exception (struct sigcontext *ctx, gpointer obj)
        static void (*restore_context) (struct sigcontext *);
        static void (*call_finally) (struct sigcontext *, unsigned long);
 
+       g_assert (ctx != NULL);
+       g_assert (obj != NULL);
+
        ji = mono_jit_info_table_find (mono_jit_info_table, ip);
 
        if (!restore_context)
index fbe5341c98e3fe3597be2f22d27ce7d4b52ec8d5..3707153cc69f361306858bcaee1284760bcf3f2e 100644 (file)
@@ -1359,6 +1359,8 @@ mono_analyze_flow (MonoFlowGraph *cfg)
                        case CEE_CEQ:
                        case CEE_CLT:
                        case CEE_CGT:
+                       case CEE_UNALIGNED_:
+                       case CEE_VOLATILE_:
                                ip++;
                                break;
                        case CEE_LDARG:
@@ -3017,6 +3019,16 @@ mono_analyze_stack (MonoFlowGraph *cfg)
                                PUSH_TREE (t1, svt);
                                break;
                        }
+                       case CEE_UNALIGNED_: {
+                               ++ip;
+                               // fixme: implement me
+                               break;
+                       }
+                       case CEE_VOLATILE_: {
+                               ++ip;
+                               // fixme: implement me                          
+                               break;
+                       }
                        default:
                                g_error ("Unimplemented opcode at IL_%04x "
                                         "0xFE %02x", ip - header->code, *ip);
index 759cf7e782e65ed0178185f8124a3716843a504b..f933958b6452843e50f39cec37444320b0c0dd1e 100644 (file)
@@ -104,11 +104,7 @@ get_mono_object_isinst (void);
 
 //#define DEBUG
 
-#ifdef DEBUG
-#define MEMCOPY debug_memcpy
-void *MEMCOPY (void *dest, const void *src, size_t n);
-
-#define PRINT_REG(text,reg) \
+#define REAL_PRINT_REG(text,reg) \
 g_assert (reg >= 0); \
 x86_push_reg (s->code, X86_EAX); \
 x86_push_reg (s->code, X86_EDX); \
@@ -122,6 +118,12 @@ x86_alu_reg_imm (s->code, X86_ADD, X86_ESP, 3*4); \
 x86_pop_reg (s->code, X86_ECX); \
 x86_pop_reg (s->code, X86_EDX); \
 x86_pop_reg (s->code, X86_EAX); 
+
+#ifdef DEBUG
+#define MEMCOPY debug_memcpy
+void *MEMCOPY (void *dest, const void *src, size_t n);
+
+#define PRINT_REG(text,reg) REAL_PRINT_REG(text,reg)
 #else
 
 #define MEMCOPY memcpy
@@ -920,7 +922,10 @@ reg: SHR_UN (reg, reg) {
 }
 
 # array support
-reg: LDLEN (reg) {
+reg: LDLEN (reg) {     
+       x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, 0);
+       EMIT_COND_EXCEPTION (X86_CC_NE, get_exception_null_reference ());
+
        x86_mov_reg_membase (s->code, tree->reg1, tree->left->reg1,  
                             G_STRUCT_OFFSET (MonoArray, bounds), 4);
        x86_mov_reg_membase (s->code, tree->reg1, tree->reg1,  
@@ -2460,7 +2465,7 @@ stmt: BLT (freg, freg) {
        x86_fnstsw (s->code);
        x86_alu_reg_imm (s->code, X86_AND, X86_EAX, 0x4500);
        offset = 6 + s->code - s->start;
-       x86_branch32 (s->code, X86_CC_EQ, tree->data.bb->addr - offset, TRUE);
+       x86_branch32 (s->code, X86_CC_EQ, tree->data.bb->addr - offset, FALSE);
 }
 
 stmt: BLT_UN (freg, freg) {
@@ -2504,6 +2509,7 @@ stmt: BLE_UN (freg, freg) {
        x86_fcompp (s->code);
        x86_fnstsw (s->code);
        x86_alu_reg_imm (s->code, X86_AND, X86_EAX, 0x4500);
+       x86_alu_reg_imm (s->code, X86_CMP, X86_EAX, 0x0100);
        offset = 6 + s->code - s->start;
        x86_branch32 (s->code, X86_CC_NE, tree->data.bb->addr - offset, FALSE);
 }
index 4dd22530e6a4bf8eb605ba2bd110b6d404157e87..e96d279182c99fc2e35e27259fdceb5ed5e05d46 100644 (file)
@@ -31,8 +31,8 @@ public class TestJit {
        
        public static int test_branch ()
        {
-               double a = 5, b = 5, t;
-               
+               double a = 0.5, b = 0.5, t;
+
                if (a == b) t = 1; else t = 0;
                if (t != 1) return 1;
 
@@ -51,6 +51,10 @@ public class TestJit {
                if (a < b) t = 0; else t = 1;
                if (t != 1) return 1;
 
+               if (a > 1.0) return 1;
+               
+               if (a < 0.1) return 1;
+               
                return 0;
        }