Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions tools/clang/unittests/HLSLExec/LongVectorOps.def
Original file line number Diff line number Diff line change
Expand Up @@ -207,5 +207,6 @@ OP_DEFAULT_DEFINES(Wave, WaveReadLaneAt, 1, "TestWaveReadLaneAt", "", " -DFUNC_W
OP_DEFAULT_DEFINES(Wave, WaveReadLaneFirst, 1, "TestWaveReadLaneFirst", "", " -DFUNC_WAVE_READ_LANE_FIRST=1")
OP_DEFAULT_DEFINES(Wave, WavePrefixSum, 1, "TestWavePrefixSum", "", " -DFUNC_WAVE_PREFIX_SUM=1 -DIS_WAVE_PREFIX_OP=1")
OP_DEFAULT_DEFINES(Wave, WavePrefixProduct, 1, "TestWavePrefixProduct", "", " -DFUNC_WAVE_PREFIX_PRODUCT=1 -DIS_WAVE_PREFIX_OP=1")
OP_DEFAULT_DEFINES(Wave, WavePrefixMatch, 1, "TestWavePrefixMatch", "", " -DFUNC_WAVE_PREFIX_MATCH=1 -DIS_WAVE_PREFIX_OP=1")

#undef OP
27 changes: 27 additions & 0 deletions tools/clang/unittests/HLSLExec/LongVectors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1433,6 +1433,23 @@ template <typename T> T wavePrefixProduct(T A, UINT) {
return static_cast<T>(A * A);
}

template <typename T>
struct Op<OpType::WavePrefixMatch, T, 1> : StrictValidation {};

template <typename T> struct ExpectedBuilder<OpType::WavePrefixMatch, T> {
static std::vector<UINT> buildExpected(Op<OpType::WavePrefixMatch, T, 1> &,
const InputSets<T> &Inputs,
UINT WaveSize) {
DXASSERT_NOMSG(Inputs.size() == 1);

std::vector<UINT> Expected;
const size_t VectorSize = Inputs[0].size();
Expected.assign(VectorSize, 0);
Expected[0] = static_cast<UINT>(std::pow(2, WaveSize - 1));
return Expected;
}
};

#undef WAVE_OP

//
Expand Down Expand Up @@ -2334,6 +2351,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveActiveAllEqual, HLSLBool_t);
HLK_WAVEOP_TEST(WaveReadLaneAt, HLSLBool_t);
HLK_WAVEOP_TEST(WaveReadLaneFirst, HLSLBool_t);
HLK_WAVEOP_TEST(WavePrefixMatch, HLSLBool_t);

HLK_WAVEOP_TEST(WaveActiveSum, int16_t);
HLK_WAVEOP_TEST(WaveActiveMin, int16_t);
Expand All @@ -2344,6 +2362,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, int16_t);
HLK_WAVEOP_TEST(WavePrefixSum, int16_t);
HLK_WAVEOP_TEST(WavePrefixProduct, int16_t);
HLK_WAVEOP_TEST(WavePrefixMatch, int16_t);
HLK_WAVEOP_TEST(WaveActiveSum, int32_t);
HLK_WAVEOP_TEST(WaveActiveMin, int32_t);
HLK_WAVEOP_TEST(WaveActiveMax, int32_t);
Expand All @@ -2353,6 +2372,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, int32_t);
HLK_WAVEOP_TEST(WavePrefixSum, int32_t);
HLK_WAVEOP_TEST(WavePrefixProduct, int32_t);
HLK_WAVEOP_TEST(WavePrefixMatch, int32_t);
HLK_WAVEOP_TEST(WaveActiveSum, int64_t);
HLK_WAVEOP_TEST(WaveActiveMin, int64_t);
HLK_WAVEOP_TEST(WaveActiveMax, int64_t);
Expand All @@ -2362,6 +2382,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, int64_t);
HLK_WAVEOP_TEST(WavePrefixSum, int64_t);
HLK_WAVEOP_TEST(WavePrefixProduct, int64_t);
HLK_WAVEOP_TEST(WavePrefixMatch, int64_t);

HLK_WAVEOP_TEST(WaveActiveSum, uint16_t);
HLK_WAVEOP_TEST(WaveActiveMin, uint16_t);
Expand All @@ -2372,6 +2393,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, uint16_t);
HLK_WAVEOP_TEST(WavePrefixSum, uint16_t);
HLK_WAVEOP_TEST(WavePrefixProduct, uint16_t);
HLK_WAVEOP_TEST(WavePrefixMatch, uint16_t);
HLK_WAVEOP_TEST(WaveActiveSum, uint32_t);
HLK_WAVEOP_TEST(WaveActiveMin, uint32_t);
HLK_WAVEOP_TEST(WaveActiveMax, uint32_t);
Expand All @@ -2385,6 +2407,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, uint32_t);
HLK_WAVEOP_TEST(WavePrefixSum, uint32_t);
HLK_WAVEOP_TEST(WavePrefixProduct, uint32_t);
HLK_WAVEOP_TEST(WavePrefixMatch, uint32_t);
HLK_WAVEOP_TEST(WaveActiveSum, uint64_t);
HLK_WAVEOP_TEST(WaveActiveMin, uint64_t);
HLK_WAVEOP_TEST(WaveActiveMax, uint64_t);
Expand All @@ -2397,6 +2420,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, uint64_t);
HLK_WAVEOP_TEST(WavePrefixSum, uint64_t);
HLK_WAVEOP_TEST(WavePrefixProduct, uint64_t);
HLK_WAVEOP_TEST(WavePrefixMatch, uint64_t);

HLK_WAVEOP_TEST(WaveActiveSum, HLSLHalf_t);
HLK_WAVEOP_TEST(WaveActiveMin, HLSLHalf_t);
Expand All @@ -2407,6 +2431,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, HLSLHalf_t);
HLK_WAVEOP_TEST(WavePrefixSum, HLSLHalf_t);
HLK_WAVEOP_TEST(WavePrefixProduct, HLSLHalf_t);
HLK_WAVEOP_TEST(WavePrefixMatch, HLSLHalf_t);
HLK_WAVEOP_TEST(WaveActiveSum, float);
HLK_WAVEOP_TEST(WaveActiveMin, float);
HLK_WAVEOP_TEST(WaveActiveMax, float);
Expand All @@ -2416,6 +2441,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, float);
HLK_WAVEOP_TEST(WavePrefixSum, float);
HLK_WAVEOP_TEST(WavePrefixProduct, float);
HLK_WAVEOP_TEST(WavePrefixMatch, float);
HLK_WAVEOP_TEST(WaveActiveSum, double);
HLK_WAVEOP_TEST(WaveActiveMin, double);
HLK_WAVEOP_TEST(WaveActiveMax, double);
Expand All @@ -2425,6 +2451,7 @@ class DxilConf_SM69_Vectorized {
HLK_WAVEOP_TEST(WaveReadLaneFirst, double);
HLK_WAVEOP_TEST(WavePrefixSum, double);
HLK_WAVEOP_TEST(WavePrefixProduct, double);
HLK_WAVEOP_TEST(WavePrefixMatch, double);

private:
bool Initialized = false;
Expand Down
12 changes: 12 additions & 0 deletions tools/clang/unittests/HLSLExec/ShaderOpArith.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4215,6 +4215,18 @@ void MSMain(uint GID : SV_GroupIndex,
}
#endif

#ifdef FUNC_WAVE_PREFIX_MATCH
void TestWavePrefixMatch(vector<TYPE, NUM> Vector)
{
if(WaveGetLaneIndex() == WAVE_SIZE - 1)
{
Vector[NUM - 1] = (TYPE)1;
const uint4 PrefixMatch = WaveMatch(Vector);
g_OutputVector.Store< uint4 >(0, PrefixMatch);
}
}
#endif

#ifdef FUNC_TEST_SELECT
vector<OUT_TYPE, NUM> TestSelect(vector<TYPE, NUM> Vector1,
vector<TYPE, NUM> Vector2,
Expand Down