<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/128228>128228</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[HLSL] hlsl202x `double` compatability overloads
</td>
</tr>
<tr>
<th>Labels</th>
<td>
HLSL
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
llvm-beanz
</td>
</tr>
</table>
<pre>
Lots of HLSL builtin functions that operate on floating point elements do not have `double` overloads. In most cases DXC successfully resolves those overloads to `float` but does not emit conversion diagnostics.
In Clang we should provide wrapper overloads that call the `float` overloads and produce conversion diagnostics. We should use the C preprocessor to define these overloads and have them conditional on HLSL 202x.
Some macros I've been playing with:
```hlsl
#define DXC_COMPAT_UNARY_DOUBLE_OVERLOAD(fn) \
float fn(double V) { return fn((float)V); } \
float2 fn(double2 V) { return fn((float2)V); } \
float3 fn(double3 V) { return fn((float3)V); } \
float4 fn(double4 V) { return fn((float4)V); }
#define DXC_COMPAT_BINARY_DOUBLE_OVERLOAD(fn) \
float fn(double V1, double V2) { return fn((float)V1, (float)V2); } \
float2 fn(double2 V1, double2 V2) { return fn((float2)V1, (float2)V2); } \
float3 fn(double3 V1, double3 V2) { return fn((float3)V1, (float3)V2); } \
float4 fn(double4 V1, double4 V2) { return fn((float4)V1, (float4)V2); }
#define DXC_COMPAT_BINARY_TERNARY_OVERLOAD(fn) \
float fn(double V1, double V2, double V3) { \
return fn((float)V1, (float)V1, (float)V3); \
} \
float2 fn(double2 V1, double2 V2, double2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
float3 fn(double3 V1, double3 V2, double3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
float4 fn(double4 V1, double4 V2, double4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyklltv6zYMxz-N8kKcwKac24MfcmmwAtk69Fx29lTINh1rkCXDktN1n36QkzTOpUnQEwQwRFn8kfrTIIW1cq2JYjaYscGiJxpXmDpWalN-SUjo_3qJyd7ilXEWTA6_rb6uIGmkclJD3ujUSaMtuEI4MBXVwhEYDbkywkm9hspI7YAUlaSdhcyANg4KsSFgwyAzTaKIDQMwG6qVEZntw6OG0lgHqbBkYfFzDrZJU7I2b5R6g5qsURvyTGPpcBCc8S5bsveYNA4yQ7YFUikdpEZvqLbSaMikWGtjnUxtnwVTFkwfNcyV0Gt4JbCFaVQGVW02MiN4rUVVUd1F-XRToRS4go6oh3eEbj1kTUofkeGvd1ZjqfU1h6qmqjY-X1P7nDLKpW43j7L17ttrdAWVHpBJL4VQ_vpblTDAf3fJfTUlQSnS2lh4ZDjaECREGiol3rxKr9IVjE-3L7NhsP0Xyiq_Rr6LYfFz_jJ_-v3P6beX739Mn_9-WTx9n60eXp5-PDyvnqYLhuNcM5wAG8xZMIVtGYC3jbdSw492ezSDmlxT6-2eP9deIE78PuMzYKPFsRfsusHrfvDE0fXfEYZ3Mfw6hn8eE3Ux0XVMdIzZiXRJlNnjZ1UJGc5hv8BbGrVvdw146RauytcB4g0iniHxEvOqjB0cv4HjZzh-BXdRzQ4tukGLzmjRCe223t8entvnrwh-WPB9uPvTcH8dnBn4Po-dr5uf9VlddFZ3RvZxvZxY9sHd89WeBX6zwjqr98DvQl3O6uOyPLF8Mqv7CrmzulONjwv8xHKhVLrNqJfFPJvwiehRHI6iIByF4RB7RTzkyTjIQx6FUcgHlGAucMxHwwnxiQiCUU_GGOAgQAwxGGCE_WyEQcYH0RjzfIjBgEUBlUKqvh96-qZe96S1DcUhjhHHPSUSUradjxB9Z2WIflLaD0nN2rIoUNI6e_DgpFPtTNUeGCzAN1PfkY_HntSUlXAikUq6t0N37zW1igvnKuu7Mi4ZLtfSFU3ST03JcOkxu8eXqjb_UOoYLtuoLcPlLvBNjP8HAAD__3_r1Tg">