From 4e473018a4100d024042044a3def3f0d8dacd6ed Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 24 Apr 2020 12:20:04 -0700 Subject: [PATCH 1/6] Intrinsify Vector64.CreateScalarUnsafe() for byte, sbyte, short, ushort, int, uint, long, ulong --- .../src/jit/hwintrinsiccodegenarm64.cpp | 19 +++++++++++++++++++ src/coreclr/src/jit/hwintrinsiclistarm64.h | 1 + src/coreclr/src/jit/lowerarmarch.cpp | 10 ++++++++++ .../src/System/Runtime/Intrinsics/Vector64.cs | 6 ++++++ 4 files changed, 36 insertions(+) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index 70fe9c540babe9..aa3567851f0da1 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -449,6 +449,25 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } break; + + case NI_Vector64_CreateScalarUnsafe: + assert(isRMW); + assert(targetReg != op1Reg); + + // TODO: Reformat it little bit + if (intrin.op1->isContainedIntOrIImmed()) + { + const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; + GetEmitter()->emitIns_R_I(INS_movi, emitSize, targetReg, dataValue, opt); + } + else + { + GetEmitter()->emitIns_R_R_I(ins, emitTypeSize(intrin.baseType), targetReg, op1Reg, 0, + INS_OPTS_NONE); + } + + break; + default: unreached(); } diff --git a/src/coreclr/src/jit/hwintrinsiclistarm64.h b/src/coreclr/src/jit/hwintrinsiclistarm64.h index f210bc0df1aba7..f763a9e37d6957 100644 --- a/src/coreclr/src/jit/hwintrinsiclistarm64.h +++ b/src/coreclr/src/jit/hwintrinsiclistarm64.h @@ -23,6 +23,7 @@ HARDWARE_INTRINSIC(Vector64, AsSByte, HARDWARE_INTRINSIC(Vector64, AsSingle, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt16, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt32, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Vector64, CreateScalarUnsafe, 8, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_fmov, INS_fmov}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Vector64, get_Count, 8, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** diff --git a/src/coreclr/src/jit/lowerarmarch.cpp b/src/coreclr/src/jit/lowerarmarch.cpp index 6eee592dc949dc..28e5222799c27d 100644 --- a/src/coreclr/src/jit/lowerarmarch.cpp +++ b/src/coreclr/src/jit/lowerarmarch.cpp @@ -914,7 +914,17 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) } } break; + case NI_Vector64_CreateScalarUnsafe: + if (intrin.op1->IsCnsIntOrI()) + { + const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; + if (comp->GetEmitter()->emitIns_valid_imm_for_movi(dataValue, emitActualTypeSize(intrin.baseType))) + { + MakeSrcContained(node, intrin.op1); + } + } + break; default: unreached(); } diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs index b1f1645858dc2b..26e7a614753681 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs @@ -522,6 +522,7 @@ public static unsafe Vector64 CreateScalar(uint value) /// Creates a new instance with the first element initialized to the specified value and the remaining elements left uninitialized. /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(byte value) { // This relies on us stripping the "init" flag from the ".locals" @@ -535,6 +536,7 @@ public static unsafe Vector64 CreateScalarUnsafe(byte value) /// Creates a new instance with the first element initialized to the specified value and the remaining elements left uninitialized. /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(short value) { // This relies on us stripping the "init" flag from the ".locals" @@ -548,6 +550,7 @@ public static unsafe Vector64 CreateScalarUnsafe(short value) /// Creates a new instance with the first element initialized to the specified value and the remaining elements left uninitialized. /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(int value) { // This relies on us stripping the "init" flag from the ".locals" @@ -562,6 +565,7 @@ public static unsafe Vector64 CreateScalarUnsafe(int value) /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. [CLSCompliant(false)] + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(sbyte value) { // This relies on us stripping the "init" flag from the ".locals" @@ -589,6 +593,7 @@ public static unsafe Vector64 CreateScalarUnsafe(float value) /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. [CLSCompliant(false)] + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(ushort value) { // This relies on us stripping the "init" flag from the ".locals" @@ -603,6 +608,7 @@ public static unsafe Vector64 CreateScalarUnsafe(ushort value) /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. [CLSCompliant(false)] + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(uint value) { // This relies on us stripping the "init" flag from the ".locals" From a41856ff81a7ad05d3e9c965b32260664524018f Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 24 Apr 2020 14:59:16 -0700 Subject: [PATCH 2/6] Intrinsify Vector64.CreateScalarUnsafe() for float --- .../src/jit/hwintrinsiccodegenarm64.cpp | 30 ++++++++++++++----- .../src/System/Runtime/Intrinsics/Vector64.cs | 1 + 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index aa3567851f0da1..1f5e65ba90920c 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -452,20 +452,34 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Vector64_CreateScalarUnsafe: assert(isRMW); - assert(targetReg != op1Reg); - // TODO: Reformat it little bit - if (intrin.op1->isContainedIntOrIImmed()) + if (varTypeIsFloating(intrin.baseType)) { - const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; - GetEmitter()->emitIns_R_I(INS_movi, emitSize, targetReg, dataValue, opt); + if (targetReg != op1Reg) + { + const double dataValue = intrin.op1->AsDblCon()->gtDconVal; + GetEmitter()->emitIns_R_F(ins, emitTypeSize(intrin.baseType), targetReg, dataValue, + INS_OPTS_NONE); + } + } else { - GetEmitter()->emitIns_R_R_I(ins, emitTypeSize(intrin.baseType), targetReg, op1Reg, 0, - INS_OPTS_NONE); - } + assert(targetReg != op1Reg); + // TODO: Reformat it little bit + if (intrin.op1->isContainedIntOrIImmed()) + { + const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; + GetEmitter()->emitIns_R_I(INS_movi, emitSize, targetReg, dataValue, opt); + } + else + { + GetEmitter()->emitIns_R_R_I(ins, emitTypeSize(intrin.baseType), targetReg, op1Reg, 0, + INS_OPTS_NONE); + } + } + break; default: diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs index 26e7a614753681..a4f3fae98cb12f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs @@ -579,6 +579,7 @@ public static unsafe Vector64 CreateScalarUnsafe(sbyte value) /// Creates a new instance with the first element initialized to the specified value and the remaining elements left uninitialized. /// The value that element 0 will be initialized to. /// A new instance with the first element initialized to and the remaining elements left uninitialized. + [Intrinsic] public static unsafe Vector64 CreateScalarUnsafe(float value) { // This relies on us stripping the "init" flag from the ".locals" From f8ff8101fd0e4831dbcb625561f675720e64f289 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 24 Apr 2020 22:14:07 -0700 Subject: [PATCH 3/6] Fixed minor things and code format --- .../src/jit/hwintrinsiccodegenarm64.cpp | 19 ++++++++++++------- src/coreclr/src/jit/hwintrinsiclistarm64.h | 2 +- src/coreclr/src/jit/lowerarmarch.cpp | 11 +++++++++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index 1f5e65ba90920c..671b8bbeddb2f7 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -453,33 +453,38 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Vector64_CreateScalarUnsafe: assert(isRMW); - if (varTypeIsFloating(intrin.baseType)) + if (intrin.op1->isContainedFltOrDblImmed()) + { + // fmov reg, #imm8 + const double dataValue = intrin.op1->AsDblCon()->gtDconVal; + GetEmitter()->emitIns_R_F(ins, emitTypeSize(intrin.baseType), targetReg, dataValue, + INS_OPTS_NONE); + } + else if (varTypeIsFloating(intrin.baseType)) { if (targetReg != op1Reg) { - const double dataValue = intrin.op1->AsDblCon()->gtDconVal; - GetEmitter()->emitIns_R_F(ins, emitTypeSize(intrin.baseType), targetReg, dataValue, - INS_OPTS_NONE); + // fmov reg1, reg2 + GetEmitter()->emitIns_R_R(ins, emitTypeSize(intrin.baseType), targetReg, op1Reg, INS_OPTS_NONE); } - } else { assert(targetReg != op1Reg); - // TODO: Reformat it little bit if (intrin.op1->isContainedIntOrIImmed()) { + // movi/movni reg, #imm8 const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; GetEmitter()->emitIns_R_I(INS_movi, emitSize, targetReg, dataValue, opt); } else { + // ins reg1[0], reg2 GetEmitter()->emitIns_R_R_I(ins, emitTypeSize(intrin.baseType), targetReg, op1Reg, 0, INS_OPTS_NONE); } } - break; default: diff --git a/src/coreclr/src/jit/hwintrinsiclistarm64.h b/src/coreclr/src/jit/hwintrinsiclistarm64.h index f763a9e37d6957..e280ab7240900b 100644 --- a/src/coreclr/src/jit/hwintrinsiclistarm64.h +++ b/src/coreclr/src/jit/hwintrinsiclistarm64.h @@ -23,7 +23,7 @@ HARDWARE_INTRINSIC(Vector64, AsSByte, HARDWARE_INTRINSIC(Vector64, AsSingle, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt16, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt32, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) -HARDWARE_INTRINSIC(Vector64, CreateScalarUnsafe, 8, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_fmov, INS_fmov}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Vector64, CreateScalarUnsafe, 8, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_invalid, INS_invalid, INS_fmov, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Vector64, get_Count, 8, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** diff --git a/src/coreclr/src/jit/lowerarmarch.cpp b/src/coreclr/src/jit/lowerarmarch.cpp index 28e5222799c27d..18117d1322e9d8 100644 --- a/src/coreclr/src/jit/lowerarmarch.cpp +++ b/src/coreclr/src/jit/lowerarmarch.cpp @@ -924,6 +924,17 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) MakeSrcContained(node, intrin.op1); } } + else if (intrin.op1->IsCnsFltOrDbl()) + { + assert(varTypeIsFloating(intrin.baseType)); + + const double dataValue = intrin.op1->AsDblCon()->gtDconVal; + + if (comp->GetEmitter()->emitIns_valid_imm_for_fmov(dataValue)) + { + MakeSrcContained(node, intrin.op1); + } + } break; default: unreached(); From 0c280c880aa28906b18fe569c793c4c2f1fca8dc Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 24 Apr 2020 22:16:00 -0700 Subject: [PATCH 4/6] Intrinsify Vector128.CreateScalarUnsafe() for all --- src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp | 2 +- src/coreclr/src/jit/hwintrinsiclistarm64.h | 1 + src/coreclr/src/jit/lowerarmarch.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index 671b8bbeddb2f7..9e108f625146dd 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -449,8 +449,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } break; - case NI_Vector64_CreateScalarUnsafe: + case NI_Vector128_CreateScalarUnsafe: assert(isRMW); if (intrin.op1->isContainedFltOrDblImmed()) diff --git a/src/coreclr/src/jit/hwintrinsiclistarm64.h b/src/coreclr/src/jit/hwintrinsiclistarm64.h index e280ab7240900b..c551efd26e00d8 100644 --- a/src/coreclr/src/jit/hwintrinsiclistarm64.h +++ b/src/coreclr/src/jit/hwintrinsiclistarm64.h @@ -42,6 +42,7 @@ HARDWARE_INTRINSIC(Vector128, AsSingle, 1 HARDWARE_INTRINSIC(Vector128, AsUInt16, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector128, AsUInt32, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector128, AsUInt64, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Vector128, CreateScalarUnsafe, 16, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_fmov, INS_fmov}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Vector128, get_Count, 16, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** diff --git a/src/coreclr/src/jit/lowerarmarch.cpp b/src/coreclr/src/jit/lowerarmarch.cpp index 18117d1322e9d8..4ae61be664ee39 100644 --- a/src/coreclr/src/jit/lowerarmarch.cpp +++ b/src/coreclr/src/jit/lowerarmarch.cpp @@ -915,6 +915,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) } break; case NI_Vector64_CreateScalarUnsafe: + case NI_Vector128_CreateScalarUnsafe: if (intrin.op1->IsCnsIntOrI()) { const ssize_t dataValue = intrin.op1->AsIntCon()->gtIconVal; From b55e6d453eaf8ebf68ffe801faaf90c82ef04d65 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 24 Apr 2020 23:15:02 -0700 Subject: [PATCH 5/6] fix formatting --- src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index 9e108f625146dd..50510a77ce7a24 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -457,8 +457,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) { // fmov reg, #imm8 const double dataValue = intrin.op1->AsDblCon()->gtDconVal; - GetEmitter()->emitIns_R_F(ins, emitTypeSize(intrin.baseType), targetReg, dataValue, - INS_OPTS_NONE); + GetEmitter()->emitIns_R_F(ins, emitTypeSize(intrin.baseType), targetReg, dataValue, INS_OPTS_NONE); } else if (varTypeIsFloating(intrin.baseType)) { From 75a1a3a69dc79bb1f646588da77cae197dc2a4de Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 27 Apr 2020 11:31:02 -0700 Subject: [PATCH 6/6] Review feedback --- src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp | 8 +++----- src/coreclr/src/jit/hwintrinsiclistarm64.h | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp index 50510a77ce7a24..9338cc01ad3b96 100644 --- a/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/src/jit/hwintrinsiccodegenarm64.cpp @@ -451,8 +451,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Vector64_CreateScalarUnsafe: case NI_Vector128_CreateScalarUnsafe: - assert(isRMW); - + { if (intrin.op1->isContainedFltOrDblImmed()) { // fmov reg, #imm8 @@ -469,8 +468,6 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } else { - assert(targetReg != op1Reg); - if (intrin.op1->isContainedIntOrIImmed()) { // movi/movni reg, #imm8 @@ -484,7 +481,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) INS_OPTS_NONE); } } - break; + } + break; default: unreached(); diff --git a/src/coreclr/src/jit/hwintrinsiclistarm64.h b/src/coreclr/src/jit/hwintrinsiclistarm64.h index c551efd26e00d8..6a07a01b4fd9a5 100644 --- a/src/coreclr/src/jit/hwintrinsiclistarm64.h +++ b/src/coreclr/src/jit/hwintrinsiclistarm64.h @@ -23,7 +23,7 @@ HARDWARE_INTRINSIC(Vector64, AsSByte, HARDWARE_INTRINSIC(Vector64, AsSingle, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt16, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector64, AsUInt32, 8, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) -HARDWARE_INTRINSIC(Vector64, CreateScalarUnsafe, 8, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_invalid, INS_invalid, INS_fmov, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Vector64, CreateScalarUnsafe, 8, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_invalid, INS_invalid, INS_fmov, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Vector64, get_Count, 8, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -42,7 +42,7 @@ HARDWARE_INTRINSIC(Vector128, AsSingle, 1 HARDWARE_INTRINSIC(Vector128, AsUInt16, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector128, AsUInt32, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Vector128, AsUInt64, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen|HW_Flag_BaseTypeFromFirstArg) -HARDWARE_INTRINSIC(Vector128, CreateScalarUnsafe, 16, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_fmov, INS_fmov}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Vector128, CreateScalarUnsafe, 16, 1, {INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_ins, INS_fmov, INS_fmov}, HW_Category_SimpleSIMD, HW_Flag_SupportsContainment|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Vector128, get_Count, 16, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoCodeGen) // ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************