From 29e6159623292fe882a2df7ae4bdfa2bd0d1e2ce Mon Sep 17 00:00:00 2001 From: Meri Khamoyan <96171496+mkhamoyan@users.noreply.github.com> Date: Mon, 7 Mar 2022 19:35:12 +0400 Subject: [PATCH] Merikhamoyan vector intrinsics operators (#66002) * Added addition and subtraction operator intrinsics --- src/mono/mono/mini/simd-intrinsics.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index 39342e8..11e56c7 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -958,8 +958,10 @@ static guint16 vector64_vector128_t_methods [] = { SN_get_Count, SN_get_IsSupported, SN_get_Zero, + SN_op_Addition, SN_op_Equality, SN_op_Inequality, + SN_op_Subtraction, }; static MonoInst* @@ -1022,6 +1024,18 @@ emit_vector64_vector128_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } break; } + case SN_op_Addition: + case SN_op_Subtraction: { + if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->ret, type) && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type))) + return NULL; + MonoInst *ins = emit_simd_ins (cfg, klass, OP_XBINOP, args [0]->dreg, args [1]->dreg); + ins->inst_c1 = etype->type; + if (etype->type == MONO_TYPE_R4 || etype->type == MONO_TYPE_R8) + ins->inst_c0 = id == SN_op_Addition ? OP_FADD : OP_FSUB; + else + ins->inst_c0 = id == SN_op_Addition ? OP_IADD : OP_ISUB; + return ins; + } case SN_op_Equality: case SN_op_Inequality: g_assert (fsig->param_count == 2 && fsig->ret->type == MONO_TYPE_BOOLEAN && -- 2.7.4