"git@repo.hca.bsc.es:lalbano/llvm-bpevl.git" did not exist on "0a2e11260e6b347bcd90b0c4b192482fe1c2aa6e"
Newer
Older
//===- Target.td - Target Independent TableGen interface --------*- C++ -*-===//
//
// This file defines the target-independent interfaces which should be
// implemented by each target which is using a TableGen based code generator.
//
//===----------------------------------------------------------------------===//
Chris Lattner
committed
//===----------------------------------------------------------------------===//
//
// Value types - These values correspond to the register types defined in the
// ValueTypes.h file.
class ValueType<int size> { string Namespace = "MVT"; int Size = size; }
Chris Lattner
committed
def i1 : ValueType<1>; // One bit boolean value
def i8 : ValueType<8>; // 8-bit integer value
def i16 : ValueType<16>; // 16-bit integer value
def i32 : ValueType<32>; // 32-bit integer value
def i64 : ValueType<64>; // 64-bit integer value
def f32 : ValueType<32>; // 32-bit floating point value
def f64 : ValueType<64>; // 64-bit floating point value
def f80 : ValueType<80>; // 80-bit floating point value
Chris Lattner
committed
//===----------------------------------------------------------------------===//
// Register file description - These classes are used to fill in the target
// description classes in llvm/Target/MRegisterInfo.h
// Register - You should define one instance of this class for each register in
// the target machine.
//
class Register {
string Namespace = "";
string Name = "";
}
// NamedReg - If the name for the 'def' of the register should not become the
// "name" of the register, you can use this to specify a custom name instead.
//
class NamedReg<string n> : Register {
Chris Lattner
committed
// RegisterAliases - You should define instances of this class to indicate which
// registers in the register file are aliased together. This allows the code
// generator to be careful not to put two values with overlapping live ranges
// into registers which alias.
//
class RegisterAliases<Register reg, list<Register> aliases> {
Register Reg = reg;
list<Register> Aliases = aliases;
}
// RegisterClass - Now that all of the registers are defined, and aliases
// between registers are defined, specify which registers belong to which
// register classes. This also defines the default allocation order of
// registers by register allocators.
//
class RegisterClass<ValueType regType, int alignment, list<Register> regList> {
// RegType - Specify the ValueType of the registers in this register class.
// Note that all registers in a register class must have the same ValueType.
//
Chris Lattner
committed
ValueType RegType = regType;
// Alignment - Specify the alignment required of the registers when they are
// stored or loaded to memory.
//
Chris Lattner
committed
int Alignment = alignment;
// MemberList - Specify which registers are in this class. If the
// allocation_order_* method are not specified, this also defines the order of
// allocation used by the register allocator.
//
Chris Lattner
committed
list<Register> MemberList = regList;
// Methods - This member can be used to insert arbitrary code into a generated
// register class. The normal usage of this is to overload virtual methods.
code Methods = [{}];
Chris Lattner
committed
}
//===----------------------------------------------------------------------===//
Chris Lattner
committed
// Instruction set description - These classes correspond to the C++ classes in
// the Target/TargetInstrInfo.h file.
Chris Lattner
committed
//
class Instruction {
string Name; // The opcode string for this instruction
string Namespace = "";
list<Register> Uses = []; // Default to using no non-operand registers
list<Register> Defs = []; // Default to modifying no non-operand registers
// These bits capture information about the high-level semantics of the
// instruction.
bit isReturn = 0; // Is this instruction a return instruction?
bit isBranch = 0; // Is this instruction a branch instruction?
bit isCall = 0; // Is this instruction a call instruction?
bit isTwoAddress = 0; // Is this a two address instruction?
bit isTerminator = 0; // Is this part of the terminator for a basic block?
// Pattern - Set to the DAG pattern for this instruction, if we know of one,
// otherwise, uninitialized.
dag Pattern;
Chris Lattner
committed
}
class Expander<dag pattern, list<dag> result> {
dag Pattern = pattern;
list<dag> Result = result;
}
Chris Lattner
committed
// InstrInfo - This class should only be instantiated once to provide parameters
// which are global to the the target machine.
//
class InstrInfo {
Instruction PHIInst;
Chris Lattner
committed
// If the target wants to associate some target-specific information with each
// instruction, it should provide these two lists to indicate how to assemble
// the target specific information into the 32 bits available.
//
list<string> TSFlagsFields = [];
list<int> TSFlagsShifts = [];
Chris Lattner
committed
}
//===----------------------------------------------------------------------===//
// Target - This class contains the "global" target information
//
class Target {
// CalleeSavedRegisters - As you might guess, this is a list of the callee
// saved registers for a target.
list<Register> CalleeSavedRegisters = [];
// PointerType - Specify the value type to be used to represent pointers in
// this target. Typically this is an i32 or i64 type.
ValueType PointerType;
// InstructionSet - Instruction set description for this target
InstrInfo InstructionSet;
//===----------------------------------------------------------------------===//
// DAG node definitions used by the instruction selector...
//
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
class DagNodeResultType;
def DNRT_void : DagNodeResultType; // Tree node always returns void
def DNRT_val : DagNodeResultType; // A non-void type
def DNRT_arg0 : DagNodeResultType; // Tree node returns same type as Arg0
class DagNodeArgType;
def DNAT_val : DagNodeArgType; // Any value
def DNAT_arg0 : DagNodeArgType; // Same as for arg #0
def DNAT_ptr : DagNodeArgType; // Returns the target pointer type
class DagNode<DagNodeResultType ret, list<DagNodeArgType> args> {
DagNodeResultType RetType = ret;
list<DagNodeArgType> ArgTypes = args;
string EnumName = ?;
}
// BuiltinDagNodes are built into the instruction selector and correspond to
// enum values.
class BuiltinDagNode<DagNodeResultType Ret, list<DagNodeArgType> Args,
string Ename> : DagNode<Ret, Args> {
let EnumName = Ename;
}
// Magic nodes...
def set : DagNode<DNRT_void, [DNAT_val, DNAT_arg0]>;
// Terminals...
def imm : DagNode<DNRT_val, []>;
// Arithmetic...
def plus : BuiltinDagNode<DNRT_arg0, [DNAT_val, DNAT_arg0], "Plus">;
def minus : BuiltinDagNode<DNRT_arg0, [DNAT_val, DNAT_arg0], "Minus">;
//def mult : DagNode<2, DNRT_arg0>;
//def div : DagNode<2, DNRT_arg0>;
//def udiv : DagNode<2, DNRT_arg0>;
//def mod : DagNode<2, DNRT_arg0>;
//def umod : DagNode<2, DNRT_arg0>;
//def load : DagNode<1, DNRT_val>;
//def store : DagNode<2, DNRT_Void>;
// Other...
def ret : BuiltinDagNode<DNRT_void, [DNAT_val], "Ret">;
def retvoid : BuiltinDagNode<DNRT_void, [], "RetVoid">;