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

    <tr>
        <th>Summary</th>
        <td>
            Implement the `asdouble` 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 `asdouble` clang builtin,
- [ ] Link `asdouble` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `asdouble` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `asdouble` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/asdouble.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/asdouble-errors.hlsl`
- [ ] Create the `int_dx_asdouble` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_asdouble` to  `101` in `DXIL.td`
- [ ] Create the  `asdouble.ll` and `asdouble_errors.ll` tests in `llvm/test/CodeGen/DirectX/`

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 101 | MakeDouble | 6.0 | () |

## SPIR-V

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

## Test Case(s)

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

export double4 fn(uint4 p1, uint4 p2) {
    return asdouble(p1, p2);
}
```
## HLSL:

Reinterprets a cast value (two 32-bit values) into a double.

## Syntax

``` syntax
double asdouble(
  in uint lowbits,
  in uint highbits
);
```

## Parameters

<dl> <dt>

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

Type: **uint**

The low 32-bit pattern of the input value.

</dd> <dt>

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

Type: **uint**

The high 32-bit pattern of the input value.

</dd> </dl>

## Return value

Type: **double**

The input (two 32-bit values) recast as a double.

## Remarks

The following overloaded version is also available:

``` syntax
double2 asdouble(uint2 lowbits, uint2 highbits);
```

If the input value is two 32-bit components, the return type will contain one double. If the input value is four 32-bit components, the return type will contain two doubles. If the input value is a 64-bit type, the returned value will have the same number of components as the input 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/eJzMV81u4zgSfhr6QsiQKNuJDz7EdtwToLPd6DQGcwsoqWxxQ5ECSSXOPv2iSP1O7Ax2trFYIYHJYvGrfxbJrRUnBbAhyy1Z7me8caU2myM3_9JKzjJdvG8iSpZbSpZ7-lDVEipQjpJVzG2hm0wCWcU0l1ydaNYI6YQibEfiu2HXV6FePt1A34QrkaOUVj4L5YxQVuR2XpJVPIG6KwpqoeI0LyF_sfSozZ-RnUbKDtd_-_r0dRtEHBqVO6HVjkuJXEIh1xNU3HMKdZrndX1JXK4LOIG6Luq-Em4k6f5cm0HC7ktL_it4B9bZFtE7h7AD0gg77HQBX0ChDMIOrc8sYYdOlzn67aqrPkFG-1tYr-bDBDYCY7SxF9F3BrgD6kpAWKHcc3F-Hvumj2LriIc-qnthIHd_zF3xOej-j4ev3-pHXtdCnRBSH6_IcpriShIng-Nx9-cixtGch6zgqhhTn1sHhMXgx4Au5Wv1IUCEHVrbCDsEwfjHUsJS2q0E2s2OooL0W43xp6P5P3gV5k8lL8DQR12AHBOeHD-BRUoLFA0f_Yv5R0I0AkrixK8_8hfYewf46Woe-1_Cbglbd_y9YU_fH35EvwfSzxIMUGGp0tQ2da2Nu1Q3byUmPDcncEKdWoT5BPUnWEd33AJht5awdVik_t9zINP9meOBRBNcXcXhz2cr4hwIOxTnnPbRxGj5ZKbRTypF9rx6vqURKI65nqwy4SL3XoOl0bc2dnD2JoT9C3pUhN02QrkFrRPCdrQds-CXLWpHKTXgGqN6uYTdBm7PR9Ktd_d-rPNgt6_G9C6I_wFCOTC1AWcppzm3jr5y2QDGwr1pmrIoEy0NvYRVpylvFZ569OldOX5uSZ1gajtq2DJW2lsjFNkxchejpVTqt0w4G873P62V4lT6RRTYWTm2r1fkOze8AgfGtuR0V0iS3lMcOJLed9x3vbw7SpY7stwK5X_3YRfG13Ubi37jz_caSIp5ghioXBj1KYp2dK6ruXNgFJ4teCYIVTetP-e9diinuKhgb_Sv1hCB_66KOJYjLb3Tf4Sc9NsuKdFFfapGkHUt2Qz4jOT2Ssb9gIqbFzvAHbWU-g1LXr-CkZoXUNBXMFZohacGl1ZT_sqFxJLsy-BqtrJxuqIb2ShFaSAMIbqclA8fvIqajOzNdVVrBSqAIm9b33hW0DchJc21clwoqhV0jqCXcY-6MX8DGNUJwPYaMqerhYfF3VNAdLJn85glfw39z2KnUU2VgcHcGtTBiF7JtP7ofRRKVE016VJdoNHO9rqFmrWNAArsnW6SBjbsrnC37WT0HXLSAf_Lz-P1ivQ9L_qV3xRv6KtkuZ2YssTzgd2WztUWk9x3qpNwZZPNc433ikeRG2310e11jjeyN6FShnc_qTMs70AtwL44XUfW5G2383eMtPAtkB2KtEiS6GR4XYrcRgaOYEDlENlqOa8KLGG88GCFgJnGwvvrHezgvUlw_LH_n4c7dFd9bGXZocL7mP8OxsHZi_-tkeHis9cVFgEOv4CuwJl3P_kuzu3VaKerunHwMa798BJtOhmTh9idh_Q5TwaT4XgyJn_it64rA_hj7_NWuNz212favWTs_yqLzkMKISnqb_ZRF3YbsulCz5vY8H9aBB_V7jrorNikxTpd8xlskhuWJMtVHKezcrOIV0laLG-yLM6OC-Ds5pjBerE4Qp6tIF7NxIbFbBHfJKvkdpmydL4u1jeQr-Ms5Xx5ky_IIoaKCznHl8Rcm9NMWNvAZr2Ob5OZ5BlI69_kjFXgeNacCGN48WIs4_kLqIKkd_1ro10JT7mOTTuS3nWk5X5mNigrypqTJYtYCuvsIN0JJ2EzvO_bN9j41o5QffbNGiM3nwSvfSB5ibXR_4QcH0reRoxaMPN1w_4dAAD__6n535o">