From 1fd7f95b65af30eab4f11b23f6cc7feaee391b1b Mon Sep 17 00:00:00 2001 From: Fei Peng Date: Thu, 19 Apr 2018 17:40:32 -0700 Subject: [PATCH] Fix SSE2 SetZeroVector128 on float type --- src/jit/hwintrinsiccodegenxarch.cpp | 1 - src/jit/hwintrinsiclistxarch.h | 2 +- .../X86/Sse2/SetZeroVector128.cs | 23 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/jit/hwintrinsiccodegenxarch.cpp b/src/jit/hwintrinsiccodegenxarch.cpp index acf013e20794..8fc5854a6f42 100644 --- a/src/jit/hwintrinsiccodegenxarch.cpp +++ b/src/jit/hwintrinsiccodegenxarch.cpp @@ -1077,7 +1077,6 @@ void CodeGen::genSSE2Intrinsic(GenTreeHWIntrinsic* node) case NI_SSE2_SetZeroVector128: { - assert(baseType != TYP_FLOAT); assert(baseType >= TYP_BYTE && baseType <= TYP_DOUBLE); assert(op1 == nullptr); assert(op2 == nullptr); diff --git a/src/jit/hwintrinsiclistxarch.h b/src/jit/hwintrinsiclistxarch.h index 0ab27836031a..c586a03dc14e 100644 --- a/src/jit/hwintrinsiclistxarch.h +++ b/src/jit/hwintrinsiclistxarch.h @@ -211,7 +211,7 @@ HARDWARE_INTRINSIC(SSE2_Or, "Or", HARDWARE_INTRINSIC(SSE2_PackSignedSaturate, "PackSignedSaturate", SSE2, -1, 16, 2, {INS_invalid, INS_invalid, INS_packsswb, INS_invalid, INS_packssdw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(SSE2_PackUnsignedSaturate, "PackUnsignedSaturate", SSE2, -1, 16, 2, {INS_invalid, INS_invalid, INS_packuswb, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(SSE2_SetScalarVector128, "SetScalarVector128", SSE2, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movsdsse2}, HW_Category_Helper, HW_Flag_MultiIns|HW_Flag_NoRMWSemantics) -HARDWARE_INTRINSIC(SSE2_SetZeroVector128, "SetZeroVector128", SSE2, -1, 16, 0, {INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_invalid, INS_xorpd}, HW_Category_Helper, HW_Flag_NoFlag) +HARDWARE_INTRINSIC(SSE2_SetZeroVector128, "SetZeroVector128", SSE2, -1, 16, 0, {INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_pxor, INS_xorps, INS_xorpd}, HW_Category_Helper, HW_Flag_OneTypeGeneric|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE2_SumAbsoluteDifferences, "SumAbsoluteDifferences", SSE2, -1, 16, 2, {INS_invalid, INS_psadbw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(SSE2_ShiftLeftLogical, "ShiftLeftLogical", SSE2, -1, 16, 2, {INS_invalid, INS_invalid, INS_psllw, INS_psllw, INS_pslld, INS_pslld, INS_psllq, INS_psllq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_MaybeIMM|HW_Flag_NoJmpTableIMM|HW_Flag_FullRangeIMM) HARDWARE_INTRINSIC(SSE2_ShiftLeftLogical128BitLane, "ShiftLeftLogical128BitLane", SSE2, -1, 16, 2, {INS_pslldq, INS_pslldq, INS_pslldq, INS_pslldq, INS_pslldq, INS_pslldq, INS_pslldq, INS_pslldq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM) diff --git a/tests/src/JIT/HardwareIntrinsics/X86/Sse2/SetZeroVector128.cs b/tests/src/JIT/HardwareIntrinsics/X86/Sse2/SetZeroVector128.cs index 4a5974addff3..750405c56165 100644 --- a/tests/src/JIT/HardwareIntrinsics/X86/Sse2/SetZeroVector128.cs +++ b/tests/src/JIT/HardwareIntrinsics/X86/Sse2/SetZeroVector128.cs @@ -23,6 +23,7 @@ static unsafe int Main(string[] args) if (Sse2.IsSupported) { using (var doubleTable = TestTableSse2.Create(testsCount)) + using (var floatTable = TestTableSse2.Create(testsCount)) using (var longTable = TestTableSse2.Create(testsCount)) using (var ulongTable = TestTableSse2.Create(testsCount)) using (var intTable = TestTableSse2.Create(testsCount)) @@ -38,6 +39,12 @@ static unsafe int Main(string[] args) doubleTable.SetOutArray(result, i); } + for (int i = 0; i < testsCount; i++) + { + Vector128 result = Sse2.SetZeroVector128(); + floatTable.SetOutArray(result, i); + } + for (int i = 0; i < testsCount; i++) { Vector128 result = Sse2.SetZeroVector128(); @@ -94,6 +101,14 @@ static unsafe int Main(string[] args) testResult = Fail; } + CheckMethod checkFloat = (float x, float y, float z, ref float a) => (a = BitwiseXor(x, x)) == z; + + if (!floatTable.CheckResult(checkFloat)) + { + PrintError(floatTable, methodUnderTestName, "(float x, float y, float z, ref float a) => (a = BitwiseXor(x, y)) == z", checkFloat); + testResult = Fail; + } + CheckMethod checkLong = (long x, long y, long z, ref long a) => (a = x ^ x) == z; if (!longTable.CheckResult(checkLong)) @@ -174,5 +189,13 @@ public static unsafe double BitwiseXor(double x, double y) var longAnd = xUlong ^ yUlong; return BitConverter.ToDouble(BitConverter.GetBytes(longAnd)); } + + public static unsafe float BitwiseXor(float x, float y) + { + var xUint = BitConverter.ToUInt32(BitConverter.GetBytes(x)); + var yUint = BitConverter.ToUInt32(BitConverter.GetBytes(y)); + var intAnd = xUint ^ yUint; + return BitConverter.ToSingle(BitConverter.GetBytes(intAnd)); + } } }