blob: fa040efb8ac0a516b1c6a4e737a31dc9268a71de [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 Lattnerb6ef5c82003-08-15 04:35:14 +000089
90 // isDummyClass - If this is set to true, this register class is not really
91 // part of the target, it is just used for other purposes.
92 bit isDummyClass = 0;
Chris Lattner7c289522003-07-30 05:50:12 +000093}
94
95
96//===----------------------------------------------------------------------===//
Chris Lattnera5100d92003-08-03 18:18:31 +000097// Instruction set description - These classes correspond to the C++ classes in
98// the Target/TargetInstrInfo.h file.
Chris Lattner7c289522003-07-30 05:50:12 +000099//
100
Misha Brukman01c16382003-05-29 18:48:17 +0000101class Instruction {
102 string Name; // The opcode string for this instruction
103 string Namespace = "";
104
105 list<Register> Uses = []; // Default to using no non-operand registers
106 list<Register> Defs = []; // Default to modifying no non-operand registers
107
108 // These bits capture information about the high-level semantics of the
109 // instruction.
Chris Lattner84c40c12003-07-29 23:02:49 +0000110 bit isReturn = 0; // Is this instruction a return instruction?
111 bit isBranch = 0; // Is this instruction a branch instruction?
112 bit isCall = 0; // Is this instruction a call instruction?
113 bit isTwoAddress = 0; // Is this a two address instruction?
114 bit isTerminator = 0; // Is this part of the terminator for a basic block?
Chris Lattner244883e2003-08-04 21:07:37 +0000115
116 // Pattern - Set to the DAG pattern for this instruction, if we know of one,
117 // otherwise, uninitialized.
118 dag Pattern;
Chris Lattnera5100d92003-08-03 18:18:31 +0000119}
120
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000121class Expander<dag pattern, list<dag> result> {
122 dag Pattern = pattern;
123 list<dag> Result = result;
124}
125
126
Chris Lattnera5100d92003-08-03 18:18:31 +0000127// InstrInfo - This class should only be instantiated once to provide parameters
128// which are global to the the target machine.
129//
130class InstrInfo {
131 Instruction PHIInst;
Chris Lattner34a20682003-08-03 21:52:28 +0000132
133 // If the target wants to associate some target-specific information with each
134 // instruction, it should provide these two lists to indicate how to assemble
135 // the target specific information into the 32 bits available.
136 //
137 list<string> TSFlagsFields = [];
138 list<int> TSFlagsShifts = [];
Chris Lattnera5100d92003-08-03 18:18:31 +0000139}
140
141
142//===----------------------------------------------------------------------===//
143// Target - This class contains the "global" target information
144//
145class Target {
146 // CalleeSavedRegisters - As you might guess, this is a list of the callee
147 // saved registers for a target.
148 list<Register> CalleeSavedRegisters = [];
149
150 // PointerType - Specify the value type to be used to represent pointers in
151 // this target. Typically this is an i32 or i64 type.
152 ValueType PointerType;
153
154 // InstructionSet - Instruction set description for this target
155 InstrInfo InstructionSet;
Misha Brukman01c16382003-05-29 18:48:17 +0000156}
Chris Lattner244883e2003-08-04 21:07:37 +0000157
158
159//===----------------------------------------------------------------------===//
160// DAG node definitions used by the instruction selector...
161//
Chris Lattnerec4f5232003-08-07 13:52:22 +0000162class DagNodeValType;
Chris Lattnerb6ef5c82003-08-15 04:35:14 +0000163def DNVT_any : DagNodeValType; // No constraint on tree node
Chris Lattnerec4f5232003-08-07 13:52:22 +0000164def DNVT_void : DagNodeValType; // Tree node always returns void
165def DNVT_val : DagNodeValType; // A non-void type
166def DNVT_arg0 : DagNodeValType; // Tree node returns same type as Arg0
Chris Lattnerc0bb13d2003-08-11 21:29:40 +0000167def DNVT_arg1 : DagNodeValType; // Tree node returns same type as Arg1
Chris Lattnerec4f5232003-08-07 13:52:22 +0000168def DNVT_ptr : DagNodeValType; // The target pointer type
Chris Lattnerc12a6142003-08-12 04:28:21 +0000169def DNVT_i8 : DagNodeValType; // Always have an i8 value
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000170
Chris Lattnerec4f5232003-08-07 13:52:22 +0000171class DagNode<DagNodeValType ret, list<DagNodeValType> args> {
172 DagNodeValType RetType = ret;
173 list<DagNodeValType> ArgTypes = args;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000174 string EnumName = ?;
175}
176
177// BuiltinDagNodes are built into the instruction selector and correspond to
178// enum values.
Chris Lattnerec4f5232003-08-07 13:52:22 +0000179class BuiltinDagNode<DagNodeValType Ret, list<DagNodeValType> Args,
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000180 string Ename> : DagNode<Ret, Args> {
181 let EnumName = Ename;
182}
183
184// Magic nodes...
Chris Lattnerb6ef5c82003-08-15 04:35:14 +0000185def Void : RegisterClass<isVoid,0,[]> { let isDummyClass = 1; }
186def set : DagNode<DNVT_void, [DNVT_val, DNVT_arg0]>;
187def chain : BuiltinDagNode<DNVT_void, [DNVT_void, DNVT_void], "ChainNode">;
188def blockchain : BuiltinDagNode<DNVT_void, [DNVT_void, DNVT_void],
189 "BlockChainNode">;
190def ChainExpander : Expander<(chain Void, Void), []>;
191def BlockChainExpander : Expander<(blockchain Void, Void), []>;
192
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000193
194// Terminals...
Chris Lattnerc8477962003-08-12 04:17:29 +0000195def imm : BuiltinDagNode<DNVT_val, [], "Constant">;
196def frameidx : BuiltinDagNode<DNVT_ptr, [], "FrameIndex">;
197def basicblock : BuiltinDagNode<DNVT_ptr, [], "BasicBlock">;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000198
199// Arithmetic...
Chris Lattnerc0bb13d2003-08-11 21:29:40 +0000200def plus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Plus">;
201def minus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Minus">;
202def times : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Times">;
203def sdiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SDiv">;
204def udiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "UDiv">;
205def srem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SRem">;
206def urem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "URem">;
207def and : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "And">;
208def or : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Or">;
209def xor : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Xor">;
Chris Lattner622003f2003-08-11 15:23:05 +0000210
Chris Lattnerc8477962003-08-12 04:17:29 +0000211// Comparisons...
Chris Lattnerc12a6142003-08-12 04:28:21 +0000212def seteq : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetEQ">;
213def setne : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetNE">;
214def setlt : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetLT">;
215def setle : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetLE">;
216def setgt : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetGT">;
217def setge : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetGE">;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000218
Chris Lattnerc0bb13d2003-08-11 21:29:40 +0000219def load : BuiltinDagNode<DNVT_val, [DNVT_ptr], "Load">;
220//def store : BuiltinDagNode<DNVT_Void, [DNVT_ptr, DNVT_val]>;
Chris Lattner3e77d6e2003-08-06 15:31:02 +0000221
222// Other...
Chris Lattnerec4f5232003-08-07 13:52:22 +0000223def ret : BuiltinDagNode<DNVT_void, [DNVT_val], "Ret">;
224def retvoid : BuiltinDagNode<DNVT_void, [], "RetVoid">;
Chris Lattnerc8477962003-08-12 04:17:29 +0000225def br : BuiltinDagNode<DNVT_void, [DNVT_ptr], "Br">;
Chris Lattnerc12a6142003-08-12 04:28:21 +0000226def brcond : BuiltinDagNode<DNVT_void, [DNVT_i8, DNVT_ptr, DNVT_ptr],
Chris Lattnerc8477962003-08-12 04:17:29 +0000227 "BrCond">;
Chris Lattnerec4f5232003-08-07 13:52:22 +0000228
Chris Lattnerb6ef5c82003-08-15 04:35:14 +0000229def unspec1 : BuiltinDagNode<DNVT_any , [DNVT_val], "Unspec1">;
230def unspec2 : BuiltinDagNode<DNVT_any , [DNVT_val, DNVT_val], "Unspec2">;
231
Chris Lattnerec4f5232003-08-07 13:52:22 +0000232//===----------------------------------------------------------------------===//
233// DAG nonterminals definitions used by the instruction selector...
234//
235class Nonterminal<dag pattern> {
236 dag Pattern = pattern;
237 bit BuiltIn = 0;
238}
239