blob: 0cdebcd7cd5c65f8273aa3dbedfbf47a391164fe [file] [log] [blame]
Chris Lattner8418e362003-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 Brukmanbb053ce2003-05-29 18:48:17 +00006//===----------------------------------------------------------------------===//
7
Chris Lattnere45b6992003-07-30 05:50:12 +00008
9//===----------------------------------------------------------------------===//
10//
Chris Lattner845ed842003-07-28 04:24:59 +000011// Value types - These values correspond to the register types defined in the
Chris Lattner6a561be2003-07-29 23:02:49 +000012// ValueTypes.h file.
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000013//
Chris Lattner75c817a2003-08-01 05:18:03 +000014class ValueType<int size> { string Namespace = "MVT"; int Size = size; }
Chris Lattnere45b6992003-07-30 05:50:12 +000015
Chris Lattner75c817a2003-08-01 05:18:03 +000016def i1 : ValueType<1>; // One bit boolean value
17def i8 : ValueType<8>; // 8-bit integer value
18def i16 : ValueType<16>; // 16-bit integer value
19def i32 : ValueType<32>; // 32-bit integer value
20def i64 : ValueType<64>; // 64-bit integer value
21def i128 : ValueType<128>; // 128-bit integer value
22def f32 : ValueType<32>; // 32-bit floating point value
23def f64 : ValueType<64>; // 64-bit floating point value
24def f80 : ValueType<80>; // 80-bit floating point value
25def f128 : ValueType<128>; // 128-bit floating point value
Chris Lattner845ed842003-07-28 04:24:59 +000026
Chris Lattnere45b6992003-07-30 05:50:12 +000027
28//===----------------------------------------------------------------------===//
29// Register file description - These classes are used to fill in the target
30// description classes in llvm/Target/MRegisterInfo.h
31
32
33// Register - You should define one instance of this class for each register in
34// the target machine.
35//
Misha Brukmanbb053ce2003-05-29 18:48:17 +000036class Register {
37 string Namespace = "";
Chris Lattner9c66ed82003-08-03 22:12:37 +000038 string Name = "";
39}
40
41// NamedReg - If the name for the 'def' of the register should not become the
42// "name" of the register, you can use this to specify a custom name instead.
43//
44class NamedReg<string n> : Register {
Chris Lattnercb7489c2003-08-04 04:58:12 +000045 let Name = n;
Misha Brukmanbb053ce2003-05-29 18:48:17 +000046}
47
Chris Lattnere45b6992003-07-30 05:50:12 +000048// RegisterAliases - You should define instances of this class to indicate which
49// registers in the register file are aliased together. This allows the code
50// generator to be careful not to put two values with overlapping live ranges
51// into registers which alias.
52//
53class RegisterAliases<Register reg, list<Register> aliases> {
54 Register Reg = reg;
55 list<Register> Aliases = aliases;
56}
57
58// RegisterClass - Now that all of the registers are defined, and aliases
59// between registers are defined, specify which registers belong to which
60// register classes. This also defines the default allocation order of
61// registers by register allocators.
62//
63class RegisterClass<ValueType regType, int alignment, list<Register> regList> {
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000064 // RegType - Specify the ValueType of the registers in this register class.
65 // Note that all registers in a register class must have the same ValueType.
66 //
Chris Lattnere45b6992003-07-30 05:50:12 +000067 ValueType RegType = regType;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000068
69 // Alignment - Specify the alignment required of the registers when they are
70 // stored or loaded to memory.
71 //
Chris Lattner75c817a2003-08-01 05:18:03 +000072 int Size = RegType.Size;
Chris Lattnere45b6992003-07-30 05:50:12 +000073 int Alignment = alignment;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000074
75 // MemberList - Specify which registers are in this class. If the
76 // allocation_order_* method are not specified, this also defines the order of
77 // allocation used by the register allocator.
78 //
Chris Lattnere45b6992003-07-30 05:50:12 +000079 list<Register> MemberList = regList;
Chris Lattner2b3ac6b2003-07-30 22:16:41 +000080
Chris Lattnerd20486a2003-08-01 22:21:49 +000081 // Methods - This member can be used to insert arbitrary code into a generated
82 // register class. The normal usage of this is to overload virtual methods.
83 code Methods = [{}];
Chris Lattnere45b6992003-07-30 05:50:12 +000084}
85
86
87//===----------------------------------------------------------------------===//
Chris Lattner6a7439f2003-08-03 18:18:31 +000088// Instruction set description - These classes correspond to the C++ classes in
89// the Target/TargetInstrInfo.h file.
Chris Lattnere45b6992003-07-30 05:50:12 +000090//
91
Misha Brukmanbb053ce2003-05-29 18:48:17 +000092class Instruction {
93 string Name; // The opcode string for this instruction
94 string Namespace = "";
95
96 list<Register> Uses = []; // Default to using no non-operand registers
97 list<Register> Defs = []; // Default to modifying no non-operand registers
98
99 // These bits capture information about the high-level semantics of the
100 // instruction.
Chris Lattner6a561be2003-07-29 23:02:49 +0000101 bit isReturn = 0; // Is this instruction a return instruction?
102 bit isBranch = 0; // Is this instruction a branch instruction?
103 bit isCall = 0; // Is this instruction a call instruction?
104 bit isTwoAddress = 0; // Is this a two address instruction?
105 bit isTerminator = 0; // Is this part of the terminator for a basic block?
Chris Lattner0d74deb2003-08-04 21:07:37 +0000106
107 // Pattern - Set to the DAG pattern for this instruction, if we know of one,
108 // otherwise, uninitialized.
109 dag Pattern;
Chris Lattner6a7439f2003-08-03 18:18:31 +0000110}
111
112// InstrInfo - This class should only be instantiated once to provide parameters
113// which are global to the the target machine.
114//
115class InstrInfo {
116 Instruction PHIInst;
Chris Lattner6c8a4082003-08-03 21:52:28 +0000117
118 // If the target wants to associate some target-specific information with each
119 // instruction, it should provide these two lists to indicate how to assemble
120 // the target specific information into the 32 bits available.
121 //
122 list<string> TSFlagsFields = [];
123 list<int> TSFlagsShifts = [];
Chris Lattner6a7439f2003-08-03 18:18:31 +0000124}
125
126
127//===----------------------------------------------------------------------===//
128// Target - This class contains the "global" target information
129//
130class Target {
131 // CalleeSavedRegisters - As you might guess, this is a list of the callee
132 // saved registers for a target.
133 list<Register> CalleeSavedRegisters = [];
134
135 // PointerType - Specify the value type to be used to represent pointers in
136 // this target. Typically this is an i32 or i64 type.
137 ValueType PointerType;
138
139 // InstructionSet - Instruction set description for this target
140 InstrInfo InstructionSet;
Misha Brukmanbb053ce2003-05-29 18:48:17 +0000141}
Chris Lattner0d74deb2003-08-04 21:07:37 +0000142
143
144//===----------------------------------------------------------------------===//
145// DAG node definitions used by the instruction selector...
146//
147def set; // FIXME: these are subject to substantial change
148def plus;
149def minus;
150def mult;
151def div;
152def udiv;
153def mod;
154def umod;
155def imm8;
156def imm16;
157def imm32;