diff --git a/src/mono/mono/mini/cpu-arm64.mdesc b/src/mono/mono/mini/cpu-arm64.mdesc index 3981c544347783974ce271a8bce9f25d946cf7c1..0e27f23291ad342f803619a60a46c61912ce073e 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 a30b61a90b80d9a662aae4963f82b6aa1aad5078..e9e9ff6b0edcbeaea6d70e68886938496b9898dd 100644 --- a/src/mono/mono/mini/mini-arm64.c +++ b/src/mono/mono/mini/mini-arm64.c @@ -3910,6 +3910,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 ff70cab60f5b3230169aea382e665efd9828b912..3c1fc0986c972662c2a665d42244859db2dafd9d 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) @@ -1950,32 +1950,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) {