From 2f5a39553b916cd1e11116806768a19022597cdb Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sun, 18 Aug 2019 02:01:10 -0400 Subject: [PATCH] [llvm] Add support for 32 byte AVX types, not enabled yet. Commit migrated from https://github.com/mono/mono/commit/7e76abb4caa5de32fbe1299d293767fe4e809ade --- src/mono/mono/metadata/class-init.c | 11 +++++++++++ src/mono/mono/metadata/class-internals.h | 1 + src/mono/mono/mini/simd-intrinsics-netcore.c | 11 ++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/class-init.c b/src/mono/mono/metadata/class-init.c index de63685..4487dbd 100644 --- a/src/mono/mono/metadata/class-init.c +++ b/src/mono/mono/metadata/class-init.c @@ -36,6 +36,10 @@ gboolean mono_print_vtable = FALSE; gboolean mono_align_small_structs = FALSE; +#ifdef ENABLE_NETCORE +/* Set by the EE */ +gint32 mono_simd_register_size; +#endif /* Statistics */ static gint32 classes_size; @@ -286,6 +290,13 @@ mono_class_setup_fields (MonoClass *klass) if (explicit_size) instance_size += real_size; +#ifdef ENABLE_NETCORE + if (mono_is_corlib_image (klass->image) && !strcmp (klass->name_space, "System.Numerics") && !strcmp (klass->name, "Register")) { + if (mono_simd_register_size) + instance_size += mono_simd_register_size; + } +#endif + /* * This function can recursively call itself. * Prevent infinite recursion by using a list in TLS. diff --git a/src/mono/mono/metadata/class-internals.h b/src/mono/mono/metadata/class-internals.h index 9f6990c..1354655 100644 --- a/src/mono/mono/metadata/class-internals.h +++ b/src/mono/mono/metadata/class-internals.h @@ -23,6 +23,7 @@ extern gboolean mono_print_vtable; extern gboolean mono_align_small_structs; +extern gint32 mono_simd_register_size; typedef struct _MonoMethodWrapper MonoMethodWrapper; typedef struct _MonoMethodInflated MonoMethodInflated; diff --git a/src/mono/mono/mini/simd-intrinsics-netcore.c b/src/mono/mono/mini/simd-intrinsics-netcore.c index 565500a..61076dd 100644 --- a/src/mono/mono/mini/simd-intrinsics-netcore.c +++ b/src/mono/mono/mini/simd-intrinsics-netcore.c @@ -36,9 +36,18 @@ enum { }; #define method_name(idx) ((const char*)&method_names + (idx)) +static int register_size; + void mono_simd_intrinsics_init (void) { + register_size = 16; +#if FALSE + if ((mono_llvm_get_cpu_features () & MONO_CPU_X86_AVX) != 0) + register_size = 32; +#endif + /* Tell the class init code the size of the System.Numerics.Register type */ + mono_simd_register_size = register_size; } MonoInst* @@ -246,7 +255,7 @@ emit_sys_numerics_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSig etype = mono_class_get_context (klass)->class_inst->type_argv [0]; size = mono_class_value_size (mono_class_from_mono_type_internal (etype), NULL); g_assert (size); - len = 16 / size; + len = register_size / size; if (!MONO_TYPE_IS_PRIMITIVE (etype) || etype->type == MONO_TYPE_CHAR || etype->type == MONO_TYPE_BOOLEAN) return NULL; -- 2.7.4