<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99224>99224</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `unpack_s8s32` 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 `unpack_s8s32` clang builtin,
- [ ] Link `unpack_s8s32` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `unpack_s8s32` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `unpack_s8s32` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/unpack_s8s32.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/unpack_s8s32-errors.hlsl`
- [ ] Create the `int_dx_unpack_s8s32` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_unpack_s8s32` to `219` in `DXIL.td`
- [ ] Create the `unpack_s8s32.ll` and `unpack_s8s32_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_unpack_s8s32` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `unpack_s8s32` lowering and map it to `int_spv_unpack_s8s32` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/unpack_s8s32.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 219 | Unpack4x8 | 6.6 | () |
## SPIR-V
# [OpSConvert](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpSConvert):
## Description:
Convert signed width. This is either a truncate or a sign extend.
*Result Type* must be a scalar or vector of [*integer
type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Integer).
*Signed Value* 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
component width must not equal the component width in *Result Type*.
Results are computed per component.
<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>114</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><em><id></em><br />
<em>Signed Value</em></p></td>
</tr>
</tbody>
</table>
## Test Case(s)
### Example 1
```hlsl
//dxc unpack_s8s32_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export int4 fn(int8_t4_packed p1) {
return unpack_s8s32(p1);
}
```
## HLSL:
## Syntax
```syntax
int<4> unpack_s8s32(p32i8 pk);
```
## 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* | [**vector**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-vector.md) | [**int**](../WinProg/windows-data-types) | 4 |
| *pk* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md) | [**int8_t4_packed**](../WinProg/windows-data-types) | 1 |
## Minimum Shader Model
This function is supported in the following shader models.
|Shader Model | Supported|
|-------------|----------|
|[Shader Model 6.6](https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_6) and higher shader models | yes |
## Shader Stages
## See also
- [**Intrinsic Functions (DirectX HLSL)**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
- **See [Unpack Intrinsics](https://microsoft.github.io/DirectX-Specs/d3d/HLSL_SM_6_6_Pack_Unpack_Intrinsics#unpack-intrinsics)**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWF9z4ygS_zT4hZJKRrbGfvCD48R7rprcTK1zs_vmwgJLXBDoAOXPfvqrBtmSbCe53Zu9m025YtM0v25-3UADtVYUivMFmt6g6e2INq7UZnGg5jet5Giv2esiwmh6g9H0Fm-qWvKKK4dRljSqpvnjzs5sSlCW4FxSVeB9I6QTCpEVSpbdyM9CPX44CD8LV4JWKa3cCeWMUFbkNi5RlgzgloxhyyuK85LnjxYftLmG7jRIV6Dzt8_bzzfBzLpRuRNaraiUoCUUaG15Rb2mUEWc1_U1k7lmvODqfXN3lXA9a3cvtemsrH5qxR-ZcNw62yJ6khBZgwyR9Uoz_hNXYAORdcudRWTd9ycGDt-k7R104KGF9q5uLqAjbow29qqFleHUcexKDtBCuR172Z3zdIpsS8rmFOlbYXjufo0dex_49tfN5y_1Pa1roQqA1Id37DmNoZeM510gAOF9M-cRjkO2UMXOe3YtIUEhcBusSPlUXQQOkXU7T0TWHxNo66ffweD26-bnb1cmtlHYd22Udabx-b_lkudOG0hFnA_sntuT-pkboQo_-4rWGAvXps_bLvpV9YZNlC5RurS-dXIeZUl8jQwAib7hPc0fuWKeYJxTyz8g2dtGZA15GnW7yflCkW0Sw4ekiKT4GJ0g-7TCkCz4Sw1rE_faf6dVaG9LyrjB95px2RdsHS24BUkLFHV_-IP2pSDqAZHx3Pf_w89k8jLzrSzO_DciM0TmR_XTvAKPJxHQ_KXerrR64sah6S0is9K52kJwyBqRteGFsM68xo-l0UrbWJuiJTYCZm3NWz7FQXA2PpIel66SiKQ9dDIH1AHL3OZG1JAVoQtjlCxbfeyPJYafBXNljB9KYbGwmAtXcoMpdqZROeSGhhYoY_7iuGKxR_H_EFn-zG0jHX54rTkiS1w11uE9hxE5ldTA6Cefj34Dmd4gshTK8YIblCxdGPVnELNpjZB53Hd3Gyb9jcrm9_qL_zfeomS5ccGvkj6F_cLCMlBNteferVxXtVZcOYupxRdBgGBylCxPaiHGAVNph_m_Gio98LkKLPdLuBOBocNiasLQxnGGa246nLhNwHTl6F5ylN6FVq5lYXRT9wXYuldQuUWEePMoXWKSIDJFhGAg9q-sjMj6YtKu5JR1LdPrQOndL9owvNKNcmG4F_b6w_Z4va-NzFsDuaGKvdF7IYWWGbSGbkPJenUSDIpNawM7Pv57qfNHXFIpChVJfnD4Kfx2ukaEBOvAzyRYqjt_2HfBHY_fR4Zl8kexUbriFXyTTDqU3giGSFbAr2AodKarvRkkhhf3l9hA-c8gAaUripJlafghDEckDQ5s2Emx79ZHM0JkTT9y9__F7GCH_4-ovcz3QYaDoLeXJcMz9gFKpRW1HJGZhTPYd_odM2iA0t0LhXsdHkNvloSPL-6T9gBhLzkeFLxQa_n6H0cPWIr9LtvNcMQVeBKNs71wEZxHFkdf2tKKv9TaOChcJ_igEJkJ5WY7N9kBKuzT41Cx3PjdHGPDXWPUwCoiM68FREMVdNv3t5uzv7yc1RrbV-XoS8fOcZQ9yoXf1iYovbswmRIxw_VjZ7hvckD2a80HVc2pfvSFYqjM_JmNyPKBV7WEAqY9x944ugvhymYf5xoq3HuRG231wd1qf14_CwUurvdS7yFKQcq4fXS6jqzJ2-j5cjZlPqRkHceXMvYSFYbWpcht5MtlRh0NIYwrBlPv-746nct_DedDSS5-410B3VbU3a__6u87wfSAukofkaXhDqrBQQxCGfjjcR_86vF-8hiWWM9dj_aLUF-NLoJLTD_bXuyOABM8IANW4hkXoTj-8bgIfr3BRW_z-0O0jC-ud_dCiaqpBrfRoOCvT4f22QvuUbapYTvmDGpqKLUPWkr9DDd8G0ZXMNrGgffz-y1K5tsjwvmSurIiTipoejOAyuLsWryqY4jiNnJCd28m0ba9rbCUIbKG3X4XQD1mtsuAIaoYLkUBl8XBhDx1r92dvDsh-jf2KyfplnNMpdUnedRF8_SAgY9Pi3DvmbUOhwOJzH-8_Dy9iUTH3Dju9n563l-YN5rehHcG3L0zfZ-43e-yXbb7CudtsLDrWSBpOIoHbzctjSO2SNk8ndMRX4w_kfE4GyfjZFQuPqXZfj6Z0dlsOtl_mnCaMJ6xccbyGZ-Ok2QkFiQhk-TTOCPJOJvM4inJUrLnkwM70MNsNkOThFdUyFjKpwquyiNhbcMX8zkhk5Gkey6tfy4npOKO7pvC16wrREj7QoXS5emBr-0JOXChdryCHzu0Q-nyqDu9HZkFOBHtm8KiSSKFdbZzywkn-aJ7k3_j7Q7gTok5aoxcvJN97Vuat1ob_U-eO0TWngCIXeDgaUH-HQAA___JUTYT">