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

    <tr>
        <th>Summary</th>
        <td>
            Implement the `countbits` 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 `countbits` clang builtin,
- [ ] Link `countbits` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `countbits` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `countbits` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/countbits.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/countbits-errors.hlsl`
- [ ] Create the `int_dx_countbits` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_countbits` to  `31` in `DXIL.td`
- [ ] Create the  `countbits.ll` and `countbits_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_countbits` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `countbits` lowering and map  it to `int_spv_countbits` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll`

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 31 | Countbits | 6.0 | () |

## SPIR-V

# [OpBitCount](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpBitCount):

## Description:
  
Count the number of set bits in an object.  
  
Results are computed per component.  
  
*Result Type* must be a scalar or vector of [*integer type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Integer).
The components must be wide enough to hold the unsigned *Width* of
*Base* as an unsigned value. That is, no sign bit is needed or counted
when checking for a wide enough result width.  
  
*Base* must be a scalar or vector of [*integer type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Integer). It must
have the same number of components as *Result Type*.  
  
The result is the unsigned value that is the number of bits in *Base*
that are 1.

<table>
<colgroup>
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
</colgroup>
<thead>
<tr>
<th>Word Count</th>
<th>Opcode</th>
<th>Results</th>
<th>Operands</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p>4</p></td>
<td class="tableblock halign-left valign-top"><p>205</p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Result Type</em></p></td>
<td class="tableblock halign-left valign-top"><p><a
href="#ResultId"><em>Result &lt;id&gt;</em></a></p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Base</em></p></td>
</tr>
</tbody>
</table>



## Test Case(s)

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

export uint4 fn(int4 p1) {
    return countbits(p1);
}
```
## HLSL:

Counts the number of bits (per component) set in the input integer.

## Syntax

``` syntax
uint countbits(
  in uint value
);
```

## Parameters

<dl> <dt>

*value* \[in\]
</dt> <dd>

Type: **uint**

The input value.

</dd> </dl>

## Return value

Type: **uint**

The number of bits.

## Remarks

The following overloaded versions are also available:

``` syntax
uint count_bits(uint value);
uint2 count_bits(uint2 value);
uint3 count_bits(uint3 value);
uint4 count_bits(uint4 value);
```

### Minimum Shader Model

This function is supported in the following shader models.



| Shader Model                                                                | Supported |
|-----------------------------------------------------------------------------|-----------|
| [Shader Model 5](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/d3d11-graphics-reference-sm5.md) and higher shader models | yes       |



 

This function is supported in the following types of shaders:



| Vertex | Hull | Domain | Geometry | Pixel | Compute |
|--------|------|--------|----------|-------|---------|
| x      | x    | x      | x        | x     | x       |



 

## See also

<dl> <dt>

[Intrinsic Functions](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
</dt> <dt>

[Shader Model 5](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/d3d11-graphics-reference-sm5.md)
</dt> </dl>
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWN1v2zgS_2uYF8KGRNlO_OAHf8TdAO21aIruvgW0OLa4oUiBpBLn_vrDkLI-aifp3e3e7QZFLQ6H8_Gb4XBI7pw8aIAFma7IdHPFa18Yu9hz-0-j1dXOiJfFiJLpipLpht6VlYIStKdkluSm1n4nvSOzhOaK6wPd1VJ5qQlbk2TZLfso9ePbK-iz9AWyFMqpB6m9ldrJ3I0LMksGspZCUAclp3kB-aOje2PPRHuDpDUy_PLx_uMq6tjWOvfS6DVXCrmkRq57KHnglPowzqvqkr7cCDiAfkPXbSl9T9XtsbKdivWHhvyefA_Ou0ZigIewLdII266NgA-gUQdh2wY1R9i2NWaM0L2K1huiEYFGbrDzbih3BNYae1n82gL3QH0BKFdq_yCODwN42lA2WNy1od1IC7n_bezF21I3v919_Fx94lUl9QFFmv1ryryhOJWlHfa4-m0Vg4iOY2pwLQbkhwaDOBuxjPKVeirPokTYtvGOsO37mLnq6WdBu_9y9_X7BX_uNA1Td9p5W4c0vwcFuTcWk47mA6UDZco8g5X6EJwueUWp9E2ivGJc2DavaCPZkmRLF0at2WSWjC9hgEJG3-mO54-gRcCV5tzBO9gG3YRtMSNHXa0YbAbV5Cr-YxlhGT1FJNKu1xRTg36ucPPR3vgfvIzj-4ILsPSTEaD6hHvPD-CQ0ggadX_0nfE5YdQTlKVhen3yIoxm4yT8EnZD2PzE3boVMWxJCPHnaiV9EEKmG8JuCu8rh4FhW8K2Fg7Sefsyfiys0caNjT00oI4QVVdBwLLWci9BpCfAx4UvFWFZTzqbo9QByOByKyvMiDhFKUmWgTskn67LHVjcwg48DT5KTbmmZvc75H4c2MN_X8HVyjvKLdDclFXtQdAKbBgYDbrPTFjDT7-9VEDYkpa183QHlFOXc8UtNZY-hQwN9WO6ImwptYcDWOrjmj8DrLuogrA5boBvBXTmu9bGZymAgjb1ocCNVxglAli1DmezoIQtf5XCF-iY2Ud_V9wFR7lD-FrWJ65qGNNvBfdUOsLWVBuKcwg2lY5qAAEC4QibBQRJls8F6HieYh3AU44PjLIR22e0YYj6yYq_Htz0zgerSLIs-FMsfQ63dpeCvVBwR89yqOcpBq4BQbphbALg1Ee8f8jxU353QJFkGVgxq9Nxs3Wytec7BSS7jaPcqIM1ddUnUOdfkGVDGAtxINmSsoSwKWGMInp_Z-ZQun9w2hfARTeyvQmS3f5qrIiFMi4PxN58rOuX55rS8tpCsFyLV2bPqDiyg9HQbGygLzohsAF2LqIT4r9TJn-kBVfyoEcK9h5zC7-9qQhjUTviM4maqs4e8YfIZcn0TckkWf7Hskm2hhJ_2Ux5kq2kIGx2wK-oKE5m650dJEYg97flgPnPAIFka441w8I-LicsiwbciZaxb9Z7HhG25e-Z-_9CNlSln4L0PM8HmY2EXg1Lhl3BN2zs1qEC3jjsGsJkqK6RA5lujxxvlzTF2VkS_4VLR9KcDuKY064lx7YwXEro6BtVcvcwe7ihI9Boxiid7aQf4Unj6Ohz0wjCsTLW01pqP6F7TdhN-KrS2FetQrWn1IKvre40EXYTWBBR7NM2fQM7J8MV6tQOhcp08ThAaf0uBnVjLyR14Ja6qnEQzrHxsNN70Z4fG9JJP3UnKro1MDq4IzVZM7JMwmw4q4LAkzN9N1pFX7jlJXiwrj2ghCLZLcUP34WYLaNAtqRkuibTldThd9PmROAOy0S7LG5jjDxKQLviVzPbYhA7mdYClCYaafitenYEq7_GsLU-_oymYWzGP8gruX10HfPeKGWesUMyT2CV4dhHPYF10ujYp3LlDOVPXKq4F5Y_EayHJlq9AJ2igyR2zsUusGXnbNkFtsk52-QHtospgXh8klqWdTm4Fp3AkY7um9cV7IJcXeFOA3HK6g46F1eXuLoFvL2SDa5c_-VfkNca0l6yRn_k31Bed5Ej09XAlemlZvcgfVHvxrnBS-4nmVvjzN5vTOhwn6XOGGHbnTI7TPdIFeAevalGzuZNSQyX2kyEOsm2IhNpOjpYXhUydyMLe7Cgcxi5cjouBdYavOUX8lCAHcYi4PUCrkNvEJxQRP79cMcKjNe9oMt1e6KN-XewHo5B_S-1ijftjSk59s3Xa_oBTAnevoTBF3ls7uLreCU8j2v7eYk2HPTJXeyOXfocBx-Dz_6gT34Dt1MZh1go3q6t01X7ekJPD5fuf5VFxy6Fhm8so1PYXcymC4V-4MNfdBOcm306Ua7EIhPzbM6vYJFeszSdzmcsuSoWbJ6kk4SlLBP5nM2m1-kumUyu5yKfTViaTa7kgiVsklyns3Q-zSbJOJ3urrM8maQin8zTBMgkgZJLNVbqqcSL7ZV0robFfJ7MJ1eK70C58ArPWAme7-pDaD7XhLHmgYxky_ZZsZmJ77ZnbKcL82nCeJItT7zTzZVdoBGjXX1wZJIo6cKLWWOWl17Bonvqv_RoiLLavLyqrVq8EdbmHS-orKz5HXJP2DZ4j_GMADwt2L8CAAD__wmlRBg">