<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/99211>99211</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Implement the `WaveMultiPrefixCountBits` HLSL Function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            metabug,
            backend:DirectX,
            HLSL,
            bot:HLSL
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          farzonl
      </td>
    </tr>
</table>

<pre>
    - [ ] Implement `WaveMultiPrefixCountBits` clang builtin,
- [ ] Link `WaveMultiPrefixCountBits` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `WaveMultiPrefixCountBits` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `WaveMultiPrefixCountBits` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/WaveMultiPrefixCountBits.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/WaveMultiPrefixCountBits-errors.hlsl`
- [ ] Create the `int_dx_WaveMultiPrefixCountBits` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_WaveMultiPrefixCountBits` to  `167` in `DXIL.td`
- [ ] Create the `WaveMultiPrefixCountBits.ll` and `WaveMultiPrefixCountBits_errors.ll` tests in `llvm/test/CodeGen/DirectX/`

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 167 | WaveMultiPrefixBitCount | 6.5 | ('library', 'compute', 'amplification', 'mesh', 'pixel', 'vertex', 'hull', 'domain', 'geometry', 'raygeneration', 'intersection', 'anyhit', 'closesthit', 'miss', 'callable', 'node') |

## SPIR-V

There is no support for `WaveMultiPrefixCountBits` when targeting SPIR-V.

## Test Case(s)

 
 ### Example 1
```hlsl
//dxc WaveMultiPrefixCountBits_test.hlsl -T lib_6_8 -enable-16bit-types -O0

export uint fn(bool p1, uint4 p2) {
    return WaveMultiPrefixCountBits(p1, p2);
}
```
## HLSL:

## Syntax


```syntax
uint WaveMultiPrefixCountBits(bool 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) | [**uint**](../WinProg/windows-data-types) | 1 |
| *value* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md) | **bool** | 1 |
| *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/eJzUWdtu4zYTfhr6hpBgUT5e-MKH9TZA0l00i7Z3ASWNJf6hSIGkHLtP_4OkZMmO10nRbZsGXqw5HM58c-BwSFOtWS4AFmi8QuPNgNamkGqxo-oPKfggkdlxEWA0XmE03uC7suJQgjAYTYa_0T081Nywrwp27LCWtTArZjSaDHHKqchxUjNumEBkjYbLTso9E89_SgB-YaawKwqu-RMTRjGhWarDAk2GZ6KXWYY1lBSnBaTPGu-kekuTkZZjbfl_un-8X3mV21qkhkmxppxbLiYs1yOU1HEykYdpVV1Tn8oMchDvV_2pZKan-dOhUp3G9eeG_JY6A9roRqJzHiJbS0Nku5YZfAZhdSCybXyqEdl-D1to_fxd197QZP3TqHGw726qCUApqa5rWyugBrApwKphwjxlh6dbvjxlReO4u1OWbJiC1Pwemuy2ks3vd_dfqgdaVUzkVqTcvVO3kdhyRpNpFzgr7U2V3w2ATzoqsltcT43_PLMPi1fO-b58FX9Eto0rENl6XPZDYkRi3M542nSNLX78pbLphXvjn2npx48FzUDhB5kB7xMeDc1BW0ojKOj-8Bvj14SgJyiaTN38hTtWzDiPuLlJOHb_IzJDZMpZoqg6IjJFxNKmqSyr2kBHoGXF2Y6l1O71jlyCLrpRxQ7Au-EelIFDNy5q3pvNZElZT1QOsgTTB6HoMQcB6kInEwaUhvScSsWxYKZnAZcatDmjlUzrHgflnCa8Z6SQmR_NW2-ewv749e6X4FdP-laAAsw0FhLruqqkMu8pYi-FrT5U5WCYyBuJ4ZmWb6ANXlMNiMw0InM_id0_x2GZPh1sMABHdnYy9B9XGqycLSLb7JBeBr_bCzbXXSXBwTfMWfI0eZrhAIR1RRBNEmYCc6xA4-BLk_lwcCbWTBi8E4jMEik5riLrNUsc4Yp4n60sUoyxAlMr8V0MiMz8arcOxSuXuJu-PZ1PXJmMl-fROApDDw2pt0q3dIf1hnpnwZ7yGlojULweofgTLql-7kD14ZwF6lgB3oBOFatcHp7Kgdv3fmuNV4gsEVl-g7LitpjZVZ6ExhtEZoUxlba2uajlzBR1EqbSVqQHliqp5c5sZGqPhhcmYmIPJS4TG2FPzUA_G1kFWqVN5F11ijOXDmQbhq9p2SHIFa0KlurAkoKMGupDHpaZNb2PfS3LSgrbyPw3wPsKy_6Arh42BbL79pf-fpCYnqCucCOyVGAQWZ7nj04pp-rj-d7j6vn9hNhtqB5eJ-43Jr4qmXtMmXzRveC1EiJ85o1mh_5n_eEg2lrjv10z0debCwv3kBr5AS30uH5oxEevjtoHJlhZl2eNU3vwMo13zYXDHsDN6QuZbedsq7iTnMsXe7xqv7q0q3Xo_X3ZiqHh_LGVcFkuruz2Ewsar85ETcLxtSiVbWDCJl5Mdq1l8FiBD0ycIbK1p9yTF-pkTp7G1kO2sS1YXoA6N8i57ti1j93J2G8u25llk4n3vs1rmJpwNQz9gl8bOOf5F1IwinqDIIoCmu2pSCELtLMtaFrUwPulOboujFn2u9Y3Tfoz8XoAXXh5YWFKjkh81iE3qAIqssD2yM34CkQr6O9F9krlV9umX9H5rhLwophtXxuDdDB3no9d699anVB7nbyi-Vd3I_jBqv01403dP9X8mtHnjuZAlQg7d_v0BhHUuqtiiGzrl8rugRZeKkUKle0st_aS02JxmRoEhQ6u4Nm4-88_gMhftC4wZVcxfW7uYP8Aqva6d4Erv4rrl_5N8N8vTXa9osegw3SzCt31LqwfA3z_Cn27gLpb9ccATcUxKJi5iXd9uvV_DMzNK8SbuB-Y1h8Dccm0vu3i5tnkY8BtH3GuQnbQfpYZvOp4zlomAEy5lid6cLZ1m8fS9p1bY0Rmzcnr3ybI_OM16qdH3qBtl_XJNUHjGGs3Gq8uXknc3Mz2nieL_5beNn6heyit3srp7YCeHDrIFnE2j-d0AItoSqJoMpzN5oNiMScRjZNZApPhLI7i6S6lZBwBnY-TlKY7GLAFGZLRcBpNyDAajSbhdJ5ElBBKCclmu9EQjYZQUsZDzvdlKFU-YFrXsJjPSRQNOE2Aa_dLDyElGJrUOSIEkTUiJKHpM4gMxcvTI3Ez47OhZZMGxcuWNN4M1MLqCpI612g05Ey71-tGu2GGw6L71eiNZ280GbrcO8VoUCu-uJF6zTu3Q1Ap-T9IjT0GrM02Tt7s_YL8PwAA___GqEHm">