38#include "tce_config.h"
40#include "llvm/IR/PassManager.h"
41#include "llvm/CodeGen/TargetRegisterInfo.h"
42#include "llvm/CodeGen/SelectionDAGNodes.h"
43#include "llvm/MC/MCContext.h"
44#include "llvm/MC/MCStreamer.h"
45#include "llvm/MC/MCInstPrinter.h"
46#include "llvm/CodeGen/MachineModuleInfo.h"
47#include "llvm/ADT/APFloat.h"
63#include <llvm/Transforms/Scalar.h>
83 const llvm::MCAsmInfo& mai,
const llvm::MCInstrInfo& mii,
84 const llvm::MCRegisterInfo& mri) :
llvm::MCInstPrinter(mai, mii, mri) {}
90 std::pair<const char*, uint64_t>
92 return std::make_pair(
nullptr, 0);
96 const MCInst*, uint64_t, StringRef,
97 const MCSubtargetInfo&, raw_ostream&)
override {}
100 #ifdef LLVM_OLDER_THAN_16
101 printRegName(raw_ostream& OS,
unsigned RegNo)
const override {}
115 const MCAsmInfo &MAI,
116 const MCInstrInfo &MII,
117 const MCRegisterInfo &MRI) {
122 RegisterTargetMachine<TCETargetMachine> Y(
TheTCETarget);
130 TargetRegistry::RegisterMCInstPrinter(
132 TargetRegistry::RegisterMCInstPrinter(
149 const Target &T,
const Triple& TTriple,
150 const llvm::StringRef& CPU,
const llvm::StringRef& FS,
152 #ifdef LLVM_OLDER_THAN_16
153 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM, CodeGenOpt::Level OL,
bool) :
155 std::optional<Reloc::
Model> RM, std::optional<CodeModel::
Model> CM, CodeGenOpt::Level OL, bool) :
158 RM?*RM:Reloc::
Model::Static, CM?*CM:CodeModel::Small, OL),
161 plugin_(NULL), pluginTool_(NULL) {
196 std::make_pair(llvm::ISD::SIGN_EXTEND_INREG, MVT::i16));
199 std::make_pair(llvm::ISD::SIGN_EXTEND_INREG, MVT::i8));
202 missingOps_.insert(std::make_pair(llvm::ISD::FSQRT, MVT::f32));
214 dataLayoutStr += target.
is64bit() ?
"e-p:64:64:64" :
"e-p:32:32:32";
216 dataLayoutStr +=
"E-p:32:32:32";
220 dataLayoutStr +=
"-i1:8:64";
221 dataLayoutStr +=
"-i8:8:64";
222 dataLayoutStr +=
"-i16:16:64";
223 dataLayoutStr +=
"-i32:32:64";
224 dataLayoutStr +=
"-i64:64:64";
225 dataLayoutStr +=
"-f16:16:64";
226 dataLayoutStr +=
"-f32:32:64";
228 dataLayoutStr +=
"-i1:8:8";
229 dataLayoutStr +=
"-i8:8:32";
230 dataLayoutStr +=
"-i16:16:32";
231 dataLayoutStr +=
"-i32:32:32";
232 dataLayoutStr +=
"-i64:64:64";
233 dataLayoutStr +=
"-f16:16:16";
234 dataLayoutStr +=
"-f32:32:32";
236 dataLayoutStr +=
"-f64:64:64";
237 dataLayoutStr +=
"-v64:64:64";
238 dataLayoutStr +=
"-v128:128:128";
239 dataLayoutStr +=
"-v256:256:256";
240 dataLayoutStr +=
"-v512:512:512";
241 dataLayoutStr +=
"-v1024:1024:1024";
242#if LLVM_HAS_CUSTOM_VECTOR_EXTENSION == 2
243 dataLayoutStr +=
"-v2048:2048:2048";
244 dataLayoutStr +=
"-v4096:4096:4096";
248 dl->reset(dataLayoutStr.c_str());
279 ->hasOperation(
"hwloop"))
280 #ifdef LLVM_OLDER_THAN_17
281 addPass(createHardwareLoopsPass());
283 addPass(createHardwareLoopsLegacyPass());
296 CodeGenOpt::Level OptLevel = getOptLevel();
315 assert(
options->isMachineFileDefined() &&
"ADF not defined");
329const std::set<std::pair<unsigned, llvm::MVT::SimpleValueType> >*
341const std::set<std::pair<unsigned, llvm::MVT::SimpleValueType> >*
350const std::set<std::pair<unsigned, llvm::MVT::SimpleValueType> >*
357 PassManagerBase &PM) {
362 tpc->setEnableTailMerge(
false);
373 switch (vt.SimpleTy) {
383 default:
assert(
false &&
"Not implemented or supported.");
394 int fpBitWidth =
static_cast<int>(
395 llvm::APFloat::getSizeInBits(fp.getSemantics()));
404 std::pair<int64_t, uint64_t> moveImm{
405 std::numeric_limits<int64_t>::max(),
406 std::numeric_limits<uint64_t>::min() };
409 if (rf->width() != 32)
continue;
412 if (!MCC::busConnectedToRF(*bus, *rf)
413 || bus->immediateWidth() == 0) {
417 if (bus->immediateWidth() >= 32) {
418 moveImm.first = -(1ll << (32-1));
419 moveImm.second = (1ll << 32)-1;
422 std::pair<int64_t, uint64_t> imm =
423 MathTools::bitsToIntegerRange<int64_t, uint64_t>(
424 bus->immediateWidth(),
427 moveImm.first = std::min(moveImm.first, imm.first);
428 moveImm.second = std::max(moveImm.second, imm.second);
435 int supportedWidth = it->supportedWidth(*iu);
436 if (supportedWidth >= 32) {
437 moveImm.first = -(1ll << (32-1));
438 moveImm.second = (1ll << 32)-1;
441 std::pair<int64_t, uint64_t> imm =
442 MathTools::bitsToIntegerRange<int64_t, uint64_t>(
443 supportedWidth, iu->signExtends());
445 moveImm.first = std::min(moveImm.first, imm.first);
446 moveImm.second = std::max(moveImm.second, imm.second);
454 if (!MCC::rfConnected(*rf))
continue;
468 int laneCount = vt.getVectorElementCount().getKnownMinValue();
470 int laneSize = vt.getScalarSizeInBits();
471 int vecSize = laneCount * laneSize;
472 TCEString relaxedName =
"LD"; relaxedName << laneSize <<
"X" << laneCount;
473 TCEString strictName =
"LD"; strictName << vecSize;
474 bool allowStrict = vecSize <= align;
478 for (
int i = 0; i < fuNav.count(); i++) {
479 auto fu = fuNav.
item(i);
480 if (fu->hasOperation(relaxedName) && fu->hasAddressSpace()) {
481 auto as = fu->addressSpace();
482 if (as->hasNumericalId(asid)) {
488 if (fu->hasOperation(strictName) && fu->hasAddressSpace()) {
489 auto as = fu->addressSpace();
490 if (as->hasNumericalId(asid)) {
#define assert(condition)
#define IGNORE_COMPILER_WARNING(X)
#define POP_COMPILER_DIAGS
static llvm::RegisterPass< InnerLoopFinder > X("find-innerloops-test", "Finds inner loops test.", false, true)
Pass * createLinkBitcodePass(Module &input)
Pass * createLowerMissingInstructionsPass(const TTAMachine::Machine &mach)
static MachInfoCmdLineOptions options
Pass * createLinkBitcodePass(Module &inputCode)
Pass * createLowerMissingInstructionsPass(const TTAMachine::Machine &mach)
Pass * createInstructionPatternAnalyzer()
Pass * createProgramPartitionerPass(std::string partitioningStrategy)
void LLVMInitializeTCETarget()
MCInstPrinter * dummyInstrPrinterCtor(const Triple &, unsigned, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
TTAMachine::Machine * readMachine()
static CmdLineOptions * cmdLineOptions()
static std::string toString(const T &source)
void printRegName(raw_ostream &OS, MCRegister Reg) const override
void printInst(const MCInst *, uint64_t, StringRef, const MCSubtargetInfo &, raw_ostream &) override
bool applyTargetSpecificCLOption(StringRef Opt) override
DummyInstPrinter(const llvm::MCAsmInfo &mai, const llvm::MCInstrInfo &mii, const llvm::MCRegisterInfo &mri)
std::pair< const char *, uint64_t > getMnemonic(const MCInst *MI) override
static int registerImmediateLoadWidth(const TTAMachine::RegisterFile &targetRF, bool allowSignExtension=false)
static int maxMemoryAlignment(const TTAMachine::Machine &mach)
ComponentType * item(int index) const
virtual RegisterFileNavigator registerFileNavigator() const
virtual FunctionUnitNavigator functionUnitNavigator() const
virtual InstructionTemplateNavigator instructionTemplateNavigator() const
virtual ImmediateUnitNavigator immediateUnitNavigator() const
virtual BusNavigator busNavigator() const
void setSourceFile(const std::string &fileName)
const TTAMachine::Machine * ttaMach_
TCETargetMachinePlugin * plugin_
virtual void addPreSched2()
virtual bool addInstSelector()
virtual bool addPreISel()
virtual void addPreRegAlloc()
virtual bool hasUREM() const =0
virtual bool hasUDIV() const =0
virtual bool hasSDIV() const =0
virtual bool hasSHR() const =0
virtual bool hasSQRTF() const =0
virtual MVT::SimpleValueType getDefaultType() const =0
virtual void registerTargetMachine(TCETargetMachine &tm)=0
Plugin needs target machine for TragetLowering generation.
virtual const DataLayout * getDataLayout() const
virtual bool hasROTL() const =0
virtual bool hasSHRU() const =0
virtual bool hasSHL() const =0
virtual FunctionPass * createISelPass(TCETargetMachine *tm)=0
virtual bool hasSREM() const =0
virtual bool hasSXHW() const =0
virtual bool isLittleEndian() const =0
virtual bool hasROTR() const =0
virtual int getLoadOpcode(const llvm::EVT &vt) const =0
virtual bool hasSXQW() const =0
virtual bool hasMUL() const =0
const std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > * customLegalizedOperations()
const std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > * missingOperations()
virtual void setTTAMach(const TTAMachine::Machine *mach) override
TCETargetMachine(const Target &T, const Triple &TTriple, const llvm::StringRef &CPU, const llvm::StringRef &FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOpt::Level OL, bool isLittle)
virtual TargetPassConfig * createPassConfig(PassManagerBase &PM) override
TTAMachine::Machine * createMachine()
bool canEncodeAsMOVI(const llvm::MVT &vt, int64_t val) const
int getLoadOpcode(int asid, int align, const llvm::EVT &vt) const
virtual ~TCETargetMachine()
std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > promotedOps_
void calculateSupportedImmediates()
bool canEncodeAsMOVF(const llvm::APFloat &fp) const
virtual void setTargetMachinePlugin(TCETargetMachinePlugin &plugin, TTAMachine::Machine &target)
PluginTools * pluginTool_
std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > customLegalizedOps_
TCETargetMachinePlugin * plugin_
std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > missingOps_
llvm::ISD opcode list of operations that have to be expanded.
const std::set< std::pair< unsigned, llvm::MVT::SimpleValueType > > * promotedOperations()