diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index ec511324c3ae..50b42ee08b36 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -754,4 +754,21 @@ def DXSA_DclOutputSgv : DXSA_Op<"dcl_output_sgv"> { let assemblyFormat = "$operand `,` $name attr-dict"; } +def DXSA_DclOutputSiv : DXSA_Op<"dcl_output_siv"> { + let summary = "declares an output as a System Interpreted Value"; + let description = [{ + The `dxsa.dcl_output_siv` operation declares an output to be written + that represents a System Interpreted Value. + + Example: + + ```mlir + dxsa.dcl_output_siv , index = [3]>, + ``` + }]; + let arguments = (ins DXSA_InlineOperandAttr:$operand, + DXSA_SystemValueNameAttr:$name); + let assemblyFormat = "$operand `,` $name attr-dict"; +} + #endif // DXSA_OPS diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index fd43722e85a0..19e7d4a309a4 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -647,6 +647,12 @@ class DXBuilder { return dxsa::DclOutputSgv::create(builder, loc, operand, nameAttr); } + Instruction buildDclOutputSiv(dxsa::InlineOperandAttr operand, + dxsa::SystemValueName name, Location loc) { + auto nameAttr = dxsa::SystemValueNameAttr::get(builder.getContext(), name); + return dxsa::DclOutputSiv::create(builder, loc, operand, nameAttr); + } + private: MLIRContext *context; ModuleOp module; @@ -1202,6 +1208,14 @@ class Parser { return builder.buildDclOutputSgv(*operand, *name, loc); } + FailureOr parseDclOutputSiv(Location loc) { + auto operand = parseInlineOperand(); + FAILURE_IF_FAILED(operand); + auto name = parseSystemValueName(getLocation()); + FAILURE_IF_FAILED(name); + return builder.buildDclOutputSiv(*operand, *name, loc); + } + OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc, Instruction &out) { FailureOr result; @@ -1254,6 +1268,9 @@ class Parser { case D3D10_SB_OPCODE_DCL_OUTPUT_SGV: result = parseDclOutputSgv(loc); break; + case D3D10_SB_OPCODE_DCL_OUTPUT_SIV: + result = parseDclOutputSiv(loc); + break; default: return std::nullopt; } diff --git a/mlir/test/Target/DXSA/dcl_output_siv.mlir b/mlir/test/Target/DXSA/dcl_output_siv.mlir new file mode 100644 index 000000000000..e48c2b5e4b25 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_output_siv.mlir @@ -0,0 +1,6 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_output_siv.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_output_siv , index = [0]>, +// CHECK-NEXT: dxsa.dcl_output_siv , index = [1]>, +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/inputs/dcl_output_siv.bin b/mlir/test/Target/DXSA/inputs/dcl_output_siv.bin new file mode 100644 index 000000000000..ac3b696671c1 Binary files /dev/null and b/mlir/test/Target/DXSA/inputs/dcl_output_siv.bin differ