@@ -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+
515519private:
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 ;
0 commit comments