-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Description
- Implement
fmaclang builtin, - Link
fmaclang builtin withhlsl_alias_intrinsics.h - Add sema checks for
fmatoCheckHLSLBuiltinFunctionCallinSemaHLSL.cpp - Add codegen for
fmatoEmitHLSLBuiltinExprinCGHLSLBuiltins.cpp - Add codegen tests to
clang/test/CodeGenHLSL/builtins/fma.hlsl - Add sema tests to
clang/test/SemaHLSL/BuiltIns/fma-errors.hlsl - Create the
int_dx_fmaintrinsic inIntrinsicsDirectX.td - Create the
DXILOpMappingofint_dx_fmato47inDXIL.td - Create the
fma.llandfma_errors.lltests inllvm/test/CodeGen/DirectX/ - Create the
int_spv_fmaintrinsic inIntrinsicsSPIRV.td - In SPIRVInstructionSelector.cpp create the
fmalowering and map it toint_spv_fmainSPIRVInstructionSelector::selectIntrinsic. - Create SPIR-V backend test case in
llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fma.ll - Set the
DX11_1_DoubleExtensionsshader flag to true inDXILShaderFlags.cppwhenfmais used - Add an
fmacase to the shader flag testllvm/test/CodeGen/DirectX/ShaderFlags/double-extensions.ll
DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
|---|---|---|---|
| 47 | Fma | 6.0 | () |
SPIR-V
Fma:
Description:
Fma
Computes a * b + c. In uses where this operation is decorated
with NoContraction:
- fma is considered a single operation, whereas the expression a
* b + c is considered two operations.
- The precision of fma can differ from the precision of the
expression a * b + c.
- fma will be computed with the same precision as any other fma
decorated with NoContraction, giving invariant results for the same
input values of a, b, and c.
Otherwise, in the absence of a NoContraction decoration, there are
no special constraints on the number of operations or difference in
precision between fma and the expression a * b +c.
The operands must all be a scalar or vector whose component type is
floating-point.
Result Type and the type of all operands must be the same type.
Results are computed per component.
| Number | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
|---|---|---|---|---|
50 |
<id> |
<id> |
<id> |
Test Case(s)
Example 1
//dxc fma_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export double4 fn(double4 p1, double4 p2, double4 p3) {
return fma(p1, p2, p3);
}HLSL:
Returns the double-precision fused multiply-addition of a * b + c.
| ret fma(double a, b, c); |
|---|
Parameters
-
a
-
[in] The first value in the fused multiply-addition.
-
b
-
[in] The second value in the fused multiply-addition.
-
c
-
[in] The third value in the fused multiply-addition.
Return Value
The double-precision fused multiply-addition of parameters a * b + c. The returned value must be accurate to 0.5 units of least precision (ULP).
Remarks
The fma intrinsic must support NaNs, INFs, and Denorms.
To use the fma intrinsic in your shader code, call the ID3D11Device::CheckFeatureSupport method with D3D11_FEATURE_D3D11_OPTIONS to verify that the Direct3D device supports the ExtendedDoublesShaderInstructions feature option. The fma intrinsic requires a WDDM 1.2 display driver, and all WDDM 1.2 display drivers must support fma. If your app creates a rendering device with feature level 11.0 or 11.1 and the compilation target is shader model 5 or later, the HLSL source code can use the fma intrinsic.
Type Description
| Name | Template Type | Component Type | Size |
|---|---|---|---|
| a | scalar, vector, or matrix | double | any |
| b | same as input a | double | same dimensions as input a |
| c | same as input a | double | same dimensions as input a |
| ret | same as input a | double | same dimensions as input a |
Minimum Shader Model
This function is supported in the following shader models.
| Shader Model | Supported |
|---|---|
| Shader model 5 or later | yes |
Requirements
| Requirement | Value |
|---|---|
| Minimum supported client |
Windows 8 [desktop apps | UWP apps] |
| Minimum supported server |
Windows Server 2012 [desktop apps | UWP apps] |
| Header |
|
See also
Metadata
Metadata
Assignees
Labels
Type
Projects
Status