2004-09-11 Ben Maurer <bmaurer@users.sourceforge.net>
[mono.git] / mono / mini / inssel.brg
index c3646e8632589627470b6449e4d7277015b6bac2..0cb8129cca0e0b6754a3569a5a925a9a2cd47ed1 100644 (file)
        } while (0)
 
 #define MONO_EMIT_BOUNDS_CHECK(cfg, array_reg, array_type, array_length_field, index_reg) do { \
-               int _length_reg = mono_regstate_next_int (cfg->rs); \
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, G_STRUCT_OFFSET (array_type, array_length_field)); \
-               MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, _length_reg, index_reg); \
-               MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \
+               if (! (state->tree->flags & MONO_INST_NORANGECHECK)) { \
+                       int _length_reg = mono_regstate_next_int (cfg->rs); \
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, G_STRUCT_OFFSET (array_type, array_length_field)); \
+                       MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, _length_reg, index_reg); \
+                       MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \
+               } \
        } while (0)
 
 #define MONO_EMIT_BOUNDS_CHECK_IMM(cfg, array_reg, array_type, array_length_field, index_imm) do { \
-               int _length_reg = mono_regstate_next_int (cfg->rs); \
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, G_STRUCT_OFFSET (array_type, array_length_field)); \
-               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, _length_reg, index_imm); \
-               MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \
+               if (! (state->tree->flags & MONO_INST_NORANGECHECK)) { \
+                       int _length_reg = mono_regstate_next_int (cfg->rs); \
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, G_STRUCT_OFFSET (array_type, array_length_field)); \
+                       MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, _length_reg, index_imm); \
+                       MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \
+               } \
        } while (0)
 
 /* we need to kludge state because monoburg puts this stuff before the definition of MBState */
@@ -1732,7 +1736,14 @@ reg: OP_CHECK_ARRAY_TYPE (reg) {
                                       vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
        MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOAD_MEMBASE, elclass_reg, 
                                       class_reg, G_STRUCT_OFFSET (MonoClass, element_class));
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, elclass_reg, tree->klass);
+       if (mono_compile_aot) {
+               int klass_reg = mono_regstate_next_int (s->rs);
+               MONO_EMIT_NEW_CLASSCONST (s, klass_reg, tree->klass);
+               MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, elclass_reg, klass_reg);
+       } else {
+               MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, elclass_reg, tree->klass);
+       }
+       
        MONO_EMIT_NEW_COND_EXC (s, NE_UN, "ArrayTypeMismatchException");
        MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
 }