blob: 5869ca4df425f04ee4d0fc11b6c2089dd84a61b9 [file] [log] [blame]
Chris Lattneree6b5f62003-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 Brukman01c16382003-05-29 18:48:17 +00006//===----------------------------------------------------------------------===//
7
Chris Lattner7c289522003-07-30 05:50:12 +00008
9//===----------------------------------------------------------------------===//
10//
Chris Lattnerb3aa3192003-07-28 04:24:59 +000011// Value types - These values correspond to the register types defined in the
Chris Lattnerec4f5232003-08-07 13:52:22 +000012// ValueTypes.h file. If you update anything here, you must update it there as
13// well!
Chris Lattner0ad13612003-07-30 22:16:41 +000014//
Chris Lattnerec4f5232003-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 Lattner7c289522003-07-30 05:50:12 +000020
Chris Lattnerec4f5232003-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 Lattner7c289522003-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 Brukman01c16382003-05-29 18:48:17 +000041class Register {
42 string Namespace = "";
Chris Lattner76bf8682003-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 Lattner60e81db2003-08-04 04:58:12 +000050 let Name = n;
Misha Brukman01c16382003-05-29 18:48:17 +000051}
52
Chris Lattner7c289522003-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 Lattner0ad13612003-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 Lattner7c289522003-07-30 05:50:12 +000072 ValueType RegType = regType;
Chris Lattner0ad13612003-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 Lattnerde04dd72003-08-01 05:18:03 +000077 int Size = RegType.Size;
Chris Lattner7c289522003-07-30 05:50:12 +000078 int Alignment = alignment;
Chris Lattner0ad13612003-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 Lattner7c289522003-07-30 05:50:12 +000084 list<Register> MemberList = regList;
Chris Lattner0ad13612003-07-30 22:16:41 +000085
Chris Lattnerbe84e3c2003-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 Lattner7c289522003-07-30 05:50:12 +000089}
90
91
92//===----------------------------------------------------------------------===//
Chris Lattnera5100d92003-08-03 18:18:31 +000093// Instruction set description - These classes correspond to the C++ classes in
94// the Target/TargetInstrInfo.h file.
Chris Lattner7c289522003-07-30 05:50:12 +000095//
96
Misha Brukman01c16382003-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 Lattner84c40c12003-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 Lattner244883e2003-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 Lattnera5100d92003-08-03 18:18:31 +0000115}
116
Chris Lattner3e77d6e2003-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 Lattnera5100d92003-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 Lattner34a20682003-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 Lattnera5100d92003-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 Brukman01c16382003-05-29 18:48:17 +0000152}
Chris Lattner244883e2003-08-04 21:07:37 +0000153
154
155//===----------------------------------------------------------------------===//
156// DAG node definitions used by the instruction selector...
157//
Chris Lattnerec4f5232003-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
162def DNVT_ptr : DagNodeValType; // The target pointer type
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000163
Chris Lattnerec4f5232003-08-07 13:52:22 +0000164class DagNode<DagNodeValType ret, list<DagNodeValType> args> {
165 DagNodeValType RetType = ret;
166 list<DagNodeValType> ArgTypes = args;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000167 string EnumName = ?;
168}
169
170// BuiltinDagNodes are built into the instruction selector and correspond to
171// enum values.
Chris Lattnerec4f5232003-08-07 13:52:22 +0000172class BuiltinDagNode<DagNodeValType Ret, list<DagNodeValType> Args,
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000173 string Ename> : DagNode<Ret, Args> {
174 let EnumName = Ename;
175}
176
177// Magic nodes...
Chris Lattnerec4f5232003-08-07 13:52:22 +0000178def set : DagNode<DNVT_void, [DNVT_val, DNVT_arg0]>;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000179
180// Terminals...
Chris Lattnerec4f5232003-08-07 13:52:22 +0000181def Constant : BuiltinDagNode<DNVT_val, [], "Contant">;
182// def frameidx : BuiltinDagNode<DNVT_ptr, [], "FrameIndex">;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000183
184// Arithmetic...
Chris Lattnerec4f5232003-08-07 13:52:22 +0000185def plus : BuiltinDagNode<DNVT_arg0, [DNVT_val, DNVT_arg0], "Plus">;
186def minus : BuiltinDagNode<DNVT_arg0, [DNVT_val, DNVT_arg0], "Minus">;
187//def mult : DagNode<2, DNVT_arg0>;
188//def div : DagNode<2, DNVT_arg0>;
189//def udiv : DagNode<2, DNVT_arg0>;
190//def mod : DagNode<2, DNVT_arg0>;
191//def umod : DagNode<2, DNVT_arg0>;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000192
Chris Lattnerec4f5232003-08-07 13:52:22 +0000193def load : DagNode<DNVT_val, [DNVT_ptr]>;
194//def store : DagNode<2, DNVT_Void>;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000195
196// Other...
Chris Lattnerec4f5232003-08-07 13:52:22 +0000197def ret : BuiltinDagNode<DNVT_void, [DNVT_val], "Ret">;
198def retvoid : BuiltinDagNode<DNVT_void, [], "RetVoid">;
199
200//===----------------------------------------------------------------------===//
201// DAG nonterminals definitions used by the instruction selector...
202//
203class Nonterminal<dag pattern> {
204 dag Pattern = pattern;
205 bit BuiltIn = 0;
206}
207
208// imm - Immediate value...
209def imm : Nonterminal<(Constant)> { let BuiltIn = 1; }
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000210