Atomic op support. If any gcc test uses __sync builtins, it might start failing...
[oota-llvm.git] / include / llvm / Target / TargetInstrDesc.h
1 //===-- llvm/Target/TargetInstrDesc.h - Instruction Descriptors -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the TargetOperandInfo and TargetInstrDesc classes, which
11 // are used to describe target instructions and their operands. 
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_TARGET_TARGETINSTRDESC_H
16 #define LLVM_TARGET_TARGETINSTRDESC_H
17
18 #include <cassert>
19
20 namespace llvm {
21
22 //===----------------------------------------------------------------------===//
23 // Machine Operand Flags and Description
24 //===----------------------------------------------------------------------===//
25   
26 namespace TOI {
27   // Operand constraints: only "tied_to" for now.
28   enum OperandConstraint {
29     TIED_TO = 0  // Must be allocated the same register as.
30   };
31   
32   /// OperandFlags - These are flags set on operands, but should be considered
33   /// private, all access should go through the TargetOperandInfo accessors.
34   /// See the accessors for a description of what these are.
35   enum OperandFlags {
36     LookupPtrRegClass = 0,
37     Predicate,
38     OptionalDef
39   };
40 }
41
42 /// TargetOperandInfo - This holds information about one operand of a machine
43 /// instruction, indicating the register class for register operands, etc.
44 ///
45 class TargetOperandInfo {
46 public:
47   /// RegClass - This specifies the register class enumeration of the operand 
48   /// if the operand is a register.  If not, this contains 0.
49   unsigned short RegClass;
50   unsigned short Flags;
51   /// Lower 16 bits are used to specify which constraints are set. The higher 16
52   /// bits are used to specify the value of constraints (4 bits each).
53   unsigned int Constraints;
54   /// Currently no other information.
55   
56   /// isLookupPtrRegClass - Set if this operand is a pointer value and it
57   /// requires a callback to look up its register class.
58   bool isLookupPtrRegClass() const { return Flags&(1 <<TOI::LookupPtrRegClass);}
59   
60   /// isPredicate - Set if this is one of the operands that made up of
61   /// the predicate operand that controls an isPredicable() instruction.
62   bool isPredicate() const { return Flags & (1 << TOI::Predicate); }
63   
64   /// isOptionalDef - Set if this operand is a optional def.
65   ///
66   bool isOptionalDef() const { return Flags & (1 << TOI::OptionalDef); }
67 };
68
69   
70 //===----------------------------------------------------------------------===//
71 // Machine Instruction Flags and Description
72 //===----------------------------------------------------------------------===//
73
74 /// TargetInstrDesc flags - These should be considered private to the
75 /// implementation of the TargetInstrDesc class.  Clients should use the
76 /// predicate methods on TargetInstrDesc, not use these directly.  These
77 /// all correspond to bitfields in the TargetInstrDesc::Flags field.
78 namespace TID {
79   enum {
80     Variadic = 0,
81     HasOptionalDef,
82     Return,
83     Call,
84     ImplicitDef,
85     Barrier,
86     Terminator,
87     Branch,
88     IndirectBranch,
89     Predicable,
90     NotDuplicable,
91     DelaySlot,
92     SimpleLoad,
93     MayLoad,
94     MayStore,
95     UnmodeledSideEffects,
96     Commutable,
97     ConvertibleTo3Addr,
98     UsesCustomDAGSchedInserter,
99     Rematerializable
100   };
101 }
102
103 /// TargetInstrDesc - Describe properties that are true of each
104 /// instruction in the target description file.  This captures information about
105 /// side effects, register use and many other things.  There is one instance of
106 /// this struct for each target instruction class, and the MachineInstr class
107 /// points to this struct directly to describe itself.
108 class TargetInstrDesc {
109 public:
110   unsigned short  Opcode;        // The opcode number.
111   unsigned short  NumOperands;   // Num of args (may be more if variable_ops)
112   unsigned short  NumDefs;       // Num of args that are definitions.
113   unsigned short  SchedClass;    // enum identifying instr sched class
114   const char *    Name;          // Name of the instruction record in td file.
115   unsigned        Flags;         // flags identifying machine instr class
116   unsigned        TSFlags;       // Target Specific Flag values
117   const unsigned *ImplicitUses;  // Registers implicitly read by this instr
118   const unsigned *ImplicitDefs;  // Registers implicitly defined by this instr
119   const TargetOperandInfo *OpInfo; // 'NumOperands' entries about operands.
120
121   /// getOperandConstraint - Returns the value of the specific constraint if
122   /// it is set. Returns -1 if it is not set.
123   int getOperandConstraint(unsigned OpNum,
124                            TOI::OperandConstraint Constraint) const {
125     assert((OpNum < NumOperands || isVariadic()) &&
126            "Invalid operand # of TargetInstrInfo");
127     if (OpNum < NumOperands &&
128         (OpInfo[OpNum].Constraints & (1 << Constraint))) {
129       unsigned Pos = 16 + Constraint * 4;
130       return (int)(OpInfo[OpNum].Constraints >> Pos) & 0xf;
131     }
132     return -1;
133   }
134
135   /// findTiedToSrcOperand - Returns the operand that is tied to the specified
136   /// dest operand. Returns -1 if there isn't one.
137   int findTiedToSrcOperand(unsigned OpNum) const;
138   
139   /// getOpcode - Return the opcode number for this descriptor.
140   unsigned getOpcode() const {
141     return Opcode;
142   }
143   
144   /// getName - Return the name of the record in the .td file for this
145   /// instruction, for example "ADD8ri".
146   const char *getName() const {
147     return Name;
148   }
149   
150   /// getNumOperands - Return the number of declared MachineOperands for this
151   /// MachineInstruction.  Note that variadic (isVariadic() returns true)
152   /// instructions may have additional operands at the end of the list, and note
153   /// that the machine instruction may include implicit register def/uses as
154   /// well.
155   unsigned getNumOperands() const {
156     return NumOperands;
157   }
158   
159   /// getNumDefs - Return the number of MachineOperands that are register
160   /// definitions.  Register definitions always occur at the start of the 
161   /// machine operand list.  This is the number of "outs" in the .td file.
162   unsigned getNumDefs() const {
163     return NumDefs;
164   }
165   
166   /// isVariadic - Return true if this instruction can have a variable number of
167   /// operands.  In this case, the variable operands will be after the normal
168   /// operands but before the implicit definitions and uses (if any are
169   /// present).
170   bool isVariadic() const {
171     return Flags & (1 << TID::Variadic);
172   }
173   
174   /// hasOptionalDef - Set if this instruction has an optional definition, e.g.
175   /// ARM instructions which can set condition code if 's' bit is set.
176   bool hasOptionalDef() const {
177     return Flags & (1 << TID::HasOptionalDef);
178   }
179   
180   /// getImplicitUses - Return a list of machine operands that are potentially
181   /// read by any instance of this machine instruction.  For example, on X86,
182   /// the "adc" instruction adds two register operands and adds the carry bit in
183   /// from the flags register.  In this case, the instruction is marked as
184   /// implicitly reading the flags.  Likewise, the variable shift instruction on
185   /// X86 is marked as implicitly reading the 'CL' register, which it always
186   /// does.
187   ///
188   /// This method returns null if the instruction has no implicit uses.
189   const unsigned *getImplicitUses() const {
190     return ImplicitUses;
191   }
192   
193   /// getImplicitDefs - Return a list of machine operands that are potentially
194   /// written by any instance of this machine instruction.  For example, on X86,
195   /// many instructions implicitly set the flags register.  In this case, they
196   /// are marked as setting the FLAGS.  Likewise, many instructions always
197   /// deposit their result in a physical register.  For example, the X86 divide
198   /// instruction always deposits the quotient and remainder in the EAX/EDX
199   /// registers.  For that instruction, this will return a list containing the
200   /// EAX/EDX/EFLAGS registers.
201   ///
202   /// This method returns null if the instruction has no implicit uses.
203   const unsigned *getImplicitDefs() const {
204     return ImplicitDefs;
205   }
206
207   /// getSchedClass - Return the scheduling class for this instruction.  The
208   /// scheduling class is an index into the InstrItineraryData table.  This
209   /// returns zero if there is no known scheduling information for the
210   /// instruction.
211   ///
212   unsigned getSchedClass() const {
213     return SchedClass;
214   }
215   
216   bool isReturn() const {
217     return Flags & (1 << TID::Return);
218   }
219   
220   bool isCall() const {
221     return Flags & (1 << TID::Call);
222   }
223   
224   /// isImplicitDef - Return true if this is an "IMPLICIT_DEF" instruction,
225   /// which defines a register to an unspecified value.  These basically
226   /// correspond to x = undef.
227   bool isImplicitDef() const {
228     return Flags & (1 << TID::ImplicitDef);
229   }
230   
231   /// isBarrier - Returns true if the specified instruction stops control flow
232   /// from executing the instruction immediately following it.  Examples include
233   /// unconditional branches and return instructions.
234   bool isBarrier() const {
235     return Flags & (1 << TID::Barrier);
236   }
237   
238   /// isTerminator - Returns true if this instruction part of the terminator for
239   /// a basic block.  Typically this is things like return and branch
240   /// instructions.
241   ///
242   /// Various passes use this to insert code into the bottom of a basic block,
243   /// but before control flow occurs.
244   bool isTerminator() const {
245     return Flags & (1 << TID::Terminator);
246   }
247   
248   /// isBranch - Returns true if this is a conditional, unconditional, or
249   /// indirect branch.  Predicates below can be used to discriminate between
250   /// these cases, and the TargetInstrInfo::AnalyzeBranch method can be used to
251   /// get more information.
252   bool isBranch() const {
253     return Flags & (1 << TID::Branch);
254   }
255
256   /// isIndirectBranch - Return true if this is an indirect branch, such as a
257   /// branch through a register.
258   bool isIndirectBranch() const {
259     return Flags & (1 << TID::IndirectBranch);
260   }
261   
262   /// isConditionalBranch - Return true if this is a branch which may fall
263   /// through to the next instruction or may transfer control flow to some other
264   /// block.  The TargetInstrInfo::AnalyzeBranch method can be used to get more
265   /// information about this branch.
266   bool isConditionalBranch() const {
267     return isBranch() & !isBarrier() & !isIndirectBranch();
268   }
269   
270   /// isUnconditionalBranch - Return true if this is a branch which always
271   /// transfers control flow to some other block.  The
272   /// TargetInstrInfo::AnalyzeBranch method can be used to get more information
273   /// about this branch.
274   bool isUnconditionalBranch() const {
275     return isBranch() & isBarrier() & !isIndirectBranch();
276   }
277   
278   // isPredicable - Return true if this instruction has a predicate operand that
279   // controls execution.  It may be set to 'always', or may be set to other
280   /// values.   There are various methods in TargetInstrInfo that can be used to
281   /// control and modify the predicate in this instruction.
282   bool isPredicable() const {
283     return Flags & (1 << TID::Predicable);
284   }
285   
286   /// isNotDuplicable - Return true if this instruction cannot be safely
287   /// duplicated.  For example, if the instruction has a unique labels attached
288   /// to it, duplicating it would cause multiple definition errors.
289   bool isNotDuplicable() const {
290     return Flags & (1 << TID::NotDuplicable);
291   }
292   
293   /// hasDelaySlot - Returns true if the specified instruction has a delay slot
294   /// which must be filled by the code generator.
295   bool hasDelaySlot() const {
296     return Flags & (1 << TID::DelaySlot);
297   }
298   
299   /// isSimpleLoad - Return true for instructions that are simple loads from
300   /// memory.  This should only be set on instructions that load a value from
301   /// memory and return it in their only virtual register definition.
302   /// Instructions that return a value loaded from memory and then modified in
303   /// some way should not return true for this.
304   bool isSimpleLoad() const {
305     return Flags & (1 << TID::SimpleLoad);
306   }
307   
308   //===--------------------------------------------------------------------===//
309   // Side Effect Analysis
310   //===--------------------------------------------------------------------===//
311
312   /// mayLoad - Return true if this instruction could possibly read memory.
313   /// Instructions with this flag set are not necessarily simple load
314   /// instructions, they may load a value and modify it, for example.
315   bool mayLoad() const {
316     return Flags & (1 << TID::MayLoad);
317   }
318   
319   
320   /// mayStore - Return true if this instruction could possibly modify memory.
321   /// Instructions with this flag set are not necessarily simple store
322   /// instructions, they may store a modified value based on their operands, or
323   /// may not actually modify anything, for example.
324   bool mayStore() const {
325     return Flags & (1 << TID::MayStore);
326   }
327   
328   /// hasUnmodeledSideEffects - Return true if this instruction has side
329   /// effects that are not modeled by other flags.  This does not return true
330   /// for instructions whose effects are captured by:
331   ///
332   ///  1. Their operand list and implicit definition/use list.  Register use/def
333   ///     info is explicit for instructions.
334   ///  2. Memory accesses.  Use mayLoad/mayStore.
335   ///  3. Calling, branching, returning: use isCall/isReturn/isBranch.
336   ///
337   /// Examples of side effects would be modifying 'invisible' machine state like
338   /// a control register, flushing a cache, modifying a register invisible to
339   /// LLVM, etc.
340   ///
341   bool hasUnmodeledSideEffects() const {
342     return Flags & (1 << TID::UnmodeledSideEffects);
343   }
344   
345   //===--------------------------------------------------------------------===//
346   // Flags that indicate whether an instruction can be modified by a method.
347   //===--------------------------------------------------------------------===//
348   
349   /// isCommutable - Return true if this may be a 2- or 3-address
350   /// instruction (of the form "X = op Y, Z, ..."), which produces the same
351   /// result if Y and Z are exchanged.  If this flag is set, then the 
352   /// TargetInstrInfo::commuteInstruction method may be used to hack on the
353   /// instruction.
354   ///
355   /// Note that this flag may be set on instructions that are only commutable
356   /// sometimes.  In these cases, the call to commuteInstruction will fail.
357   /// Also note that some instructions require non-trivial modification to
358   /// commute them.
359   bool isCommutable() const {
360     return Flags & (1 << TID::Commutable);
361   }
362   
363   /// isConvertibleTo3Addr - Return true if this is a 2-address instruction
364   /// which can be changed into a 3-address instruction if needed.  Doing this
365   /// transformation can be profitable in the register allocator, because it
366   /// means that the instruction can use a 2-address form if possible, but
367   /// degrade into a less efficient form if the source and dest register cannot
368   /// be assigned to the same register.  For example, this allows the x86
369   /// backend to turn a "shl reg, 3" instruction into an LEA instruction, which
370   /// is the same speed as the shift but has bigger code size.
371   ///
372   /// If this returns true, then the target must implement the
373   /// TargetInstrInfo::convertToThreeAddress method for this instruction, which
374   /// is allowed to fail if the transformation isn't valid for this specific
375   /// instruction (e.g. shl reg, 4 on x86).
376   ///
377   bool isConvertibleTo3Addr() const {
378     return Flags & (1 << TID::ConvertibleTo3Addr);
379   }
380   
381   /// usesCustomDAGSchedInsertionHook - Return true if this instruction requires
382   /// custom insertion support when the DAG scheduler is inserting it into a
383   /// machine basic block.  If this is true for the instruction, it basically
384   /// means that it is a pseudo instruction used at SelectionDAG time that is 
385   /// expanded out into magic code by the target when MachineInstrs are formed.
386   ///
387   /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method
388   /// is used to insert this into the MachineBasicBlock.
389   bool usesCustomDAGSchedInsertionHook() const {
390     return Flags & (1 << TID::UsesCustomDAGSchedInserter);
391   }
392   
393   /// isRematerializable - Returns true if this instruction is a candidate for
394   /// remat.  This flag is deprecated, please don't use it anymore.  If this
395   /// flag is set, the isReallyTriviallyReMaterializable() method is called to
396   /// verify the instruction is really rematable.
397   bool isRematerializable() const {
398     return Flags & (1 << TID::Rematerializable);
399   }
400 };
401
402 } // end namespace llvm
403
404 #endif