Explorar o código

Change WaveMultiPrefix test data to be generated by hctdb_test.py (#2334)

The tests were manually added to ShaderOpArithTable.xml in PR #1867,
but ShaderOpArithTable.xml should be generated by hctdb_test.py script.
No actual changes to the test data, just the order of the tests is different
because of rearranging done by the script XML processing.

Added a check for shader model 6.5 so the tests will be skipped on lower
shader models.
Helena Kotas %!s(int64=6) %!d(string=hai) anos
pai
achega
ec912b2ec9

+ 5 - 2
tools/clang/unittests/HLSL/ExecutionTest.cpp

@@ -474,6 +474,7 @@ public:
     D3D_SHADER_MODEL_6_2 = 0x62,
     D3D_SHADER_MODEL_6_3 = 0x63,
     D3D_SHADER_MODEL_6_4 = 0x64,
+    D3D_SHADER_MODEL_6_5 = 0x65,
 } D3D_SHADER_MODEL;
 
 #if WDK_NTDDI_VERSION == NTDDI_WIN10_RS2
@@ -484,8 +485,10 @@ public:
   static const D3D_SHADER_MODEL HIGHEST_SHADER_MODEL = D3D_SHADER_MODEL_6_2;
 #elif WDK_NTDDI_VERSION == NTDDI_WIN10_RS5
   static const D3D_SHADER_MODEL HIGHEST_SHADER_MODEL = D3D_SHADER_MODEL_6_3;
-#else
+#elif WDK_NTDDI_VERSION == NTDDI_WIN10_19H1
   static const D3D_SHADER_MODEL HIGHEST_SHADER_MODEL = D3D_SHADER_MODEL_6_4;
+#else
+  static const D3D_SHADER_MODEL HIGHEST_SHADER_MODEL = D3D_SHADER_MODEL_6_5;
 #endif
 
   dxc::DxcDllSupport m_support;
@@ -6234,7 +6237,7 @@ ExecutionTest::WaveIntrinsicsMultiPrefixOpTest(TableParameter *pParameterList,
 
   CComPtr<ID3D12Device> pDevice;
 
-  if (!CreateDevice(&pDevice)) {
+  if (!CreateDevice(&pDevice, D3D_SHADER_MODEL_6_5)) {
     return;
   }
 

+ 80 - 212
tools/clang/unittests/HLSL/ShaderOpArithTable.xml

@@ -6063,11 +6063,10 @@
             <ParameterType Array="true" Name="Validation.Keys">String</ParameterType>
             <ParameterType Array="true" Name="Validation.Values">String</ParameterType>
         </ParameterTypes>
-        <Row Name="WaveMultiPrefixBitAnd">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitAnd</Parameter>
+        <Row Name="WaveMultiPrefixBitXor">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitXor</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6075,31 +6074,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitAnd(data.value, mask);
+                        data.result = WaveMultiPrefixBitXor(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitAnd(data.value, mask);
+                        data.result = WaveMultiPrefixBitXor(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6122,11 +6111,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixBitOr">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitOr</Parameter>
+        <Row Name="WaveMultiPrefixCountBits">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixCountBits</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6134,31 +6122,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitOr(data.value, mask);
+                        data.result = WaveMultiPrefixCountBits(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitOr(data.value, mask);
+                        data.result = WaveMultiPrefixCountBits(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6181,11 +6159,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixBitXor">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitXor</Parameter>
+        <Row Name="WaveMultiPrefixSum">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixSum</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6193,31 +6170,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitXor(data.value, mask);
+                        data.result = WaveMultiPrefixSum(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitXor(data.value, mask);
+                        data.result = WaveMultiPrefixSum(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6240,11 +6207,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixSum">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixSum</Parameter>
+        <Row Name="WaveMultiPrefixBitAnd">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitAnd</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6252,31 +6218,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixSum(data.value, mask);
+                        data.result = WaveMultiPrefixBitAnd(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixSum(data.value, mask);
+                        data.result = WaveMultiPrefixBitAnd(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6299,11 +6255,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixProduct">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixProduct</Parameter>
+        <Row Name="WaveMultiPrefixBitOr">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitOr</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6311,31 +6266,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixProduct(data.value, mask);
+                        data.result = WaveMultiPrefixBitOr(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixProduct(data.value, mask);
+                        data.result = WaveMultiPrefixBitOr(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6358,11 +6303,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixCountBits">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixCountBits</Parameter>
+        <Row Name="WaveMultiPrefixProduct">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixProduct</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6370,31 +6314,21 @@
                     int value;
                     int result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixCountBits(data.value > 10, mask);
+                        data.result = WaveMultiPrefixProduct(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixCountBits(data.value > 10, mask);
+                        data.result = WaveMultiPrefixProduct(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6425,11 +6359,10 @@
             <ParameterType Array="true" Name="Validation.Keys">String</ParameterType>
             <ParameterType Array="true" Name="Validation.Values">String</ParameterType>
         </ParameterTypes>
-        <Row Name="WaveMultiPrefixBitAnd">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitAnd</Parameter>
+        <Row Name="WaveMultiPrefixUBitAnd">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUBitAnd</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6437,20 +6370,12 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
                         data.result = WaveMultiPrefixBitAnd(data.value, mask);
@@ -6458,10 +6383,8 @@
                         uint4 mask = WaveMatch(data.key);
                         data.result = WaveMultiPrefixBitAnd(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6484,11 +6407,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixBitOr">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitOr</Parameter>
+        <Row Name="WaveMultiPrefixUBitOr">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUBitOr</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6496,20 +6418,12 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
                         data.result = WaveMultiPrefixBitOr(data.value, mask);
@@ -6517,10 +6431,8 @@
                         uint4 mask = WaveMatch(data.key);
                         data.result = WaveMultiPrefixBitOr(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6543,11 +6455,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixBitXor">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixBitXor</Parameter>
+        <Row Name="WaveMultiPrefixUSum">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUSum</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6555,31 +6466,21 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitXor(data.value, mask);
+                        data.result = WaveMultiPrefixSum(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixBitXor(data.value, mask);
+                        data.result = WaveMultiPrefixSum(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6602,11 +6503,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixUSum">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUSum</Parameter>
+        <Row Name="WaveMultiPrefixUProduct">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUProduct</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6614,31 +6514,21 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixSum(data.value, mask);
+                        data.result = WaveMultiPrefixProduct(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixSum(data.value, mask);
+                        data.result = WaveMultiPrefixProduct(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6661,11 +6551,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixUSum">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUProduct</Parameter>
+        <Row Name="WaveMultiPrefixUBitXor">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUBitXor</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6673,31 +6562,21 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixProduct(data.value, mask);
+                        data.result = WaveMultiPrefixBitXor(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixProduct(data.value, mask);
+                        data.result = WaveMultiPrefixBitXor(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>
@@ -6720,11 +6599,10 @@
                 <Value>34</Value>
             </Parameter>
         </Row>
-        <Row Name="WaveMultiPrefixCountBits">
-            <Parameter Name="ShaderOp.Name">WaveMultiPrefixCountBits</Parameter>
+        <Row Name="WaveMultiPrefixUCountBits">
+            <Parameter Name="ShaderOp.Name">WaveMultiPrefixUCountBits</Parameter>
             <Parameter Name="ShaderOp.Target">cs_6_5</Parameter>
-            <Parameter Name="ShaderOp.Text">
-                struct ThreadData {
+            <Parameter Name="ShaderOp.Text"> struct ThreadData {
                     uint key;
                     uint firstLaneId;
                     uint laneId;
@@ -6732,31 +6610,21 @@
                     uint value;
                     uint result;
                 };
-
                 RWStructuredBuffer&lt;ThreadData&gt; g_buffer : register(u0);
-
                 [numthreads(8, 12, 1)]
-                void main
-                (
-                    uint id : SV_GroupIndex
-                )
-                {
+                void main(uint id : SV_GroupIndex) {
                     ThreadData data = g_buffer[id];
-
                     data.firstLaneId = WaveReadLaneFirst(id);
                     data.laneId = WaveGetLaneIndex();
-
                     if (data.mask != 0) {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixCountBits(data.value > 10, mask);
+                        data.result = WaveMultiPrefixCountBits(data.value, mask);
                     } else {
                         uint4 mask = WaveMatch(data.key);
-                        data.result = WaveMultiPrefixCountBits(data.value > 10, mask);
+                        data.result = WaveMultiPrefixCountBits(data.value, mask);
                     }
-
                     g_buffer[id] = data;
-                }
-            </Parameter>
+                }</Parameter>
             <Parameter Name="Validation.Keys">
                 <Value>0</Value>
                 <Value>3</Value>

+ 155 - 1
utils/hct/hctdb_test.py

@@ -532,7 +532,53 @@ g_shader_texts = {
                             pts.output = %s(pts.input > 3);
                         }
                         g_sb[GI] = pts;
-                    };'''
+                    };''',
+    "wave op multi prefix int": ''' struct ThreadData {
+                    uint key;
+                    uint firstLaneId;
+                    uint laneId;
+                    uint mask;
+                    int value;
+                    int result;
+                };
+                RWStructuredBuffer<ThreadData> g_buffer : register(u0);
+                [numthreads(8, 12, 1)]
+                void main(uint id : SV_GroupIndex) {
+                    ThreadData data = g_buffer[id];
+                    data.firstLaneId = WaveReadLaneFirst(id);
+                    data.laneId = WaveGetLaneIndex();
+                    if (data.mask != 0) {
+                        uint4 mask = WaveMatch(data.key);
+                        data.result = %s(data.value, mask);
+                    } else {
+                        uint4 mask = WaveMatch(data.key);
+                        data.result = %s(data.value, mask);
+                    }
+                    g_buffer[id] = data;
+                }''',
+    "wave op multi prefix uint": ''' struct ThreadData {
+                    uint key;
+                    uint firstLaneId;
+                    uint laneId;
+                    uint mask;
+                    uint value;
+                    uint result;
+                };
+                RWStructuredBuffer<ThreadData> g_buffer : register(u0);
+                [numthreads(8, 12, 1)]
+                void main(uint id : SV_GroupIndex) {
+                    ThreadData data = g_buffer[id];
+                    data.firstLaneId = WaveReadLaneFirst(id);
+                    data.laneId = WaveGetLaneIndex();
+                    if (data.mask != 0) {
+                        uint4 mask = WaveMatch(data.key);
+                        data.result = %s(data.value, mask);
+                    } else {
+                        uint4 mask = WaveMatch(data.key);
+                        data.result = %s(data.value, mask);
+                    }
+                    g_buffer[id] = data;
+                }'''
 }
 
 def get_shader_text(op_type, op_call):
@@ -1330,6 +1376,45 @@ def add_test_cases():
         [['1', '2', '3', '4', '5'], ['0', '1'], ['1', '2', '4', '128']], [],
         'cs_6_0', get_shader_text("wave op uint", "WavePrefixProduct"))
 
+    #Wave Multi Prefix Tests
+    add_test_case('WaveMultiPrefixBitAnd', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixBitAnd"))
+    add_test_case('WaveMultiPrefixBitOr', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixBitOr"))
+    add_test_case('WaveMultiPrefixBitXor', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixBitXor"))
+    add_test_case('WaveMultiPrefixSum', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixSum"))
+    add_test_case('WaveMultiPrefixProduct', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixProduct"))
+    add_test_case('WaveMultiPrefixCountBits', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix int", "WaveMultiPrefixCountBits"))
+
+    add_test_case('WaveMultiPrefixUBitAnd', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixBitAnd"))
+    add_test_case('WaveMultiPrefixUBitOr', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixBitOr"))
+    add_test_case('WaveMultiPrefixUBitXor', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixBitXor"))
+    add_test_case('WaveMultiPrefixUSum', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixSum"))
+    add_test_case('WaveMultiPrefixUProduct', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixProduct"))
+    add_test_case('WaveMultiPrefixUCountBits', ['WaveMultiPrefixOp'], 'Epsilon', 0,
+         [['0', '3', '1', '5', '4'], ['10', '42', '1', '64', '11', '76', '90', '111', '9', '6', '79', '34']], [],
+        'cs_6_5', get_shader_text("wave op multi prefix uint", "WaveMultiPrefixCountBits"))
+
 
 # generating xml file for execution test using data driven method
 # TODO: ElementTree is not generating formatted XML. Currently xml file is checked in after VS Code formatter.
@@ -1421,6 +1506,32 @@ def generate_parameter_types_wave(table):
             "Array": "true"
         }).text = "String"
 
+def generate_parameter_types_wave_multi_prefix(table):
+    param_types = ET.SubElement(table, "ParameterTypes")
+
+    ET.SubElement(
+        param_types, "ParameterType", attrib={
+            "Name": "ShaderOp.Target"
+        }).text = "String"
+    ET.SubElement(
+        param_types, "ParameterType", attrib={
+            "Name": "ShaderOp.Text"
+        }).text = "String"
+    ET.SubElement(
+        param_types,
+        "ParameterType",
+        attrib={
+            "Name": "Validation.Keys",
+            "Array": "true"
+        }).text = "String"
+    ET.SubElement(
+        param_types,
+        "ParameterType",
+        attrib={
+            "Name": "Validation.Values",
+            "Array": "true"
+        }).text = "String"
+
 def generate_parameter_types_msad(table):
     param_types = ET.SubElement(table, "ParameterTypes")
     ET.SubElement(
@@ -1510,6 +1621,28 @@ def generate_row_wave(table, case):
         for val in case.input_lists[i]:
             ET.SubElement(inputs, "Value").text = str(val)
 
+def generate_row_wave_multi(table, case):
+    row = ET.SubElement(table, "Row", {"Name": case.test_name})
+    ET.SubElement(row, "Parameter", {
+        "Name": "ShaderOp.Name"
+    }).text = case.test_name
+    ET.SubElement(row, "Parameter", {
+        "Name": "ShaderOp.Target"
+    }).text = case.shader_target
+    ET.SubElement(row, "Parameter", {
+        "Name": "ShaderOp.Text"
+    }).text = case.shader_text
+    inputs = ET.SubElement(row, "Parameter", {
+        "Name": "Validation.Keys"
+    })
+    for val in case.input_lists[0]:
+        ET.SubElement(inputs, "Value").text = str(val)
+    inputs = ET.SubElement(row, "Parameter", {
+        "Name": "Validation.Values"
+    })
+    for val in case.input_lists[1]:
+        ET.SubElement(inputs, "Value").text = str(val)
+
 def generate_table_for_taef():
     with open("..\\..\\tools\\clang\\unittests\\HLSL\\ShaderOpArithTable.xml",
               'w') as f:
@@ -1628,6 +1761,16 @@ def generate_table_for_taef():
                 root, "Table", attrib={
                     "Id": "WaveIntrinsicsPrefixUintTable"
                 }))
+        generate_parameter_types_wave_multi_prefix(
+            ET.SubElement(
+                root, "Table", attrib={
+                    "Id": "WaveIntrinsicsMultiPrefixIntTable"
+                }))
+        generate_parameter_types_wave_multi_prefix(
+            ET.SubElement(
+                root, "Table", attrib={
+                    "Id": "WaveIntrinsicsMultiPrefixUintTable"
+                }))
         generate_parameter_types(
             ET.SubElement(
                 root, "Table", attrib={
@@ -1803,6 +1946,17 @@ def generate_table_for_taef():
                         root.find(
                             "./Table[@Id='WaveIntrinsicsPrefixIntTable']"),
                         case)
+            elif cur_inst.dxil_class == "WaveMultiPrefixOp":
+                if case.test_name.startswith("WaveMultiPrefixU"):
+                    generate_row_wave_multi(
+                        root.find(
+                            "./Table[@Id='WaveIntrinsicsMultiPrefixUintTable']"
+                        ), case)
+                else:
+                    generate_row_wave_multi(
+                        root.find(
+                            "./Table[@Id='WaveIntrinsicsMultiPrefixIntTable']"),
+                        case)
             else:
                 print("unknown op: " + cur_inst.name)
                 print(cur_inst.dxil_class)