[jit] Fix more simd+aot issues. Avoid treating the Vector<T> GTD or Vector<T_REF...
authorZoltan Varga <vargaz@gmail.com>
Thu, 24 Nov 2016 22:23:59 +0000 (17:23 -0500)
committerGitHub <noreply@github.com>
Thu, 24 Nov 2016 22:23:59 +0000 (17:23 -0500)
mono/metadata/class-internals.h
mono/metadata/class.c
mono/metadata/icall.c
mono/mini/method-to-ir.c
mono/mini/mini.c
mono/mini/simd-intrinsics.c

index 96e86033f8afe8d043d021524577720ad0a75947..9e7729f52b9229d63898af4c4a301ff0bb1e2ee0 100644 (file)
@@ -1310,6 +1310,9 @@ mono_type_is_valid_enum_basetype (MonoType * type);
 MONO_API gboolean
 mono_class_is_valid_enum (MonoClass *klass);
 
+gboolean
+mono_type_is_primitive (MonoType *type);
+
 MonoType *
 mono_type_get_checked        (MonoImage *image, guint32 type_token, MonoGenericContext *context, MonoError *error);
 
index b1b803710c946b22cb74cc7dc5f6c0fafe274ec3..1dbb0c5a72eafdbf2028b5c18170fc45d8b1859a 100644 (file)
@@ -6009,9 +6009,6 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token, MonoError
        } else if (klass->image->assembly_name && !strcmp (klass->image->assembly_name, "System.Numerics") && !strcmp (nspace, "System.Numerics")) {
                if (!strcmp (name, "Vector2") || !strcmp (name, "Vector3") || !strcmp (name, "Vector4"))
                        klass->simd_type = 1;
-       } else if (klass->image->assembly_name && !strcmp (klass->image->assembly_name, "System.Numerics.Vectors") && !strcmp (nspace, "System.Numerics")) {
-               if (!strcmp (name, "Vector`1"))
-                       klass->simd_type = 1;
        }
 
        mono_loader_unlock ();
@@ -6068,6 +6065,12 @@ mono_generic_class_setup_parent (MonoClass *klass, MonoClass *gtd)
        }
 }
 
+gboolean
+mono_type_is_primitive (MonoType *type)
+{
+       return (type->type >= MONO_TYPE_BOOLEAN && type->type <= MONO_TYPE_R8) ||
+                       type-> type == MONO_TYPE_I || type->type == MONO_TYPE_U;
+}
 
 /*
  * Create the `MonoClass' for an instantiation of a generic type.
@@ -6106,7 +6109,13 @@ mono_generic_class_get_class (MonoGenericClass *gclass)
        klass->this_arg.byref = TRUE;
        klass->enumtype = gklass->enumtype;
        klass->valuetype = gklass->valuetype;
-       klass->simd_type = gklass->simd_type;
+
+       if (gklass->image->assembly_name && !strcmp (gklass->image->assembly_name, "System.Numerics.Vectors") && !strcmp (gklass->name_space, "System.Numerics") && !strcmp (gklass->name, "Vector`1")) {
+               g_assert (gclass->context.class_inst);
+               g_assert (gclass->context.class_inst->type_argc > 0);
+               if (mono_type_is_primitive (gclass->context.class_inst->type_argv [0]))
+                       klass->simd_type = 1;
+       }
 
        klass->cast_class = klass->element_class = klass;
 
index ce357517219fd9c24287fc8330d8d795cc6ec6e8..831ea1dd40d67960c9e1fbd3115c395ccf1c7207 100644 (file)
@@ -1591,13 +1591,6 @@ handle_enum:
        return 0;
 }
 
-static gboolean
-mono_type_is_primitive (MonoType *type)
-{
-       return (type->type >= MONO_TYPE_BOOLEAN && type->type <= MONO_TYPE_R8) ||
-                       type-> type == MONO_TYPE_I || type->type == MONO_TYPE_U;
-}
-
 static MonoType*
 mono_type_get_underlying_type_ignore_byref (MonoType *type)
 {
index da35e44bb2a1fe6c2ad49f00b7712356af9cc4fd..acb7e6fd275909b1f9ace6146fd24cd3cf656412 100644 (file)
@@ -327,6 +327,8 @@ handle_enum:
        case MONO_TYPE_TYPEDBYREF:
                return OP_VMOVE;
        case MONO_TYPE_GENERICINST:
+               if (MONO_CLASS_IS_SIMD (cfg, mono_class_from_mono_type (type)))
+                       return OP_XMOVE;
                type = &type->data.generic_class->container_class->byval_arg;
                goto handle_enum;
        case MONO_TYPE_VAR:
index 4da25a4d439edda2babe9a41e70d0ea1912c2b05..cfca91bf6e82b1d10abb7ececa75b650c5e2504c 100644 (file)
@@ -365,6 +365,8 @@ handle_enum:
        case MONO_TYPE_TYPEDBYREF:
                return OP_STOREV_MEMBASE;
        case MONO_TYPE_GENERICINST:
+               if (MONO_CLASS_IS_SIMD (cfg, mono_class_from_mono_type (type)))
+                       return OP_STOREX_MEMBASE;
                type = &type->data.generic_class->container_class->byval_arg;
                goto handle_enum;
        case MONO_TYPE_VAR:
index 9f89822293daf0ea589d5119f5a9fb0bdcd0a5ee..cc2dede3b8ea16e106fdde2f02fc430ccd96814c 100644 (file)
@@ -2054,12 +2054,6 @@ emit_vector_t_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSigna
                return NULL;
        }
 
-       if (cfg->verbose_level > 1) {
-               char *name = mono_method_full_name (cmethod, TRUE);
-               printf ("  SIMD intrinsic %s\n", name);
-               g_free (name);
-       }
-
        etype = mono_class_get_context (cmethod->klass)->class_inst->type_argv [0];
        size = mono_class_value_size (mono_class_from_mono_type (etype), NULL);
        g_assert (size);
@@ -2068,6 +2062,12 @@ emit_vector_t_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSigna
        if (!MONO_TYPE_IS_PRIMITIVE (etype))
                return NULL;
 
+       if (cfg->verbose_level > 1) {
+               char *name = mono_method_full_name (cmethod, TRUE);
+               printf ("  SIMD intrinsic %s\n", name);
+               g_free (name);
+       }
+
        switch (intrins->name) {
        case SN_get_Count:
                EMIT_NEW_ICONST (cfg, ins, len);