Chris Lattner | ee6b5f6 | 2003-07-29 23:07:13 +0000 | [diff] [blame] | 1 | //===- Target.td - Target Independent TableGen interface --------*- C++ -*-===// |
John Criswell | 856ba76 | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by the LLVM research group and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | ee6b5f6 | 2003-07-29 23:07:13 +0000 | [diff] [blame] | 9 | // |
| 10 | // This file defines the target-independent interfaces which should be |
| 11 | // implemented by each target which is using a TableGen based code generator. |
| 12 | // |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 13 | //===----------------------------------------------------------------------===// |
| 14 | |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 15 | |
| 16 | //===----------------------------------------------------------------------===// |
| 17 | // |
Chris Lattner | b3aa319 | 2003-07-28 04:24:59 +0000 | [diff] [blame] | 18 | // Value types - These values correspond to the register types defined in the |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 19 | // ValueTypes.h file. If you update anything here, you must update it there as |
| 20 | // well! |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 21 | // |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 22 | class ValueType<int size, int value> { |
| 23 | string Namespace = "MVT"; |
| 24 | int Size = size; |
| 25 | int Value = value; |
| 26 | } |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 27 | |
Chris Lattner | 6565043 | 2004-02-11 03:08:45 +0000 | [diff] [blame] | 28 | def OtherVT: ValueType<0 , 0>; // "Other" value |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 29 | def i1 : ValueType<1 , 1>; // One bit boolean value |
| 30 | def i8 : ValueType<8 , 2>; // 8-bit integer value |
| 31 | def i16 : ValueType<16 , 3>; // 16-bit integer value |
| 32 | def i32 : ValueType<32 , 4>; // 32-bit integer value |
| 33 | def i64 : ValueType<64 , 5>; // 64-bit integer value |
| 34 | def i128 : ValueType<128, 5>; // 128-bit integer value |
| 35 | def f32 : ValueType<32 , 7>; // 32-bit floating point value |
| 36 | def f64 : ValueType<64 , 8>; // 64-bit floating point value |
| 37 | def f80 : ValueType<80 , 9>; // 80-bit floating point value |
| 38 | def f128 : ValueType<128, 9>; // 128-bit floating point value |
| 39 | def isVoid : ValueType<0 , 11>; // Produces no value |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 40 | |
| 41 | //===----------------------------------------------------------------------===// |
| 42 | // Register file description - These classes are used to fill in the target |
| 43 | // description classes in llvm/Target/MRegisterInfo.h |
| 44 | |
| 45 | |
| 46 | // Register - You should define one instance of this class for each register in |
| 47 | // the target machine. |
| 48 | // |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 49 | class Register { |
| 50 | string Namespace = ""; |
Chris Lattner | 76bf868 | 2003-08-03 22:12:37 +0000 | [diff] [blame] | 51 | string Name = ""; |
| 52 | } |
| 53 | |
| 54 | // NamedReg - If the name for the 'def' of the register should not become the |
| 55 | // "name" of the register, you can use this to specify a custom name instead. |
| 56 | // |
| 57 | class NamedReg<string n> : Register { |
Chris Lattner | 60e81db | 2003-08-04 04:58:12 +0000 | [diff] [blame] | 58 | let Name = n; |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 59 | } |
| 60 | |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 61 | // RegisterAliases - You should define instances of this class to indicate which |
| 62 | // registers in the register file are aliased together. This allows the code |
| 63 | // generator to be careful not to put two values with overlapping live ranges |
| 64 | // into registers which alias. |
| 65 | // |
| 66 | class RegisterAliases<Register reg, list<Register> aliases> { |
| 67 | Register Reg = reg; |
| 68 | list<Register> Aliases = aliases; |
| 69 | } |
| 70 | |
| 71 | // RegisterClass - Now that all of the registers are defined, and aliases |
| 72 | // between registers are defined, specify which registers belong to which |
| 73 | // register classes. This also defines the default allocation order of |
| 74 | // registers by register allocators. |
| 75 | // |
| 76 | class RegisterClass<ValueType regType, int alignment, list<Register> regList> { |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 77 | // RegType - Specify the ValueType of the registers in this register class. |
| 78 | // Note that all registers in a register class must have the same ValueType. |
| 79 | // |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 80 | ValueType RegType = regType; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 81 | |
| 82 | // Alignment - Specify the alignment required of the registers when they are |
| 83 | // stored or loaded to memory. |
| 84 | // |
Chris Lattner | de04dd7 | 2003-08-01 05:18:03 +0000 | [diff] [blame] | 85 | int Size = RegType.Size; |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 86 | int Alignment = alignment; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 87 | |
| 88 | // MemberList - Specify which registers are in this class. If the |
| 89 | // allocation_order_* method are not specified, this also defines the order of |
| 90 | // allocation used by the register allocator. |
| 91 | // |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 92 | list<Register> MemberList = regList; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 93 | |
Chris Lattner | be84e3c | 2003-08-01 22:21:49 +0000 | [diff] [blame] | 94 | // Methods - This member can be used to insert arbitrary code into a generated |
| 95 | // register class. The normal usage of this is to overload virtual methods. |
| 96 | code Methods = [{}]; |
Chris Lattner | b6ef5c8 | 2003-08-15 04:35:14 +0000 | [diff] [blame] | 97 | |
| 98 | // isDummyClass - If this is set to true, this register class is not really |
| 99 | // part of the target, it is just used for other purposes. |
| 100 | bit isDummyClass = 0; |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | |
| 104 | //===----------------------------------------------------------------------===// |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 105 | // Instruction set description - These classes correspond to the C++ classes in |
| 106 | // the Target/TargetInstrInfo.h file. |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 107 | // |
| 108 | |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 109 | class Instruction { |
| 110 | string Name; // The opcode string for this instruction |
| 111 | string Namespace = ""; |
| 112 | |
| 113 | list<Register> Uses = []; // Default to using no non-operand registers |
| 114 | list<Register> Defs = []; // Default to modifying no non-operand registers |
| 115 | |
| 116 | // These bits capture information about the high-level semantics of the |
| 117 | // instruction. |
Chris Lattner | 84c40c1 | 2003-07-29 23:02:49 +0000 | [diff] [blame] | 118 | bit isReturn = 0; // Is this instruction a return instruction? |
| 119 | bit isBranch = 0; // Is this instruction a branch instruction? |
| 120 | bit isCall = 0; // Is this instruction a call instruction? |
| 121 | bit isTwoAddress = 0; // Is this a two address instruction? |
| 122 | bit isTerminator = 0; // Is this part of the terminator for a basic block? |
Chris Lattner | 244883e | 2003-08-04 21:07:37 +0000 | [diff] [blame] | 123 | |
| 124 | // Pattern - Set to the DAG pattern for this instruction, if we know of one, |
| 125 | // otherwise, uninitialized. |
| 126 | dag Pattern; |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 127 | } |
| 128 | |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 129 | class Expander<dag pattern, list<dag> result> { |
| 130 | dag Pattern = pattern; |
| 131 | list<dag> Result = result; |
| 132 | } |
| 133 | |
| 134 | |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 135 | // InstrInfo - This class should only be instantiated once to provide parameters |
| 136 | // which are global to the the target machine. |
| 137 | // |
| 138 | class InstrInfo { |
| 139 | Instruction PHIInst; |
Chris Lattner | 34a2068 | 2003-08-03 21:52:28 +0000 | [diff] [blame] | 140 | |
| 141 | // If the target wants to associate some target-specific information with each |
| 142 | // instruction, it should provide these two lists to indicate how to assemble |
| 143 | // the target specific information into the 32 bits available. |
| 144 | // |
| 145 | list<string> TSFlagsFields = []; |
| 146 | list<int> TSFlagsShifts = []; |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 147 | } |
| 148 | |
| 149 | |
| 150 | //===----------------------------------------------------------------------===// |
| 151 | // Target - This class contains the "global" target information |
| 152 | // |
| 153 | class Target { |
| 154 | // CalleeSavedRegisters - As you might guess, this is a list of the callee |
| 155 | // saved registers for a target. |
| 156 | list<Register> CalleeSavedRegisters = []; |
| 157 | |
| 158 | // PointerType - Specify the value type to be used to represent pointers in |
| 159 | // this target. Typically this is an i32 or i64 type. |
| 160 | ValueType PointerType; |
| 161 | |
| 162 | // InstructionSet - Instruction set description for this target |
| 163 | InstrInfo InstructionSet; |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 164 | } |
Chris Lattner | 244883e | 2003-08-04 21:07:37 +0000 | [diff] [blame] | 165 | |
| 166 | |
| 167 | //===----------------------------------------------------------------------===// |
| 168 | // DAG node definitions used by the instruction selector... |
| 169 | // |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 170 | class DagNodeValType; |
Chris Lattner | b6ef5c8 | 2003-08-15 04:35:14 +0000 | [diff] [blame] | 171 | def DNVT_any : DagNodeValType; // No constraint on tree node |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 172 | def DNVT_void : DagNodeValType; // Tree node always returns void |
| 173 | def DNVT_val : DagNodeValType; // A non-void type |
| 174 | def DNVT_arg0 : DagNodeValType; // Tree node returns same type as Arg0 |
Chris Lattner | c0bb13d | 2003-08-11 21:29:40 +0000 | [diff] [blame] | 175 | def DNVT_arg1 : DagNodeValType; // Tree node returns same type as Arg1 |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 176 | def DNVT_ptr : DagNodeValType; // The target pointer type |
Chris Lattner | c12a614 | 2003-08-12 04:28:21 +0000 | [diff] [blame] | 177 | def DNVT_i8 : DagNodeValType; // Always have an i8 value |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 178 | |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 179 | class DagNode<DagNodeValType ret, list<DagNodeValType> args> { |
| 180 | DagNodeValType RetType = ret; |
| 181 | list<DagNodeValType> ArgTypes = args; |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 182 | string EnumName = ?; |
| 183 | } |
| 184 | |
| 185 | // BuiltinDagNodes are built into the instruction selector and correspond to |
| 186 | // enum values. |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 187 | class BuiltinDagNode<DagNodeValType Ret, list<DagNodeValType> Args, |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 188 | string Ename> : DagNode<Ret, Args> { |
| 189 | let EnumName = Ename; |
| 190 | } |
| 191 | |
| 192 | // Magic nodes... |
Chris Lattner | b6ef5c8 | 2003-08-15 04:35:14 +0000 | [diff] [blame] | 193 | def Void : RegisterClass<isVoid,0,[]> { let isDummyClass = 1; } |
| 194 | def set : DagNode<DNVT_void, [DNVT_val, DNVT_arg0]>; |
| 195 | def chain : BuiltinDagNode<DNVT_void, [DNVT_void, DNVT_void], "ChainNode">; |
| 196 | def blockchain : BuiltinDagNode<DNVT_void, [DNVT_void, DNVT_void], |
| 197 | "BlockChainNode">; |
| 198 | def ChainExpander : Expander<(chain Void, Void), []>; |
| 199 | def BlockChainExpander : Expander<(blockchain Void, Void), []>; |
| 200 | |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 201 | |
| 202 | // Terminals... |
Chris Lattner | c847796 | 2003-08-12 04:17:29 +0000 | [diff] [blame] | 203 | def imm : BuiltinDagNode<DNVT_val, [], "Constant">; |
| 204 | def frameidx : BuiltinDagNode<DNVT_ptr, [], "FrameIndex">; |
| 205 | def basicblock : BuiltinDagNode<DNVT_ptr, [], "BasicBlock">; |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 206 | |
| 207 | // Arithmetic... |
Chris Lattner | c0bb13d | 2003-08-11 21:29:40 +0000 | [diff] [blame] | 208 | def plus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Plus">; |
| 209 | def minus : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Minus">; |
| 210 | def times : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Times">; |
| 211 | def sdiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SDiv">; |
| 212 | def udiv : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "UDiv">; |
| 213 | def srem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "SRem">; |
| 214 | def urem : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "URem">; |
| 215 | def and : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "And">; |
| 216 | def or : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Or">; |
| 217 | def xor : BuiltinDagNode<DNVT_arg0, [DNVT_arg1, DNVT_arg0], "Xor">; |
Chris Lattner | 622003f | 2003-08-11 15:23:05 +0000 | [diff] [blame] | 218 | |
Chris Lattner | c847796 | 2003-08-12 04:17:29 +0000 | [diff] [blame] | 219 | // Comparisons... |
Chris Lattner | c12a614 | 2003-08-12 04:28:21 +0000 | [diff] [blame] | 220 | def seteq : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetEQ">; |
| 221 | def setne : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetNE">; |
| 222 | def setlt : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetLT">; |
| 223 | def setle : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetLE">; |
| 224 | def setgt : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetGT">; |
| 225 | def setge : BuiltinDagNode<DNVT_i8 , [DNVT_arg1, DNVT_arg0], "SetGE">; |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 226 | |
Chris Lattner | c0bb13d | 2003-08-11 21:29:40 +0000 | [diff] [blame] | 227 | def load : BuiltinDagNode<DNVT_val, [DNVT_ptr], "Load">; |
| 228 | //def store : BuiltinDagNode<DNVT_Void, [DNVT_ptr, DNVT_val]>; |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 229 | |
| 230 | // Other... |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 231 | def ret : BuiltinDagNode<DNVT_void, [DNVT_val], "Ret">; |
| 232 | def retvoid : BuiltinDagNode<DNVT_void, [], "RetVoid">; |
Chris Lattner | c847796 | 2003-08-12 04:17:29 +0000 | [diff] [blame] | 233 | def br : BuiltinDagNode<DNVT_void, [DNVT_ptr], "Br">; |
Chris Lattner | c12a614 | 2003-08-12 04:28:21 +0000 | [diff] [blame] | 234 | def brcond : BuiltinDagNode<DNVT_void, [DNVT_i8, DNVT_ptr, DNVT_ptr], |
Chris Lattner | c847796 | 2003-08-12 04:17:29 +0000 | [diff] [blame] | 235 | "BrCond">; |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 236 | |
Chris Lattner | b6ef5c8 | 2003-08-15 04:35:14 +0000 | [diff] [blame] | 237 | def unspec1 : BuiltinDagNode<DNVT_any , [DNVT_val], "Unspec1">; |
| 238 | def unspec2 : BuiltinDagNode<DNVT_any , [DNVT_val, DNVT_val], "Unspec2">; |
| 239 | |
Chris Lattner | ec4f523 | 2003-08-07 13:52:22 +0000 | [diff] [blame] | 240 | //===----------------------------------------------------------------------===// |
| 241 | // DAG nonterminals definitions used by the instruction selector... |
| 242 | // |
| 243 | class Nonterminal<dag pattern> { |
| 244 | dag Pattern = pattern; |
| 245 | bit BuiltIn = 0; |
| 246 | } |
| 247 | |