@@ -49,20 +49,17 @@ class TVMAsmPrinter : public AsmPrinter {
4949 void printOperand (const MachineInstr *MI, int OpNum, raw_ostream &O,
5050 const char *Modifier = nullptr );
5151 void EmitInstruction (const MachineInstr *MI) override ;
52- bool ShouldPrintNextBlock (const MachineBasicBlock &CurMBB) const override ;
5352 std::string regToString (const MachineOperand &MO);
5453 void EmitBasicBlockStart (const MachineBasicBlock &MBB) const override ;
54+ void EmitBasicBlockEnd (const MachineBasicBlock &MBB) override ;
55+ void EmitFunctionBodyEnd () override ;
5556
5657 void EmitFunctionHeader () override ;
5758
5859 // / Print a big LLVM constant int (>64 bit) to the .s file.
5960 void EmitBigInt (const ConstantInt *CI) override ;
6061
6162 bool runOnMachineFunction (MachineFunction &MF) override ;
62- protected:
63- void EmitSubBlockForPushcont (const TVMMCInstLower &lower, const MCInst &Inst,
64- int depth);
65- void EmitBBEntry (const MachineBasicBlock &MBB) const ;
6663private:
6764 TVMFunctionInfo *MFI;
6865};
@@ -97,7 +94,7 @@ void TVMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
9794
9895// ===----------------------------------------------------------------------===//
9996void TVMAsmPrinter::EmitInstruction (const MachineInstr *MI) {
100- LLVM_DEBUG (dbgs () << " EmitInstruction: " << *MI << ' \n ' );
97+ LLVM_DEBUG (dbgs () << " EmitInstruction: " << *MI);
10198 if (isVerbose ())
10299 for (auto Comment : MFI->getStackModelComments (MI)) {
103100 OutStreamer->AddComment (Comment);
@@ -131,112 +128,72 @@ void TVMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
131128
132129 MCInst TmpInst;
133130 MCInstLowering.lower (MI, TmpInst);
134- // We need to access OutStreamer->GetOS() to have such code pattern:
135- // (tabs for first offset from labels ans 2-spaces nested PUSHCONTs)
136- // \tInstr1
137- // \tInstr2
138- // \tPUSHCONT
139- // \t{
140- // \t Instr3
141- // \t Instr4
142- // \t PUSHCONT
143- // \t {
144- // \t Instr5
145- // \t Instr6
146- // \t }
147- // \t}
148- OutStreamer->GetOS () << " \t " ;
131+ OutStreamer->GetOS () << (MF->size () < 2 ? " " : " " );
149132 EmitToStreamer (*OutStreamer, TmpInst);
150- if (TmpInst.getOpcode () == TVM::PUSHCONT_MBB_S) {
151- EmitSubBlockForPushcont (MCInstLowering, TmpInst, 0 );
152- }
153133 }
154134}
155135
156- bool TVMAsmPrinter::ShouldPrintNextBlock (const MachineBasicBlock &CurMBB) const {
157- auto Term = CurMBB.terminators ();
158- // Continue if no terminators or fallthrough terminator
159- if (Term.begin () == Term.end () ||
160- Term.begin ()->getOpcode () == TVM::IFJMP_S ||
161- Term.begin ()->getOpcode () == TVM::IFNOTJMP_S)
162- return true ;
163- return false ;
136+ void TVMAsmPrinter::EmitBasicBlockStart (const MachineBasicBlock &MBB) const {
137+ if (MF->size () < 2 )
138+ return ;
139+ OutStreamer->AddComment (MBB.getName ());
140+ OutStreamer->EmitRawText (" PUSHCONT {" );
164141}
165142
166- void TVMAsmPrinter::EmitBBEntry (const MachineBasicBlock &MBB) const {
167- if (isVerbose ()) {
168- if (const BasicBlock *BB = MBB.getBasicBlock ()) {
169- if (BB->hasName ()) {
170- BB->printAsOperand (OutStreamer->GetCommentOS (), false , BB->getModule ());
171- OutStreamer->GetCommentOS () << ' \n ' ;
172- }
173- }
174- auto BBStackComment = MFI->getStackModelBBComment (&MBB);
175- if (!BBStackComment.empty ())
176- OutStreamer->AddComment (BBStackComment, true );
177- }
178- OutStreamer->emitRawComment (" %bb." + Twine (MBB.getNumber ()) + " :" , false );
143+ void TVMAsmPrinter::EmitBasicBlockEnd (const MachineBasicBlock &MBB) {
144+ if (MF->size () < 2 )
145+ return ;
146+ OutStreamer->EmitRawText (" }" );
179147}
180148
181- void TVMAsmPrinter::EmitSubBlockForPushcont (const TVMMCInstLower &lower,
182- const MCInst &Inst,
183- int depth) {
184- OutStreamer->EmitRawText (" \t " + std::string (depth, ' ' ) + " {\n " );
149+ void TVMAsmPrinter::EmitFunctionHeader () {
150+ const Function &F = MF->getFunction ();
151+ if (F.hasFnAttribute (" tvm_raw_func" )) {
152+ OutStreamer->EmitRawText (" \t .internal\t :" + CurrentFnSym->getName ());
153+ } else {
154+ AsmPrinter::EmitFunctionHeader ();
155+ }
156+ }
185157
186- const auto &Mapping = lower.getMCInstrsMap ();
187- const MachineBasicBlock *MBB = nullptr ;
158+ void TVMAsmPrinter::EmitFunctionBodyEnd () {
159+ unsigned Blocks = MF->size ();
160+ if (Blocks < 2 )
161+ return ;
188162
189- auto I = llvm::find_if (Inst, [](const MCOperand &op) { return op.isInst (); });
190- if (I != Inst.end ()) {
191- auto MIit = Mapping.find (I->getInst ());
192- if (MIit != Mapping.end ()) {
193- if ((MBB = MIit->second ->getParent ()))
194- EmitBBEntry (*MBB);
163+ auto *FI = MF->getInfo <TVMFunctionInfo>();
164+ unsigned Arguments = FI->getParams ().size ();
165+ unsigned ReturnValues = FI->getResults ().size ();
166+
167+ if (Arguments > 0 ) {
168+ if (Blocks <= 16 && Arguments <= 16 ) {
169+ OutStreamer->EmitRawText (" BLKSWAP\t " + Twine (Arguments) + " , " +
170+ Twine (Blocks));
171+ } else {
172+ OutStreamer->EmitRawText (" PUSHINT\t " + Twine (Arguments));
173+ OutStreamer->EmitRawText (" PUSHINT\t " + Twine (Blocks));
174+ OutStreamer->EmitRawText (" BLKSWX" );
195175 }
196176 }
197177
198- for (const auto &op : Inst) {
199- if (op.isInst ()) {
200- auto &curInst = *op.getInst ();
201- if (isVerbose ()) {
202- auto MIit = Mapping.find (&curInst);
203- // PUSHCONT_MBB comment will be printed later, at closing brace '}'
204- if (MIit != Mapping.end () && curInst.getOpcode () != TVM::PUSHCONT_MBB_S)
205- for (auto &Comment : MFI->getStackModelComments (MIit->second ))
206- OutStreamer->AddComment (Comment);
207- if (curInst.getOpcode () == TVM::FALLTHROUGH_RETURN) {
208- OutStreamer->AddComment (" fallthrough return" );
209- OutStreamer->AddBlankLine ();
210- }
211- }
212- OutStreamer->GetOS () << " \t " ;
213- static_cast <formatted_raw_ostream &>(OutStreamer->GetOS ()).
214- PadToColumn (10 + depth);
215- EmitToStreamer (*OutStreamer, curInst);
216- if (curInst.getOpcode () == TVM::PUSHCONT_MBB_S)
217- EmitSubBlockForPushcont (lower, curInst, depth + 2 );
178+ OutStreamer->EmitRawText (" PUSH s" + Twine (Blocks + Arguments - 1 ));
179+ OutStreamer->EmitRawText (" EXECUTE" );
180+
181+ if (ReturnValues > 0 ) {
182+ if (Blocks <= 16 && ReturnValues <= 16 ) {
183+ OutStreamer->EmitRawText (" BLKSWAP\t " + Twine (Blocks) + " , " +
184+ Twine (ReturnValues));
185+ } else {
186+ OutStreamer->EmitRawText (" PUSHINT\t " + Twine (Blocks));
187+ OutStreamer->EmitRawText (" PUSHINT\t " + Twine (ReturnValues));
188+ OutStreamer->EmitRawText (" BLKSWX" );
218189 }
219190 }
220- if (isVerbose ()) {
221- // Print PUSHCONT_MBB comments at close brace '}'
222- auto MIit = Mapping.find (&Inst);
223- if (MIit != Mapping.end ())
224- for (auto &Comment : MFI->getStackModelComments (MIit->second ))
225- OutStreamer->AddComment (Comment);
226- }
227- OutStreamer->EmitRawText (" \t " + std::string (depth, ' ' ) + " }\n " );
228- }
229-
230- void TVMAsmPrinter::EmitBasicBlockStart (const MachineBasicBlock &MBB) const {
231- EmitBBEntry (MBB);
232- }
233191
234- void TVMAsmPrinter::EmitFunctionHeader () {
235- const Function &F = MF->getFunction ();
236- if (F.hasFnAttribute (" tvm_raw_func" )) {
237- OutStreamer->EmitRawText (" \t .internal\t :" + CurrentFnSym->getName ());
192+ if (Blocks < 16 ) {
193+ OutStreamer->EmitRawText (" BLKDROP\t " + Twine (Blocks));
238194 } else {
239- AsmPrinter::EmitFunctionHeader ();
195+ OutStreamer->EmitRawText (" PUSHINT\t " + Twine (Blocks));
196+ OutStreamer->EmitRawText (" DROPX" );
240197 }
241198}
242199
0 commit comments