From dc371f40ae82e0c43617f3156dbea34c41bc7602 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Tue, 8 Feb 2022 08:57:09 -0800 Subject: [PATCH 1/2] Add intrinsic for Vector64/128 Ceiling --- src/mono/mono/mini/simd-intrinsics.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index f63cf472b9e038..29292ee35fddf4 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -576,6 +576,7 @@ static guint16 sri_vector_methods [] = { SN_AsVector256, SN_AsVector3, SN_AsVector4, + SN_Ceiling, SN_Create, SN_CreateScalar, SN_CreateScalarUnsafe, @@ -650,6 +651,14 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi return NULL; return emit_simd_ins (cfg, klass, OP_XCAST, args [0]->dreg, -1); } + case SN_Ceiling: +#ifdef TARGET_ARM64 + if ((arg0_type != MONO_TYPE_R4) && (arg0_type != MONO_TYPE_R8)) + return NULL; + return emit_simd_ins_for_sig (cfg, klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FRINTP, arg0_type, fsig, args); +#else + return NULL; +#endif case SN_Create: { MonoType *etype = get_vector_t_elem_type (fsig->ret); if (fsig->param_count == 1 && mono_metadata_type_equal (fsig->params [0], etype)) From 270f549fab1154ac24cb0d5cb90ab35c55782677 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Tue, 8 Feb 2022 09:36:38 -0800 Subject: [PATCH 2/2] Add intrinsic for Vector64/128 Floor --- src/mono/mono/mini/simd-intrinsics.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index 29292ee35fddf4..700099737d29c1 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -580,6 +580,7 @@ static guint16 sri_vector_methods [] = { SN_Create, SN_CreateScalar, SN_CreateScalarUnsafe, + SN_Floor, SN_GetElement, SN_GetLower, SN_GetUpper, @@ -652,13 +653,16 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi return emit_simd_ins (cfg, klass, OP_XCAST, args [0]->dreg, -1); } case SN_Ceiling: + case SN_Floor: { #ifdef TARGET_ARM64 if ((arg0_type != MONO_TYPE_R4) && (arg0_type != MONO_TYPE_R8)) return NULL; - return emit_simd_ins_for_sig (cfg, klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FRINTP, arg0_type, fsig, args); + int ceil_or_floor = id == SN_Ceiling ? INTRINS_AARCH64_ADV_SIMD_FRINTP : INTRINS_AARCH64_ADV_SIMD_FRINTM; + return emit_simd_ins_for_sig (cfg, klass, OP_XOP_OVR_X_X, ceil_or_floor, arg0_type, fsig, args); #else return NULL; #endif + } case SN_Create: { MonoType *etype = get_vector_t_elem_type (fsig->ret); if (fsig->param_count == 1 && mono_metadata_type_equal (fsig->params [0], etype))