LLVM: lib/Target/VE/VEAsmPrinter.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
18#include "VE.h"
33using namespace llvm;
34
35#define DEBUG_TYPE "ve-asmprinter"
36
37namespace {
38class VEAsmPrinter : public AsmPrinter {
40 return static_cast<VETargetStreamer &>(*OutStreamer->getTargetStreamer());
41 }
42
43public:
44 explicit VEAsmPrinter(TargetMachine &TM, std::unique_ptr Streamer)
46
47 StringRef getPassName() const override { return "VE Assembly Printer"; }
48
49 void lowerGETGOTAndEmitMCInsts(const MachineInstr *MI,
51 void lowerGETFunPLTAndEmitMCInsts(const MachineInstr *MI,
53 void lowerGETTLSAddrAndEmitMCInsts(const MachineInstr *MI,
55
56 void emitInstruction(const MachineInstr *MI) override;
57
60 }
62 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
63 const char *ExtraCode, raw_ostream &O) override;
64 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
65 const char *ExtraCode, raw_ostream &O) override;
66
67 static char ID;
68};
69}
70
77
83
91
103
115
127
139
151
162
165 emitBinary(OutStreamer, VE::ANDrm, RS1, Imm, RD, STI);
166}
167
171
174 emitLEAzzi(OutStreamer, lo, RD, STI);
176 emitANDrm(OutStreamer, RD, M032, RD, STI);
178}
179
180void VEAsmPrinter::lowerGETGOTAndEmitMCInsts(const MachineInstr *MI,
183 OutContext.getOrCreateSymbol(Twine("_GLOBAL_OFFSET_TABLE_"));
184
185 const MachineOperand &MO = MI->getOperand(0);
187
188 if (!isPositionIndependent()) {
189
190 switch (TM.getCodeModel()) {
191 default:
197 OutContext, STI);
198 break;
199 }
200 return;
201 }
202
205
206
207
208
209
212 emitLEAzii(*OutStreamer, cim24, loImm, MCRegOP, STI);
214 emitANDrm(*OutStreamer, MCRegOP, M032, MCRegOP, STI);
215 emitSIC(*OutStreamer, RegPLT, STI);
217 emitLEASLrri(*OutStreamer, RegGOT, RegPLT, hiImm, MCRegOP, STI);
218}
219
220void VEAsmPrinter::lowerGETFunPLTAndEmitMCInsts(const MachineInstr *MI,
221 const MCSubtargetInfo &STI) {
222 const MachineOperand &MO = MI->getOperand(0);
224 const MachineOperand &Addr = MI->getOperand(1);
226
227 switch (Addr.getType()) {
228 default:
230 return;
233 return;
236 return;
238 AddrSym = GetExternalSymbolSymbol(Addr.getSymbolName());
239 break;
241 AddrSym = getSymbol(Addr.getGlobal());
242 break;
243 }
244
245 if (!isPositionIndependent()) {
246 llvm_unreachable("Unsupported uses of %plt in not PIC code");
247 return;
248 }
249
251
252
253
254
255
258 emitLEAzii(*OutStreamer, cim24, loImm, MCRegOP, STI);
260 emitANDrm(*OutStreamer, MCRegOP, M032, MCRegOP, STI);
261 emitSIC(*OutStreamer, RegPLT, STI);
263 emitLEASLrri(*OutStreamer, MCRegOP, RegPLT, hiImm, MCRegOP, STI);
264}
265
266void VEAsmPrinter::lowerGETTLSAddrAndEmitMCInsts(const MachineInstr *MI,
267 const MCSubtargetInfo &STI) {
268 const MachineOperand &Addr = MI->getOperand(0);
270
271 switch (Addr.getType()) {
272 default:
274 return;
277 return;
280 return;
282 AddrSym = GetExternalSymbolSymbol(Addr.getSymbolName());
283 break;
285 AddrSym = getSymbol(Addr.getGlobal());
286 break;
287 }
288
292 MCSymbol *GetTLSLabel = OutContext.getOrCreateSymbol(Twine("__tls_get_addr"));
293
294
295
296
297
298
299
300
301
304 emitLEAzii(*OutStreamer, cim24, loImm, RegS0, STI);
306 emitANDrm(*OutStreamer, RegS0, M032, RegS0, STI);
307 emitSIC(*OutStreamer, RegLR, STI);
309 emitLEASLrri(*OutStreamer, RegS0, RegLR, hiImm, RegS0, STI);
311 MCOperand loImm2 =
313 emitLEAzii(*OutStreamer, ci8, loImm2, RegS12, STI);
314 emitANDrm(*OutStreamer, RegS12, M032, RegS12, STI);
315 MCOperand hiImm2 =
317 emitLEASLrri(*OutStreamer, RegS12, RegLR, hiImm2, RegS12, STI);
318 emitBSIC(*OutStreamer, RegLR, RegS12, STI);
319}
320
321void VEAsmPrinter::emitInstruction(const MachineInstr *MI) {
322 VE_MC::verifyInstructionPredicates(MI->getOpcode(),
323 getSubtargetInfo().getFeatureBits());
324
325 switch (MI->getOpcode()) {
326 default:
327 break;
328 case TargetOpcode::DBG_VALUE:
329
330 return;
331 case VE::GETGOT:
332 lowerGETGOTAndEmitMCInsts(MI, getSubtargetInfo());
333 return;
334 case VE::GETFUNPLT:
335 lowerGETFunPLTAndEmitMCInsts(MI, getSubtargetInfo());
336 return;
337 case VE::GETTLSADDR:
338 lowerGETTLSAddrAndEmitMCInsts(MI, getSubtargetInfo());
339 return;
340 }
341
344 do {
345 MCInst TmpInst;
347 EmitToStreamer(*OutStreamer, TmpInst);
348 } while ((++I != E) && I->isInsideBundle());
349}
350
351void VEAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
352 raw_ostream &O) {
353 const MachineOperand &MO = MI->getOperand(OpNum);
354
358 break;
361 break;
362 default:
364 }
365}
366
367
368bool VEAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
369 const char *ExtraCode, raw_ostream &O) {
370 if (ExtraCode && ExtraCode[0]) {
371 if (ExtraCode[1] != 0)
372 return true;
373
374 switch (ExtraCode[0]) {
375 default:
376
378 case 'r':
379 case 'v':
380 break;
381 }
382 }
383
385
386 return false;
387}
388
389bool VEAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
390 const char *ExtraCode,
391 raw_ostream &O) {
392 if (ExtraCode && ExtraCode[0])
393 return true;
394
395 if (MI->getOperand(OpNo+1).isImm() &&
396 MI->getOperand(OpNo+1).getImm() == 0) {
397
398 } else {
400 }
401 if (MI->getOperand(OpNo).isImm() &&
402 MI->getOperand(OpNo).getImm() == 0) {
403 if (MI->getOperand(OpNo+1).isImm() &&
404 MI->getOperand(OpNo+1).getImm() == 0) {
405 O << "0";
406 } else {
407
408 }
409 } else {
410 O << "(";
412 O << ")";
413 }
414 return false;
415}
416
417char VEAsmPrinter::ID = 0;
418
419INITIALIZE_PASS(VEAsmPrinter, "ve-asm-printer", "VE Assembly Printer", false,
420 false)
421
422
425}
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_EXTERNAL_VISIBILITY
static std::string getRegisterName(const TargetRegisterInfo *TRI, Register Reg)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static bool printOperand(raw_ostream &OS, const SelectionDAG *G, const SDValue Value)
static void emitHiLo(MCStreamer &OutStreamer, MCSymbol *GOTSym, uint16_t HiKind, uint16_t LoKind, MCOperand &RD, MCContext &OutContext, const MCSubtargetInfo &STI)
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static void emitSIC(MCStreamer &OutStreamer, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:84
static void emitHiLo(MCStreamer &OutStreamer, MCSymbol *GOTSym, VE::Specifier HiKind, VE::Specifier LoKind, MCOperand &RD, MCContext &OutContext, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:168
static void emitBinary(MCStreamer &OutStreamer, unsigned Opcode, MCOperand &RS1, MCOperand &Src2, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:152
static void emitLEAzii(MCStreamer &OutStreamer, MCOperand &RS1, MCOperand &Imm, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:128
static void emitLEASLzzi(MCStreamer &OutStreamer, MCOperand &Imm, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:116
static MCOperand createGOTRelExprOp(VE::Specifier Kind, MCSymbol *GOTLabel, MCContext &OutContext)
Definition VEAsmPrinter.cpp:78
static void emitBSIC(MCStreamer &OutStreamer, MCOperand &R1, MCOperand &R2, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:92
static MCOperand createVEMCOperand(VE::Specifier Kind, MCSymbol *Sym, MCContext &OutContext)
Definition VEAsmPrinter.cpp:71
static void emitLEAzzi(MCStreamer &OutStreamer, MCOperand &Imm, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:104
static void emitANDrm(MCStreamer &OutStreamer, MCOperand &RS1, MCOperand &Imm, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:163
static void emitLEASLrri(MCStreamer &OutStreamer, MCOperand &RS1, MCOperand &RS2, MCOperand &Imm, MCOperand &RD, const MCSubtargetInfo &STI)
Definition VEAsmPrinter.cpp:140
This class is intended to be used as a driving class for all asm writers.
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
Context object for machine code objects.
Instances of this class represent a single low-level machine instruction.
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
Instances of this class represent operands of the MCInst class.
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
Wrapper class representing physical registers. Should be passed by value.
static const MCSpecifierExpr * create(const MCExpr *Expr, Spec S, MCContext &Ctx, SMLoc Loc=SMLoc())
Streaming machine code generation interface.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Instructions::const_iterator const_instr_iterator
Representation of each machine instruction.
const GlobalValue * getGlobal() const
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
StringRef - Represent a constant reference to a string, i.e.
Primary interface to the complete machine description for the target machine.
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=VE::NoRegAltName)
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, AsmPrinter &AP)
Target & getTheVETarget()
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
unsigned M0(unsigned Val)
RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...