@@ -67,6 +67,11 @@ class SparcAsmPrinter : public AsmPrinter {
67
67
68
68
void LowerGETPCXAndEmitMCInsts (const MachineInstr *MI,
69
69
const MCSubtargetInfo &STI);
70
+
71
+ MCOperand lowerOperand (const MachineOperand &MO) const ;
72
+
73
+ private:
74
+ void lowerToMCInst (const MachineInstr *MI, MCInst &OutMI);
70
75
};
71
76
} // end of anonymous namespace
72
77
@@ -255,6 +260,68 @@ void SparcAsmPrinter::LowerGETPCXAndEmitMCInsts(const MachineInstr *MI,
255
260
EmitADD (*OutStreamer, MCRegOP, RegO7, MCRegOP, STI);
256
261
}
257
262
263
+ MCOperand SparcAsmPrinter::lowerOperand (const MachineOperand &MO) const {
264
+ switch (MO.getType ()) {
265
+ default :
266
+ llvm_unreachable (" unknown operand type" );
267
+ break ;
268
+ case MachineOperand::MO_Register:
269
+ if (MO.isImplicit ())
270
+ break ;
271
+ return MCOperand::createReg (MO.getReg ());
272
+
273
+ case MachineOperand::MO_Immediate:
274
+ return MCOperand::createImm (MO.getImm ());
275
+
276
+ case MachineOperand::MO_MachineBasicBlock:
277
+ case MachineOperand::MO_GlobalAddress:
278
+ case MachineOperand::MO_BlockAddress:
279
+ case MachineOperand::MO_ExternalSymbol:
280
+ case MachineOperand::MO_ConstantPoolIndex: {
281
+ SparcMCExpr::Specifier Kind = (SparcMCExpr::Specifier)MO.getTargetFlags ();
282
+ const MCSymbol *Symbol = nullptr ;
283
+ switch (MO.getType ()) {
284
+ default :
285
+ llvm_unreachable (" " );
286
+ case MachineOperand::MO_MachineBasicBlock:
287
+ Symbol = MO.getMBB ()->getSymbol ();
288
+ break ;
289
+ case MachineOperand::MO_GlobalAddress:
290
+ Symbol = getSymbol (MO.getGlobal ());
291
+ break ;
292
+ case MachineOperand::MO_BlockAddress:
293
+ Symbol = GetBlockAddressSymbol (MO.getBlockAddress ());
294
+ break ;
295
+ case MachineOperand::MO_ExternalSymbol:
296
+ Symbol = GetExternalSymbolSymbol (MO.getSymbolName ());
297
+ break ;
298
+ case MachineOperand::MO_ConstantPoolIndex:
299
+ Symbol = GetCPISymbol (MO.getIndex ());
300
+ break ;
301
+ }
302
+
303
+ const MCExpr *expr = MCSymbolRefExpr::create (Symbol, OutContext);
304
+ if (Kind)
305
+ expr = SparcMCExpr::create (Kind, expr, OutContext);
306
+ return MCOperand::createExpr (expr);
307
+ }
308
+
309
+ case MachineOperand::MO_RegisterMask:
310
+ break ;
311
+ }
312
+ return MCOperand ();
313
+ }
314
+
315
+ void SparcAsmPrinter::lowerToMCInst (const MachineInstr *MI, MCInst &OutMI) {
316
+ OutMI.setOpcode (MI->getOpcode ());
317
+
318
+ for (const MachineOperand &MO : MI->operands ()) {
319
+ MCOperand MCOp = lowerOperand (MO);
320
+ if (MCOp.isValid ())
321
+ OutMI.addOperand (MCOp);
322
+ }
323
+ }
324
+
258
325
void SparcAsmPrinter::emitInstruction (const MachineInstr *MI) {
259
326
Sparc_MC::verifyInstructionPredicates (MI->getOpcode (),
260
327
getSubtargetInfo ().getFeatureBits ());
@@ -278,7 +345,7 @@ void SparcAsmPrinter::emitInstruction(const MachineInstr *MI) {
278
345
MachineBasicBlock::const_instr_iterator E = MI->getParent ()->instr_end ();
279
346
do {
280
347
MCInst TmpInst;
281
- LowerSparcMachineInstrToMCInst (&*I, TmpInst, * this );
348
+ lowerToMCInst (&*I, TmpInst);
282
349
EmitToStreamer (*OutStreamer, TmpInst);
283
350
} while ((++I != E) && I->isInsideBundle ()); // Delay slot check.
284
351
}
0 commit comments