blob: 7ee39e366b68a13f3389a27f63e57c516b7d974b [file] [log] [blame]
Chris Lattner8418e362003-07-29 23:07:13 +00001//===- Target.td - Target Independent TableGen interface --------*- C++ -*-===//
2//
3// This file defines the target-independent interfaces which should be
4// implemented by each target which is using a TableGen based code generator.
5//
Misha Brukmanbb053ce2003-05-29 18:48:17 +00006//===----------------------------------------------------------------------===//
7
Chris Lattnere45b6992003-07-30 05:50:12 +00008
9//===----------------------------------------------------------------------===//
10//
Chris Lattner845ed842003-07-28 04:24:59 +000011// Value types - These values correspond to the register types defined in the
Chris Lattnereaa5b962003-08-07 13:52:22 +000012// ValueTypes.h file. If you update anything here, you must update it there as
13// well!
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000014//
Chris Lattnereaa5b962003-08-07 13:52:22 +000015class ValueType<int size, int value> {
16 string Namespace = "MVT";
17 int Size = size;
18 int Value = value;
19}
Chris Lattnere45b6992003-07-30 05:50:12 +000020
Chris Lattnereaa5b962003-08-07 13:52:22 +000021def i1 : ValueType<1 , 1>; // One bit boolean value
22def i8 : ValueType<8 , 2>; // 8-bit integer value
23def i16 : ValueType<16 , 3>; // 16-bit integer value
24def i32 : ValueType<32 , 4>; // 32-bit integer value
25def i64 : ValueType<64 , 5>; // 64-bit integer value
26def i128 : ValueType<128, 5>; // 128-bit integer value
27def f32 : ValueType<32 , 7>; // 32-bit floating point value
28def f64 : ValueType<64 , 8>; // 64-bit floating point value
29def f80 : ValueType<80 , 9>; // 80-bit floating point value
30def f128 : ValueType<128, 9>; // 128-bit floating point value
31def isVoid : ValueType<0 , 11>; // Produces no value
Chris Lattnere45b6992003-07-30 05:50:12 +000032
33//===----------------------------------------------------------------------===//
34// Register file description - These classes are used to fill in the target
35// description classes in llvm/Target/MRegisterInfo.h
36
37
38// Register - You should define one instance of this class for each register in
39// the target machine.
40//
Misha Brukmanbb053ce2003-05-29 18:48:17 +000041class Register {
42 string Namespace = "";
Chris Lattner9c66ed82003-08-03 22:12:37 +000043 string Name = "";
44}
45
46// NamedReg - If the name for the 'def' of the register should not become the
47// "name" of the register, you can use this to specify a custom name instead.
48//
49class NamedReg<string n> : Register {
Chris Lattnercb7489c2003-08-04 04:58:12 +000050 let Name = n;
Misha Brukmanbb053ce2003-05-29 18:48:17 +000051}
52
Chris Lattnere45b6992003-07-30 05:50:12 +000053// RegisterAliases - You should define instances of this class to indicate which
54// registers in the register file are aliased together. This allows the code
55// generator to be careful not to put two values with overlapping live ranges
56// into registers which alias.
57//
58class RegisterAliases<Register reg, list<Register> aliases> {
59 Register Reg = reg;
60 list<Register> Aliases = aliases;
61}
62
63// RegisterClass - Now that all of the registers are defined, and aliases
64// between registers are defined, specify which registers belong to which
65// register classes. This also defines the default allocation order of
66// registers by register allocators.
67//
68class RegisterClass<ValueType regType, int alignment, list<Register> regList> {
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000069 // RegType - Specify the ValueType of the registers in this register class.
70 // Note that all registers in a register class must have the same ValueType.
71 //
Chris Lattnere45b6992003-07-30 05:50:12 +000072 ValueType RegType = regType;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000073
74 // Alignment - Specify the alignment required of the registers when they are
75 // stored or loaded to memory.
76 //
Chris Lattner75c817a2003-08-01 05:18:03 +000077 int Size = RegType.Size;
Chris Lattnere45b6992003-07-30 05:50:12 +000078 int Alignment = alignment;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000079
80 // MemberList - Specify which registers are in this class. If the
81 // allocation_order_* method are not specified, this also defines the order of
82 // allocation used by the register allocator.
83 //
Chris Lattnere45b6992003-07-30 05:50:12 +000084 list<Register> MemberList = regList;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000085
Chris Lattnerd20486a2003-08-01 22:21:49 +000086 // Methods - This member can be used to insert arbitrary code into a generated
87 // register class. The normal usage of this is to overload virtual methods.
88 code Methods = [{}];
Chris Lattnere45b6992003-07-30 05:50:12 +000089}
90
91
92//===----------------------------------------------------------------------===//
Chris Lattner6a7439f2003-08-03 18:18:31 +000093// Instruction set description - These classes correspond to the C++ classes in
94// the Target/TargetInstrInfo.h file.
Chris Lattnere45b6992003-07-30 05:50:12 +000095//
96
Misha Brukmanbb053ce2003-05-29 18:48:17 +000097class Instruction {
98 string Name; // The opcode string for this instruction
99 string Namespace = "";
100
101 list<Register> Uses = []; // Default to using no non-operand registers
102 list<Register> Defs = []; // Default to modifying no non-operand registers
103
104 // These bits capture information about the high-level semantics of the
105 // instruction.
Chris Lattner6a561be2003-07-29 23:02:49 +0000106 bit isReturn = 0; // Is this instruction a return instruction?
107 bit isBranch = 0; // Is this instruction a branch instruction?
108 bit isCall = 0; // Is this instruction a call instruction?
109 bit isTwoAddress = 0; // Is this a two address instruction?
110 bit isTerminator = 0; // Is this part of the terminator for a basic block?
Chris Lattner0d74deb2003-08-04 21:07:37 +0000111
112 // Pattern - Set to the DAG pattern for this instruction, if we know of one,
113 // otherwise, uninitialized.
114 dag Pattern;
Chris Lattner6a7439f2003-08-03 18:18:31 +0000115}
116
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000117class Expander<dag pattern, list<dag> result> {
118 dag Pattern = pattern;
119 list<dag> Result = result;
120}
121
122
Chris Lattner6a7439f2003-08-03 18:18:31 +0000123// InstrInfo - This class should only be instantiated once to provide parameters
124// which are global to the the target machine.
125//
126class InstrInfo {
127 Instruction PHIInst;
Chris Lattner6c8a4082003-08-03 21:52:28 +0000128
129 // If the target wants to associate some target-specific information with each
130 // instruction, it should provide these two lists to indicate how to assemble
131 // the target specific information into the 32 bits available.
132 //
133 list<string> TSFlagsFields = [];
134 list<int> TSFlagsShifts = [];
Chris Lattner6a7439f2003-08-03 18:18:31 +0000135}
136
137
138//===----------------------------------------------------------------------===//
139// Target - This class contains the "global" target information
140//
141class Target {
142 // CalleeSavedRegisters - As you might guess, this is a list of the callee
143 // saved registers for a target.
144 list<Register> CalleeSavedRegisters = [];
145
146 // PointerType - Specify the value type to be used to represent pointers in
147 // this target. Typically this is an i32 or i64 type.
148 ValueType PointerType;
149
150 // InstructionSet - Instruction set description for this target
151 InstrInfo InstructionSet;
Misha Brukmanbb053ce2003-05-29 18:48:17 +0000152}
Chris Lattner0d74deb2003-08-04 21:07:37 +0000153
154
155//===----------------------------------------------------------------------===//
156// DAG node definitions used by the instruction selector...
157//
Chris Lattnereaa5b962003-08-07 13:52:22 +0000158class DagNodeValType;
159def DNVT_void : DagNodeValType; // Tree node always returns void
160def DNVT_val : DagNodeValType; // A non-void type
161def DNVT_arg0 : DagNodeValType; // Tree node returns same type as Arg0
Chris Lattner6088a0b2003-08-11 21:29:40 +0000162def DNVT_arg1 : DagNodeValType; // Tree node returns same type as Arg1
Chris Lattnereaa5b962003-08-07 13:52:22 +0000163def DNVT_ptr : DagNodeValType; // The target pointer type
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000164
Chris Lattnereaa5b962003-08-07 13:52:22 +0000165class DagNode<DagNodeValType ret, list<DagNodeValType> args> {
166 DagNodeValType RetType = ret;
167 list<DagNodeValType> ArgTypes = args;
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000168 string EnumName = ?;
169}
170
171// BuiltinDagNodes are built into the instruction selector and correspond to
172// enum values.
Chris Lattnereaa5b962003-08-07 13:52:22 +0000173class BuiltinDagNode<DagNodeValType Ret, list<DagNodeValType> Args,
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000174 string Ename> : DagNode<Ret, Args> {
175 let EnumName = Ename;
176}
177
178// Magic nodes...
Chris Lattnereaa5b962003-08-07 13:52:22 +0000179def set : DagNode<DNVT_void, [DNVT_val, DNVT_arg0]>;
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000180
181// Terminals...
Chris Lattner3e2e0fb2003-08-10 19:51:16 +0000182def imm : BuiltinDagNode<DNVT_val, [], "Constant">;
Chris Lattner6088a0b2003-08-11 21:29:40 +0000183def frameidx : BuiltinDagNode<DNVT_ptr, [], "FrameIndex">;
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000184
185// Arithmetic...
Chris Lattner6088a0b2003-08-11 21:29:40 +0000186def plus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Plus">;
187def minus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Minus">;
188def times : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Times">;
189def sdiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SDiv">;
190def udiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "UDiv">;
191def srem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SRem">;
192def urem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "URem">;
193def and : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "And">;
194def or : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Or">;
195def xor : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Xor">;
Chris Lattnerc914a482003-08-11 15:23:05 +0000196
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000197
Chris Lattner6088a0b2003-08-11 21:29:40 +0000198def load : BuiltinDagNode<DNVT_val, [DNVT_ptr], "Load">;
199//def store : BuiltinDagNode<DNVT_Void, [DNVT_ptr, DNVT_val]>;
Chris Lattner0c4dd1e2003-08-06 15:31:02 +0000200
201// Other...
Chris Lattnereaa5b962003-08-07 13:52:22 +0000202def ret : BuiltinDagNode<DNVT_void, [DNVT_val], "Ret">;
203def retvoid : BuiltinDagNode<DNVT_void, [], "RetVoid">;
204
205//===----------------------------------------------------------------------===//
206// DAG nonterminals definitions used by the instruction selector...
207//
208class Nonterminal<dag pattern> {
209 dag Pattern = pattern;
210 bit BuiltIn = 0;
211}
212