Fix some sign extension issues in the 2 dimensional array access implementation on...
authorZoltan Varga <vargaz@gmail.com>
Sat, 29 Sep 2012 00:21:02 +0000 (02:21 +0200)
committerZoltan Varga <vargaz@gmail.com>
Sat, 29 Sep 2012 00:21:16 +0000 (02:21 +0200)
mono/mini/arrays.cs
mono/mini/method-to-ir.c

index b1f91172321f48a6eeb57e8ab740d764048f4b5a..3e0feb3651584784e24f0916b9af2240020d107c 100644 (file)
@@ -739,6 +739,16 @@ class Tests {
                        return 2;
                return 0;
        }
+
+       // #7438
+       public static int test_0_ldelema_2_64bit () {
+        bool[,] test = new bool[201,201];
+        int x,y;
+        for(x=-100;x<100;x++) for(y=-100;y<100;y++){
+            test[x+100,y+100] = true;
+        }
+               return 0;
+       }               
 }
 
 
index f5f779c645e21c0360f59c14cb46f9de891097d1..ac24d1cfc5f546e0a81de8dc0a90497d6e702a5a 100644 (file)
@@ -4141,7 +4141,7 @@ mini_emit_ldelema_2_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
        int realidx1_reg = alloc_preg (cfg);
        int realidx2_reg = alloc_preg (cfg);
        int sum_reg = alloc_preg (cfg);
-       int index1, index2;
+       int index1, index2, tmpreg;
        MonoInst *ins;
        guint32 size;
 
@@ -4151,6 +4151,22 @@ mini_emit_ldelema_2_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
        index1 = index_ins1->dreg;
        index2 = index_ins2->dreg;
 
+#if SIZEOF_REGISTER == 8
+       /* The array reg is 64 bits but the index reg is only 32 */
+       if (COMPILE_LLVM (cfg)) {
+               /* Not needed */
+       } else {
+               tmpreg = alloc_preg (cfg);
+               MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, tmpreg, index1);
+               index1 = tmpreg;
+               tmpreg = alloc_preg (cfg);
+               MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, tmpreg, index2);
+               index2 = tmpreg;
+       }
+#else
+       // FIXME: Do we need to do something here for i8 indexes, like in ldelema_1_ins ?
+#endif
+
        /* range checking */
        MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, 
                                       arr->dreg, G_STRUCT_OFFSET (MonoArray, bounds));