summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarol Eidt <cteidt@microsoft.com>2017-09-14 14:29:44 -0700
committerCarol Eidt <cteidt@microsoft.com>2017-09-14 14:29:44 -0700
commitd743cbdeb438322a4b10e2dc3d9f22a653439714 (patch)
treefbd23b12150394b5ced5c24f650e72f3b9b5de4a
parent650bdbf98968c5c274a40a21ee8b7dd9bb2d193c (diff)
downloadcoreclr-d743cbdeb438322a4b10e2dc3d9f22a653439714.tar.gz
coreclr-d743cbdeb438322a4b10e2dc3d9f22a653439714.tar.bz2
coreclr-d743cbdeb438322a4b10e2dc3d9f22a653439714.zip
Update test
-rw-r--r--tests/src/JIT/Regression/JitBlue/GitHub_13568/GitHub_13568.cs171
1 files changed, 86 insertions, 85 deletions
diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_13568/GitHub_13568.cs b/tests/src/JIT/Regression/JitBlue/GitHub_13568/GitHub_13568.cs
index 3f4f526523..98a136c1e6 100644
--- a/tests/src/JIT/Regression/JitBlue/GitHub_13568/GitHub_13568.cs
+++ b/tests/src/JIT/Regression/JitBlue/GitHub_13568/GitHub_13568.cs
@@ -20,7 +20,7 @@ namespace VectorWiden
fixed (byte* pBytes = &_asciiBytes[0])
fixed (char* pString = _asciiString)
{
- TryGetAsciiStringVectorized(pBytes, pString, _asciiBytes.Length);
+ TryGetAsciiStringVectorWiden(pBytes, pString, _asciiBytes.Length);
}
if (String.Compare(_asciiString, compareString) != 0)
{
@@ -33,105 +33,106 @@ namespace VectorWiden
return 100;
}
- public static unsafe bool TryGetAsciiStringVectorized(byte* input, char* output, int count)
+ public static unsafe bool TryGetAsciiStringVectorWiden(byte* input, char* output, int count)
+
{
// Calcuate end position
var end = input + count;
+
// Start as valid
var isValid = true;
- if (Vector.IsHardwareAccelerated && count >= Vector<sbyte>.Count)
- {
- // Jump forward to vector code to reduced cost when smaller than vector size
- // - by default, forward jumps are predicted non-taken and near code is hotter in instruction decode
- // When larger than Vector, vectorization will be able to make the cost back
- goto Vectorized;
- }
-
- NonVectorized:
- if (IntPtr.Size == 8) // Use Intrinsic switch for branch elimination
+ do
{
- // 64-bit: Loop longs by default
- while (input <= end - sizeof(long))
+ // If Vector not-accelerated or remaining less than vector size
+ if (!Vector.IsHardwareAccelerated || input > end - Vector<sbyte>.Count)
{
- isValid &= CheckBytesInAsciiRange(((long*)input)[0]);
-
- output[0] = (char)input[0];
- output[1] = (char)input[1];
- output[2] = (char)input[2];
- output[3] = (char)input[3];
- output[4] = (char)input[4];
- output[5] = (char)input[5];
- output[6] = (char)input[6];
- output[7] = (char)input[7];
-
- input += sizeof(long);
- output += sizeof(long);
+ if (IntPtr.Size == 8) // Use Intrinsic switch for branch elimination
+ {
+ // 64-bit: Loop longs by default
+ while (input <= end - sizeof(long))
+ {
+ isValid &= CheckBytesInAsciiRange(((long*)input)[0]);
+
+ output[0] = (char)input[0];
+ output[1] = (char)input[1];
+ output[2] = (char)input[2];
+ output[3] = (char)input[3];
+ output[4] = (char)input[4];
+ output[5] = (char)input[5];
+ output[6] = (char)input[6];
+ output[7] = (char)input[7];
+
+ input += sizeof(long);
+ output += sizeof(long);
+ }
+ if (input <= end - sizeof(int))
+ {
+ isValid &= CheckBytesInAsciiRange(((int*)input)[0]);
+
+ output[0] = (char)input[0];
+ output[1] = (char)input[1];
+ output[2] = (char)input[2];
+ output[3] = (char)input[3];
+
+ input += sizeof(int);
+ output += sizeof(int);
+ }
+ }
+ else
+ {
+ // 32-bit: Loop ints by default
+ while (input <= end - sizeof(int))
+ {
+ isValid &= CheckBytesInAsciiRange(((int*)input)[0]);
+
+ output[0] = (char)input[0];
+ output[1] = (char)input[1];
+ output[2] = (char)input[2];
+ output[3] = (char)input[3];
+
+ input += sizeof(int);
+ output += sizeof(int);
+ }
+ }
+ if (input <= end - sizeof(short))
+ {
+ isValid &= CheckBytesInAsciiRange(((short*)input)[0]);
+
+ output[0] = (char)input[0];
+ output[1] = (char)input[1];
+
+ input += sizeof(short);
+ output += sizeof(short);
+ }
+ if (input < end)
+ {
+ isValid &= CheckBytesInAsciiRange(((sbyte*)input)[0]);
+ output[0] = (char)input[0];
+ }
+
+ return isValid;
}
- if (input <= end - sizeof(int))
- {
- isValid &= CheckBytesInAsciiRange(((int*)input)[0]);
- output[0] = (char)input[0];
- output[1] = (char)input[1];
- output[2] = (char)input[2];
- output[3] = (char)input[3];
-
- input += sizeof(int);
- output += sizeof(int);
- }
- }
- else
- {
- // 32-bit: Loop ints by default
- while (input <= end - sizeof(int))
+ // do/while as entry condition already checked
+ do
{
- isValid &= CheckBytesInAsciiRange(((int*)input)[0]);
-
- output[0] = (char)input[0];
- output[1] = (char)input[1];
- output[2] = (char)input[2];
- output[3] = (char)input[3];
-
- input += sizeof(int);
- output += sizeof(int);
- }
- }
- if (input <= end - sizeof(short))
- {
- isValid &= CheckBytesInAsciiRange(((short*)input)[0]);
-
- output[0] = (char)input[0];
- output[1] = (char)input[1];
-
- input += sizeof(short);
- output += sizeof(short);
- }
- if (input < end)
- {
- isValid &= CheckBytesInAsciiRange(((sbyte*)input)[0]);
- output[0] = (char)input[0];
- }
+ var vector = Unsafe.AsRef<Vector<sbyte>>(input);
+ isValid &= CheckBytesInAsciiRange(vector);
+ // Vectorized widen, byte vector to two short vectors
+ Vector.Widen(vector, out Unsafe.AsRef<Vector<short>>(output),
+ out Unsafe.AsRef<Vector<short>>(output + Vector<short>.Count));
+ input += Vector<sbyte>.Count;
+ output += Vector<sbyte>.Count;
+ } while (input <= end - Vector<sbyte>.Count);
+
+ // Vector path done, loop back to do non-Vector
+ // If is a exact multiple of vector size, bail now
+ } while (input > end - Vector<sbyte>.Count);
return isValid;
-
- Vectorized:
- // do/while as entry condition already checked
- do
- {
- var vector = Unsafe.AsRef<Vector<sbyte>>(input);
- isValid &= CheckBytesInAsciiRange(vector);
- // Vectorized widen, byte vector to two short vectors
- Vector.Widen(vector, out Unsafe.AsRef<Vector<short>>(output),
- out Unsafe.AsRef<Vector<short>>(output + Vector<short>.Count));
- input += Vector<sbyte>.Count;
- output += Vector<sbyte>.Count;
- } while (input < end - Vector<sbyte>.Count);
-
- goto NonVectorized;
}
-
private static bool CheckBytesInAsciiRange(Vector<sbyte> check)
{
// Vectorized byte range check, signed byte > 0 for 1-127