159 std::ostream& o,
const TCEString& origPat,
162 std::ostream& o,
Operation& op,
bool skipPattern,
163 std::vector<TDGenerator::ValueType> inputs,
164 std::vector<TDGenerator::ValueType> outputs,
170 const std::string regName,
171 const std::string regTemplate,
172 const std::string aliases,
193 std::ostream& o,
Operation& op,
bool skipPattern);
196 const TCEString& attributes,
bool skipPattern);
200 std::ostream& o,
Operation& op,
bool skipPattern);
202 std::ostream& o,
Operation& op,
bool skipPattern);
218 std::ostream& o)
const;
224 std::ostream& o)
const;
233 std::ostream& o)
const;
235 std::ostream& o)
const;
240 std::ostream& o)
const;
262 std::ostream& o,
Operation& op,
const std::string& operandTypes,
263 const std::string& attrs,
bool skipPattern,
264 std::string backendPrefix =
"");
268 const std::string& operandTypes);
284 const Operation& op,
char operandType =
' ')
const;
291 std::set<std::string>* recursionCycleCheck = NULL,
292 bool recursionHasStore =
false);
295 std::set<std::string>* recursionCycleCheck = NULL,
296 bool recursionHasStore =
false);
312 const std::string& immDefName =
"");
317 const std::string& operandTypes);
323 const std::string& operandTypes,
329 const std::string& operandTypes,
const Operation* emulatingOp =
nullptr,
334 const std::string& operandTypes);
346 bool writePredicatedVersions);
363 std::ostream& o,
Operation& op,
const std::string& operandTypes,
364 const std::string& attrs,
bool skipPattern,
365 std::string backendPrefix =
"");
370 std::ostream& o,
Operation& op,
int bitsize,
int vectorLen);
380 bool addrImm,
const TCEString& resultType,
381 const TCEString& loadPatternName,
bool writePredicatedVersions);
384 std::ostream& o,
const std::string& defName,
385 const std::string& operandType,
const std::string& predicate);
387 std::ostream& o,
const std::string& instrDefName,
388 const std::string& outs,
const std::string& ins,
389 const std::string& asmString,
const std::string& pattern);
398 int64_t lowerBoundInclusive,
399 uint64_t upperBoundInclusive);
405 const std::string& operandTypes)
const;
431 std::ostream& os,
const TCEString& nodeName,
453 const Operation& op,
const std::string& operandTypes,
454 const std::string& operand0,
const std::string& operand1)
const;
460 const char& opdType,
const std::string& inputPattern)
const;
532 std::map<int, std::vector<TDGenerator::RegisterInfo> >
registers_;
560 std::map<std::pair<TCEString, std::vector<int>>,
TCEString>
603 std::map<std::string, RegInfo>
regs_;
643 typedef std::map<std::string, std::vector<std::string> >
RegClassMap;
662 unsigned regIndex,
unsigned regWidth)
716 int width,
bool onlyInts =
false);
TCETools::CIStringSet OperationSet
void write32bitRegisterInfo(std::ostream &o)
void write64bitMoveDefs(std::ostream &o)
static const char OT_VREG_INT32
std::map< TCEString, TDGenerator::InstructionInfo > immediateLoads_
All immediate load operations (<ValueType, InstrInfo>).
static const char OT_REG_LONG
virtual TCEString llvmOperationName(const TCEString &opName) const
void writeInstrFormats(std::ostream &o)
std::map< TCEString, TCEString > shlOperations_
Contains machine's shl instructions (<ValueType, InstrName>).
void writeVectorStoreDefs(std::ostream &o, const TCEString &opName, const TCEString &opNameSuffix, bool addrImm, const TCEString &dataType, bool writePredicatedVersions)
void writeVectorLoadStoreOperationExploitations(std::ostream &o)
static const int MAX_SUBW_COUNT
Maximum number of subwords that any SIMD operation can have.
std::map< TCEString, TCEString > shrSameOperations_
Contains machine's SHRSAME instructions (<ValueType, InstrName>).
void genTCETargetLoweringSIMD_addVectorRegisterClasses(std::ostream &o) const
std::vector< std::string > argRegNames_
std::string subPattern(const Operation &op, const OperationDAG &dag)
static std::vector< std::string > supportedStackAccessOperations(const TTAMachine::Machine &mach)
std::map< TCEString, TCEString > packOperations_
Contains machine's PACK instructions (<ValueType, InstrName>).
std::string operationNodeToString(const Operation &op, const OperationDAG &dag, const OperationNode &node, bool emulationPattern, const std::string &operandTypes)
void writeVectorBitwiseOperationDefs(std::ostream &o, Operation &op, bool skipPattern)
std::vector< std::pair< const Operation *, TCEString > > truncOperations_
Contains machine's TRUNCxx/CFH instructions (<ValueType, InstrName>).
void writeVectorOperationDef(std::ostream &o, Operation &op, TCEString valueTypes, const TCEString &attributes, bool skipPattern)
virtual void createSelectPatterns(std::ostream &os)
std::string immediateOperandNameForEmulatedOperation(const OperationDAG &, const Operand &operand)
bool writePortGuardedJumpDefPair(std::ostream &os, const TCEString &tceop1, const TCEString &tceop2, bool fp=false)
void writeVectorRegisterNames(std::ostream &o)
std::map< std::string, std::vector< std::string > > RegClassMap
std::map< TCEString, Operation * > scalarOps_
Contains all scalar operations (<Name, Operation>).
virtual std::string generateBackend() const
bool canBeImmediate(const OperationDAG &dag, const TerminalNode &node)
std::string dagNodeToString(const Operation &op, const OperationDAG &dag, const OperationDAGNode &node, bool emulationPattern, const std::string &operandTypes, const Operation *emulatingOp=nullptr, const OperationDAGNode *successor=nullptr)
void associateRegistersWithVectorRegisterClasses()
bool hasConditionalMoves_
bool isVectorStoreOperation(const Operation &op) const
void writeVectorLoadDefs(std::ostream &o, const TCEString &opName, const TCEString &opNameSuffix, bool addrImm, const TCEString &resultType, const TCEString &loadPatternName, bool writePredicatedVersions)
void genGeneratedTCEPlugin_getVectorImmediateOpcode(std::ostream &o) const
const std::vector< OperationDAG * > getMatchableOperationDAGs(const Operation &op)
bool isWrongEndianessVectorOp(const Operation &op) const
void writeGuardRegisterClassInfo(std::ostream &o)
void writeHWLoopDef(std::ostream &o)
OperationDAG * createTrivialDAG(Operation &op)
static const char OT_VREG_INT16
static const char OT_REG_BOOL
std::map< TCEString, TCEString > xorSameOperations_
Contains machine's XORSAME instructions (<ValueType, InstrName>).
void genGeneratedTCEPlugin_getStore(std::ostream &o) const
void genGeneratedTCEPlugin_getShlOpcode(std::ostream &o) const
std::vector< RegInfo > regs32bit_
void writeAddressingModeDefs(std::ostream &o)
void genTCETargetLoweringSIMD_associatedVectorRegClass(std::ostream &o) const
std::vector< std::string > constantMaterializationPredicates_
All predicates used in constant materialization patterns.
void writeArgRegsArray(std::ostream &os)
std::string argRegsArray_
std::string createDefaultOperandTypeString(const Operation &op)
void writeOperationDef(std::ostream &o, Operation &op, const std::string &operandTypes, const std::string &attrs, bool skipPattern, std::string backendPrefix="")
static const int MAX_SCALAR_WIDTH
Distincts wide vs scalar registers.
void verbose(const TCEString &msg) const
std::map< ImmInfoKey, std::string > immOperandDefs_
Maps (operation, operand) pairs to i32 immediate operand definition names.
const TTAMachine::Machine & mach_
void writeBooleanStorePatterns(std::ostream &os)
std::map< TCEString, TCEString > vselectOperations_
Contains machine's VSELECT instructions (<instrName, ValueType>).
void writeControlFlowInstrDefs(std::ostream &os)
std::string addressingModeDefs_
static const bool EXPLOIT_BIGGER_REGISTERS
If set to true, smaller vector value types can be stored to larger register files,...
std::string operandTypesToRegisters(const std::string &opdTypes) const
static const char OT_IMM_LONG
virtual TCEString llvmOperationPattern(const Operation &op, char operandType=' ') const
std::map< TCEString, TCEString > iorOperations_
Contains machine's shl instructions (<ValueType, InstrName>).
virtual void writeCallDefRegs(std::ostream &o)
std::map< std::string, std::string > falsePredOps_
std::map< TCEString, TCEString > vbcastOperations_
Contains machine's VBCAST instructions (<ValueType, InstrName>).
std::set< TCEString > movOperations_
Contains all moves between register classes (<InstrName>).
std::map< TCEString, TDGenerator::RegisterClass > vRegClasses_
Contains required vector register classes (<ValueType, RegClass>).
virtual void writeImmediateDef(std::ostream &o, const std::string &defName, const std::string &operandType, const std::string &predicate)
std::map< TCEString, TCEString > shruSameOperations_
Contains machine's SHRUSAME instructions (<ValueType, InstrName>).
bool operationDAGCanBeMatched(const OperationDAG &op, std::set< std::string > *recursionCycleCheck=NULL, bool recursionHasStore=false)
RegClassMap regsInClasses_
All registers in certain group.
static const char OT_VREG_FP
bool hasRawOperands(const Operation &op) const
std::vector< RegInfo > regs64bit_
void writeBroadcastDefs(std::ostream &o, Operation &op, int vectorLen)
bool canBePredicated(Operation &op, const std::string &operandTypes)
std::vector< std::string > llvmGuardRegs_
The LLVM register defs used as guards.
std::map< std::string, std::string > truePredOps_
void writeIntegerImmediateDefs(std::ostream &o, const ImmInfo &iivis)
void createMinMaxDef(const TCEString &opName, const TCEString &valueName, std::ostream &os)
void createConstantMaterializationQuery(std::ostream &os)
bool isVectorLoadOperation(const Operation &op) const
static const char OT_REG_FP
std::string patOutputs(const Operation &op, const std::string &oprTypes)
unsigned int requiredI64Regs_
void writeScalarToVectorDefs(std::ostream &o) const
void writeRegisterDef(std::ostream &o, const RegInfo ®, const std::string regName, const std::string regTemplate, const std::string aliases, RegType type)
virtual char operandChar(Operand &operand)
void write8bitRegisterInfo(std::ostream &o)
void analyzeMachineRegisters()
bool isVectorBitwiseOperation(const Operation &op) const
static const int BOOL_SUBW_WIDTH
Bool type subword width.
static const char OT_VREG_BOOL
void genGeneratedTCEPlugin_isVectorRegisterMove(std::ostream &o) const
void genGeneratedTCEPlugin_getVectorShlSameOpcode(std::ostream &o) const
void generateLoadStoreCopyGenerator(std::ostream &os)
TCEString associatedVectorRegisterClass(const Operand &operand) const
void writeCallingConvLicenceText(std::ostream &os)
void writeWiderVectorOperationExploitations(std::ostream &o)
std::map< TCEString, TCEString > iorSameOperations_
Contains machine's IORSAME instructions (<ValueType, InstrName>).
void writeInstrDef(std::ostream &o, const std::string &instrDefName, const std::string &outs, const std::string &ins, const std::string &asmString, const std::string &pattern)
std::set< const TTAMachine::RegisterFile *, TTAMachine::MachinePart::Comparator > tempRegFiles_
Register files whose last reg reserved for temp reg copies.
virtual void createMinMaxGenerator(std::ostream &os)
TCEString getLLVMPatternWithConstants(const Operation &op, const std::string &operandTypes, const std::string &operand0, const std::string &operand1) const
std::string tceOperationPattern(const Operation &op)
static const char OT_IMM_INT
std::map< int, TCEString > baseClasses_
Contains vector base classes for register files (<Width, Name>).
void writeConstShiftPat(std::ostream &os, const TCEString &nodeName, const TCEString &opNameBase, int i)
void writeVectorStoreDefs(std::ostream &o, Operation &op, int vectorLen)
static const char OT_VREG_HFP
int subwordWidthOfRawData(const Operation &op) const
std::string constantNodeString(const Operation &op, const OperationDAG &dag, const ConstantNode &node, const std::string &operandTypes, const OperationDAGNode *successor=nullptr)
static const int FP_SUBW_WIDTH
Float type subword width.
std::map< TCEString, TCEString > vshuffle1Operations_
Contains machine's VSHUFFLE1 instructions (<ValueType, InstrName>).
static const char OT_REG_HFP
void writeOperandDefs(std::ostream &o)
void writePatternReplacement(std::ostream &o, const TCEString &origPat, const TCEString &replacerPat) const
static const char OT_IMM_FP
void genGeneratedTCEPlugin_getVectorAndSameOpcode(std::ostream &o) const
std::map< TCEString, TCEString > andSameOperations_
Contains machine's ANDSAME instructions (<ValueType, InstrName>).
void genGeneratedTCEPlugin_getVectorShuffle2Opcode(std::ostream &o) const
std::map< TCEString, TCEString > extractElemOperations_
Contains machine's EXTRACTELEM instructions (<ValueType, InstrName>).
void writeCallDef(std::ostream &o)
void writeCallSeqStart(std::ostream &os)
void writeTopLevelTD(std::ostream &o)
std::map< int, std::vector< TDGenerator::RegisterInfo > > registers_
Contains registers fit for being vector registers (<Width, Registers>).
unsigned int argRegCount_
std::map< TCEString, Operation * > vectorOps_
Contains all vector operations (<Name, Operation>).
std::map< TCEString, TCEString > shlSameOperations_
Contains machine's SHLSAME instructions (<ValueType, InstrName>).
void genGeneratedTCEPlugin_getGatherOpcode(std::ostream &o) const
void createByteExtLoadPatterns(std::ostream &os)
void writeVectorAnyextPattern(std::ostream &o, Operation &op, const TCEString &loadPatternName, int vectorLen)
void writeVectorImmediateWriteDefs(std::ostream &instrInfoTD)
void writeVectorMemoryOperationDefs(std::ostream &o, Operation &op, bool skipPattern)
void initializeBackendContents()
std::map< TCEString, TCEString > gatherOperations_
Contains machine's GATHER instructions (<ValueType, InstrName>).
void writeRARegisterInfo(std::ostream &o)
void writeRegisterClasses(std::ostream &o)
bool operationCanBeMatched(const Operation &op, std::set< std::string > *recursionCycleCheck=NULL, bool recursionHasStore=false)
void genGeneratedTCEPlugin_getLoadOpcode(std::ostream &o) const
bool prebypassStackIndeces_
void writeCallingConv(std::ostream &os)
std::set< RegInfo > guardedRegs_
List of register that are associated with a guard on a bus.
void writeVectorLoadDefs(std::ostream &o, Operation &op, const TCEString &loadPatternName, int vectorLen)
void saveAdditionalVectorOperationInfo(const Operation &op, const TCEString &valueTypes, bool isRegisterOp)
virtual std::string operandToString(const Operand &operand, bool match, char operandType, const std::string &immDefName="")
std::map< std::string, std::string > opNames_
char operandTypeToRegister(const char &opdType) const
virtual void createVectorRVDRegNums(std::ostream &os)
std::map< std::string, RegInfo > regs_
Map of generated llvm register names to physical register in the machine.
static const char OT_IMM_BOOL
void writeVectorTruncStoreDefs(std::ostream &o, Operation &op, int bitsize, int vectorLen)
static const std::map< TCEString, TCEString > OPERATION_PATTERNS_
Contains <BaseOpName, OpPattern> key-value pairs.
void genGeneratedTCEPlugin_getExtractElemOpcode(std::ostream &o) const
void createEndiannesQuery(std::ostream &os)
void genTCEInstrInfoSIMD_copyPhysVectorReg(std::ostream &o) const
unsigned int requiredI32Regs_
Minimum number of 32 bit registers.
virtual void createConstantMaterializationPatterns(std::ostream &os)
std::vector< RegInfo > regs8bit_
std::string emulatingOpNodeLLVMName(const Operation &op, const OperationDAG &dag, const OperationNode &node, const std::string &operandTypes)
void writeVectorOperationDefs(std::ostream &o, Operation &op, bool skipPattern)
void writeBackendCode(std::ostream &o)
void writeVectorTruncStoreDefs(std::ostream &o) const
void genGeneratedTCEPlugin_getVectorShuffle1Opcode(std::ostream &o) const
std::string operationPattern(const Operation &op, const OperationDAG &dag, const std::string &operandTypes)
bool areImmediateOperandsLegal(const Operation &operation, const std::string &operandTypes) const
void genGeneratedTCEPlugin_getVectorShrSameOpcode(std::ostream &o) const
std::map< TCEString, TDGenerator::InstructionInfo > immediateStores_
All immediate store operations (<ValueType, InstrInfo>).
std::string instrFormats_
void writeVectorRegisterMoveDefs(std::ostream &o)
void write1bitRegisterInfo(std::ostream &o)
void createShortExtLoadPatterns(std::ostream &os)
std::map< std::pair< TCEString, std::vector< int > >, TCEString > vcshuffleOperations_
Contains machine's VCSHUFFLE instructions (<<ValueType, ConstantSelects>, InstrName>).
void orderEqualWidthRegistersToRoundRobin()
RegClassMap regsInRFClasses_
std::map< TCEString, TDGenerator::InstructionInfo > registerStores_
All register store operations (<ValueType, InstrInfo>).
void writeVectorBitConversions(std::ostream &o) const
void writeInstrInfo(std::ostream &o)
void createParamDRegNums(std::ostream &os)
void writeOperationDefs(std::ostream &o, Operation &op, bool skipPattern)
bool checkRequiredRegisters()
void genGeneratedTCEPlugin_getVectorSelectOpcode(std::ostream &o) const
void writeVectorRegisterClasses(std::ostream &o) const
void genGeneratedTCEPlugin_getVectorIorSameOpcode(std::ostream &o) const
void writeCondBranchDefs(std::ostream &os)
void writeScalarOperationExploitations(std::ostream &o)
std::map< TCEString, TCEString > addOperations_
Contains machine's add instructions (<ValueType, InstrName>).
void genGeneratedTCEPlugin_getLoad(std::ostream &o) const
void genGeneratedTCEPlugin_getIorOpcode(std::ostream &o) const
std::vector< RegInfo > regs16bit_
void writeMiscPatterns(std::ostream &o)
void analyzeRegisters(RegsToProcess regsToProcess)
void gatherAllMachineOperations()
std::string registerInfo_
TCEString getMovePattern(const char &opdType, const std::string &inputPattern) const
void write16bitRegisterInfo(std::ostream &o)
void genGeneratedTCEPlugin_getVectorShruSameOpcode(std::ostream &o) const
static const char OT_REG_DOUBLE
void createBoolAndHalfLoadPatterns(std::ostream &os)
void genTCERegisterInfo_setReservedVectorRegs(std::ostream &os) const
void create32BitExtLoadPatterns(std::ostream &os)
void analyzeRegisterFileClasses()
const OperationDAG * getMatchableOperationDAG(const Operation &op)
void write64bitRegisterInfo(std::ostream &o)
std::map< TCEString, TCEString > vshuffle2Operations_
Contains machine's VSHUFFLE2 instructions (<ValueType, InstrName>).
std::map< TCEString, TDGenerator::InstructionInfo > registerLoads_
All register load operations (<ValueType, InstrInfo>).
OperationDAGSelector::OperationSet allOpNames_
Contains all operation names in upper case.
void genGeneratedTCEPlugin_getVectorBroadcastOpcode(std::ostream &o) const
bool writeRegisterInfo(std::ostream &o)
std::vector< std::string > gprRegNames_
void analyzeMachineVectorRegisterClasses()
void writeVectorRegisterBaseClasses(std::ostream &o) const
bool hasRegisterClassSupport(const Operation &op) const
void writeStartOfRegisterInfo(std::ostream &o)
void writeGetPointerAdjustmentQuery(std::ostream &os) const
void writeEmulationPattern(std::ostream &o, const Operation &op, const OperationDAG &dag)
static const int HFP_SUBW_WIDTH
Half float type subword width.
static const char OT_VREG_INT8
void createGetMaxMemoryAlignment(std::ostream &os) const
void createBranchAnalysis(std::ostream &os)
void createVectorMinMaxDef(const TCEString &opName, int bits, char llvmTypeChar, const TCEString &postFix, std::ostream &os)
static const std::string guardRegTemplateName
static const char OT_IMM_HFP
std::string immediatePredicate(int64_t lowerBoundInclusive, uint64_t upperBoundInclusive)
void genGeneratedTCEPlugin_getConstantVectorShuffleOpcode(std::ostream &o) const
void createConstShiftPatterns(std::ostream &os)
static const char OT_REG_INT
void genTCEInstrInfo_copyPhys64bitReg(std::ostream &o) const
void writeMoveImmediateDefs(std::ostream &o)
std::vector< RegInfo > regs1bit_
void genGeneratedTCEPlugin_getVectorValueType(std::ostream &o) const
void genGeneratedTCEPlugin_getAddOpcode(std::ostream &o) const
std::string patInputs(const Operation &op, const std::string &oprTypes)
void genGeneratedTCEPlugin_getVectorPackOpcode(std::ostream &o) const
void genTCETargetLoweringSIMD_getSetCCResultVT(std::ostream &o) const
void genGeneratedTCEPlugin_getVectorXorSameOpcode(std::ostream &o) const
void writeOperationDefUsingGivenOperandTypes(std::ostream &o, Operation &op, bool skipPattern, std::vector< TDGenerator::ValueType > inputs, std::vector< TDGenerator::ValueType > outputs, TCEString instrSuffix="")
std::vector< std::string > resRegNames_
int alignment_
RegisterClass alignment in bits, at least 8.
std::vector< RegisterInfo > registers_
Register file registers that this RegisterClass uses.
ValueType valueType() const
RegisterClass & operator=(const RegisterClass &other)
std::vector< RegisterInfo > registers() const
RegisterInfo registerInfo(int index) const
ValueType vt_
Value type that is supported by this RegisterClass, e.g. v4i32.
size_t numberOfRegisters() const
void addRegisters(const std::vector< RegisterInfo > ®isters)
TCEString name_
RegisterClass name.
static std::vector< ValueType > vectorTypesOfWidth(int width, bool onlyInts=false)
ValueType & operator=(const ValueType &other)
int subwCount_
Subword count of the value type.
bool isFloat_
If true, the value type is a floating point type.
bool isSupportedByLLVM() const
static const std::set< TCEString > SUPPORTED_LLVM_VALUE_TYPES
Contains all supported LLVM value types (<ValueType>).
static std::vector< ValueType > vectorTypesOfSubwordWidth(int subwordWidth, bool onlyInt=false)
TCEString valueTypeStr() const
Operand::OperandType operandType() const
static ValueType valueType(const TCEString &vtStr)
int subwWidth_
Subword width of the value type.
bool operator<(const RegInfo &other) const
TCEString osalOpName_
The OSAL operation used to create the record, e.g. "ADD32X4".
TCEString instrName_
The instruction record name, e.g. "ADD32X4uuu".
InstructionInfo(const TCEString &osalOpName, const TCEString &instrName)
RegisterInfo(const TCEString ®Name, const TCEString ®FileName, unsigned regIndex, unsigned regWidth)
TCEString regFileName_
Name of the register file the register belongs to, e.g. "RF".
TCEString regName_
Register name in GenRegisterInfo.td, e.g. "KLUDGE_REGISTER".
unsigned regIndex_
Register index in the register file.
unsigned regWidth_
Register width in bits.