2003-01-07 Dietmar Maurer <dietmar@ximian.com>
[mono.git] / mono / jit / x86.brg
index 902a32707316354a9df4d0f0a140ef0e7e9faf73..c2b8d51de1f6c4b5180a60d4c00d1b3731e7429d 100644 (file)
@@ -1645,22 +1645,22 @@ reg: LDLEN (reg) {
 reg: LDELEMA (reg, CONST_I4) {
        int ind;
 
-       x86_alu_membase_imm (s->code, X86_CMP, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length), tree->right->data.i);
-       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_GT, FALSE, "IndexOutOfRangeException");
+       if (mono_jit_boundcheck){
+               x86_alu_membase_imm (s->code, X86_CMP, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length), tree->right->data.i);
+               EMIT_COND_SYSTEM_EXCEPTION (X86_CC_GT, FALSE, "IndexOutOfRangeException");
+       }
        
        ind = tree->data.i * tree->right->data.i + G_STRUCT_OFFSET (MonoArray, vector);
        
-       x86_alu_reg_imm (s->code, X86_ADD, tree->left->reg1, ind);
-
-       if (tree->reg1 != tree->left->reg1)
-               x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
-
+       x86_lea_membase (s->code, tree->reg1, tree->left->reg1, ind);
 }
 
 reg: LDELEMA (reg, reg) {
 
-       x86_alu_reg_membase (s->code, X86_CMP, tree->right->reg1, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length));
-       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LT, FALSE, "IndexOutOfRangeException");
+       if (mono_jit_boundcheck){
+               x86_alu_reg_membase (s->code, X86_CMP, tree->right->reg1, tree->left->reg1, G_STRUCT_OFFSET (MonoArray, max_length));
+               EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LT, FALSE, "IndexOutOfRangeException");
+       }
 
        if (tree->data.i == 1 || tree->data.i == 2 || 
            tree->data.i == 4 || tree->data.i == 8) {
@@ -1846,6 +1846,10 @@ reg: LOCALLOC (CONST_I4) {
        if (size) {
                mono_emit_stack_alloc_const (s, tree, size);
 
+               if (tree->reg1 != X86_EDI && tree->left->reg1 != X86_EDI) {
+                       x86_push_reg (s->code, X86_EDI);
+                       offset += 4;
+               }
                if (tree->reg1 != X86_EAX && tree->left->reg1 != X86_EAX) {
                        x86_push_reg (s->code, X86_EAX);
                        offset += 4;
@@ -1854,10 +1858,6 @@ reg: LOCALLOC (CONST_I4) {
                        x86_push_reg (s->code, X86_ECX);
                        offset += 4;
                }
-               if (tree->reg1 != X86_EDI && tree->left->reg1 != X86_EDI) {
-                       x86_push_reg (s->code, X86_EDI);
-                       offset += 4;
-               }
                
                x86_mov_reg_imm (s->code, X86_ECX, size >> 2);
                x86_alu_reg_reg (s->code, X86_SUB, X86_EAX, X86_EAX);
@@ -1970,10 +1970,10 @@ reg: CASTCLASS (reg) {
 
                        x86_alu_membase_imm (s->code, X86_CMP, lreg, G_STRUCT_OFFSET (MonoClass, rank), klass->rank);
                        EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, FALSE, "InvalidCastException");
-                       x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, element_class), 4);
+                       x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, cast_class), 4);
                        x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, baseval), 4);
-                       x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->element_class->baseval);
-                       x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->element_class->diffval);
+                       x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->cast_class->baseval);
+                       x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->cast_class->diffval);
                        EMIT_COND_SYSTEM_EXCEPTION (X86_CC_LE, FALSE, "InvalidCastException");
 
                } else {
@@ -2037,10 +2037,10 @@ reg: ISINST (reg) {
 
                        x86_alu_membase_imm (s->code, X86_CMP, lreg, G_STRUCT_OFFSET (MonoClass, rank), klass->rank);
                        br [1] = s->code; x86_branch8 (s->code, X86_CC_NE, 0, FALSE);
-                       x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, element_class), 4);
+                       x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, cast_class), 4);
                        x86_mov_reg_membase (s->code, lreg, lreg, G_STRUCT_OFFSET (MonoClass, baseval), 4);
-                       x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->element_class->baseval);
-                       x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->element_class->diffval);
+                       x86_alu_reg_mem (s->code, X86_SUB, lreg, &klass->cast_class->baseval);
+                       x86_alu_reg_mem (s->code, X86_CMP, lreg, &klass->cast_class->diffval);
                        br [2] = s->code; x86_branch8 (s->code, X86_CC_LE, 0, FALSE);
                        x86_patch (br [1], s->code);
                        x86_mov_membase_imm (s->code, X86_ESP, 0, 0, 4);
@@ -4347,7 +4347,7 @@ freg: REM (freg, freg) {
        /* this requires a loop, because fprem1 somtimes 
         * returns a partial remainder */
        l1 = s->code;
-       x86_fprem1 (s->code);
+       x86_fprem (s->code);
        x86_fnstsw (s->code);
        x86_alu_reg_imm (s->code, X86_AND, X86_EAX, 0x0400);
        l2 = s->code + 2;
@@ -4361,7 +4361,9 @@ freg: NEG (freg) {
        x86_fchs (s->code);
 }
 
-stmt: POP (freg)
+stmt: POP (freg) {
+       x86_fstp (s->code, 0);
+}
 
 stmt: STIND_R4 (addr, freg) {