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