[simd] Fix the exception thrown by Vector<T>.CopyTo () on a failed bounds check.
authorZoltan Varga <vargaz@gmail.com>
Fri, 16 Dec 2016 19:58:57 +0000 (14:58 -0500)
committerZoltan Varga <vargaz@gmail.com>
Fri, 16 Dec 2016 19:58:57 +0000 (14:58 -0500)
mono/mini/basic-vectors.cs
mono/mini/simd-intrinsics.c

index 1830fd9a8bcddeb4c245c3108144956a7ba1633d..3b8c50c181a1eaf52d0137e4bed3ac288f1e8a9f 100644 (file)
@@ -1410,7 +1410,7 @@ public class VectorTests {
                try {
                        vector_copyto (v1, arr, 241);
                        return 1;
-               } catch (IndexOutOfRangeException) {
+               } catch (ArgumentException) {
                }
                return 0;
        }
index b237968189c2823173f30d580a9a2db1a47f5a1a..9b31c3fa69b07f4cc5e90e8722a29678fc524da2 100644 (file)
@@ -2224,7 +2224,11 @@ emit_vector_t_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSigna
                /* Emit index check for the end (index + len - 1 < array length) */
                end_index_reg = alloc_ireg (cfg);
                EMIT_NEW_BIALU_IMM (cfg, ins, OP_IADD_IMM, end_index_reg, index_ins->dreg, len - 1);
-               MONO_EMIT_BOUNDS_CHECK (cfg, array_ins->dreg, MonoArray, max_length, end_index_reg);
+
+               int length_reg = alloc_ireg (cfg);
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT (cfg, OP_LOADI4_MEMBASE, length_reg, array_ins->dreg, MONO_STRUCT_OFFSET (MonoArray, max_length));
+               MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, length_reg, end_index_reg);
+               MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "ArgumentException");
 
                /* Load the simd reg into the array slice */
                ldelema_ins = mini_emit_ldelema_1_ins (cfg, mono_class_from_mono_type (etype), array_ins, index_ins, TRUE);