mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
2a68ddf041
Summary: This patch implements minimal VE code generation for empty function bodies (no args, no value return). Contents * empty function code generation test. * Minimal function prologue & epilogue emission * Instruction formats and instruction definitions as far as required for the empty function prologue & epilogue. * I64 register class definitions. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D72598
79 lines
2.5 KiB
C++
79 lines
2.5 KiB
C++
//===-- VEAsmPrinter.cpp - VE LLVM assembly writer ------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains a printer that converts from our internal representation
|
|
// of machine-dependent LLVM code to GAS-format VE assembly language.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "InstPrinter/VEInstPrinter.h"
|
|
#include "MCTargetDesc/VETargetStreamer.h"
|
|
#include "VE.h"
|
|
#include "VEInstrInfo.h"
|
|
#include "VETargetMachine.h"
|
|
#include "llvm/CodeGen/AsmPrinter.h"
|
|
#include "llvm/CodeGen/MachineInstr.h"
|
|
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
|
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
|
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
|
#include "llvm/IR/Mangler.h"
|
|
#include "llvm/MC/MCAsmInfo.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCInst.h"
|
|
#include "llvm/MC/MCInstBuilder.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/TargetRegistry.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "ve-asmprinter"
|
|
|
|
namespace {
|
|
class VEAsmPrinter : public AsmPrinter {
|
|
VETargetStreamer &getTargetStreamer() {
|
|
return static_cast<VETargetStreamer &>(*OutStreamer->getTargetStreamer());
|
|
}
|
|
|
|
public:
|
|
explicit VEAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
|
|
: AsmPrinter(TM, std::move(Streamer)) {}
|
|
|
|
StringRef getPassName() const override { return "VE Assembly Printer"; }
|
|
|
|
void EmitInstruction(const MachineInstr *MI) override;
|
|
|
|
static const char *getRegisterName(unsigned RegNo) {
|
|
return VEInstPrinter::getRegisterName(RegNo);
|
|
}
|
|
};
|
|
} // end of anonymous namespace
|
|
|
|
void VEAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
|
|
|
switch (MI->getOpcode()) {
|
|
default:
|
|
break;
|
|
case TargetOpcode::DBG_VALUE:
|
|
// FIXME: Debug Value.
|
|
return;
|
|
}
|
|
MachineBasicBlock::const_instr_iterator I = MI->getIterator();
|
|
MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end();
|
|
do {
|
|
MCInst TmpInst;
|
|
LowerVEMachineInstrToMCInst(&*I, TmpInst, *this);
|
|
EmitToStreamer(*OutStreamer, TmpInst);
|
|
} while ((++I != E) && I->isInsideBundle()); // Delay slot check.
|
|
}
|
|
|
|
// Force static initialization.
|
|
extern "C" void LLVMInitializeVEAsmPrinter() {
|
|
RegisterAsmPrinter<VEAsmPrinter> X(getTheVETarget());
|
|
}
|