diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jit/hwintrinsiclistxarch.h | 1 | ||||
-rw-r--r-- | src/jit/hwintrinsicxarch.cpp | 18 | ||||
-rw-r--r-- | src/mscorlib/src/System/Runtime/Intrinsics/X86/Sse.cs | 17 |
3 files changed, 16 insertions, 20 deletions
diff --git a/src/jit/hwintrinsiclistxarch.h b/src/jit/hwintrinsiclistxarch.h index 12a7b2387c..c89995226b 100644 --- a/src/jit/hwintrinsiclistxarch.h +++ b/src/jit/hwintrinsiclistxarch.h @@ -102,7 +102,6 @@ HARDWARE_INTRINSIC(SSE_ReciprocalSqrt, "Reciprocal HARDWARE_INTRINSIC(SSE_ReciprocalSqrtScalar, "ReciprocalSqrtScalar", SSE, -1, 16, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_rsqrtss, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_CopyUpperBits) HARDWARE_INTRINSIC(SSE_SetAllVector128, "SetAllVector128", SSE, -1, 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_NoCodeGen|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE_SetScalarVector128, "SetScalarVector128", SSE, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movss, INS_invalid}, HW_Category_Helper, HW_Flag_MultiIns|HW_Flag_NoRMWSemantics) -HARDWARE_INTRINSIC(SSE_SetVector128, "SetVector128", SSE, -1, 16, 4, {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_NoCodeGen) HARDWARE_INTRINSIC(SSE_SetZeroVector128, "SetZeroVector128", SSE, -1, 16, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_xorps, INS_invalid}, HW_Category_Helper, HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE_Shuffle, "Shuffle", SSE, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_shufps, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM) HARDWARE_INTRINSIC(SSE_Sqrt, "Sqrt", SSE, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sqrtps, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoRMWSemantics) diff --git a/src/jit/hwintrinsicxarch.cpp b/src/jit/hwintrinsicxarch.cpp index b48a1b170d..869361770c 100644 --- a/src/jit/hwintrinsicxarch.cpp +++ b/src/jit/hwintrinsicxarch.cpp @@ -909,24 +909,6 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic, switch (intrinsic) { - case NI_SSE_SetVector128: - { - assert(sig->numArgs == 4); - assert(getBaseTypeOfSIMDType(sig->retTypeSigClass) == TYP_FLOAT); - - op4 = impPopStack().val; - op3 = impPopStack().val; - op2 = impPopStack().val; - op1 = impPopStack().val; - - GenTree* left = gtNewSimdHWIntrinsicNode(TYP_SIMD16, op4, op3, NI_SSE_UnpackLow, TYP_FLOAT, simdSize); - GenTree* right = gtNewSimdHWIntrinsicNode(TYP_SIMD16, op2, op1, NI_SSE_UnpackLow, TYP_FLOAT, simdSize); - GenTree* control = gtNewIconNode(68, TYP_UBYTE); - - retNode = gtNewSimdHWIntrinsicNode(TYP_SIMD16, left, right, control, NI_SSE_Shuffle, TYP_FLOAT, simdSize); - break; - } - case NI_SSE_MoveMask: assert(sig->numArgs == 1); assert(JITtype2varType(sig->retType) == TYP_INT); diff --git a/src/mscorlib/src/System/Runtime/Intrinsics/X86/Sse.cs b/src/mscorlib/src/System/Runtime/Intrinsics/X86/Sse.cs index fa789ebb49..f07bf4ac99 100644 --- a/src/mscorlib/src/System/Runtime/Intrinsics/X86/Sse.cs +++ b/src/mscorlib/src/System/Runtime/Intrinsics/X86/Sse.cs @@ -467,7 +467,22 @@ namespace System.Runtime.Intrinsics.X86 /// <summary> /// __m128 _mm_set_ps (float e3, float e2, float e1, float e0) /// </summary> - public static Vector128<float> SetVector128(float e3, float e2, float e1, float e0) => SetVector128(e3, e2, e1, e0); + public static unsafe Vector128<float> SetVector128(float e3, float e2, float e1, float e0) + { + // TODO-CQ Optimize algorithm choice based on benchmarks + + // Zero vector and load e2 et index 0 + Vector128<float> e2Vector = SetScalarVector128(e2); + Vector128<float> e1Vector = SetScalarVector128(e1); + Vector128<float> e0Vector = SetScalarVector128(e0); + // Create { -- -- e2 e0 } + e0Vector = UnpackLow(e0Vector, e2Vector); + e2Vector = SetScalarVector128(e3); + // Create { -- -- e3 e1 } + e1Vector = UnpackLow(e1Vector, e2Vector); + // Create { e3 e2 e1 e0 } and return result + return UnpackLow(e0Vector, e1Vector); + } /// <summary> /// __m128 _mm_set_ss (float a) |