Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Mono] Intrinsify StoreSelectedScalar #98710

Merged
merged 2 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3776,9 +3776,6 @@ internal Arm64() { }
/// </summary>
public static unsafe void StorePairScalarNonTemporal(uint* address, Vector64<uint> value1, Vector64<uint> value2) { throw new PlatformNotSupportedException(); }

#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081

/// <summary>
/// void vst2_lane_s8 (int8_t * ptr, int8x16x2_t val, const int lane)
/// A64: ST2 { Vt.16B, Vt+1.16B }[index], [Xn]
Expand Down Expand Up @@ -3949,7 +3946,6 @@ internal Arm64() { }
/// A64: ST3 { Vt.2D, Vt+1.2D, Vt+2.2D, Vt+3.2D }[index], [Xn]
/// </summary>
public static unsafe void StoreSelectedScalar(double* address, (Vector128<double> value1, Vector128<double> value2, Vector128<double> value3, Vector128<double> value4) value, [ConstantExpected(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }
#endif

/// <summary>
/// A64: ST2 { Vn.16B, Vn+1.16B }, [Xn]
Expand Down Expand Up @@ -15932,9 +15928,6 @@ internal Arm64() { }
/// </summary>
public static unsafe void StoreSelectedScalar(ulong* address, Vector128<ulong> value, [ConstantExpected(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }

#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081

/// <summary>
/// A64: ST2 { Vt.8B, Vt+1.8B }[index], [Xn]
/// </summary>
Expand Down Expand Up @@ -16039,7 +16032,6 @@ internal Arm64() { }
/// A64: ST4 { Vt.2S, Vt+1.2S, Vt+2.2S, Vt+3.2S }[index], [Xn]
/// </summary>
public static unsafe void StoreSelectedScalar(float* address, (Vector64<float> value1, Vector64<float> value2, Vector64<float> value3, Vector64<float> value4) value, [ConstantExpected(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }
#endif

/// <summary>
/// A64: ST2 { Vn.8B, Vn+1.8B }, [Xn]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3774,9 +3774,6 @@ internal Arm64() { }
/// </summary>
public static unsafe void StorePairScalarNonTemporal(uint* address, Vector64<uint> value1, Vector64<uint> value2) => StorePairScalarNonTemporal(address, value1, value2);

#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081

/// <summary>
/// void vst2_lane_s8 (int8_t * ptr, int8x16x2_t val, const int lane)
/// A64: ST2 { Vt.16B, Vt+1.16B }[index], [Xn]
Expand Down Expand Up @@ -3947,7 +3944,6 @@ internal Arm64() { }
/// A64: ST4 { Vt.2D, Vt+1.2D, Vt+2.2D, Vt+3.2D }[index], [Xn]
/// </summary>
public static unsafe void StoreSelectedScalar(double* address, (Vector128<double> value1, Vector128<double> value2, Vector128<double> value3, Vector128<double> value4) value, [ConstantExpected(Max = (byte)(1))] byte index) => StoreSelectedScalar(address, value, index);
#endif

/// <summary>
/// A64: ST2 { Vn.16B, Vn+1.16B }, [Xn]
Expand Down Expand Up @@ -15929,9 +15925,6 @@ internal Arm64() { }
/// </summary>
public static unsafe void StoreSelectedScalar(ulong* address, Vector128<ulong> value, [ConstantExpected(Max = (byte)(1))] byte index) => StoreSelectedScalar(address, value, index);

#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081

/// <summary>
/// A64: ST2 { Vt.8B, Vt+1.8B }[index], [Xn]
/// </summary>
Expand Down Expand Up @@ -16036,7 +16029,6 @@ internal Arm64() { }
/// A64: ST4 { Vt.2S, Vt+1.2S, Vt+2.2S, Vt+3.2S }[index], [Xn]
/// </summary>
public static unsafe void StoreSelectedScalar(float* address, (Vector64<float> value1, Vector64<float> value2, Vector64<float> value3, Vector64<float> value4) value, [ConstantExpected(Max = (byte)(1))] byte index) => StoreSelectedScalar(address, value, index);
#endif

/// <summary>
/// A64: ST2 { Vn.8B, Vn+1.8B }, [Xn]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2904,8 +2904,6 @@ public static unsafe void StoreSelectedScalar(ushort* address, System.Runtime.In
public static unsafe void StoreSelectedScalar(uint* address, System.Runtime.Intrinsics.Vector128<uint> value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(3))] byte index) { }
public static unsafe void StoreSelectedScalar(uint* address, System.Runtime.Intrinsics.Vector64<uint> value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { }
public static unsafe void StoreSelectedScalar(ulong* address, System.Runtime.Intrinsics.Vector128<ulong> value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { }
#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081
public static unsafe void StoreSelectedScalar(byte* address, (System.Runtime.Intrinsics.Vector64<byte> value1, System.Runtime.Intrinsics.Vector64<byte> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(7))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(sbyte* address, (System.Runtime.Intrinsics.Vector64<sbyte> value1, System.Runtime.Intrinsics.Vector64<sbyte> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(7))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(short* address, (System.Runtime.Intrinsics.Vector64<short> value1, System.Runtime.Intrinsics.Vector64<short> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(3))] byte index) { throw null; }
Expand All @@ -2927,7 +2925,6 @@ public static unsafe void StoreSelectedScalar(ulong* address, System.Runtime.Int
public static unsafe void StoreSelectedScalar(int* address, (System.Runtime.Intrinsics.Vector64<int> value1, System.Runtime.Intrinsics.Vector64<int> value2, System.Runtime.Intrinsics.Vector64<int> value3, System.Runtime.Intrinsics.Vector64<int> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }
public static unsafe void StoreSelectedScalar(uint* address, (System.Runtime.Intrinsics.Vector64<uint> value1, System.Runtime.Intrinsics.Vector64<uint> value2, System.Runtime.Intrinsics.Vector64<uint> value3, System.Runtime.Intrinsics.Vector64<uint> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }
public static unsafe void StoreSelectedScalar(float* address, (System.Runtime.Intrinsics.Vector64<float> value1, System.Runtime.Intrinsics.Vector64<float> value2, System.Runtime.Intrinsics.Vector64<float> value3, System.Runtime.Intrinsics.Vector64<float> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { throw new PlatformNotSupportedException(); }
#endif
public unsafe static void StoreVector64x2AndZip(byte* address, (System.Runtime.Intrinsics.Vector64<byte> Value1, System.Runtime.Intrinsics.Vector64<byte> Value2) value) { throw null; }
public unsafe static void StoreVector64x2AndZip(sbyte* address, (System.Runtime.Intrinsics.Vector64<sbyte> Value1, System.Runtime.Intrinsics.Vector64<sbyte> Value2) value) { throw null; }
public unsafe static void StoreVector64x2AndZip(short* address, (System.Runtime.Intrinsics.Vector64<short> Value1, System.Runtime.Intrinsics.Vector64<short> Value2) value) { throw null; }
Expand Down Expand Up @@ -3748,8 +3745,6 @@ public static unsafe void StorePairScalar(uint* address, System.Runtime.Intrinsi
public static unsafe void StorePairScalarNonTemporal(int* address, System.Runtime.Intrinsics.Vector64<int> value1, System.Runtime.Intrinsics.Vector64<int> value2) { }
public static unsafe void StorePairScalarNonTemporal(float* address, System.Runtime.Intrinsics.Vector64<float> value1, System.Runtime.Intrinsics.Vector64<float> value2) { }
public static unsafe void StorePairScalarNonTemporal(uint* address, System.Runtime.Intrinsics.Vector64<uint> value1, System.Runtime.Intrinsics.Vector64<uint> value2) { }
#if false
// Should be disabled until Mono implements these APIs. See https://github.com/dotnet/runtime/issues/93081
public static unsafe void StoreSelectedScalar(byte* address, (System.Runtime.Intrinsics.Vector128<byte> value1, System.Runtime.Intrinsics.Vector128<byte> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(15))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(sbyte* address, (System.Runtime.Intrinsics.Vector128<sbyte> value1, System.Runtime.Intrinsics.Vector128<sbyte> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(15))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(short* address, (System.Runtime.Intrinsics.Vector128<short> value1, System.Runtime.Intrinsics.Vector128<short> value2) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(7))] byte index) { throw null; }
Expand Down Expand Up @@ -3780,7 +3775,6 @@ public static unsafe void StorePairScalarNonTemporal(uint* address, System.Runti
public static unsafe void StoreSelectedScalar(ulong* address, (System.Runtime.Intrinsics.Vector128<ulong> value1, System.Runtime.Intrinsics.Vector128<ulong> value2, System.Runtime.Intrinsics.Vector128<ulong> value3, System.Runtime.Intrinsics.Vector128<ulong> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(float* address, (System.Runtime.Intrinsics.Vector128<float> value1, System.Runtime.Intrinsics.Vector128<float> value2, System.Runtime.Intrinsics.Vector128<float> value3, System.Runtime.Intrinsics.Vector128<float> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(3))] byte index) { throw null; }
public static unsafe void StoreSelectedScalar(double* address, (System.Runtime.Intrinsics.Vector128<double> value1, System.Runtime.Intrinsics.Vector128<double> value2, System.Runtime.Intrinsics.Vector128<double> value3, System.Runtime.Intrinsics.Vector128<double> value4) value, [System.Diagnostics.CodeAnalysis.ConstantExpectedAttribute(Max = (byte)(1))] byte index) { throw null; }
#endif
public unsafe static void StoreVector128x2AndZip(byte* address, (System.Runtime.Intrinsics.Vector128<byte> Value1, System.Runtime.Intrinsics.Vector128<byte> Value2) value) { throw null; }
public unsafe static void StoreVector128x2AndZip(sbyte* address, (System.Runtime.Intrinsics.Vector128<sbyte> Value1, System.Runtime.Intrinsics.Vector128<sbyte> Value2) value) { throw null; }
public unsafe static void StoreVector128x2AndZip(short* address, (System.Runtime.Intrinsics.Vector128<short> Value1, System.Runtime.Intrinsics.Vector128<short> Value2) value) { throw null; }
Expand Down
6 changes: 6 additions & 0 deletions src/mono/mono/mini/llvm-intrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,12 @@ INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_LD4LANE_V64, aarch64_neon_ld4lane, Arm64,
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_LD2LANE_V128, aarch64_neon_ld2lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_LD3LANE_V128, aarch64_neon_ld3lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_LD4LANE_V128, aarch64_neon_ld4lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST2LANE_V64, aarch64_neon_st2lane, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST3LANE_V64, aarch64_neon_st3lane, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST4LANE_V64, aarch64_neon_st4lane, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST2LANE_V128, aarch64_neon_st2lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST3LANE_V128, aarch64_neon_st3lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST4LANE_V128, aarch64_neon_st4lane, Arm64, AddPointer, V128 | I1 | I2 | I4 | I8 | R4 | R8)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST1X2_V64, aarch64_neon_st1x2, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST1X3_V64, aarch64_neon_st1x3, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
INTRINS_OVR_TAG_KIND(AARCH64_ADV_SIMD_ST1X4_V64, aarch64_neon_st1x4, Arm64, AddPointer, V64 | I1 | I2 | I4 | R4)
Expand Down
96 changes: 88 additions & 8 deletions src/mono/mono/mini/mini-llvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,12 +685,12 @@ simd_valuetuple_to_llvm_type (EmitContext *ctx, MonoClass *klass)
{
const char *klass_name = m_class_get_name (klass);
g_assert (strstr (klass_name, "ValueTuple") != NULL);
MonoGenericInst *classInst = mono_class_get_generic_class (klass)->context.class_inst;
MonoType *etype = classInst->type_argv [0];
MonoGenericInst *class_inst = mono_class_get_generic_class (klass)->context.class_inst;
MonoType *etype = class_inst->type_argv [0];
g_assert (etype->type == MONO_TYPE_GENERICINST);
MonoClass *eklass = etype->data.generic_class->cached_class;
LLVMTypeRef ltype = simd_class_to_llvm_type (ctx, eklass);
return LLVMArrayType (ltype, classInst->type_argc);
return LLVMArrayType (ltype, class_inst->type_argc);
}

/* Return the 128 bit SIMD type corresponding to the mono type TYPE */
Expand Down Expand Up @@ -5473,7 +5473,9 @@ immediate_unroll_begin (
LLVMBasicBlockRef continuation = gen_bb (ctx, name);
LLVMValueRef switch_ins = LLVMBuildSwitch (ctx->builder, switch_index, default_case, max_cases);
LLVMPositionBuilderAtEnd (ctx->builder, continuation);
LLVMValueRef phi = LLVMBuildPhi (ctx->builder, return_type, name);
LLVMValueRef phi = NULL;
if (return_type != LLVMVoidType ())
phi = LLVMBuildPhi (ctx->builder, return_type, name);
ImmediateUnrollCtx ictx = { 0 };
ictx.ctx = ctx;
ictx.bb = bb;
Expand Down Expand Up @@ -5504,7 +5506,8 @@ immediate_unroll_commit (ImmediateUnrollCtx *ictx, int switch_const, LLVMValueRe
{
LLVMBuildBr (ictx->ctx->builder, ictx->continuation);
LLVMAddCase (ictx->switch_ins, LLVMConstInt (ictx->switch_index_type, switch_const, FALSE), ictx->tmp_block);
LLVMAddIncoming (ictx->phi, &value, &ictx->tmp_block, 1);
if (ictx->phi)
LLVMAddIncoming (ictx->phi, &value, &ictx->tmp_block, 1);
}

static void
Expand All @@ -5517,7 +5520,8 @@ static void
immediate_unroll_commit_default (ImmediateUnrollCtx *ictx, LLVMValueRef value)
{
LLVMBuildBr (ictx->ctx->builder, ictx->continuation);
LLVMAddIncoming (ictx->phi, &value, &ictx->default_case, 1);
if (ictx->phi)
LLVMAddIncoming (ictx->phi, &value, &ictx->default_case, 1);
}

static void
Expand Down Expand Up @@ -11633,7 +11637,7 @@ MONO_RESTORE_WARNING

lhs = LLVMBuildLoad2 (builder, ret_t, addresses [ins->sreg1]->value, "");

LLVMValueRef *args = g_new0(LLVMValueRef, n_elem_tuple + 2);
LLVMValueRef *args = g_newa0(LLVMValueRef, n_elem_tuple + 2);
unsigned int idx = 0;
for ( ; idx < n_elem_tuple; idx++) {
args [idx] = LLVMBuildExtractValue (builder, lhs, idx, "extract_elem");
Expand Down Expand Up @@ -11750,7 +11754,7 @@ MONO_RESTORE_WARNING
break;
}
case OP_ARM64_STM: {
LLVMTypeRef tuple_t = simd_valuetuple_to_llvm_type (ctx, ins->klass);
LLVMTypeRef tuple_t = simd_class_to_llvm_type (ctx, ins->klass);
LLVMTypeRef vec_t = LLVMGetElementType (tuple_t);

IntrinsicId iid = (IntrinsicId) ins->inst_c0;
Expand Down Expand Up @@ -11786,6 +11790,82 @@ MONO_RESTORE_WARNING
mono_llvm_build_aligned_store (builder, val, address, FALSE, alignment);
break;
}
case OP_ARM64_STM_SCALAR: {
LLVMTypeRef tuple_t = simd_valuetuple_to_llvm_type (ctx, ins->klass);
LLVMTypeRef vec_t = LLVMGetElementType (tuple_t);
unsigned int n_elem_tuple = LLVMGetArrayLength (tuple_t);
unsigned int n_elem_vector = LLVMGetVectorSize (vec_t);
LLVMTypeRef elem_t = LLVMGetElementType (vec_t);
unsigned int elem_bits = mono_llvm_get_prim_size_bits (elem_t);
unsigned int vector_size = n_elem_vector * elem_bits;
IntrinsicId iid;
switch (vector_size) {
case 64: {
switch (n_elem_tuple) {
case 2:
iid = INTRINS_AARCH64_ADV_SIMD_ST2LANE_V64;
break;
case 3:
iid = INTRINS_AARCH64_ADV_SIMD_ST3LANE_V64;
break;
case 4:
iid = INTRINS_AARCH64_ADV_SIMD_ST4LANE_V64;
break;
default:
g_assert_not_reached ();
break;
}
break;
}
case 128: {
switch (n_elem_tuple) {
case 2:
iid = INTRINS_AARCH64_ADV_SIMD_ST2LANE_V128;
break;
case 3:
iid = INTRINS_AARCH64_ADV_SIMD_ST3LANE_V128;
break;
case 4:
iid = INTRINS_AARCH64_ADV_SIMD_ST4LANE_V128;
break;
default:
g_assert_not_reached ();
break;
}
break;
}
default:
g_assert_not_reached ();
break;

}

rhs = LLVMBuildLoad2 (builder, tuple_t, addresses [ins->sreg2]->value, "");

LLVMValueRef *args = g_newa0(LLVMValueRef, n_elem_tuple + 2);
unsigned int idx = 0;
for ( ; idx < n_elem_tuple; idx++) {
args [idx] = LLVMBuildExtractValue (builder, rhs, idx, "extract_elem");
}
args [idx++] = arg3;
args [idx] = lhs;

llvm_ovr_tag_t ovr_tag = ovr_tag_from_llvm_type (vec_t);

// convert arg3 to a constant
LLVMTypeRef ret_t = LLVMVoidType ();
ImmediateUnrollCtx ictx = immediate_unroll_begin (ctx, bb, 16, arg3, ret_t, "");
int i = 0;
while (immediate_unroll_next (&ictx, &i)) {
args [idx - 1] = const_int64 (i);
call_overloaded_intrins (ctx, iid, ovr_tag, args, "");
immediate_unroll_commit (&ictx, i, NULL);
}
immediate_unroll_default (&ictx);
immediate_unroll_commit_default (&ictx, NULL);
immediate_unroll_end (&ictx, &cbb);
break;
}
case OP_ARM64_ADDHN:
case OP_ARM64_ADDHN2:
case OP_ARM64_SUBHN:
Expand Down
1 change: 1 addition & 0 deletions src/mono/mono/mini/mini-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -1664,6 +1664,7 @@ MINI_OP(OP_ARM64_UZP2, "arm64_uzp2", XREG, XREG, XREG)
MINI_OP(OP_ARM64_ZIP1, "arm64_zip1", XREG, XREG, XREG)
MINI_OP(OP_ARM64_ZIP2, "arm64_zip2", XREG, XREG, XREG)
MINI_OP3(OP_ARM64_ST1_SCALAR, "arm64_st1_scalar", NONE, IREG, XREG, IREG)
MINI_OP3(OP_ARM64_STM_SCALAR, "arm64_stm_scalar", NONE, IREG, VREG, IREG)
MINI_OP3(OP_ARM64_STNP, "arm64_stnp", NONE, IREG, XREG, XREG)
MINI_OP3(OP_ARM64_STNP_SCALAR, "arm64_stnp_scalar", NONE, IREG, XREG, XREG)
MINI_OP3(OP_ARM64_STP, "arm64_stp", NONE, IREG, XREG, XREG)
Expand Down
10 changes: 7 additions & 3 deletions src/mono/mono/mini/simd-intrinsics.c
Original file line number Diff line number Diff line change
Expand Up @@ -4209,9 +4209,13 @@ emit_arm64_intrinsics (
return ret;
}
case SN_StoreSelectedScalar: {
if (!is_intrinsics_vector_type (fsig->params [1]))
return NULL;
return emit_simd_ins_for_sig (cfg, klass, OP_ARM64_ST1_SCALAR, 0, arg0_type, fsig, args);
int store_op;
if (is_intrinsics_vector_type (fsig->params [1]))
store_op = OP_ARM64_ST1_SCALAR;
else
store_op = OP_ARM64_STM_SCALAR;
MonoClass* klass_tuple_var = mono_class_from_mono_type_internal (fsig->params [1]);
return emit_simd_ins_for_sig (cfg, klass_tuple_var, store_op, 0, arg0_type, fsig, args);
}
case SN_MultiplyRoundedDoublingBySelectedScalarSaturateHigh:
case SN_MultiplyRoundedDoublingScalarBySelectedScalarSaturateHigh:
Expand Down
Loading
Loading