Chris Lattner | bbe664c | 2004-08-01 03:23:34 +0000 | [diff] [blame] | 1 | //===- Target.td - Target Independent TableGen interface ---*- tablegen -*-===// |
John Criswell | 856ba76 | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
John Criswell | 856ba76 | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 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 | da10f19 | 2006-03-24 18:52:35 +0000 | [diff] [blame] | 15 | // Include all information about LLVM intrinsics. |
| 16 | include "llvm/Intrinsics.td" |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 17 | |
| 18 | //===----------------------------------------------------------------------===// |
| 19 | // Register file description - These classes are used to fill in the target |
Chris Lattner | ccc8ed7 | 2005-10-04 05:09:20 +0000 | [diff] [blame] | 20 | // description classes. |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 21 | |
Chris Lattner | ccc8ed7 | 2005-10-04 05:09:20 +0000 | [diff] [blame] | 22 | class RegisterClass; // Forward def |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 23 | |
Chris Lattner | b228657 | 2004-09-14 04:17:02 +0000 | [diff] [blame] | 24 | // Register - You should define one instance of this class for each register |
| 25 | // in the target machine. String n will become the "name" of the register. |
Chris Lattner | ef242b1 | 2005-09-30 04:13:23 +0000 | [diff] [blame] | 26 | class Register<string n> { |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 27 | string Namespace = ""; |
Bill Wendling | 74ab84c | 2008-02-26 21:11:01 +0000 | [diff] [blame] | 28 | string AsmName = n; |
Chris Lattner | b4d83c1 | 2004-08-21 02:17:39 +0000 | [diff] [blame] | 29 | |
| 30 | // SpillSize - If this value is set to a non-zero value, it is the size in |
| 31 | // bits of the spill slot required to hold this register. If this value is |
| 32 | // set to zero, the information is inferred from any register classes the |
| 33 | // register belongs to. |
| 34 | int SpillSize = 0; |
| 35 | |
| 36 | // SpillAlignment - This value is used to specify the alignment required for |
| 37 | // spilling the register. Like SpillSize, this should only be explicitly |
| 38 | // specified if the register is not in a register class. |
| 39 | int SpillAlignment = 0; |
Chris Lattner | 76bf868 | 2003-08-03 22:12:37 +0000 | [diff] [blame] | 40 | |
Chris Lattner | ef242b1 | 2005-09-30 04:13:23 +0000 | [diff] [blame] | 41 | // Aliases - A list of registers that this register overlaps with. A read or |
Dan Gohman | e26bff2 | 2007-02-20 20:52:03 +0000 | [diff] [blame] | 42 | // modification of this register can potentially read or modify the aliased |
Chris Lattner | ef242b1 | 2005-09-30 04:13:23 +0000 | [diff] [blame] | 43 | // registers. |
Chris Lattner | ef242b1 | 2005-09-30 04:13:23 +0000 | [diff] [blame] | 44 | list<Register> Aliases = []; |
Jim Laskey | 8da17b2 | 2006-03-24 21:13:21 +0000 | [diff] [blame] | 45 | |
Evan Cheng | 3cafbf7 | 2007-04-20 21:13:46 +0000 | [diff] [blame] | 46 | // SubRegs - A list of registers that are parts of this register. Note these |
| 47 | // are "immediate" sub-registers and the registers within the list do not |
| 48 | // themselves overlap. e.g. For X86, EAX's SubRegs list contains only [AX], |
| 49 | // not [AX, AH, AL]. |
| 50 | list<Register> SubRegs = []; |
| 51 | |
Anton Korobeynikov | f191c80 | 2007-11-11 19:50:10 +0000 | [diff] [blame] | 52 | // DwarfNumbers - Numbers used internally by gcc/gdb to identify the register. |
Jim Laskey | 8da17b2 | 2006-03-24 21:13:21 +0000 | [diff] [blame] | 53 | // These values can be determined by locating the <target>.h file in the |
| 54 | // directory llvmgcc/gcc/config/<target>/ and looking for REGISTER_NAMES. The |
| 55 | // order of these names correspond to the enumeration used by gcc. A value of |
Anton Korobeynikov | 2e7eedf | 2007-11-11 19:53:50 +0000 | [diff] [blame] | 56 | // -1 indicates that the gcc number is undefined and -2 that register number |
| 57 | // is invalid for this mode/flavour. |
Anton Korobeynikov | f191c80 | 2007-11-11 19:50:10 +0000 | [diff] [blame] | 58 | list<int> DwarfNumbers = []; |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 59 | } |
| 60 | |
Evan Cheng | 3cafbf7 | 2007-04-20 21:13:46 +0000 | [diff] [blame] | 61 | // RegisterWithSubRegs - This can be used to define instances of Register which |
| 62 | // need to specify sub-registers. |
| 63 | // List "subregs" specifies which registers are sub-registers to this one. This |
| 64 | // is used to populate the SubRegs and AliasSet fields of TargetRegisterDesc. |
| 65 | // This allows the code generator to be careful not to put two values with |
| 66 | // overlapping live ranges into registers which alias. |
| 67 | class RegisterWithSubRegs<string n, list<Register> subregs> : Register<n> { |
| 68 | let SubRegs = subregs; |
| 69 | } |
| 70 | |
Nate Begeman | 7bf1c27 | 2007-05-01 05:57:02 +0000 | [diff] [blame] | 71 | // SubRegSet - This can be used to define a specific mapping of registers to |
| 72 | // indices, for use as named subregs of a particular physical register. Each |
| 73 | // register in 'subregs' becomes an addressable subregister at index 'n' of the |
| 74 | // corresponding register in 'regs'. |
| 75 | class SubRegSet<int n, list<Register> regs, list<Register> subregs> { |
| 76 | int index = n; |
| 77 | |
| 78 | list<Register> From = regs; |
| 79 | list<Register> To = subregs; |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 80 | } |
| 81 | |
| 82 | // RegisterClass - Now that all of the registers are defined, and aliases |
| 83 | // between registers are defined, specify which registers belong to which |
| 84 | // register classes. This also defines the default allocation order of |
| 85 | // registers by register allocators. |
| 86 | // |
Nate Begeman | 6510b22 | 2005-12-01 04:51:06 +0000 | [diff] [blame] | 87 | class RegisterClass<string namespace, list<ValueType> regTypes, int alignment, |
Chris Lattner | 1ff9540 | 2005-08-19 18:48:48 +0000 | [diff] [blame] | 88 | list<Register> regList> { |
| 89 | string Namespace = namespace; |
| 90 | |
Chris Lattner | 506efda | 2006-05-14 02:05:19 +0000 | [diff] [blame] | 91 | // RegType - Specify the list ValueType of the registers in this register |
| 92 | // class. Note that all registers in a register class must have the same |
Chris Lattner | 94ae9d3 | 2006-05-15 18:35:02 +0000 | [diff] [blame] | 93 | // ValueTypes. This is a list because some targets permit storing different |
| 94 | // types in same register, for example vector values with 128-bit total size, |
| 95 | // but different count/size of items, like SSE on x86. |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 96 | // |
Nate Begeman | 6510b22 | 2005-12-01 04:51:06 +0000 | [diff] [blame] | 97 | list<ValueType> RegTypes = regTypes; |
| 98 | |
| 99 | // Size - Specify the spill size in bits of the registers. A default value of |
| 100 | // zero lets tablgen pick an appropriate size. |
| 101 | int Size = 0; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 102 | |
| 103 | // Alignment - Specify the alignment required of the registers when they are |
| 104 | // stored or loaded to memory. |
| 105 | // |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 106 | int Alignment = alignment; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 107 | |
Evan Cheng | a3ca314 | 2007-09-19 01:35:01 +0000 | [diff] [blame] | 108 | // CopyCost - This value is used to specify the cost of copying a value |
| 109 | // between two registers in this register class. The default value is one |
| 110 | // meaning it takes a single instruction to perform the copying. A negative |
| 111 | // value means copying is extremely expensive or impossible. |
| 112 | int CopyCost = 1; |
| 113 | |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 114 | // MemberList - Specify which registers are in this class. If the |
| 115 | // allocation_order_* method are not specified, this also defines the order of |
| 116 | // allocation used by the register allocator. |
| 117 | // |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 118 | list<Register> MemberList = regList; |
Christopher Lamb | a321125 | 2007-06-13 22:20:15 +0000 | [diff] [blame] | 119 | |
| 120 | // SubClassList - Specify which register classes correspond to subregisters |
| 121 | // of this class. The order should be by subregister set index. |
| 122 | list<RegisterClass> SubRegClassList = []; |
Chris Lattner | 0ad1361 | 2003-07-30 22:16:41 +0000 | [diff] [blame] | 123 | |
Chris Lattner | ecbce61 | 2005-08-19 19:13:20 +0000 | [diff] [blame] | 124 | // MethodProtos/MethodBodies - These members can be used to insert arbitrary |
| 125 | // code into a generated register class. The normal usage of this is to |
| 126 | // overload virtual methods. |
| 127 | code MethodProtos = [{}]; |
| 128 | code MethodBodies = [{}]; |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 129 | } |
| 130 | |
| 131 | |
| 132 | //===----------------------------------------------------------------------===// |
Jim Laskey | 8da17b2 | 2006-03-24 21:13:21 +0000 | [diff] [blame] | 133 | // DwarfRegNum - This class provides a mapping of the llvm register enumeration |
| 134 | // to the register numbering used by gcc and gdb. These values are used by a |
| 135 | // debug information writer (ex. DwarfWriter) to describe where values may be |
| 136 | // located during execution. |
Anton Korobeynikov | f191c80 | 2007-11-11 19:50:10 +0000 | [diff] [blame] | 137 | class DwarfRegNum<list<int> Numbers> { |
| 138 | // DwarfNumbers - Numbers used internally by gcc/gdb to identify the register. |
Jim Laskey | 8da17b2 | 2006-03-24 21:13:21 +0000 | [diff] [blame] | 139 | // These values can be determined by locating the <target>.h file in the |
| 140 | // directory llvmgcc/gcc/config/<target>/ and looking for REGISTER_NAMES. The |
| 141 | // order of these names correspond to the enumeration used by gcc. A value of |
Anton Korobeynikov | 2e7eedf | 2007-11-11 19:53:50 +0000 | [diff] [blame] | 142 | // -1 indicates that the gcc number is undefined and -2 that register number is |
| 143 | // invalid for this mode/flavour. |
Anton Korobeynikov | f191c80 | 2007-11-11 19:50:10 +0000 | [diff] [blame] | 144 | list<int> DwarfNumbers = Numbers; |
Jim Laskey | 8da17b2 | 2006-03-24 21:13:21 +0000 | [diff] [blame] | 145 | } |
| 146 | |
| 147 | //===----------------------------------------------------------------------===// |
Jim Laskey | 5384214 | 2005-10-19 19:51:16 +0000 | [diff] [blame] | 148 | // Pull in the common support for scheduling |
| 149 | // |
Vladimir Prus | e438c2a | 2006-05-16 06:39:36 +0000 | [diff] [blame] | 150 | include "TargetSchedule.td" |
Jim Laskey | 5384214 | 2005-10-19 19:51:16 +0000 | [diff] [blame] | 151 | |
Evan Cheng | 58e84a6 | 2005-12-14 22:02:59 +0000 | [diff] [blame] | 152 | class Predicate; // Forward def |
Jim Laskey | 5384214 | 2005-10-19 19:51:16 +0000 | [diff] [blame] | 153 | |
| 154 | //===----------------------------------------------------------------------===// |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 155 | // Instruction set description - These classes correspond to the C++ classes in |
| 156 | // the Target/TargetInstrInfo.h file. |
Chris Lattner | 7c28952 | 2003-07-30 05:50:12 +0000 | [diff] [blame] | 157 | // |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 158 | class Instruction { |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 159 | string Namespace = ""; |
| 160 | |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 161 | dag OutOperandList; // An dag containing the MI def operand list. |
| 162 | dag InOperandList; // An dag containing the MI use operand list. |
Chris Lattner | c139203 | 2004-08-01 04:40:43 +0000 | [diff] [blame] | 163 | string AsmString = ""; // The .s format to print the instruction with. |
Chris Lattner | bbe664c | 2004-08-01 03:23:34 +0000 | [diff] [blame] | 164 | |
| 165 | // Pattern - Set to the DAG pattern for this instruction, if we know of one, |
| 166 | // otherwise, uninitialized. |
| 167 | list<dag> Pattern; |
| 168 | |
| 169 | // The follow state will eventually be inferred automatically from the |
| 170 | // instruction pattern. |
| 171 | |
| 172 | list<Register> Uses = []; // Default to using no non-operand registers |
| 173 | list<Register> Defs = []; // Default to modifying no non-operand registers |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 174 | |
Evan Cheng | 58e84a6 | 2005-12-14 22:02:59 +0000 | [diff] [blame] | 175 | // Predicates - List of predicates which will be turned into isel matching |
| 176 | // code. |
| 177 | list<Predicate> Predicates = []; |
| 178 | |
Evan Cheng | e6f3203 | 2006-07-19 00:24:41 +0000 | [diff] [blame] | 179 | // Code size. |
| 180 | int CodeSize = 0; |
| 181 | |
Evan Cheng | f5e1dc2 | 2006-04-19 20:38:28 +0000 | [diff] [blame] | 182 | // Added complexity passed onto matching pattern. |
| 183 | int AddedComplexity = 0; |
Evan Cheng | 5941320 | 2006-04-19 18:07:24 +0000 | [diff] [blame] | 184 | |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 185 | // These bits capture information about the high-level semantics of the |
| 186 | // instruction. |
Chris Lattner | 84c40c1 | 2003-07-29 23:02:49 +0000 | [diff] [blame] | 187 | bit isReturn = 0; // Is this instruction a return instruction? |
| 188 | bit isBranch = 0; // Is this instruction a branch instruction? |
Owen Anderson | 20ab290 | 2007-11-12 07:39:39 +0000 | [diff] [blame] | 189 | bit isIndirectBranch = 0; // Is this instruction an indirect branch? |
Chris Lattner | 2a809f6 | 2004-07-31 02:07:07 +0000 | [diff] [blame] | 190 | bit isBarrier = 0; // Can control flow fall through this instruction? |
Chris Lattner | 84c40c1 | 2003-07-29 23:02:49 +0000 | [diff] [blame] | 191 | bit isCall = 0; // Is this instruction a call instruction? |
Chris Lattner | 834f1ce | 2008-01-06 23:38:27 +0000 | [diff] [blame] | 192 | bit isSimpleLoad = 0; // Is this just a load instruction? |
Chris Lattner | f7c8db9 | 2008-01-07 23:16:55 +0000 | [diff] [blame] | 193 | bit mayLoad = 0; // Is it possible for this inst to read memory? |
| 194 | bit mayStore = 0; // Is it possible for this inst to write memory? |
Chris Lattner | 84c40c1 | 2003-07-29 23:02:49 +0000 | [diff] [blame] | 195 | bit isTwoAddress = 0; // Is this a two address instruction? |
Chris Lattner | 273f228 | 2005-01-02 02:27:48 +0000 | [diff] [blame] | 196 | bit isConvertibleToThreeAddress = 0; // Can this 2-addr instruction promote? |
| 197 | bit isCommutable = 0; // Is this 3 operand instruction commutable? |
Chris Lattner | 84c40c1 | 2003-07-29 23:02:49 +0000 | [diff] [blame] | 198 | bit isTerminator = 0; // Is this part of the terminator for a basic block? |
Dan Gohman | d45eddd | 2007-06-26 00:48:07 +0000 | [diff] [blame] | 199 | bit isReMaterializable = 0; // Is this instruction re-materializable? |
Evan Cheng | 064d7cd | 2007-05-16 20:47:01 +0000 | [diff] [blame] | 200 | bit isPredicable = 0; // Is this instruction predicable? |
Chris Lattner | 7baaf09 | 2004-09-28 18:34:14 +0000 | [diff] [blame] | 201 | bit hasDelaySlot = 0; // Does this instruction have an delay slot? |
Chris Lattner | e3cbf82 | 2005-08-26 20:55:40 +0000 | [diff] [blame] | 202 | bit usesCustomDAGSchedInserter = 0; // Pseudo instr needing special help. |
Evan Cheng | f8ac814 | 2005-12-04 08:13:17 +0000 | [diff] [blame] | 203 | bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains? |
Evan Cheng | eaa91b0 | 2007-06-19 01:26:51 +0000 | [diff] [blame] | 204 | bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction? |
Bill Wendling | 8370d38 | 2008-05-28 22:54:52 +0000 | [diff] [blame] | 205 | bit isAsCheapAsAMove = 0; // As cheap (or cheaper) than a move instruction. |
Bill Wendling | 6b1da9c | 2007-12-14 01:48:59 +0000 | [diff] [blame] | 206 | |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 207 | // Side effect flags - When set, the flags have these meanings: |
Bill Wendling | 7d9e97c | 2007-12-17 21:02:07 +0000 | [diff] [blame] | 208 | // |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 209 | // hasSideEffects - The instruction has side effects that are not |
| 210 | // captured by any operands of the instruction or other flags. |
Bill Wendling | 8370d38 | 2008-05-28 22:54:52 +0000 | [diff] [blame] | 211 | // |
Bill Wendling | 7d9e97c | 2007-12-17 21:02:07 +0000 | [diff] [blame] | 212 | // mayHaveSideEffects - Some instances of the instruction can have side |
| 213 | // effects. The virtual method "isReallySideEffectFree" is called to |
| 214 | // determine this. Load instructions are an example of where this is |
| 215 | // useful. In general, loads always have side effects. However, loads from |
| 216 | // constant pools don't. Individual back ends make this determination. |
Bill Wendling | 8370d38 | 2008-05-28 22:54:52 +0000 | [diff] [blame] | 217 | // |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 218 | // neverHasSideEffects - Set on an instruction with no pattern if it has no |
| 219 | // side effects. |
| 220 | bit hasSideEffects = 0; |
Bill Wendling | 7d9e97c | 2007-12-17 21:02:07 +0000 | [diff] [blame] | 221 | bit mayHaveSideEffects = 0; |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 222 | bit neverHasSideEffects = 0; |
Bill Wendling | 8370d38 | 2008-05-28 22:54:52 +0000 | [diff] [blame] | 223 | |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 224 | InstrItinClass Itinerary = NoItinerary;// Execution steps used for scheduling. |
Evan Cheng | 2f15c06 | 2006-11-01 00:26:27 +0000 | [diff] [blame] | 225 | |
Evan Cheng | e77d10d | 2007-01-12 07:25:16 +0000 | [diff] [blame] | 226 | string Constraints = ""; // OperandConstraint, e.g. $src = $dst. |
Chris Lattner | fa326c7 | 2006-11-15 22:55:04 +0000 | [diff] [blame] | 227 | |
| 228 | /// DisableEncoding - List of operand names (e.g. "$op1,$op2") that should not |
| 229 | /// be encoded into the output machineinstr. |
| 230 | string DisableEncoding = ""; |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 231 | } |
| 232 | |
Evan Cheng | 58e84a6 | 2005-12-14 22:02:59 +0000 | [diff] [blame] | 233 | /// Predicates - These are extra conditionals which are turned into instruction |
| 234 | /// selector matching code. Currently each predicate is just a string. |
| 235 | class Predicate<string cond> { |
| 236 | string CondString = cond; |
| 237 | } |
| 238 | |
Chris Lattner | a7ad3d1 | 2007-05-03 00:27:11 +0000 | [diff] [blame] | 239 | /// NoHonorSignDependentRounding - This predicate is true if support for |
| 240 | /// sign-dependent-rounding is not enabled. |
| 241 | def NoHonorSignDependentRounding |
| 242 | : Predicate<"!HonorSignDependentRoundingFPMath()">; |
| 243 | |
Evan Cheng | 58e84a6 | 2005-12-14 22:02:59 +0000 | [diff] [blame] | 244 | class Requires<list<Predicate> preds> { |
| 245 | list<Predicate> Predicates = preds; |
| 246 | } |
Chris Lattner | 3e77d6e | 2003-08-06 15:31:02 +0000 | [diff] [blame] | 247 | |
Chris Lattner | c139203 | 2004-08-01 04:40:43 +0000 | [diff] [blame] | 248 | /// ops definition - This is just a simple marker used to identify the operands |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 249 | /// list for an instruction. outs and ins are identical both syntatically and |
| 250 | /// semantically, they are used to define def operands and use operands to |
| 251 | /// improve readibility. This should be used like this: |
| 252 | /// (outs R32:$dst), (ins R32:$src1, R32:$src2) or something similar. |
Chris Lattner | c139203 | 2004-08-01 04:40:43 +0000 | [diff] [blame] | 253 | def ops; |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 254 | def outs; |
| 255 | def ins; |
Chris Lattner | 52d2f14 | 2004-08-11 01:53:34 +0000 | [diff] [blame] | 256 | |
Chris Lattner | 329cdc3 | 2005-08-18 23:17:07 +0000 | [diff] [blame] | 257 | /// variable_ops definition - Mark this instruction as taking a variable number |
| 258 | /// of operands. |
| 259 | def variable_ops; |
| 260 | |
Evan Cheng | ffd4364 | 2006-05-18 20:44:26 +0000 | [diff] [blame] | 261 | /// ptr_rc definition - Mark this operand as being a pointer value whose |
| 262 | /// register class is resolved dynamically via a callback to TargetInstrInfo. |
| 263 | /// FIXME: We should probably change this to a class which contain a list of |
| 264 | /// flags. But currently we have but one flag. |
| 265 | def ptr_rc; |
| 266 | |
Christopher Lamb | 1fab4a6 | 2008-03-11 10:09:17 +0000 | [diff] [blame] | 267 | /// unknown definition - Mark this operand as being of unknown type, causing |
| 268 | /// it to be resolved by inference in the context it is used. |
| 269 | def unknown; |
| 270 | |
Chris Lattner | 52d2f14 | 2004-08-11 01:53:34 +0000 | [diff] [blame] | 271 | /// Operand Types - These provide the built-in operand types that may be used |
| 272 | /// by a target. Targets can optionally provide their own operand types as |
| 273 | /// needed, though this should not be needed for RISC targets. |
| 274 | class Operand<ValueType ty> { |
Chris Lattner | 52d2f14 | 2004-08-11 01:53:34 +0000 | [diff] [blame] | 275 | ValueType Type = ty; |
| 276 | string PrintMethod = "printOperand"; |
Chris Lattner | be7a2ff | 2005-11-19 07:00:10 +0000 | [diff] [blame] | 277 | dag MIOperandInfo = (ops); |
Chris Lattner | 52d2f14 | 2004-08-11 01:53:34 +0000 | [diff] [blame] | 278 | } |
| 279 | |
Chris Lattner | fa14683 | 2004-08-15 05:37:00 +0000 | [diff] [blame] | 280 | def i1imm : Operand<i1>; |
Chris Lattner | 52d2f14 | 2004-08-11 01:53:34 +0000 | [diff] [blame] | 281 | def i8imm : Operand<i8>; |
| 282 | def i16imm : Operand<i16>; |
| 283 | def i32imm : Operand<i32>; |
| 284 | def i64imm : Operand<i64>; |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 285 | |
Nate Begeman | 0fec975 | 2008-02-14 07:25:46 +0000 | [diff] [blame] | 286 | def f32imm : Operand<f32>; |
| 287 | def f64imm : Operand<f64>; |
| 288 | |
Evan Cheng | 2aa133e | 2007-07-05 07:09:09 +0000 | [diff] [blame] | 289 | /// zero_reg definition - Special node to stand for the zero register. |
| 290 | /// |
| 291 | def zero_reg; |
Chris Lattner | 60a09a5 | 2006-11-03 23:52:18 +0000 | [diff] [blame] | 292 | |
| 293 | /// PredicateOperand - This can be used to define a predicate operand for an |
| 294 | /// instruction. OpTypes specifies the MIOperandInfo for the operand, and |
| 295 | /// AlwaysVal specifies the value of this predicate when set to "always |
Evan Cheng | 49ce02e | 2007-07-06 23:21:02 +0000 | [diff] [blame] | 296 | /// execute". |
Evan Cheng | 2aa133e | 2007-07-05 07:09:09 +0000 | [diff] [blame] | 297 | class PredicateOperand<ValueType ty, dag OpTypes, dag AlwaysVal> |
| 298 | : Operand<ty> { |
Chris Lattner | 60a09a5 | 2006-11-03 23:52:18 +0000 | [diff] [blame] | 299 | let MIOperandInfo = OpTypes; |
Evan Cheng | e496d78 | 2007-07-06 01:00:16 +0000 | [diff] [blame] | 300 | dag DefaultOps = AlwaysVal; |
Chris Lattner | 60a09a5 | 2006-11-03 23:52:18 +0000 | [diff] [blame] | 301 | } |
| 302 | |
Evan Cheng | e496d78 | 2007-07-06 01:00:16 +0000 | [diff] [blame] | 303 | /// OptionalDefOperand - This is used to define a optional definition operand |
| 304 | /// for an instruction. DefaultOps is the register the operand represents if none |
| 305 | /// is supplied, e.g. zero_reg. |
| 306 | class OptionalDefOperand<ValueType ty, dag OpTypes, dag defaultops> |
| 307 | : Operand<ty> { |
| 308 | let MIOperandInfo = OpTypes; |
| 309 | dag DefaultOps = defaultops; |
Evan Cheng | 2aa133e | 2007-07-05 07:09:09 +0000 | [diff] [blame] | 310 | } |
| 311 | |
Chris Lattner | 60a09a5 | 2006-11-03 23:52:18 +0000 | [diff] [blame] | 312 | |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 313 | // InstrInfo - This class should only be instantiated once to provide parameters |
| 314 | // which are global to the the target machine. |
| 315 | // |
| 316 | class InstrInfo { |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 317 | // If the target wants to associate some target-specific information with each |
| 318 | // instruction, it should provide these two lists to indicate how to assemble |
| 319 | // the target specific information into the 32 bits available. |
| 320 | // |
| 321 | list<string> TSFlagsFields = []; |
| 322 | list<int> TSFlagsShifts = []; |
Misha Brukman | 99ee67a | 2004-10-14 05:53:40 +0000 | [diff] [blame] | 323 | |
| 324 | // Target can specify its instructions in either big or little-endian formats. |
| 325 | // For instance, while both Sparc and PowerPC are big-endian platforms, the |
| 326 | // Sparc manual specifies its instructions in the format [31..0] (big), while |
| 327 | // PowerPC specifies them using the format [0..31] (little). |
| 328 | bit isLittleEndianEncoding = 0; |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 329 | } |
| 330 | |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 331 | // Standard Instructions. |
| 332 | def PHI : Instruction { |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 333 | let OutOperandList = (ops); |
| 334 | let InOperandList = (ops variable_ops); |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 335 | let AsmString = "PHINODE"; |
Chris Lattner | de321a8 | 2006-05-01 17:00:49 +0000 | [diff] [blame] | 336 | let Namespace = "TargetInstrInfo"; |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 337 | } |
| 338 | def INLINEASM : Instruction { |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 339 | let OutOperandList = (ops); |
| 340 | let InOperandList = (ops variable_ops); |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 341 | let AsmString = ""; |
Chris Lattner | de321a8 | 2006-05-01 17:00:49 +0000 | [diff] [blame] | 342 | let Namespace = "TargetInstrInfo"; |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 343 | } |
Dan Gohman | 4406604 | 2008-07-01 00:05:16 +0000 | [diff] [blame] | 344 | def DBG_LABEL : Instruction { |
Evan Cheng | 64d80e3 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 345 | let OutOperandList = (ops); |
Dan Gohman | 4406604 | 2008-07-01 00:05:16 +0000 | [diff] [blame] | 346 | let InOperandList = (ops i32imm:$id); |
| 347 | let AsmString = ""; |
| 348 | let Namespace = "TargetInstrInfo"; |
| 349 | let hasCtrlDep = 1; |
| 350 | } |
| 351 | def EH_LABEL : Instruction { |
| 352 | let OutOperandList = (ops); |
| 353 | let InOperandList = (ops i32imm:$id); |
| 354 | let AsmString = ""; |
| 355 | let Namespace = "TargetInstrInfo"; |
| 356 | let hasCtrlDep = 1; |
| 357 | } |
| 358 | def GC_LABEL : Instruction { |
| 359 | let OutOperandList = (ops); |
| 360 | let InOperandList = (ops i32imm:$id); |
Jim Laskey | 1ee2925 | 2007-01-26 14:34:52 +0000 | [diff] [blame] | 361 | let AsmString = ""; |
| 362 | let Namespace = "TargetInstrInfo"; |
| 363 | let hasCtrlDep = 1; |
| 364 | } |
Evan Cheng | a844bde | 2008-02-02 04:07:54 +0000 | [diff] [blame] | 365 | def DECLARE : Instruction { |
| 366 | let OutOperandList = (ops); |
| 367 | let InOperandList = (ops variable_ops); |
| 368 | let AsmString = ""; |
| 369 | let Namespace = "TargetInstrInfo"; |
| 370 | let hasCtrlDep = 1; |
| 371 | } |
Christopher Lamb | 08d5207 | 2007-07-26 07:48:21 +0000 | [diff] [blame] | 372 | def EXTRACT_SUBREG : Instruction { |
Christopher Lamb | 1fab4a6 | 2008-03-11 10:09:17 +0000 | [diff] [blame] | 373 | let OutOperandList = (ops unknown:$dst); |
| 374 | let InOperandList = (ops unknown:$supersrc, i32imm:$subidx); |
Christopher Lamb | 08d5207 | 2007-07-26 07:48:21 +0000 | [diff] [blame] | 375 | let AsmString = ""; |
| 376 | let Namespace = "TargetInstrInfo"; |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 377 | let neverHasSideEffects = 1; |
Christopher Lamb | 08d5207 | 2007-07-26 07:48:21 +0000 | [diff] [blame] | 378 | } |
| 379 | def INSERT_SUBREG : Instruction { |
Christopher Lamb | 1fab4a6 | 2008-03-11 10:09:17 +0000 | [diff] [blame] | 380 | let OutOperandList = (ops unknown:$dst); |
| 381 | let InOperandList = (ops unknown:$supersrc, unknown:$subsrc, i32imm:$subidx); |
Christopher Lamb | 08d5207 | 2007-07-26 07:48:21 +0000 | [diff] [blame] | 382 | let AsmString = ""; |
| 383 | let Namespace = "TargetInstrInfo"; |
Chris Lattner | ba7e756 | 2008-01-10 07:59:24 +0000 | [diff] [blame] | 384 | let neverHasSideEffects = 1; |
Christopher Lamb | c929823 | 2008-03-16 03:12:01 +0000 | [diff] [blame] | 385 | let Constraints = "$supersrc = $dst"; |
Christopher Lamb | 08d5207 | 2007-07-26 07:48:21 +0000 | [diff] [blame] | 386 | } |
Evan Cheng | da47e6e | 2008-03-15 00:03:38 +0000 | [diff] [blame] | 387 | def IMPLICIT_DEF : Instruction { |
| 388 | let OutOperandList = (ops unknown:$dst); |
| 389 | let InOperandList = (ops); |
| 390 | let AsmString = ""; |
| 391 | let Namespace = "TargetInstrInfo"; |
| 392 | let neverHasSideEffects = 1; |
Dan Gohman | e3b4c0e | 2008-09-09 18:25:28 +0000 | [diff] [blame] | 393 | let isReMaterializable = 1; |
| 394 | let isAsCheapAsAMove = 1; |
Evan Cheng | da47e6e | 2008-03-15 00:03:38 +0000 | [diff] [blame] | 395 | } |
Christopher Lamb | c929823 | 2008-03-16 03:12:01 +0000 | [diff] [blame] | 396 | def SUBREG_TO_REG : Instruction { |
| 397 | let OutOperandList = (ops unknown:$dst); |
| 398 | let InOperandList = (ops unknown:$implsrc, unknown:$subsrc, i32imm:$subidx); |
| 399 | let AsmString = ""; |
| 400 | let Namespace = "TargetInstrInfo"; |
| 401 | let neverHasSideEffects = 1; |
| 402 | } |
Chris Lattner | cedc6f4 | 2006-01-27 01:46:15 +0000 | [diff] [blame] | 403 | |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 404 | //===----------------------------------------------------------------------===// |
| 405 | // AsmWriter - This class can be implemented by targets that need to customize |
| 406 | // the format of the .s file writer. |
| 407 | // |
| 408 | // Subtargets can have multiple different asmwriters (e.g. AT&T vs Intel syntax |
| 409 | // on X86 for example). |
| 410 | // |
| 411 | class AsmWriter { |
| 412 | // AsmWriterClassName - This specifies the suffix to use for the asmwriter |
| 413 | // class. Generated AsmWriter classes are always prefixed with the target |
| 414 | // name. |
| 415 | string AsmWriterClassName = "AsmPrinter"; |
| 416 | |
| 417 | // InstFormatName - AsmWriters can specify the name of the format string to |
| 418 | // print instructions with. |
| 419 | string InstFormatName = "AsmString"; |
Chris Lattner | 0fa2066 | 2004-10-03 19:34:18 +0000 | [diff] [blame] | 420 | |
| 421 | // Variant - AsmWriters can be of multiple different variants. Variants are |
| 422 | // used to support targets that need to emit assembly code in ways that are |
| 423 | // mostly the same for different targets, but have minor differences in |
| 424 | // syntax. If the asmstring contains {|} characters in them, this integer |
| 425 | // will specify which alternative to use. For example "{x|y|z}" with Variant |
| 426 | // == 1, will expand to "y". |
| 427 | int Variant = 0; |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 428 | } |
| 429 | def DefaultAsmWriter : AsmWriter; |
| 430 | |
| 431 | |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 432 | //===----------------------------------------------------------------------===// |
| 433 | // Target - This class contains the "global" target information |
| 434 | // |
| 435 | class Target { |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 436 | // InstructionSet - Instruction set description for this target. |
Chris Lattner | a5100d9 | 2003-08-03 18:18:31 +0000 | [diff] [blame] | 437 | InstrInfo InstructionSet; |
Chris Lattner | 175580c | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 438 | |
Chris Lattner | 0fa2066 | 2004-10-03 19:34:18 +0000 | [diff] [blame] | 439 | // AssemblyWriters - The AsmWriter instances available for this target. |
| 440 | list<AsmWriter> AssemblyWriters = [DefaultAsmWriter]; |
Misha Brukman | 01c1638 | 2003-05-29 18:48:17 +0000 | [diff] [blame] | 441 | } |
Chris Lattner | 244883e | 2003-08-04 21:07:37 +0000 | [diff] [blame] | 442 | |
Chris Lattner | 244883e | 2003-08-04 21:07:37 +0000 | [diff] [blame] | 443 | //===----------------------------------------------------------------------===// |
Jim Laskey | 0de8796 | 2005-10-19 13:34:52 +0000 | [diff] [blame] | 444 | // SubtargetFeature - A characteristic of the chip set. |
| 445 | // |
Bill Wendling | 4222d80 | 2007-05-04 20:38:40 +0000 | [diff] [blame] | 446 | class SubtargetFeature<string n, string a, string v, string d, |
| 447 | list<SubtargetFeature> i = []> { |
Jim Laskey | 0de8796 | 2005-10-19 13:34:52 +0000 | [diff] [blame] | 448 | // Name - Feature name. Used by command line (-mattr=) to determine the |
| 449 | // appropriate target chip. |
| 450 | // |
| 451 | string Name = n; |
| 452 | |
Jim Laskey | f0c2be4 | 2005-10-26 17:28:23 +0000 | [diff] [blame] | 453 | // Attribute - Attribute to be set by feature. |
| 454 | // |
| 455 | string Attribute = a; |
| 456 | |
Evan Cheng | 19c9550 | 2006-01-27 08:09:42 +0000 | [diff] [blame] | 457 | // Value - Value the attribute to be set to by feature. |
| 458 | // |
| 459 | string Value = v; |
| 460 | |
Jim Laskey | 0de8796 | 2005-10-19 13:34:52 +0000 | [diff] [blame] | 461 | // Desc - Feature description. Used by command line (-mattr=) to display help |
| 462 | // information. |
| 463 | // |
| 464 | string Desc = d; |
Bill Wendling | 4222d80 | 2007-05-04 20:38:40 +0000 | [diff] [blame] | 465 | |
| 466 | // Implies - Features that this feature implies are present. If one of those |
| 467 | // features isn't set, then this one shouldn't be set either. |
| 468 | // |
| 469 | list<SubtargetFeature> Implies = i; |
Jim Laskey | 0de8796 | 2005-10-19 13:34:52 +0000 | [diff] [blame] | 470 | } |
| 471 | |
| 472 | //===----------------------------------------------------------------------===// |
| 473 | // Processor chip sets - These values represent each of the chip sets supported |
| 474 | // by the scheduler. Each Processor definition requires corresponding |
| 475 | // instruction itineraries. |
| 476 | // |
| 477 | class Processor<string n, ProcessorItineraries pi, list<SubtargetFeature> f> { |
| 478 | // Name - Chip set name. Used by command line (-mcpu=) to determine the |
| 479 | // appropriate target chip. |
| 480 | // |
| 481 | string Name = n; |
| 482 | |
| 483 | // ProcItin - The scheduling information for the target processor. |
| 484 | // |
| 485 | ProcessorItineraries ProcItin = pi; |
| 486 | |
| 487 | // Features - list of |
Jim Laskey | f5fc2cb | 2005-10-21 19:05:19 +0000 | [diff] [blame] | 488 | list<SubtargetFeature> Features = f; |
Jim Laskey | 0de8796 | 2005-10-19 13:34:52 +0000 | [diff] [blame] | 489 | } |
| 490 | |
| 491 | //===----------------------------------------------------------------------===// |
Chris Lattner | d637a8b | 2007-02-27 06:59:52 +0000 | [diff] [blame] | 492 | // Pull in the common support for calling conventions. |
| 493 | // |
| 494 | include "TargetCallingConv.td" |
| 495 | |
| 496 | //===----------------------------------------------------------------------===// |
| 497 | // Pull in the common support for DAG isel generation. |
Chris Lattner | 244883e | 2003-08-04 21:07:37 +0000 | [diff] [blame] | 498 | // |
Vladimir Prus | e438c2a | 2006-05-16 06:39:36 +0000 | [diff] [blame] | 499 | include "TargetSelectionDAG.td" |