Skip to content

Commit ed42541

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 ed42541

5 files changed

Lines changed: 79 additions & 6 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: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,17 @@ class DXBuilder {
505505
return module;
506506
}
507507

508-
Instruction buildDclGlobalFlags(uint32_t flags, FileLineColLoc loc) {
508+
Instruction buildDclGlobalFlags(uint32_t flags, Location 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, Location 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,48 @@ class Parser {
804808
getLocation());
805809
}
806810

811+
FailureOr<Instruction> parseDclGlobalFlags(uint32_t opcodeToken,
812+
Location loc) {
813+
return builder.buildDclGlobalFlags(
814+
DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
815+
}
816+
817+
FailureOr<Instruction> parseDclTemps(Location 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+
OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
835+
Instruction &out) {
836+
FailureOr<Instruction> result;
837+
switch (DECODE_D3D10_SB_OPCODE_TYPE(opcodeToken)) {
838+
case D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS:
839+
result = parseDclGlobalFlags(opcodeToken, loc);
840+
break;
841+
case D3D10_SB_OPCODE_DCL_TEMPS:
842+
result = parseDclTemps(loc);
843+
break;
844+
default:
845+
return std::nullopt;
846+
}
847+
if (failed(result))
848+
return failure();
849+
out = *result;
850+
return success();
851+
}
852+
807853
FailureOr<Instruction> parseInstruction() {
808854
size_t beginOffset = currentTokenOffset;
809855
Token token = parseToken();
@@ -829,12 +875,16 @@ class Parser {
829875
return failure();
830876
}
831877

832-
uint32_t opcodeToken = *token;
878+
auto opcodeToken = *token;
833879

834-
if (opcode == D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS) {
880+
Instruction dclInstruction;
881+
auto parseResult = parseDclInstruction(opcodeToken, loc, dclInstruction);
882+
if (parseResult.has_value()) {
883+
if (failed(*parseResult))
884+
return failure();
835885
if (failed(verifyInstructionLength(beginOffset, length)))
836886
return failure();
837-
return builder.buildDclGlobalFlags(DECODE_D3D10_SB_GLOBAL_FLAGS(opcodeToken), loc);
887+
return dclInstruction;
838888
}
839889

840890
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)