31#include <llvm/CodeGen/MachineFunction.h>
32#include "tce_config.h"
33#include <llvm/IR/Function.h>
34#include <llvm/Support/CommandLine.h>
35#include <llvm/Analysis/AliasAnalysis.h>
47#include "tce_config.h"
59 : MachineFunctionPass(ID) {
60 auto* option =
static_cast<llvm::cl::opt<std::string>*
>(
61 llvm::cl::getRegisteredOptions().lookup(
"adf"));
62 const std::string adf = option->getValue();
67 <<
"TCE: unable to load the ADF:" << std::endl
69 <<
"Make sure you give the"
70 <<
" correct adf with the -adf switch to llc";
91 std::string msg =
"BEM does not identify R format ";
100 std::string regs =
"";
103 std::string ss =
static_cast<std::string
>(i);
109 if (foundRegs != 3) {
111 "Invalid amount of register operands, 3 required, found " +
112 std::to_string(foundRegs);
120 const std::string& s)
const {
122 std::string opName =
"";
124 std::string ss =
static_cast<std::string
>(i);
131 std::string msg =
"Machine does not have operation: " + ss;
137 const std::string msg =
138 "Warning: Failed to find operation name from: \"" + s +
"\"";
139 std::cerr << msg << std::endl;
148 const MachineBasicBlock::iterator& it)
const {
149 const unsigned OpIdx = 0;
150 std::vector<int> regIdxs;
151 const std::string asmString =
152 std::string(it->getOperand(OpIdx).getSymbolName());
153 for (
unsigned o = 0; o < it->getNumOperands(); o++) {
154 const MachineOperand& mo = it->getOperand(o);
157#ifdef LLVM_OLDER_THAN_17
158 const int magicNumber = 40;
160 const int magicNumber = 41;
162 int idx = mo.getReg() - magicNumber;
163 regIdxs.push_back(idx);
164 if (idx < 0 && idx > 31) {
166 "Invalid register index: " + std::to_string(idx) +
167 " in instruction: " + asmString;
172 if (regIdxs.size() != 3) {
173 std::string msg =
"3 reg operands required, found " +
174 std::to_string(regIdxs.size()) +
175 " in instruction: " + asmString;
183 const std::string& opName,
const std::vector<int>& regIdxs)
const {
184 const int fu3Mask = 0b1110000000;
185 const int fu7Mask = 0b11111110000000000;
186 const int opcodeMask = 0b1111111;
188 const int fu3Enc = ((encoding & fu3Mask) >> 7);
189 const int fu7Enc = ((encoding & fu7Mask) >> 10);
190 const int opcodeEnc = encoding & opcodeMask;
191 const int shiftedEnc = (fu7Enc << 25) + (fu3Enc << 12) + opcodeEnc;
193 encoding = shiftedEnc + (regIdxs.at(0) << 7) + (regIdxs.at(1) << 15) +
194 (regIdxs.at(2) << 20);
201 for (MachineFunction::iterator i = MF.begin(); i != MF.end(); i++) {
202 for (MachineBasicBlock::iterator j = i->begin(); j != i->end(); j++) {
203 if (j->isInlineAsm()) {
204 const unsigned OpIdx = 0;
205 std::string asmString =
206 std::string(j->getOperand(OpIdx).getSymbolName());
211 const std::string regs =
findRegs(asmString);
215 std::string* cName =
new std::string(
216 ".long " + std::to_string(encoding) +
"; #" + opName +
218 j->getOperand(OpIdx).ChangeToES(
219 cName->c_str(), j->getOperand(OpIdx).getTargetFlags());
#define IGNORE_COMPILER_WARNING(X)
#define POP_COMPILER_DIAGS
static std::ostream & logStream()
BinaryEncoding * generate()
int instructionFormatCount() const
InstructionFormat & instructionFormat(int index) const
std::string errorMessage() const
static Machine * loadFromADF(const std::string &adfFileName)
virtual bool doInitialization(Module &m)
InstructionFormat * findRFormat()
std::string findRegs(const std::string &s) const
TTAMachine::Machine * mach_
std::string findOperationName(const std::string &s) const
std::vector< int > findRegIndexes(const MachineBasicBlock::iterator &it) const
InstructionFormat * rFormat_
int constructEncoding(const std::string &opName, const std::vector< int > ®Idxs) const
virtual bool runOnMachineFunction(MachineFunction &MF)
LLVMTCERISCVIntrinsicsLowering()
const std::string RISCV_R_TYPE_NAME
FunctionPass * createRISCVIntrinsicsPass(const char *)