Skip to content

Commit 0d4da1e

Browse files
authored
Execution Tests: Long Vector finish implementing unary operators (microsoft#7770)
This PR adds test cases for explicit casts of long vectors. Bitwise NOT was removed as I realized it resolves to XOR and comparison ops that already have coverage. Other unary ops listed in the issue have a similar story. Resolves microsoft#7617
1 parent a89e18e commit 0d4da1e

File tree

4 files changed

+221
-15
lines changed

4 files changed

+221
-15
lines changed

tools/clang/unittests/HLSLExec/LongVectorOps.def

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ INPUT_SET(RangeOne)
1616
INPUT_SET(RangeHalfPi)
1717
INPUT_SET(SplitDouble)
1818
INPUT_SET(BitShiftRhs)
19+
INPUT_SET(Positive)
1920
INPUT_SET(Bitwise)
2021

2122
#undef INPUT_SET
@@ -49,8 +50,6 @@ OP_DEFAULT(BinaryMath, Ldexp, 2, "ldexp", ",")
4950
OP_DEFAULT(Bitwise, And, 2, "", "&")
5051
OP_DEFAULT(Bitwise, Or, 2, "", "|")
5152
OP_DEFAULT(Bitwise, Xor, 2, "", "^")
52-
OP_DEFAULT_DEFINES(Bitwise, Not, 1, "TestUnaryOperator", "~",
53-
" -DFUNC_UNARY_OPERATOR=1")
5453
OP(Bitwise, LeftShift, 2, "", "<<", "", Default1, BitShiftRhs, Default3)
5554
OP(Bitwise, RightShift, 2, "", ">>", "", Default1, BitShiftRhs, Default3)
5655
OP_DEFAULT(Bitwise, Saturate, 1, "saturate", "")
@@ -63,6 +62,29 @@ OP(Bitwise, FirstBitLow, 1, "firstbitlow", "", "", Bitwise, Default2, Default3)
6362
OP_DEFAULT_DEFINES(Unary, Initialize, 1, "TestInitialize", "",
6463
" -DFUNC_INITIALIZE=1")
6564

65+
#define OP_CAST_DEFAULT(GROUP, SYMBOL) \
66+
OP_DEFAULT_DEFINES(GROUP, SYMBOL, 1, "TestCast", "", "-DFUNC_TEST_CAST=1")
67+
#define OP_CAST(GROUP, SYMBOL, INPUT_SET_1) \
68+
OP(GROUP, SYMBOL, 1, "TestCast", "", "-DFUNC_TEST_CAST=1", INPUT_SET_1, \
69+
Default2, Default3)
70+
71+
OP_CAST_DEFAULT(Cast, CastToBool)
72+
OP_CAST_DEFAULT(Cast, CastToInt16)
73+
OP_CAST_DEFAULT(Cast, CastToInt32)
74+
OP_CAST_DEFAULT(Cast, CastToInt64)
75+
OP_CAST_DEFAULT(Cast, CastToUint16)
76+
OP_CAST_DEFAULT(Cast, CastToUint32)
77+
OP_CAST_DEFAULT(Cast, CastToUint64)
78+
OP_CAST(Cast, CastToUint16_FromFP, Positive)
79+
OP_CAST(Cast, CastToUint32_FromFP, Positive)
80+
OP_CAST(Cast, CastToUint64_FromFP, Positive)
81+
OP_CAST_DEFAULT(Cast, CastToFloat16)
82+
OP_CAST_DEFAULT(Cast, CastToFloat32)
83+
OP_CAST_DEFAULT(Cast, CastToFloat64)
84+
85+
#undef OP_CAST_DEFAULT
86+
#undef OP_CAST
87+
6688
OP(Trigonometric, Acos, 1, "acos", "", "", RangeOne, Default2, Default3)
6789
OP(Trigonometric, Asin, 1, "asin", "", "", RangeHalfPi, Default2, Default3)
6890
OP(Trigonometric, Atan, 1, "atan", "", "", RangeHalfPi, Default2, Default3)
@@ -109,4 +131,11 @@ OP_DEFAULT(BinaryComparison, NotEqual, 2, "", "!=")
109131

110132
OP_DEFAULT(Binary, Logical_And, 2, "and", ",")
111133
OP_DEFAULT(Binary, Logical_Or, 2, "or", ",")
112-
#undef OP
134+
135+
OP_DEFAULT_DEFINES(Binary, TernaryAssignment_True, 2, "TestTernaryAssignment",
136+
",", " -DTERNARY_CONDITION=1 -DFUNC_TERNARY_ASSIGNMENT=1")
137+
OP_DEFAULT_DEFINES(Binary, TernaryAssignment_False, 2, "TestTernaryAssignment",
138+
",", " -DTERNARY_CONDITION=0 -DFUNC_TERNARY_ASSIGNMENT=1")
139+
140+
#undef OP
141+

tools/clang/unittests/HLSLExec/LongVectorTestData.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ struct HLSLBool_t {
6767
return HLSLBool_t(Val || Other.Val);
6868
}
6969

70+
bool AsBool() const { return static_cast<bool>(Val); }
71+
72+
operator bool() const { return AsBool(); }
73+
operator int16_t() const { return (int16_t)(AsBool()); }
74+
operator int32_t() const { return (int32_t)(AsBool()); }
75+
operator int64_t() const { return (int64_t)(AsBool()); }
76+
operator uint16_t() const { return (uint16_t)(AsBool()); }
77+
operator uint32_t() const { return (uint32_t)(AsBool()); }
78+
operator uint64_t() const { return (uint64_t)(AsBool()); }
79+
operator float() const { return (float)(AsBool()); }
80+
operator double() const { return (double)(AsBool()); }
81+
7082
// So we can construct std::wstrings using std::wostream
7183
friend std::wostream &operator<<(std::wostream &Os, const HLSLBool_t &Obj) {
7284
Os << static_cast<bool>(Obj.Val);
@@ -321,6 +333,8 @@ INPUT_SET(InputSet::SmoothStepMax, 10.0, -2.6, -2.3, -1.4, -2.2, 2.3, 2.9, 3.3,
321333
3.9, 4.2);
322334
INPUT_SET(InputSet::SmoothStepInput, -2.8, -4.9, -2.3, -3.3, -3.6, 0.6, 3.0,
323335
3.3, 1.9, 4.3);
336+
INPUT_SET(InputSet::Positive, 1.0, 1.0, 342.0, 0.01, 5531.0, 0.01, 1.0, 0.01,
337+
331.2330, 3250.01);
324338
END_INPUT_SETS()
325339

326340
BEGIN_INPUT_SETS(float)
@@ -340,6 +354,8 @@ INPUT_SET(InputSet::SmoothStepMax, -2.8f, -2.6f, -2.3f, -1.4f, -2.2f, 2.3f,
340354
2.9f, 3.3f, 3.9f, 4.2f);
341355
INPUT_SET(InputSet::SmoothStepInput, -2.8f, -4.9f, -2.3f, -3.3f, -3.6f, 0.6f,
342356
3.0f, 3.3f, 1.9f, 4.3f);
357+
INPUT_SET(InputSet::Positive, 1.0f, 1.0f, 3424241.0f, 0.01f, 5531.0f, 0.01f,
358+
1.0f, 0.01f, 331.2330f, 3250.01f);
343359
END_INPUT_SETS()
344360

345361
BEGIN_INPUT_SETS(double)
@@ -361,6 +377,8 @@ INPUT_SET(InputSet::SmoothStepMax, -2.8, -2.6, -2.3, -1.4, -2.0, 2.3, 2.9, 3.3,
361377
3.9, 4.2);
362378
INPUT_SET(InputSet::SmoothStepInput, -10.8, -4.9, -2.3, -3.3, -3.0, 0.6, 3.0,
363379
3.3, 1.9, 4.3);
380+
INPUT_SET(InputSet::Positive, 1.0, 1.0, 3424241.0, 0.01, 5531.0, 0.01, 1.0,
381+
0.01, 331.2330, 3250.01);
364382
END_INPUT_SETS()
365383

366384
#undef BEGIN_INPUT_SETS

tools/clang/unittests/HLSLExec/LongVectors.cpp

Lines changed: 159 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ std::string getCompilerOptionsString(size_t VectorSize,
289289

290290
std::stringstream CompilerOptions;
291291

292-
if (is16BitType<T>())
292+
if (is16BitType<T>() || is16BitType<OUT_TYPE>())
293293
CompilerOptions << " -enable-16bit-types";
294294

295295
CompilerOptions << " -DTYPE=" << getHLSLTypeString<T>();
@@ -685,7 +685,6 @@ template <typename T> uint32_t FirstBitLow(T A) {
685685
DEFAULT_OP_2(OpType::And, (A & B));
686686
DEFAULT_OP_2(OpType::Or, (A | B));
687687
DEFAULT_OP_2(OpType::Xor, (A ^ B));
688-
DEFAULT_OP_1(OpType::Not, (~A));
689688
DEFAULT_OP_2(OpType::LeftShift, (A << B));
690689
DEFAULT_OP_2(OpType::RightShift, (A >> B));
691690
DEFAULT_OP_1(OpType::Saturate, (Saturate(A)));
@@ -708,6 +707,61 @@ BITWISE_OP(OpType::FirstBitLow, (FirstBitLow(A)));
708707

709708
DEFAULT_OP_1(OpType::Initialize, (A));
710709

710+
//
711+
// Cast
712+
//
713+
714+
#define CAST_OP(OP, TYPE, IMPL) \
715+
template <typename T> struct Op<OP, T> : StrictValidation { \
716+
TYPE operator()(T A) { return IMPL; } \
717+
};
718+
719+
template <typename T> HLSLBool_t CastToBool(T A) { return (bool)A; }
720+
template <> HLSLBool_t CastToBool(HLSLHalf_t A) { return (bool)((float)A); }
721+
722+
template <typename T> HLSLHalf_t CastToFloat16(T A) {
723+
return HLSLHalf_t(float(A));
724+
}
725+
726+
template <typename T> float CastToFloat32(T A) { return (float)A; }
727+
728+
template <typename T> double CastToFloat64(T A) { return (double)A; }
729+
template <> double CastToFloat64(HLSLHalf_t A) { return (double)((float)A); }
730+
731+
template <typename T> int16_t CastToInt16(T A) { return (int16_t)A; }
732+
template <> int16_t CastToInt16(HLSLHalf_t A) { return (int16_t)((float)A); }
733+
734+
template <typename T> int32_t CastToInt32(T A) { return (int32_t)A; }
735+
template <> int32_t CastToInt32(HLSLHalf_t A) { return (int32_t)((float)A); }
736+
737+
template <typename T> int64_t CastToInt64(T A) { return (int64_t)A; }
738+
template <> int64_t CastToInt64(HLSLHalf_t A) { return (int64_t)((float)A); }
739+
740+
template <typename T> uint16_t CastToUint16(T A) { return (uint16_t)A; }
741+
template <> uint16_t CastToUint16(HLSLHalf_t A) { return (uint16_t)((float)A); }
742+
743+
template <typename T> uint32_t CastToUint32(T A) { return (uint32_t)A; }
744+
template <> uint32_t CastToUint32(HLSLHalf_t A) { return (uint32_t)((float)A); }
745+
746+
template <typename T> uint64_t CastToUint64(T A) { return (uint64_t)A; }
747+
template <> uint64_t CastToUint64(HLSLHalf_t A) { return (uint64_t)((float)A); }
748+
749+
CAST_OP(OpType::CastToBool, HLSLBool_t, (CastToBool(A)));
750+
CAST_OP(OpType::CastToInt16, int16_t, (CastToInt16(A)));
751+
CAST_OP(OpType::CastToInt32, int32_t, (CastToInt32(A)));
752+
CAST_OP(OpType::CastToInt64, int64_t, (CastToInt64(A)));
753+
CAST_OP(OpType::CastToUint16, uint16_t, (CastToUint16(A)));
754+
CAST_OP(OpType::CastToUint32, uint32_t, (CastToUint32(A)));
755+
CAST_OP(OpType::CastToUint64, uint64_t, (CastToUint64(A)));
756+
CAST_OP(OpType::CastToUint16_FromFP, uint16_t, (CastToUint16(A)));
757+
CAST_OP(OpType::CastToUint32_FromFP, uint32_t, (CastToUint32(A)));
758+
CAST_OP(OpType::CastToUint64_FromFP, uint64_t, (CastToUint64(A)));
759+
CAST_OP(OpType::CastToFloat16, HLSLHalf_t, (CastToFloat16(A)));
760+
CAST_OP(OpType::CastToFloat32, float, (CastToFloat32(A)));
761+
CAST_OP(OpType::CastToFloat64, double, (CastToFloat64(A)));
762+
763+
#undef CAST_OP
764+
711765
//
712766
// Trigonometric
713767
//
@@ -1314,7 +1368,6 @@ class DxilConf_SM69_Vectorized {
13141368
HLK_TEST(Or, uint16_t, ScalarOp2);
13151369
HLK_TEST(Xor, uint16_t, Vector);
13161370
HLK_TEST(Xor, uint16_t, ScalarOp2);
1317-
HLK_TEST(Not, uint16_t, Vector);
13181371
HLK_TEST(ReverseBits, uint16_t, Vector);
13191372
HLK_TEST(CountBits, uint16_t, Vector);
13201373
HLK_TEST(FirstBitHigh, uint16_t, Vector);
@@ -1329,7 +1382,6 @@ class DxilConf_SM69_Vectorized {
13291382
HLK_TEST(Or, uint32_t, ScalarOp2);
13301383
HLK_TEST(Xor, uint32_t, Vector);
13311384
HLK_TEST(Xor, uint32_t, ScalarOp2);
1332-
HLK_TEST(Not, uint32_t, Vector);
13331385
HLK_TEST(LeftShift, uint32_t, Vector);
13341386
HLK_TEST(LeftShift, uint32_t, ScalarOp2);
13351387
HLK_TEST(RightShift, uint32_t, Vector);
@@ -1344,7 +1396,6 @@ class DxilConf_SM69_Vectorized {
13441396
HLK_TEST(Or, uint64_t, ScalarOp2);
13451397
HLK_TEST(Xor, uint64_t, Vector);
13461398
HLK_TEST(Xor, uint64_t, ScalarOp2);
1347-
HLK_TEST(Not, uint64_t, Vector);
13481399
HLK_TEST(LeftShift, uint64_t, Vector);
13491400
HLK_TEST(LeftShift, uint64_t, ScalarOp2);
13501401
HLK_TEST(RightShift, uint64_t, Vector);
@@ -1359,7 +1410,6 @@ class DxilConf_SM69_Vectorized {
13591410
HLK_TEST(Or, int16_t, ScalarOp2);
13601411
HLK_TEST(Xor, int16_t, Vector);
13611412
HLK_TEST(Xor, int16_t, ScalarOp2);
1362-
HLK_TEST(Not, int16_t, Vector);
13631413
HLK_TEST(LeftShift, int16_t, Vector);
13641414
HLK_TEST(LeftShift, int16_t, ScalarOp2);
13651415
HLK_TEST(RightShift, int16_t, Vector);
@@ -1374,7 +1424,6 @@ class DxilConf_SM69_Vectorized {
13741424
HLK_TEST(Or, int32_t, ScalarOp2);
13751425
HLK_TEST(Xor, int32_t, Vector);
13761426
HLK_TEST(Xor, int32_t, ScalarOp2);
1377-
HLK_TEST(Not, int32_t, Vector);
13781427
HLK_TEST(LeftShift, int32_t, Vector);
13791428
HLK_TEST(LeftShift, int32_t, ScalarOp2);
13801429
HLK_TEST(RightShift, int32_t, Vector);
@@ -1389,7 +1438,6 @@ class DxilConf_SM69_Vectorized {
13891438
HLK_TEST(Or, int64_t, ScalarOp2);
13901439
HLK_TEST(Xor, int64_t, Vector);
13911440
HLK_TEST(Xor, int64_t, ScalarOp2);
1392-
HLK_TEST(Not, int64_t, Vector);
13931441
HLK_TEST(LeftShift, int64_t, Vector);
13941442
HLK_TEST(LeftShift, int64_t, ScalarOp2);
13951443
HLK_TEST(RightShift, int64_t, Vector);
@@ -1415,6 +1463,108 @@ class DxilConf_SM69_Vectorized {
14151463
HLK_TEST(Initialize, float, Vector);
14161464
HLK_TEST(Initialize, double, Vector);
14171465

1466+
// Explicit Cast
1467+
1468+
HLK_TEST(CastToInt16, HLSLBool_t, Vector);
1469+
HLK_TEST(CastToInt32, HLSLBool_t, Vector);
1470+
HLK_TEST(CastToInt64, HLSLBool_t, Vector);
1471+
HLK_TEST(CastToUint16, HLSLBool_t, Vector);
1472+
HLK_TEST(CastToUint32, HLSLBool_t, Vector);
1473+
HLK_TEST(CastToUint64, HLSLBool_t, Vector);
1474+
HLK_TEST(CastToFloat16, HLSLBool_t, Vector);
1475+
HLK_TEST(CastToFloat32, HLSLBool_t, Vector);
1476+
HLK_TEST(CastToFloat64, HLSLBool_t, Vector);
1477+
1478+
HLK_TEST(CastToBool, HLSLHalf_t, Vector);
1479+
HLK_TEST(CastToInt16, HLSLHalf_t, Vector);
1480+
HLK_TEST(CastToInt32, HLSLHalf_t, Vector);
1481+
HLK_TEST(CastToInt64, HLSLHalf_t, Vector);
1482+
HLK_TEST(CastToUint16_FromFP, HLSLHalf_t, Vector);
1483+
HLK_TEST(CastToUint32_FromFP, HLSLHalf_t, Vector);
1484+
HLK_TEST(CastToUint64_FromFP, HLSLHalf_t, Vector);
1485+
HLK_TEST(CastToFloat32, HLSLHalf_t, Vector);
1486+
HLK_TEST(CastToFloat64, HLSLHalf_t, Vector);
1487+
1488+
HLK_TEST(CastToBool, float, Vector);
1489+
HLK_TEST(CastToInt16, float, Vector);
1490+
HLK_TEST(CastToInt32, float, Vector);
1491+
HLK_TEST(CastToInt64, float, Vector);
1492+
HLK_TEST(CastToUint16_FromFP, float, Vector);
1493+
HLK_TEST(CastToUint32_FromFP, float, Vector);
1494+
HLK_TEST(CastToUint64_FromFP, float, Vector);
1495+
HLK_TEST(CastToFloat16, float, Vector);
1496+
HLK_TEST(CastToFloat64, float, Vector);
1497+
1498+
HLK_TEST(CastToBool, double, Vector);
1499+
HLK_TEST(CastToInt16, double, Vector);
1500+
HLK_TEST(CastToInt32, double, Vector);
1501+
HLK_TEST(CastToInt64, double, Vector);
1502+
HLK_TEST(CastToUint16_FromFP, double, Vector);
1503+
HLK_TEST(CastToUint32_FromFP, double, Vector);
1504+
HLK_TEST(CastToUint64_FromFP, double, Vector);
1505+
HLK_TEST(CastToFloat16, double, Vector);
1506+
HLK_TEST(CastToFloat32, double, Vector);
1507+
1508+
HLK_TEST(CastToBool, uint16_t, Vector);
1509+
HLK_TEST(CastToInt16, uint16_t, Vector);
1510+
HLK_TEST(CastToInt32, uint16_t, Vector);
1511+
HLK_TEST(CastToInt64, uint16_t, Vector);
1512+
HLK_TEST(CastToUint32, uint16_t, Vector);
1513+
HLK_TEST(CastToUint64, uint16_t, Vector);
1514+
HLK_TEST(CastToFloat16, uint16_t, Vector);
1515+
HLK_TEST(CastToFloat32, uint16_t, Vector);
1516+
HLK_TEST(CastToFloat64, uint16_t, Vector);
1517+
1518+
HLK_TEST(CastToBool, uint32_t, Vector);
1519+
HLK_TEST(CastToInt16, uint32_t, Vector);
1520+
HLK_TEST(CastToInt32, uint32_t, Vector);
1521+
HLK_TEST(CastToInt64, uint32_t, Vector);
1522+
HLK_TEST(CastToUint16, uint32_t, Vector);
1523+
HLK_TEST(CastToUint64, uint32_t, Vector);
1524+
HLK_TEST(CastToFloat16, uint32_t, Vector);
1525+
HLK_TEST(CastToFloat32, uint32_t, Vector);
1526+
HLK_TEST(CastToFloat64, uint32_t, Vector);
1527+
1528+
HLK_TEST(CastToBool, uint64_t, Vector);
1529+
HLK_TEST(CastToInt16, uint64_t, Vector);
1530+
HLK_TEST(CastToInt32, uint64_t, Vector);
1531+
HLK_TEST(CastToInt64, uint64_t, Vector);
1532+
HLK_TEST(CastToUint16, uint64_t, Vector);
1533+
HLK_TEST(CastToUint32, uint64_t, Vector);
1534+
HLK_TEST(CastToFloat16, uint64_t, Vector);
1535+
HLK_TEST(CastToFloat32, uint64_t, Vector);
1536+
HLK_TEST(CastToFloat64, uint64_t, Vector);
1537+
1538+
HLK_TEST(CastToBool, int16_t, Vector);
1539+
HLK_TEST(CastToInt32, int16_t, Vector);
1540+
HLK_TEST(CastToInt64, int16_t, Vector);
1541+
HLK_TEST(CastToUint16, int16_t, Vector);
1542+
HLK_TEST(CastToUint32, int16_t, Vector);
1543+
HLK_TEST(CastToUint64, int16_t, Vector);
1544+
HLK_TEST(CastToFloat16, int16_t, Vector);
1545+
HLK_TEST(CastToFloat32, int16_t, Vector);
1546+
HLK_TEST(CastToFloat64, int16_t, Vector);
1547+
1548+
HLK_TEST(CastToBool, int32_t, Vector);
1549+
HLK_TEST(CastToInt16, int32_t, Vector);
1550+
HLK_TEST(CastToInt64, int32_t, Vector);
1551+
HLK_TEST(CastToUint16, int32_t, Vector);
1552+
HLK_TEST(CastToUint32, int32_t, Vector);
1553+
HLK_TEST(CastToUint64, int32_t, Vector);
1554+
HLK_TEST(CastToFloat16, int32_t, Vector);
1555+
HLK_TEST(CastToFloat32, int32_t, Vector);
1556+
HLK_TEST(CastToFloat64, int32_t, Vector);
1557+
1558+
HLK_TEST(CastToBool, int64_t, Vector);
1559+
HLK_TEST(CastToInt16, int64_t, Vector);
1560+
HLK_TEST(CastToInt32, int64_t, Vector);
1561+
HLK_TEST(CastToUint16, int64_t, Vector);
1562+
HLK_TEST(CastToUint32, int64_t, Vector);
1563+
HLK_TEST(CastToUint64, int64_t, Vector);
1564+
HLK_TEST(CastToFloat16, int64_t, Vector);
1565+
HLK_TEST(CastToFloat32, int64_t, Vector);
1566+
HLK_TEST(CastToFloat64, int64_t, Vector);
1567+
14181568
// Trigonometric
14191569

14201570
HLK_TEST(Acos, HLSLHalf_t, Vector);
@@ -1626,4 +1776,4 @@ class DxilConf_SM69_Vectorized {
16261776
private:
16271777
bool Initialized = false;
16281778
bool VerboseLogging = false;
1629-
};
1779+
};

tools/clang/unittests/HLSLExec/ShaderOpArith.xml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3776,10 +3776,19 @@ void MSMain(uint GID : SV_GroupIndex,
37763776
}
37773777
#endif
37783778
3779-
#ifdef FUNC_UNARY_OPERATOR
3780-
vector<OUT_TYPE, NUM> TestUnaryOperator(vector<TYPE, NUM> Vector)
3779+
3780+
#ifdef FUNC_TEST_CAST
3781+
vector<OUT_TYPE, NUM> TestCast(vector<TYPE, NUM> Vector)
3782+
{
3783+
return (vector<OUT_TYPE, NUM>)Vector;
3784+
}
3785+
#endif
3786+
3787+
#ifdef FUNC_TERNARY_ASSIGNMENT
3788+
vector<TYPE, NUM> TestTernaryAssignment(vector<TYPE, NUM> Vector,
3789+
vector<TYPE, NUM> Vector2))
37813790
{
3782-
return OPERATOR(Vector);
3791+
return (TERNARY_CONDITION ? Vector : Vector2);
37833792
}
37843793
#endif
37853794

0 commit comments

Comments
 (0)