Adding the MicroBlaze backend.
[oota-llvm.git] / lib / Target / MBlaze / MBlazeRegisterInfo.td
1 //===- MBlazeRegisterInfo.td - MBlaze Register defs -------------*- 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 //===----------------------------------------------------------------------===//
11 //  Declarations that describe the MicroBlaze register file
12 //===----------------------------------------------------------------------===//
13
14 // We have banks of 32 registers each.
15 class MBlazeReg<string n> : Register<n> {
16   field bits<5> Num;
17   let Namespace = "MBlaze";
18 }
19
20 class MBlazeRegWithSubRegs<string n, list<Register> subregs>
21   : RegisterWithSubRegs<n, subregs> {
22   field bits<5> Num;
23   let Namespace = "MBlaze";
24 }
25
26 // MBlaze CPU Registers
27 class MBlazeGPRReg<bits<5> num, string n> : MBlazeReg<n> {
28   let Num = num;
29 }
30
31 // MBlaze 32-bit (aliased) FPU Registers
32 class FPR<bits<5> num, string n, list<Register> subregs>
33   : MBlazeRegWithSubRegs<n, subregs> {
34   let Num = num;
35 }
36
37 //===----------------------------------------------------------------------===//
38 //  Registers
39 //===----------------------------------------------------------------------===//
40
41 let Namespace = "MBlaze" in {
42
43   // General Purpose Registers
44   def R0  : MBlazeGPRReg< 0,  "r0">,   DwarfRegNum<[0]>;
45   def R1  : MBlazeGPRReg< 1,  "r1">,   DwarfRegNum<[1]>;
46   def R2  : MBlazeGPRReg< 2,  "r2">,   DwarfRegNum<[2]>;
47   def R3  : MBlazeGPRReg< 3,  "r3">,   DwarfRegNum<[3]>;
48   def R4  : MBlazeGPRReg< 4,  "r4">,   DwarfRegNum<[5]>;
49   def R5  : MBlazeGPRReg< 5,  "r5">,   DwarfRegNum<[5]>;
50   def R6  : MBlazeGPRReg< 6,  "r6">,   DwarfRegNum<[6]>;
51   def R7  : MBlazeGPRReg< 7,  "r7">,   DwarfRegNum<[7]>;
52   def R8  : MBlazeGPRReg< 8,  "r8">,   DwarfRegNum<[8]>;
53   def R9  : MBlazeGPRReg< 9,  "r9">,   DwarfRegNum<[9]>;
54   def R10 : MBlazeGPRReg< 10, "r10">,  DwarfRegNum<[10]>;
55   def R11 : MBlazeGPRReg< 11, "r11">,  DwarfRegNum<[11]>;
56   def R12 : MBlazeGPRReg< 12, "r12">,  DwarfRegNum<[12]>;
57   def R13 : MBlazeGPRReg< 13, "r13">,  DwarfRegNum<[13]>;
58   def R14 : MBlazeGPRReg< 14, "r14">,  DwarfRegNum<[14]>;
59   def R15 : MBlazeGPRReg< 15, "r15">,  DwarfRegNum<[15]>;
60   def R16 : MBlazeGPRReg< 16, "r16">,  DwarfRegNum<[16]>;
61   def R17 : MBlazeGPRReg< 17, "r17">,  DwarfRegNum<[17]>;
62   def R18 : MBlazeGPRReg< 18, "r18">,  DwarfRegNum<[18]>;
63   def R19 : MBlazeGPRReg< 19, "r19">,  DwarfRegNum<[19]>;
64   def R20 : MBlazeGPRReg< 20, "r20">,  DwarfRegNum<[20]>;
65   def R21 : MBlazeGPRReg< 21, "r21">,  DwarfRegNum<[21]>;
66   def R22 : MBlazeGPRReg< 22, "r22">,  DwarfRegNum<[22]>;
67   def R23 : MBlazeGPRReg< 23, "r23">,  DwarfRegNum<[23]>;
68   def R24 : MBlazeGPRReg< 24, "r24">,  DwarfRegNum<[24]>;
69   def R25 : MBlazeGPRReg< 25, "r25">,  DwarfRegNum<[25]>;
70   def R26 : MBlazeGPRReg< 26, "r26">,  DwarfRegNum<[26]>;
71   def R27 : MBlazeGPRReg< 27, "r27">,  DwarfRegNum<[27]>;
72   def R28 : MBlazeGPRReg< 28, "r28">,  DwarfRegNum<[28]>;
73   def R29 : MBlazeGPRReg< 29, "r29">,  DwarfRegNum<[29]>;
74   def R30 : MBlazeGPRReg< 30, "r30">,  DwarfRegNum<[30]>;
75   def R31 : MBlazeGPRReg< 31, "r31">,  DwarfRegNum<[31]>;
76
77   /// MBlaze Single point precision FPU Registers
78   def F0  : FPR< 0,  "r0", [R0]>,  DwarfRegNum<[32]>;
79   def F1  : FPR< 1,  "r1", [R1]>,  DwarfRegNum<[33]>;
80   def F2  : FPR< 2,  "r2", [R2]>,  DwarfRegNum<[34]>;
81   def F3  : FPR< 3,  "r3", [R3]>,  DwarfRegNum<[35]>;
82   def F4  : FPR< 4,  "r4", [R4]>,  DwarfRegNum<[36]>;
83   def F5  : FPR< 5,  "r5", [R5]>,  DwarfRegNum<[37]>;
84   def F6  : FPR< 6,  "r6", [R6]>,  DwarfRegNum<[38]>;
85   def F7  : FPR< 7,  "r7", [R7]>,  DwarfRegNum<[39]>;
86   def F8  : FPR< 8,  "r8", [R8]>,  DwarfRegNum<[40]>;
87   def F9  : FPR< 9,  "r9", [R9]>,  DwarfRegNum<[41]>;
88   def F10 : FPR<10, "r10", [R10]>, DwarfRegNum<[42]>;
89   def F11 : FPR<11, "r11", [R11]>, DwarfRegNum<[43]>;
90   def F12 : FPR<12, "r12", [R12]>, DwarfRegNum<[44]>;
91   def F13 : FPR<13, "r13", [R13]>, DwarfRegNum<[45]>;
92   def F14 : FPR<14, "r14", [R14]>, DwarfRegNum<[46]>;
93   def F15 : FPR<15, "r15", [R15]>, DwarfRegNum<[47]>;
94   def F16 : FPR<16, "r16", [R16]>, DwarfRegNum<[48]>;
95   def F17 : FPR<17, "r17", [R17]>, DwarfRegNum<[49]>;
96   def F18 : FPR<18, "r18", [R18]>, DwarfRegNum<[50]>;
97   def F19 : FPR<19, "r19", [R19]>, DwarfRegNum<[51]>;
98   def F20 : FPR<20, "r20", [R20]>, DwarfRegNum<[52]>;
99   def F21 : FPR<21, "r21", [R21]>, DwarfRegNum<[53]>;
100   def F22 : FPR<22, "r22", [R22]>, DwarfRegNum<[54]>;
101   def F23 : FPR<23, "r23", [R23]>, DwarfRegNum<[55]>;
102   def F24 : FPR<24, "r24", [R24]>, DwarfRegNum<[56]>;
103   def F25 : FPR<25, "r25", [R25]>, DwarfRegNum<[57]>;
104   def F26 : FPR<26, "r26", [R26]>, DwarfRegNum<[58]>;
105   def F27 : FPR<27, "r27", [R27]>, DwarfRegNum<[59]>;
106   def F28 : FPR<28, "r28", [R28]>, DwarfRegNum<[60]>;
107   def F29 : FPR<29, "r29", [R29]>, DwarfRegNum<[61]>;
108   def F30 : FPR<30, "r30", [R30]>, DwarfRegNum<[62]>;
109   def F31 : FPR<31, "r31", [R31]>, DwarfRegNum<[63]>;
110 }
111
112 //===----------------------------------------------------------------------===//
113 // Register Classes
114 //===----------------------------------------------------------------------===//
115
116 def CPURegs : RegisterClass<"MBlaze", [i32], 32,
117   [
118   // Return Values and Arguments
119   R3, R4, R5, R6, R7, R8, R9, R10,
120
121   // Not preserved across procedure calls
122   R11, R12,
123
124   // Callee save
125   R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
126
127   // Reserved
128   R0,  // Always zero
129   R1,  // The stack pointer
130   R2,  // Read-only small data area anchor
131   R13, // Read-write small data area anchor
132   R14, // Return address for interrupts
133   R15, // Return address for sub-routines
134   R16, // Return address for trap
135   R17, // Return address for exceptions
136   R18, // Reserved for assembler
137   R19  // The frame-pointer
138   ]>
139 {
140   let MethodProtos = [{
141     iterator allocation_order_end(const MachineFunction &MF) const;
142   }];
143   let MethodBodies = [{
144     CPURegsClass::iterator
145     CPURegsClass::allocation_order_end(const MachineFunction &MF) const {
146       // The last 10 registers on the list above are reserved
147       return end()-10;
148     }
149   }];
150 }
151
152 def FGR32 : RegisterClass<"MBlaze", [f32], 32,
153   [
154   // Return Values and Arguments
155   F3, F4, F5, F6, F7, F8, F9, F10,
156
157   // Not preserved across procedure calls
158   F11, F12,
159
160   // Callee save
161   F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31,
162
163   // Reserved
164   F0,  // Always zero
165   F1,  // The stack pointer
166   F2,  // Read-only small data area anchor
167   F13, // Read-write small data area anchor
168   F14, // Return address for interrupts
169   F15, // Return address for sub-routines
170   F16, // Return address for trap
171   F17, // Return address for exceptions
172   F18, // Reserved for assembler
173   F19  // The frame pointer
174   ]>
175 {
176   let MethodProtos = [{
177     iterator allocation_order_end(const MachineFunction &MF) const;
178   }];
179   let MethodBodies = [{
180     FGR32Class::iterator
181     FGR32Class::allocation_order_end(const MachineFunction &MF) const {
182       // The last 10 registers on the list above are reserved
183       return end()-10;
184     }
185   }];
186 }