<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99132>99132</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `isnan` 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 `isnan` clang builtin,
- [ ] Link `isnan` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `isnan` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `isnan` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/isnan.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/isnan-errors.hlsl`
- [ ] Create the `int_dx_isnan` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_isnan` to `8` in `DXIL.td`
- [ ] Create the `isnan.ll` and `isnan_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_isnan` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `isnan` lowering and map it to `int_spv_isnan` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/isnan.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 8 | IsNaN | 6.0 | () |
## SPIR-V
# [OpIsNan](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpIsNan):
## Description:
Result is **true** if *x* is a NaN for the floating-point encoding used
by the type of *x*, otherwise result is **false**.
*Result Type* must be a scalar or vector of [*Boolean
type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Boolean).
*x* must be a scalar or vector of [*floating-point type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Floating). It
must have the same number of components as *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>156</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>x</em></p></td>
</tr>
</tbody>
</table>
## Test Case(s)
### Example 1
```hlsl
//dxc isnan_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export bool4 fn(float4 p1) {
return isnan(p1);
}
```
## HLSL:
Determines if the specified value is NAN or QNAN.
| *ret* isnan(*x*) |
|------------------|
## Parameters
| Item | Description |
|--------------------------------------------------------|----------------------------------------|
| <span id="x"></span><span id="X"></span>*x*<br/> | \[in\] The specified value.<br/> |
## Return Value
Returns a value of the same size as the input, with a value set to **True** if the *x* parameter is NAN or QNAN. Otherwise, **False**.
## Type Description
| Name | [**Template Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md) | [**Component Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md) | Size |
|-------|----------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|----------|
| *x* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md), **vector**, or **matrix** | [**float**](/windows/desktop/WinProg/windows-data-types) | any |
| *ret* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md), **vector**, or **matrix** | [**bool**](/windows/desktop/WinProg/windows-data-types) | as input |
## Minimum Shader Model
This function is supported in the following shader models.
| Shader Model | Supported |
|------------------------------------------------------------------------------------|---------------------|
| [Shader Model 2 (DirectX HLSL)](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-sm2.md) and higher shader models | yes |
| [Shader Model 1 (DirectX HLSL)](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-sm1.md) | yes (vs\_1\_1 only) |
## Requirements
| Requirement | Value |
|-------------------|--------------------------------------------------------------------------------------------|
| Header<br/> | <dl> <dt>Corecrt\_math.h</dt> </dl> |
## See also
<dl> <dt>
[**Intrinsic Functions (DirectX HLSL)**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
</dt> </dl>
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWd1y4ygWfhp8Q0klo9ixL3xhy_GMq7rTs51UT9-lkIQkNgi0gPIzT791QLKs2El6ZrpremtVqVhw4Px8HOADUWN4KRlbodkGzbYT2tpK6VVB9R9Kikmq8udVgNFsg9Fsi_d1I1jNpMVoHnEjqUTzCGeCyhKnLReWS0QSFK2HLh-4vH-9NX7ktgJxJYy449JqLg3PTFiheTTSs85zbFhNcVax7N7gQumRWqugmIDw1w83HzZe_66VmeVKJlQIaMUltLphNXUtuSzDrGnO2cpUzkomX7FzVXN7ZObqqdGD-uSXrvo93ZYZazqNDhZEdlCHyC5ROfuFSbCByK5DyyCyc46EANerCL2hFiLvdDof94POgGmttDmrOtGMWoZtxRwW0t7lT3cHSA7D1sW_PwzjlmuW2a-hzd_WuP26__Cp-UibhssSVKrinCGrMFQvBqih47vaPWQ-AajMD1V3XcRe4lHzaoV4qE_GApFdFw8iu_cRMs3Dt0B089v-85czIewldqK9NFa3LolvmGCZVRrSCmenIYIhoR6Z5rJ0gda0wZjbLhXOOOUmwytWULxG8dq40sFdNI_Cc3GDkuALTml2z2TusMQZNewdPJ1tRHaQc8Ew-w9pLrpMhD8SIxLjfgR83WWCIQPwpwamFD4qX9Pal28qmjONP6qcieOKG0tLZqCmUxQMD36nfFoRHClaOOneXNNr9zYPI_eLyAKRZd_wEJGH7lAFyH5qoLdEsy0ii8raxsBgkB0iO81Kbqx-Du8rraQyodJlB2QASJqGOfxayQvO8mkPcljZWiAS96rJElSOkGUm07yBFPAijFG0_sxMKyzmBiOyRmRtdcv8G-YF1D25V4MphnhhtYSULISilssyaBSXFjOZqRyysjUsR9E6fXat7HPD3FT3ahBJsLIV04_cMKxfWC6oMJ3p0LmGne-9h7fPDUhx3RqLU4YpNhkVVGOl8YNLaGdptkFkvVFKMCpRtLa-149AujdCliHu0ezx-hYnX0D4Az3ddZacq3uLorXzr6IPfn0xMJdkW6fMuZepulGSSWswdYMzHoFucIbkMZhq5nq1luW4YXpQEXYpGCeWpoKh-MqXMiVKrdrmuAIb-wxNtoiQR57bCsVrTCJEZogQDFD8LzdGZHcStK0YzYeSPhKg-Op3pXOcqFZa391VHsn9onhe1o3Max2ZpjJ_RXpSCyU9Ko3dBg55NogcuKAxHh03_qlQ2T2uqOClDAQrLH7w71Y1iBBvHfC58JaawZ_8u-idzuZvakbR-i_rRnHCavglc2FRvOE5IvMS3rwhL4yTVI8Sw1UfT7FR4x8BAooTiqJ1pVnhuyMSewf2-aHhsVvvRYTIjr7n7j-F7NO34Xma5KO0hoqjBSwab623QIcSCtvXwsDW64R-D3MtoNHVE4XTFZ6CdB75P0fGo26dz58y7IkrEClH1HFwiwVP7-Z3CxwwCS4E03nKbQD7hcHBp44-sadGaYtTpcQFLiQiC7e_XOBm6knJxi3aGGtmWy29HUQWTgxAArfZHrs2hOcOFD2b2DLLdM0lM0AQ3PbRsMxtPDB8LYMd_Xp9DVvev67X1-EIL0eT1ppZzyq8Dwd6sBxYVnDyDLzqgO7g4m9U0xo8My_N7S2r8Z9_HNUcGNNbjn3b8ye6DlQTxYlpqMQ899Pm6TAt3LZPpS-M2nw916ZDGKaInyGesc4SNNtw6X63-PZ0MMMXXV4fgc8-r75ALy_wNcAcfV6oYmAbhv_BgF1ABZdNa4EburuCvrVh_lzjCOHtiJW6M1HHtJp-4F-mHf7UM01Q7TvvjijmeAIDUT0myC-SyJ02Osg2nUusbgQcjTpa9Ap3K7mt2jTMFJyPPvJMK6MKu1WOsD1yGRM4_guVwvz3tTkz91Y1gdFZty64M1Gcu8UClomg1LSpeGaC8cEqKLrrEBPWeTedBo-TnpT99C7fQHa8nHF_Y-791ec7mBypOJrYXfq-SCp_WvhJh2aYR_4o07kJhzrdCWpqNX_qZuooMrcbHQfmHc7V45GTiOx-5_I3rcpBGuTUUr_b9elB5fNhkT7ZVP5P8ISN_nvBafwS_Pb6_pFLXrf16L7FN7ituMF9bLAMm7YBMsJyzKW_LVBCqEcuS2x87xp6mxNqcHqXc9D0t_ffb56kwdn5OtuMnIOz3aK7q_L8iCz_qQQzNenWTipzXPGyYnoMtMPymZlzLOeVAKc_VYDTo80B4kBk8WDQLLmbun9YSfE8vns7y1D-03LtPm-csMQjmTPiaMybSfeDt6NhZH5lMCwn1C1OcuEKcZJbFF8lSrNMW8CjprYKK08AnQx37-IMi-tvKRnDVBh1uK8Za--q-9XncF-M-w8w5ly-_KTrbn-iO8Fmkq_ifBkv6YStppdkOp1H02g6qVaLaZ4vomVUFPGiWM6K-WVWzBaLYp6yywWbX0z4ikTkIrqczkkUTS-icHEZLYrLdJ4W88t8vojRRcRqykUoxEMdKl1OuDEtWy2X05hMBE2ZMO4bHSE1szRtS3cuTxAh3aU7iteHzxOdxON80qy_GOwFyqJ43bedbSd6BU4EaVsadBEJbqwZ3LLcCrYaPgS-_AABeg6jPmm1WL0xtN13AWeu0erfLLPu7t-0sP3sfPAPK_LfAAAA___cLjr2">