Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,11 @@ def DXSA_DclGlobalFlags : DXSA_Op<"dcl_global_flags"> {
let hasVerifier = 1;
}

def DXSA_DclTemps : DXSA_Op<"dcl_temps"> {
let summary = "declares the number of temporary registers";
let arguments = (ins ConfinedAttr<I32Attr,
[IntPositive, IntMaxValue<4096>]>:$count);
let assemblyFormat = [{ $count attr-dict }];
}

#endif // DXSA_OPS
62 changes: 56 additions & 6 deletions mlir/lib/Target/DXSA/BinaryParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,13 +505,17 @@ class DXBuilder {
return module;
}

Instruction buildDclGlobalFlags(uint32_t flags, FileLineColLoc loc) {
Instruction buildDclGlobalFlags(uint32_t flags, Location loc) {
auto flagsAttr = dxsa::GlobalFlagsAttr::get(
builder.getContext(),
static_cast<dxsa::GlobalFlags>(flags));
builder.getContext(), static_cast<dxsa::GlobalFlags>(flags));
return dxsa::DclGlobalFlags::create(builder, loc, flagsAttr);
}

Instruction buildDclTemps(uint32_t count, Location loc) {
return dxsa::DclTemps::create(builder, loc,
builder.getI32IntegerAttr(count));
}

private:
MLIRContext *context;
ModuleOp module;
Expand Down Expand Up @@ -804,6 +808,48 @@ class Parser {
getLocation());
}

FailureOr<Instruction> parseDclGlobalFlags(uint32_t opcodeToken,
Location loc) {
return builder.buildDclGlobalFlags(
DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
}

FailureOr<Instruction> parseDclTemps(Location loc) {
auto countToken = parseToken();
if (failed(countToken))
return failure();
auto count = *countToken;
if (count == 0) {
emitError(getLocation(), "temp register count cannot be zero");
return failure();
}
if (count > 4096) {
emitError(getLocation(), "invalid temp register count: ")
<< count << " (max 4096)";
return failure();
}
return builder.buildDclTemps(count, loc);
}

OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
Instruction &out) {
FailureOr<Instruction> result;
switch (DECODE_D3D10_SB_OPCODE_TYPE(opcodeToken)) {
case D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS:
result = parseDclGlobalFlags(opcodeToken, loc);
break;
case D3D10_SB_OPCODE_DCL_TEMPS:
result = parseDclTemps(loc);
break;
default:
return std::nullopt;
}
if (failed(result))
return failure();
out = *result;
return success();
}

FailureOr<Instruction> parseInstruction() {
size_t beginOffset = currentTokenOffset;
Token token = parseToken();
Expand All @@ -829,12 +875,16 @@ class Parser {
return failure();
}

uint32_t opcodeToken = *token;
auto opcodeToken = *token;

if (opcode == D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS) {
Instruction dclInstruction;
auto parseResult = parseDclInstruction(opcodeToken, loc, dclInstruction);
if (parseResult.has_value()) {
if (failed(*parseResult))
return failure();
if (failed(verifyInstructionLength(beginOffset, length)))
return failure();
return builder.buildDclGlobalFlags(DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
return dclInstruction;
}

unsigned numOperands = instrInfo[opcode].numOperands;
Expand Down
7 changes: 7 additions & 0 deletions mlir/test/Target/DXSA/dcl_temps.mlir
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_temps.bin | FileCheck %s

// CHECK: module {
// CHECK-NEXT: dxsa.dcl_temps 1
// CHECK-NEXT: dxsa.dcl_temps 16
// CHECK-NEXT: dxsa.dcl_temps 4096
// CHECK-NEXT: }
9 changes: 9 additions & 0 deletions mlir/test/Target/DXSA/dcl_temps_invalid.mlir
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// RUN: mlir-opt %s -split-input-file -verify-diagnostics

// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 4096}}
dxsa.dcl_temps 0

// -----

// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 4096}}
dxsa.dcl_temps 4097
Binary file added mlir/test/Target/DXSA/inputs/dcl_temps.bin
Binary file not shown.