Skip to content

Commit f495905

Browse files
committed
[mlir][dxsa] Add dcl_temps instruction
Example: dxsa.dcl_temps {count = 1 : i32} Signed-off-by: Vladimir Shiryaev <tagolog@users.noreply.github.com>
1 parent 03a0684 commit f495905

5 files changed

Lines changed: 71 additions & 5 deletions

File tree

mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,11 @@ def DXSA_DclGlobalFlags : DXSA_Op<"dcl_global_flags"> {
151151
let hasVerifier = 1;
152152
}
153153

154+
def DXSA_DclTemps : DXSA_Op<"dcl_temps"> {
155+
let summary = "declares the number of temporary registers";
156+
let arguments = (ins ConfinedAttr<I32Attr,
157+
[IntPositive, IntMaxValue<4096>]>:$count);
158+
let assemblyFormat = [{ $count attr-dict }];
159+
}
160+
154161
#endif // DXSA_OPS

mlir/lib/Target/DXSA/BinaryParser.cpp

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -507,11 +507,15 @@ class DXBuilder {
507507

508508
Instruction buildDclGlobalFlags(uint32_t flags, FileLineColLoc loc) {
509509
auto flagsAttr = dxsa::GlobalFlagsAttr::get(
510-
builder.getContext(),
511-
static_cast<dxsa::GlobalFlags>(flags));
510+
builder.getContext(), static_cast<dxsa::GlobalFlags>(flags));
512511
return dxsa::DclGlobalFlags::create(builder, loc, flagsAttr);
513512
}
514513

514+
Instruction buildDclTemps(uint32_t count, FileLineColLoc loc) {
515+
return dxsa::DclTemps::create(builder, loc,
516+
builder.getI32IntegerAttr(count));
517+
}
518+
515519
private:
516520
MLIRContext *context;
517521
ModuleOp module;
@@ -804,6 +808,42 @@ class Parser {
804808
getLocation());
805809
}
806810

811+
FailureOr<Instruction> parseDclGlobalFlags(uint32_t opcodeToken,
812+
FileLineColLoc loc) {
813+
return builder.buildDclGlobalFlags(
814+
DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
815+
}
816+
817+
FailureOr<Instruction> parseDclTemps(FileLineColLoc loc) {
818+
auto countToken = parseToken();
819+
if (failed(countToken))
820+
return failure();
821+
auto count = *countToken;
822+
if (count == 0) {
823+
emitError(getLocation(), "temp register count cannot be zero");
824+
return failure();
825+
}
826+
if (count > 4096) {
827+
emitError(getLocation(), "invalid temp register count: ")
828+
<< count << " (max 4096)";
829+
return failure();
830+
}
831+
return builder.buildDclTemps(count, loc);
832+
}
833+
834+
std::optional<FailureOr<Instruction>>
835+
tryParseAsDclInstruction(uint32_t opcode, uint32_t opcodeToken,
836+
FileLineColLoc loc) {
837+
switch (opcode) {
838+
case D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS:
839+
return parseDclGlobalFlags(opcodeToken, loc);
840+
case D3D10_SB_OPCODE_DCL_TEMPS:
841+
return parseDclTemps(loc);
842+
default:
843+
return std::nullopt;
844+
}
845+
}
846+
807847
FailureOr<Instruction> parseInstruction() {
808848
size_t beginOffset = currentTokenOffset;
809849
Token token = parseToken();
@@ -829,12 +869,15 @@ class Parser {
829869
return failure();
830870
}
831871

832-
uint32_t opcodeToken = *token;
872+
auto opcodeToken = *token;
833873

834-
if (opcode == D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS) {
874+
auto dclResult = tryParseAsDclInstruction(opcode, opcodeToken, loc);
875+
if (dclResult) {
876+
if (failed(*dclResult))
877+
return failure();
835878
if (failed(verifyInstructionLength(beginOffset, length)))
836879
return failure();
837-
return builder.buildDclGlobalFlags(DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
880+
return *dclResult;
838881
}
839882

840883
unsigned numOperands = instrInfo[opcode].numOperands;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_temps.bin | FileCheck %s
2+
3+
// CHECK: module {
4+
// CHECK-NEXT: dxsa.dcl_temps 1
5+
// CHECK-NEXT: dxsa.dcl_temps 16
6+
// CHECK-NEXT: dxsa.dcl_temps 4096
7+
// CHECK-NEXT: }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: mlir-opt %s -split-input-file -verify-diagnostics
2+
3+
// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 4096}}
4+
dxsa.dcl_temps 0
5+
6+
// -----
7+
8+
// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 4096}}
9+
dxsa.dcl_temps 4097
24 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)