diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSADoubleArithOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSADoubleArithOps.td index 7c36f2a9a444..a2576414a975 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSADoubleArithOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSADoubleArithOps.td @@ -13,7 +13,7 @@ #ifndef MLIR_DIALECT_DXSA_IR_DXSADOUBLEARITHOPS #define MLIR_DIALECT_DXSA_IR_DXSADOUBLEARITHOPS -include "mlir/Dialect/DXSA/IR/DXSAOpBase.td" +include "mlir/Dialect/DXSA/IR/DXSAFPArithOps.td" //===----------------------------------------------------------------------===// // dxsa.dadd @@ -305,4 +305,52 @@ def DXSA_DrcpSat : DXSA_UnaryOp<"drcp_sat"> { }]; } +//===----------------------------------------------------------------------===// +// dxsa.dfma +//===----------------------------------------------------------------------===// + +def DXSA_Dfma : DXSA_MultiplyAddOp<"dfma"> { + let summary = "component-wise double-precision multiply-add"; + let description = [{ + The `dxsa.dfma` operation computes the component-wise double-precision + multiply-add `$dst = $lhs * $rhs + $acc`. Each operand holds a vector of + doubles, one double per `xy` and `zw` component pair. + + Because each double spans a component pair, the destination write mask must + be ``, ``, or ``, and each source swizzle must be + one of ``, ``, ``, or ``. + + Example: + + ```mlir + dxsa.dfma r<0>, r<1>, r<2>, r<3> + dxsa.dfma r<1, >, r<1, >, r<1, >, r<2, > + ``` + }]; +} + +//===----------------------------------------------------------------------===// +// dxsa.dfma_sat +//===----------------------------------------------------------------------===// + +def DXSA_DfmaSat : DXSA_MultiplyAddOp<"dfma_sat"> { + let summary = "component-wise double-precision multiply-add, saturated to [0, 1]"; + let description = [{ + The `dxsa.dfma_sat` operation computes the component-wise double-precision + multiply-add of `$lhs`, `$rhs` and `$acc`, clamps each result component to + `[0.0, 1.0]`, and writes it to `$dst`. + + Because each double spans a component pair, the destination write mask must + be ``, ``, or ``, and each source swizzle must be + one of ``, ``, ``, or ``. + + Example: + + ```mlir + dxsa.dfma_sat r<0>, r<1>, r<2>, r<3> + dxsa.dfma_sat r<1, >, r<1, >, r<1, >, r<2, > + ``` + }]; +} + #endif // MLIR_DIALECT_DXSA_IR_DXSADOUBLEARITHOPS diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index 12ef61ab7bf0..1f784b75ce98 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -2437,6 +2437,8 @@ class Parser { return SATURABLE_OP(Dmul, 1, 2, HasPreciseAttr::Yes); case D3D11_1_SB_OPCODE_DDIV: return SATURABLE_OP(Ddiv, 1, 2, HasPreciseAttr::Yes); + case D3D11_1_SB_OPCODE_DFMA: + return SATURABLE_OP(Dfma, 1, 3, HasPreciseAttr::Yes); case D3D11_1_SB_OPCODE_DRCP: return SATURABLE_OP(Drcp, 1, 1, HasPreciseAttr::Yes); } diff --git a/mlir/test/Target/DXSA/double_arith_ops.test b/mlir/test/Target/DXSA/double_arith_ops.test index 030d652d03ee..c3d27b1e43a7 100644 --- a/mlir/test/Target/DXSA/double_arith_ops.test +++ b/mlir/test/Target/DXSA/double_arith_ops.test @@ -82,3 +82,87 @@ // CHECK-NEXT: dxsa.drcp_sat r<0>, r<1> // CHECK-NEXT: } 0x050020d4, 0x001000f2, 0x00000000, 0x00100e46, 0x00000001 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma precise r<0>, r<0>, r<1>, r<2> +// CHECK-NEXT: } +0x097800D3, 0x001000F2, 0x00000000, 0x00100E46, 0x00000000, 0x00100E46, 0x00000001, 0x00100E46, 0x00000002 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat precise r<1>, r<1>, r<2>, r<3> +// CHECK-NEXT: } +0x097820D3, 0x001000F2, 0x00000001, 0x00100E46, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma r<1>, r<1>, r<2>, r<3> +// CHECK-NEXT: } +0x090000D3, 0x001000F2, 0x00000001, 0x00100E46, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat r<1>, r<1>, r<2>, r<3> +// CHECK-NEXT: } +0x090020D3, 0x001000F2, 0x00000001, 0x00100E46, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma r<1>, -r<1>, r<2>, r<3> +// CHECK-NEXT: } +0x0A0000D3, 0x001000F2, 0x00000001, 0x80100E46, 0x00000041, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat r<1>, -r<1>, r<2>, r<3> +// CHECK-NEXT: } +0x0A0020D3, 0x001000F2, 0x00000001, 0x80100E46, 0x00000041, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma r<1>, -r<1>, r<2>, -r<3> +// CHECK-NEXT: } +0x0B0000D3, 0x001000F2, 0x00000001, 0x80100E46, 0x00000041, 0x00000001, 0x00100E46, 0x00000002, 0x80100E46, 0x00000041, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat r<1>, -r<1>, r<2>, -r<3> +// CHECK-NEXT: } +0x0B0020D3, 0x001000F2, 0x00000001, 0x80100E46, 0x00000041, 0x00000001, 0x00100E46, 0x00000002, 0x80100E46, 0x00000041, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma r<1>, r<1, >, r<2>, r<3> +// CHECK-NEXT: } +0x090000D3, 0x001000F2, 0x00000001, 0x001004E6, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat r<1>, r<1, >, r<2>, r<3> +// CHECK-NEXT: } +0x090020D3, 0x001000F2, 0x00000001, 0x001004E6, 0x00000001, 0x00100E46, 0x00000002, 0x00100E46, 0x00000003 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma r<1, >, r<1, >, r<1, >, r<2, > +// CHECK-NEXT: } +0x090000D3, 0x00100032, 0x00000001, 0x00100446, 0x00000001, 0x00100EE6, 0x00000001, 0x00100446, 0x00000002 + +// ----- + +// CHECK-LABEL: dxsa.module { +// CHECK-NEXT: dxsa.dfma_sat r<1, >, r<1, >, r<1, >, r<2, > +// CHECK-NEXT: } +0x090020D3, 0x00100032, 0x00000001, 0x00100446, 0x00000001, 0x00100EE6, 0x00000001, 0x00100446, 0x00000002