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);
} 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 ();
}
}
+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.
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;
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)
{
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:
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:
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);
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);