diff --git a/src/mono/mono/mini/cpu-arm64.mdesc b/src/mono/mono/mini/cpu-arm64.mdesc index 1b075a0926dcc2..e7fd9440159cd3 100644 --- a/src/mono/mono/mini/cpu-arm64.mdesc +++ b/src/mono/mono/mini/cpu-arm64.mdesc @@ -497,6 +497,7 @@ atomic_store_r4: dest:b src1:f len:28 atomic_store_r8: dest:b src1:f len:24 xbinop: dest:x src1:x src2:x len:8 clob:1 xzero: dest:x len:4 +xones: dest:x len:8 xmove: dest:x src1:x len:4 xconst: dest:x len:10 xcompare: dest:x src1:x src2:x len:4 diff --git a/src/mono/mono/mini/mini-arm64.c b/src/mono/mono/mini/mini-arm64.c index 96822e9b9b4fa5..9b3b758b6174d5 100644 --- a/src/mono/mono/mini/mini-arm64.c +++ b/src/mono/mono/mini/mini-arm64.c @@ -3917,6 +3917,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_XZERO: arm_neon_eor_16b (code, dreg, dreg, dreg); break; + case OP_XONES: + arm_neon_eor_16b (code, dreg, dreg, dreg); + arm_neon_not_16b (code, dreg, dreg); + break; case OP_XEXTRACT: code = emit_xextract (code, VREG_FULL, ins->inst_c0, dreg, sreg1); break; diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index 633167c6335841..79c5965b026e25 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -387,7 +387,7 @@ emit_simd_ins_for_binary_op (MonoCompile *cfg, MonoClass *klass, MonoMethodSigna case SN_Multiply: case SN_op_Multiply: { #ifdef TARGET_ARM64 - if (!COMPILE_LLVM (cfg) && (arg_type == MONO_TYPE_I8 || arg_type == MONO_TYPE_U8)) + if (!COMPILE_LLVM (cfg) && (arg_type == MONO_TYPE_I8 || arg_type == MONO_TYPE_U8 || arg_type == MONO_TYPE_I || arg_type == MONO_TYPE_U)) return NULL; #endif if (fsig->params [1]->type != MONO_TYPE_GENERICINST) @@ -1944,32 +1944,10 @@ emit_vector64_vector128_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign return NULL; #endif -// FIXME: This limitation could be removed once everything here are supported by mini JIT on arm64 +// FIXME: Support Vector64 for mini JIT on arm64 #ifdef TARGET_ARM64 - if (!COMPILE_LLVM (cfg)) { + if (!COMPILE_LLVM (cfg) && (size != 16)) return NULL; - if (size != 16) - return NULL; - switch (id) { - case SN_get_One: - case SN_get_Zero: - case SN_op_OnesComplement: - case SN_op_UnaryNegation: - case SN_op_UnaryPlus: - case SN_op_Addition: - case SN_op_Subtraction: - case SN_op_BitwiseAnd: - case SN_op_BitwiseOr: - case SN_op_ExclusiveOr: - case SN_op_Equality: - case SN_op_Inequality: - case SN_op_Division: - case SN_op_Multiply: - break; - default: - return NULL; - } - } #endif switch (id) {