Skip to content

Commit 4823e7c

Browse files
EgorBoSergey Andreenko
and
Sergey Andreenko
authored
RyuJIT: Fix logic to test bits in a constant vector (Vector256) (#47385)
Co-authored-by: Sergey Andreenko <[email protected]>
1 parent 8f91099 commit 4823e7c

File tree

6 files changed

+226
-19
lines changed

6 files changed

+226
-19
lines changed

src/coreclr/jit/lower.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,28 @@ class Lowering final : public Phase
348348
double f64[4];
349349
};
350350

351+
//----------------------------------------------------------------------------------------------
352+
// VectorConstantIsBroadcastedI64: Check N i64 elements in a constant vector for equality
353+
//
354+
// Arguments:
355+
// vecCns - Constant vector
356+
// count - Amount of i64 components to compare
357+
//
358+
// Returns:
359+
// true if N i64 elements of the given vector are equal
360+
static bool VectorConstantIsBroadcastedI64(VectorConstant& vecCns, int count)
361+
{
362+
assert(count >= 1 && count <= 4);
363+
for (int i = 1; i < count; i++)
364+
{
365+
if (vecCns.i64[i] != vecCns.i64[0])
366+
{
367+
return false;
368+
}
369+
}
370+
return true;
371+
}
372+
351373
//----------------------------------------------------------------------------------------------
352374
// ProcessArgForHWIntrinsicCreate: Processes an argument for the Lowering::LowerHWIntrinsicCreate method
353375
//

src/coreclr/jit/lowerarmarch.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -971,25 +971,23 @@ void Lowering::LowerHWIntrinsicCreate(GenTreeHWIntrinsic* node)
971971

972972
assert((simdSize == 8) || (simdSize == 16));
973973

974-
if ((argCnt == 1) || (simdSize == 8) || (vecCns.i64[0] == vecCns.i64[1]))
974+
if (VectorConstantIsBroadcastedI64(vecCns, simdSize / 8))
975975
{
976976
// If we are a single constant or if all parts are the same, we might be able to optimize
977977
// this even further for certain values, such as Zero or AllBitsSet.
978978

979979
if (vecCns.i64[0] == 0)
980980
{
981-
node->gtOp1 = nullptr;
982-
node->gtOp2 = nullptr;
983-
984-
node->gtHWIntrinsicId = NI_Vector128_get_Zero;
981+
node->gtOp1 = nullptr;
982+
node->gtOp2 = nullptr;
983+
node->gtHWIntrinsicId = (simdSize == 8) ? NI_Vector64_get_Zero : NI_Vector128_get_Zero;
985984
return;
986985
}
987986
else if (vecCns.i64[0] == -1)
988987
{
989-
node->gtOp1 = nullptr;
990-
node->gtOp2 = nullptr;
991-
992-
node->gtHWIntrinsicId = NI_Vector128_get_AllBitsSet;
988+
node->gtOp1 = nullptr;
989+
node->gtOp2 = nullptr;
990+
node->gtHWIntrinsicId = (simdSize == 8) ? NI_Vector64_get_AllBitsSet : NI_Vector128_get_AllBitsSet;
993991
return;
994992
}
995993
}

src/coreclr/jit/lowerxarch.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,26 +1517,23 @@ void Lowering::LowerHWIntrinsicCreate(GenTreeHWIntrinsic* node)
15171517

15181518
assert((simdSize == 8) || (simdSize == 12) || (simdSize == 16) || (simdSize == 32));
15191519

1520-
if ((argCnt == 1) ||
1521-
((vecCns.i64[0] == vecCns.i64[1]) && ((simdSize <= 16) || (vecCns.i64[2] == vecCns.i64[3]))))
1520+
if (((simdSize == 16) || (simdSize == 32)) && VectorConstantIsBroadcastedI64(vecCns, simdSize / 8))
15221521
{
15231522
// If we are a single constant or if all parts are the same, we might be able to optimize
15241523
// this even further for certain values, such as Zero or AllBitsSet.
15251524

15261525
if (vecCns.i64[0] == 0)
15271526
{
1528-
node->gtOp1 = nullptr;
1529-
node->gtOp2 = nullptr;
1530-
1531-
node->gtHWIntrinsicId = NI_Vector128_get_Zero;
1527+
node->gtOp1 = nullptr;
1528+
node->gtOp2 = nullptr;
1529+
node->gtHWIntrinsicId = (simdSize == 16) ? NI_Vector128_get_Zero : NI_Vector256_get_Zero;
15321530
return;
15331531
}
15341532
else if (vecCns.i64[0] == -1)
15351533
{
1536-
node->gtOp1 = nullptr;
1537-
node->gtOp2 = nullptr;
1538-
1539-
node->gtHWIntrinsicId = NI_Vector128_get_AllBitsSet;
1534+
node->gtOp1 = nullptr;
1535+
node->gtOp2 = nullptr;
1536+
node->gtHWIntrinsicId = (simdSize == 16) ? NI_Vector128_get_AllBitsSet : NI_Vector256_get_AllBitsSet;
15401537
return;
15411538
}
15421539
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Runtime.CompilerServices;
6+
using System.Runtime.Intrinsics;
7+
8+
public static class Program
9+
{
10+
private static int s_returnCode = 100;
11+
12+
public static int Main(string[] args)
13+
{
14+
TestVector256();
15+
TestVector128();
16+
TestVector64();
17+
return s_returnCode;
18+
}
19+
20+
public static void TestVector256()
21+
{
22+
// Test get_Zero() optimization:
23+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToString());
24+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1).ToString());
25+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
26+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
27+
Assert("<0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
28+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
29+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToString());
30+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1).ToString());
31+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
32+
Assert("<0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
33+
Assert("<0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
34+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
35+
Assert("<1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToString());
36+
Assert("<0, 0, 0, 0, 0, 0, 0, 0>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0).ToString());
37+
Assert("<0, 0, 0, 0, 0, 0, 0, 1>", Vector256.Create(0, 0, 0, 0, 0, 0, 0, 1).ToString());
38+
Assert("<0, 0, 0, 0, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 0, 1, 1, 1, 1).ToString());
39+
Assert("<0, 0, 0, 1, 1, 1, 1, 1>", Vector256.Create(0, 0, 0, 1, 1, 1, 1, 1).ToString());
40+
Assert("<0, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(0, 1, 1, 1, 1, 1, 1, 1).ToString());
41+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
42+
Assert("<1, 1, 1, 1, 0, 0, 0, 0>", Vector256.Create(1, 1, 1, 1, 0, 0, 0, 0).ToString());
43+
Assert("<0, 0, 0, 0>", Vector256.Create(0, 0, 0, 0).ToString());
44+
Assert("<0, 0, 1, 1>", Vector256.Create(0, 0, 1, 1).ToString());
45+
Assert("<0, 1, 1, 1>", Vector256.Create(0, 1, 1, 1).ToString());
46+
Assert("<1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1).ToString());
47+
Assert("<1, 1, 0, 0>", Vector256.Create(1, 1, 0, 0).ToString());
48+
49+
// Test get_AllBitSet() optimization:
50+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1).ToString());
51+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1).ToString());
52+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
53+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
54+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
55+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
56+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1).ToString());
57+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1).ToString());
58+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
59+
Assert("<-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
60+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
61+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
62+
Assert("<1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1).ToString());
63+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, -1).ToString());
64+
Assert("<-1, -1, -1, -1, -1, -1, -1, 1>", Vector256.Create(-1, -1, -1, -1, -1, -1, -1, 1).ToString());
65+
Assert("<-1, -1, -1, -1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, -1, 1, 1, 1, 1).ToString());
66+
Assert("<-1, -1, -1, 1, 1, 1, 1, 1>", Vector256.Create(-1, -1, -1, 1, 1, 1, 1, 1).ToString());
67+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(-1, 1, 1, 1, 1, 1, 1, 1).ToString());
68+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
69+
Assert("<1, 1, 1, 1, -1, -1, -1, -1>", Vector256.Create(1, 1, 1, 1, -1, -1, -1, -1).ToString());
70+
Assert("<-1, -1, -1, -1>", Vector256.Create(-1, -1, -1, -1).ToString());
71+
Assert("<-1, -1, 1, 1>", Vector256.Create(-1, -1, 1, 1).ToString());
72+
Assert("<-1, 1, 1, 1>", Vector256.Create(-1, 1, 1, 1).ToString());
73+
Assert("<1, 1, 1, 1>", Vector256.Create(1, 1, 1, 1).ToString());
74+
Assert("<1, 1, -1, -1>", Vector256.Create(1, 1, -1, -1).ToString());
75+
}
76+
77+
public static void TestVector128()
78+
{
79+
// Test get_Zero() optimization:
80+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToString());
81+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1).ToString());
82+
Assert("<0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
83+
Assert("<0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
84+
Assert("<0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
85+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
86+
Assert("<1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToString());
87+
Assert("<0, 0, 0, 0, 0, 0, 0, 0>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0).ToString());
88+
Assert("<0, 0, 0, 0, 0, 0, 0, 1>", Vector128.Create(0, 0, 0, 0, 0, 0, 0, 1).ToString());
89+
Assert("<0, 0, 0, 0, 1, 1, 1, 1>", Vector128.Create(0, 0, 0, 0, 1, 1, 1, 1).ToString());
90+
Assert("<0, 0, 0, 1, 1, 1, 1, 1>", Vector128.Create(0, 0, 0, 1, 1, 1, 1, 1).ToString());
91+
Assert("<0, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(0, 1, 1, 1, 1, 1, 1, 1).ToString());
92+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
93+
Assert("<1, 1, 1, 1, 0, 0, 0, 0>", Vector128.Create(1, 1, 1, 1, 0, 0, 0, 0).ToString());
94+
Assert("<0, 0, 0, 0>", Vector128.Create(0, 0, 0, 0).ToString());
95+
Assert("<0, 0, 1, 1>", Vector128.Create(0, 0, 1, 1).ToString());
96+
Assert("<0, 1, 1, 1>", Vector128.Create(0, 1, 1, 1).ToString());
97+
Assert("<1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1).ToString());
98+
Assert("<1, 1, 0, 0>", Vector128.Create(1, 1, 0, 0).ToString());
99+
Assert("<0, 0>", Vector128.Create(0, 0).ToString());
100+
Assert("<0, 1>", Vector128.Create(0, 1).ToString());
101+
Assert("<1, 1>", Vector128.Create(1, 1).ToString());
102+
Assert("<1, 0>", Vector128.Create(1, 0).ToString());
103+
104+
// Test get_AllBitSet() optimization:
105+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1).ToString());
106+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1).ToString());
107+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
108+
Assert("<-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
109+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
110+
Assert("<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).ToString());
111+
Assert("<1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1).ToString());
112+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, -1).ToString());
113+
Assert("<-1, -1, -1, -1, -1, -1, -1, 1>", Vector128.Create(-1, -1, -1, -1, -1, -1, -1, 1).ToString());
114+
Assert("<-1, -1, -1, -1, 1, 1, 1, 1>", Vector128.Create(-1, -1, -1, -1, 1, 1, 1, 1).ToString());
115+
Assert("<-1, -1, -1, 1, 1, 1, 1, 1>", Vector128.Create(-1, -1, -1, 1, 1, 1, 1, 1).ToString());
116+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(-1, 1, 1, 1, 1, 1, 1, 1).ToString());
117+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
118+
Assert("<1, 1, 1, 1, -1, -1, -1, -1>", Vector128.Create(1, 1, 1, 1, -1, -1, -1, -1).ToString());
119+
Assert("<-1, -1, -1, -1>", Vector128.Create(-1, -1, -1, -1).ToString());
120+
Assert("<-1, -1, 1, 1>", Vector128.Create(-1, -1, 1, 1).ToString());
121+
Assert("<-1, 1, 1, 1>", Vector128.Create(-1, 1, 1, 1).ToString());
122+
Assert("<1, 1, 1, 1>", Vector128.Create(1, 1, 1, 1).ToString());
123+
Assert("<1, 1, -1, -1>", Vector128.Create(1, 1, -1, -1).ToString());
124+
Assert("<-1, -1>", Vector128.Create(-1, -1).ToString());
125+
Assert("<-1, 1>", Vector128.Create(-1, 1).ToString());
126+
Assert("<1, -1>", Vector128.Create(1, -1).ToString());
127+
}
128+
129+
public static void TestVector64()
130+
{
131+
// Test get_Zero() optimization:
132+
Assert("<0, 0, 0, 0, 0, 0, 0, 0>", Vector64.Create(0, 0, 0, 0, 0, 0, 0, 0).ToString());
133+
Assert("<0, 0, 0, 0, 0, 0, 0, 1>", Vector64.Create(0, 0, 0, 0, 0, 0, 0, 1).ToString());
134+
Assert("<0, 0, 0, 0, 1, 1, 1, 1>", Vector64.Create(0, 0, 0, 0, 1, 1, 1, 1).ToString());
135+
Assert("<0, 0, 0, 1, 1, 1, 1, 1>", Vector64.Create(0, 0, 0, 1, 1, 1, 1, 1).ToString());
136+
Assert("<0, 1, 1, 1, 1, 1, 1, 1>", Vector64.Create(0, 1, 1, 1, 1, 1, 1, 1).ToString());
137+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector64.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
138+
Assert("<1, 1, 1, 1, 0, 0, 0, 0>", Vector64.Create(1, 1, 1, 1, 0, 0, 0, 0).ToString());
139+
Assert("<0, 0, 0, 0>", Vector64.Create(0, 0, 0, 0).ToString());
140+
Assert("<0, 0, 1, 1>", Vector64.Create(0, 0, 1, 1).ToString());
141+
Assert("<0, 1, 1, 1>", Vector64.Create(0, 1, 1, 1).ToString());
142+
Assert("<1, 1, 1, 1>", Vector64.Create(1, 1, 1, 1).ToString());
143+
Assert("<1, 1, 0, 0>", Vector64.Create(1, 1, 0, 0).ToString());
144+
Assert("<0, 0>", Vector64.Create(0, 0).ToString());
145+
Assert("<0, 1>", Vector64.Create(0, 1).ToString());
146+
Assert("<1, 1>", Vector64.Create(1, 1).ToString());
147+
Assert("<1, 0>", Vector64.Create(1, 0).ToString());
148+
149+
// Test get_AllBitSet() optimization:
150+
Assert("<-1, -1, -1, -1, -1, -1, -1, -1>", Vector64.Create(-1, -1, -1, -1, -1, -1, -1, -1).ToString());
151+
Assert("<-1, -1, -1, -1, -1, -1, -1, 1>", Vector64.Create(-1, -1, -1, -1, -1, -1, -1, 1).ToString());
152+
Assert("<-1, -1, -1, -1, 1, 1, 1, 1>", Vector64.Create(-1, -1, -1, -1, 1, 1, 1, 1).ToString());
153+
Assert("<-1, -1, -1, 1, 1, 1, 1, 1>", Vector64.Create(-1, -1, -1, 1, 1, 1, 1, 1).ToString());
154+
Assert("<-1, 1, 1, 1, 1, 1, 1, 1>", Vector64.Create(-1, 1, 1, 1, 1, 1, 1, 1).ToString());
155+
Assert("<1, 1, 1, 1, 1, 1, 1, 1>", Vector64.Create(1, 1, 1, 1, 1, 1, 1, 1).ToString());
156+
Assert("<1, 1, 1, 1, -1, -1, -1, -1>", Vector64.Create(1, 1, 1, 1, -1, -1, -1, -1).ToString());
157+
Assert("<-1, -1, -1, -1>", Vector64.Create(-1, -1, -1, -1).ToString());
158+
Assert("<-1, -1, 1, 1>", Vector64.Create(-1, -1, 1, 1).ToString());
159+
Assert("<-1, 1, 1, 1>", Vector64.Create(-1, 1, 1, 1).ToString());
160+
Assert("<1, 1, 1, 1>", Vector64.Create(1, 1, 1, 1).ToString());
161+
Assert("<1, 1, -1, -1>", Vector64.Create(1, 1, -1, -1).ToString());
162+
Assert("<-1, -1>", Vector64.Create(-1, -1).ToString());
163+
Assert("<-1, 1>", Vector64.Create(-1, 1).ToString());
164+
Assert("<1, -1>", Vector64.Create(1, -1).ToString());
165+
}
166+
167+
private static void Assert(string expected, string actual, [CallerLineNumber] int line = 0)
168+
{
169+
if (expected != actual)
170+
{
171+
s_returnCode++;
172+
Console.WriteLine($"{expected} != {actual}, L{line}");
173+
}
174+
}
175+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<OutputType>Exe</OutputType>
4+
</PropertyGroup>
5+
<PropertyGroup>
6+
<DebugType>Embedded</DebugType>
7+
<Optimize>True</Optimize>
8+
</PropertyGroup>
9+
<ItemGroup>
10+
<Compile Include="GitHub_47236.cs" />
11+
</ItemGroup>
12+
</Project>

0 commit comments

Comments
 (0)