<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99210>99210</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `WaveMultiPrefixBitXor` HLSL Function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
metabug,
backend:DirectX,
HLSL,
backend:SPIR-V,
bot:HLSL
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
farzonl
</td>
</tr>
</table>
<pre>
- [ ] Implement `WaveMultiPrefixBitXor` clang builtin,
- [ ] Link `WaveMultiPrefixBitXor` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `WaveMultiPrefixBitXor` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `WaveMultiPrefixBitXor` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/WaveMultiPrefixBitXor.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/WaveMultiPrefixBitXor-errors.hlsl`
- [ ] Create the `int_dx_WaveMultiPrefixBitXor` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_WaveMultiPrefixBitXor` to `166` in `DXIL.td`
- [ ] Create the `WaveMultiPrefixBitXor.ll` and `WaveMultiPrefixBitXor_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_WaveMultiPrefixBitXor` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `WaveMultiPrefixBitXor` lowering and map it to `int_spv_WaveMultiPrefixBitXor` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveMultiPrefixBitXor.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 166 | WaveMultiPrefixOp | 6.5 | ('library', 'compute', 'amplification', 'mesh', 'pixel', 'vertex', 'hull', 'domain', 'geometry', 'raygeneration', 'intersection', 'anyhit', 'closesthit', 'miss', 'callable', 'node') |
## SPIR-V
# [OpGroupNonUniformBitwiseXor](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpGroupNonUniformBitwiseXor):
## Description:
A bitwise xor [group operation](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Group_Operation) of all *Value*
operands contributed by active [invocations](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Invocation) in the
[group](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Group).
*Result Type* must be a scalar or vector of [*integer
type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Integer).
*Execution* is a [*Scope*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Scope_-id-) that identifies the group of
invocations affected by this command. It must be **Subgroup**.
The identity *I* for *Operation* is 0. If *Operation* is
**ClusteredReduce**, *ClusterSize* must be present.
The type of *Value* must be the same as *Result Type*.
*ClusterSize* is the size of cluster to use. *ClusterSize* must be a
scalar of [*integer type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Integer), whose *Signedness* operand is 0.
*ClusterSize* must come from a [*constant
instruction*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#ConstantInstruction). Behavior is undefined unless
*ClusterSize* is at least 1 and a power of 2. If *ClusterSize* is
greater than the size of the [group](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Group), executing this instruction
results in undefined behavior.
[Capability](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Capability):
**GroupNonUniformArithmetic**, **GroupNonUniformClustered**,
**GroupNonUniformPartitionedNV**
[Missing before](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Unified) **version 1.3**.
<table>
<colgroup>
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
<col style="width: 12%" />
</colgroup>
<thead>
<tr>
<th>Word Count</th>
<th>Opcode</th>
<th>Results</th>
<th>Operands</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p>6 + variable</p></td>
<td class="tableblock halign-left valign-top"><p>361</p></td>
<td
class="tableblock halign-left valign-top"><p><em><id></em><br />
<em>Result Type</em></p></td>
<td class="tableblock halign-left valign-top"><p><a
href="#ResultId"><em>Result <id></em></a></p></td>
<td class="tableblock halign-left valign-top"><p><a
href="#Scope_-id-"><em>Scope <id></em></a><br />
<em>Execution</em></p></td>
<td class="tableblock halign-left valign-top"><p><a
href="#Group_Operation"><em>Group Operation</em></a><br />
<em>Operation</em></p></td>
<td
class="tableblock halign-left valign-top"><p><em><id></em><br />
<em>Value</em></p></td>
<td class="tableblock halign-left valign-top"><p>Optional<br />
<em><id></em><br />
<em>ClusterSize</em></p></td>
</tr>
</tbody>
</table>
## Test Case(s)
### Example 1
```hlsl
//dxc WaveMultiPrefixBitXor_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export int4 fn(int4 p1, uint4 p2) {
return WaveMultiPrefixBitXor(p1, p2);
}
```
## HLSL:
## Syntax
```syntax
any_int<> WaveMultiPrefixBitXor(any_int<> value, uint<4> mask);
```
## Type Description
| Name | [**Template Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-data-types.md)| [**Component Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-data-types.md) | Size |
|-------|--------------------------------------------------------------------|----------------------------------------------------------------------|------|
| *ret* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md), [**vector**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-vector.md), or [**matrix**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-matrix.md) | [**int**](../WinProg/windows-data-types), [**int16_t**](https://github.com/microsoft/DirectXShaderCompiler/wiki/16-Bit-Scalar-Types), [**int64_t**](../WinProg/windows-data-types), [**uint**](../WinProg/windows-data-types), [**uint16_t**](https://github.com/microsoft/DirectXShaderCompiler/wiki/16-Bit-Scalar-Types), or [**uint64_t**](../WinProg/windows-data-types) | any |
| *value* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md), [**vector**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-vector.md), or [**matrix**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-matrix.md) | [**int**](../WinProg/windows-data-types), [**int16_t**](https://github.com/microsoft/DirectXShaderCompiler/wiki/16-Bit-Scalar-Types), [**int64_t**](../WinProg/windows-data-types), [**uint**](../WinProg/windows-data-types), [**uint16_t**](https://github.com/microsoft/DirectXShaderCompiler/wiki/16-Bit-Scalar-Types), or [**uint64_t**](../WinProg/windows-data-types) | any |
| *mask* | [**vector**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-vector.md) | [**uint**](../WinProg/windows-data-types) | 4 |
## Minimum Shader Model
This function is supported in the following shader models.
|Shader Model | Supported|
|-------------|----------|
|[Shader Model 6.5](https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_5) and higher shader models | yes |
## Shader Stages
* **Library Shader**
* [**Compute Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d11/direct3d-11-advanced-stages-compute-shader.md)
* [**Amplification Shader**](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#amplification-shader-and-mesh-shader)
* [**Mesh Shader**](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html)
* [**Pixel Shader**](../direct3dhlsl/dx-graphics-hlsl-writing-shaders-9.md#pixel-shader-basics)
* [**Vertex Shader**](../direct3dhlsl/dx-graphics-hlsl-writing-shaders-9.md#vertex-shader-basics)
* [**Hull Shader**](https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/hull-shader-stage--hs-)
* [**Domain Shader**](https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/domain-shader-stage--ds-)
* [**Geometry Shader**](https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/geometry-shader-stage--gs-)
* [**Raygeneration Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/ray-generation-shader.md)
* [**Intersection Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/intersection-shader.md)
* [**Anyhit Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/any-hit-shader.md)
* [**Closesthit Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/closest-hit-shader.md)
* [**Miss Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/miss-shader.md)
* [**Callable Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/callable-shader.md)
* **Node Shader**
## See also
- [**Intrinsic Functions (DirectX HLSL)**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
- **See [WaveMultiPrefix*() Functions](https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_5#wavemultiprefix-functions)**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW9tu2zgTfhrmhpBgU7GTXORCcequgaYt6m537wJKHFv8Q5ECSTn2Pv0PkrIkn5IeNm0WaBAgFg8z33wzpIb0hBrDlxLgGo1u0Oj2jNa2UPp6QfU_SoqzTLHNdYTR6Aaj0S2elZWAEqTFaDz4i67grhaWf9Sw4Osbbv9WGo0HOBdULnFWc2G5RGSCBmkn4h2XD18_Gz9yW7jhhTDinkuruTQ8N3GBxoMduSlj2EBJcV5A_mDwQukn1Vjluidu8B_v5u9ugr5pLXPLlZxQIdwoLt2oOZTUj-RyGedVdUx3rhgsQX6l3jcltz21b9aV7tRN3jbNz-myYKxpJHraEJm6NkSmE8XgLUinA5Fpw6ZBZHoUWOzoPcnoE2ocM40Oj3l2WkcEWittjqqaaKAWsC3A6eDS3rP1_UkK2zBo-Jq1YXHLNeT279iypzXc_j1796G6o1XF5dKJVIuvUWwVdsOG43HnLCfqWX3HSQ8hRiU7OeS-4SyMDH4IaoVYlQfeRmTaMIDI9HmOTbX6HpLnH2efvhwxeSax75pJY3Xtl9EcBORWaRfIOH-eEqdYqEfQXC49MSWtMOa2Cb6vAO2X6wkUKElRkhr_1JqDxoP4GE9OSPQFZzR_AMk89zinBp7h3-tGZOqiPOr2q5MLTzRrwf2SBJEEbz0Y2i4m2EUY_lC5RY97z-9pGZ7nBWWg8Z1iIPoNc0uXYFxLIyjqfvAzz4cNUU_QcDz2_Xsmfah86zge-b-IXCJyIXimqd4gcoGIa7vIVVnVFroGWlaCL3hOna-65hJM0T1VfA2ie1yBtrDunota9HqZKinviVqCKsH2QWi6WYIEvaeTSwvaQL7bSuWm4LZngVAGjN1pK7kxvRFUCJqJnpFSsfB0teWxdXiItLbJBeKH6q1WdfVeyT8lXyhd3nD7yA24MB_dInJZWFsZF89kishUw5IbqzfxQ6GVVCZWetnEYuSC0VTgQ7CWfMGBDbdxGhe2FIgkT6kjV07NToCCyTWvPEe-C2M0SFOchUl47d6Ao5ulE4lVtSX5BXB71PcfWhXkym3kVAiMSPqFihoQcQA9CMkMzpVbkVltgeFsg2lu-QocWC5XKgSgeQmgs1a8w8il2wQdoQ1LL8YNIlcx3noIkfQTmFpY_HlTOWZwWRuLM8AUm5wKqrHSeOW3Sv9CHN0gkrolsQSNBqkNs16Gn6BkD-6bNeR1YC3F3GDaYJrn6sWgeNn3EWeRc5UtqMWcgbRutPEvryawF2iQ9sIG08UC8iawbMFdsJUllSzGM9sy7UCTdF5nwe_-KcatzZ8LaLTZjRs7c4b7jJKkvTD3ZAxiPFsc6QjUIZJORG0saGCfgNU5hMawHW375vyfnUCoNBiQdg-Rc7wPiG5RtTMcIca9iajBBwHWk3Ookwc2Df_HC89Dr3vT1wbiJ0BSNEi38boXpfinxKjj8LFQxrtz7o5PTILb_lPc7DTBP0fN9lbkqgS80KpsQzpX0lgqrQ-qNnN5IVMmjbJZX9NVjG-goCuutINfSwYLLoHhWgpn3QkfUosFUGPx0CdsFFcuf3OeIdsAPZiEBunSZ1naLTC5Ewc-PfwJ-6JzIoT9RS7Dgu0TP0i1D2Wfb3dcZA1DcfNGHN1MaEUzLrjdvIinOun-RYzb1b33xk41t0UJluc76_xwYLsrtONOifxIteWODGDvv4QRYT0Hw--4MY66DBZKw0sY_2do9zmTV78CbbiSeBgnzdbZuCGZWJ9uJW_CU65ECKBeAzZ244bcIkIeObOFo3NIEBkhQrBD_HvwDw9GZHrAvS2Asu5J9zpQ8uYvpRmeqFraMN039vrDwed4X3jbmFMTQ9J3vPcFWt2T3nnaNTxTbHOUBoZzQY0J_PpAzoTKH3BBBV_KSMDC4lX4bFWFCAnaHcNjjMgNXlHNQ_w7tVUHjv0rSpLx8EnJaJB-t2yUTKB0f8lYWJTccIbIeOk-BUWhM5lkeifOfHM_2dgZ_BIkoGTiEo9CwyJMRyQJAGasHdiH9ZxFiEzpz4XbT237gH37N-A95osuVf8lnjg4Cfbt85246_wGs05PemVrISTmL879B3_sp-IEiu9B3s8Ovwr_4T67s7O6hl4yMNi9vPgMxuIJNYDIpXE5le8MaY0f4Qa9WdOyEoCHrnc8CL_-3nrQpDZsne_ffjU3thaM9XfcOPqMBc_ux_eXOALpIEXDccZt5A4pBkcfmns_WFdKW8ylPccLicil_1QNXQpXh88k3BvdOJgabK3lce2IXIZ5foajf5Cii9u-GR0V_t5-725nvpGWrjvStrPMtp3KzT0P7-rkzUkQu6NW4dAYrEHJ5Nw1ltQ8dBj76Hbc5Y6e_Qun9lbUX3-Ge0Z_gEIk_QxlJaiF7fHzxOlpyW1RZ3GuSkSmdzzXyqiFvVU-F33kMiGITDOhMufn0MrAPFhVRUbnjf_9JW3CfFCQaRwftrF1tNS0KnhuIn8bzKilwfdx6ZLaHewTVVZKgrT_EfDhotmd2dpr4eaeuPv0Qz__kpieoO7-GpFUg3XnmR0fhEuF18d9wNUEDekBDnd1rw9wwNUBDhfCAWdJrebr14c54OoFd4vYbVo9uF7aX1x-1GoZIDH1aHoLZN9LXNrh-N5-pcnl1uTuy7zwfY7bIbgA7XU-cESmw3F0w2009-ERfT6he3x-_2P46x8loP4FDPRDrv5OFnwYULnBOzvHansF-nvv-L13_N47fu8d37B3hKR3b-v4L6zEXcTf41Uv4fzgy-87LnlZlztFDGHA54IbvGjqsTA32NSVOygBa75AxQslhHrkcolNmF262SYOfO-XRaDB1XwrYT9nPZJytkPQ6GZH1DgeHfNSG3lx4y-uuhiM5s1VN0sYIlN38roPQr3M8f3IMUQlwwVfFqB3DfLUbbpSju601i_02PakzWX5u1B40Qxq3NUM6J86agu7Y35BCA6HvYdoOIwoW1GZA4uMty1qikaiwEvzdtgzJu3XkTxr0rf46w5MEeRtv5rYqVlpUEVUsqgEUzTPRyA6QS-L7EDlR74GcUTnV20Bj5pbLpeNQSa68swnvhhna3VGQ4HTgeYvvkbnX1YdCn-e1f1HLY4ZvUu0AKpl3NEdwhtkVJtuF0NkWj9Wbg1s4eVK5lBZ11PUouXBR2oUFSY6gufWVyT9BESh9GkPEzuK6W1TFfUTUG0LsPZwLY_i-tSvzfr1W5Obr-km6jA9uQvNeiVkrwN8v6jt6Q3U17m9DtBUbqKC2yfxTto6vNeBuakLfBb3HTfmdSAuuTFPU9wUMr4OuNuyyqOQPbT3isFBxrOTMgFgKoxq26OdpduUPG__DcBgRC6bN2-4L3cnhNeWqLdlxtE2XTYtNdG25Ax8Wc3ehb3vu3S5Z2vxi-S2ySNdQen0Vl5vB7Ql9IxdJ-wquaJncD28IMPheHB5OT4rrhllkLHz0YiOz3MYZQtyNSQkv1jAYnF1mcEZvyYDcj64GI7JYHh-Po7pIFsklwOWEcpIcj5E5wMoKRexEKsyVnp5xo2p4frqigwHZ4JmIIz__xdCSrA0q5f-S8UJIqQp_0ZJ2hbWNz0hGg6GbYtbth3KoiTdjh3dnulrByLK6qVB5wPBjTUdLMutgOvun2yeK5V3clvPndVaXD8RkE3FuldfafU_yN0h2TPhvBfIWF2T_wcAAP__5_TwXA">