Revert 95130.
[oota-llvm.git] / lib / Target / MSP430 / MSP430RegisterInfo.td
1 //===- MSP430RegisterInfo.td - MSP430 Register defs ----------*- tblgen -*-===//
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 MSP430 register file
12 //===----------------------------------------------------------------------===//
13
14 class MSP430Reg<bits<4> num, string n> : Register<n> {
15   field bits<4> Num = num;
16   let Namespace = "MSP430";
17 }
18
19 class MSP430RegWithSubregs<bits<4> num, string n, list<Register> subregs> 
20   : RegisterWithSubRegs<n, subregs> {
21   field bits<4> Num = num;
22   let Namespace = "MSP430";
23 }
24
25 //===----------------------------------------------------------------------===//
26 //  Registers
27 //===----------------------------------------------------------------------===//
28
29 def PCB  : MSP430Reg<0,  "r0">;
30 def SPB  : MSP430Reg<1,  "r1">;
31 def SRB  : MSP430Reg<2,  "r2">;
32 def CGB  : MSP430Reg<3,  "r3">;
33 def FPB  : MSP430Reg<4,  "r4">;
34 def R5B  : MSP430Reg<5,  "r5">;
35 def R6B  : MSP430Reg<6,  "r6">;
36 def R7B  : MSP430Reg<7,  "r7">;
37 def R8B  : MSP430Reg<8,  "r8">;
38 def R9B  : MSP430Reg<9,  "r9">;
39 def R10B : MSP430Reg<10, "r10">;
40 def R11B : MSP430Reg<11, "r11">;
41 def R12B : MSP430Reg<12, "r12">;
42 def R13B : MSP430Reg<13, "r13">;
43 def R14B : MSP430Reg<14, "r14">;
44 def R15B : MSP430Reg<15, "r15">;
45
46 def PCW  : MSP430RegWithSubregs<0,  "r0",  [PCB]>;
47 def SPW  : MSP430RegWithSubregs<1,  "r1",  [SPB]>;
48 def SRW  : MSP430RegWithSubregs<2,  "r2",  [SRB]>;
49 def CGW  : MSP430RegWithSubregs<3,  "r3",  [CGB]>;
50 def FPW  : MSP430RegWithSubregs<4,  "r4",  [FPB]>;
51 def R5W  : MSP430RegWithSubregs<5,  "r5",  [R5B]>;
52 def R6W  : MSP430RegWithSubregs<6,  "r6",  [R6B]>;
53 def R7W  : MSP430RegWithSubregs<7,  "r7",  [R7B]>;
54 def R8W  : MSP430RegWithSubregs<8,  "r8",  [R8B]>;
55 def R9W  : MSP430RegWithSubregs<9,  "r9",  [R9B]>;
56 def R10W : MSP430RegWithSubregs<10, "r10", [R10B]>;
57 def R11W : MSP430RegWithSubregs<11, "r11", [R11B]>;
58 def R12W : MSP430RegWithSubregs<12, "r12", [R12B]>;
59 def R13W : MSP430RegWithSubregs<13, "r13", [R13B]>;
60 def R14W : MSP430RegWithSubregs<14, "r14", [R14B]>;
61 def R15W : MSP430RegWithSubregs<15, "r15", [R15B]>;
62
63 def : SubRegSet<1, [PCW, SPW, SRW, CGW, FPW,
64                     R5W, R6W, R7W, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W],
65                    [PCB, SPB, SRB, CGB, FPB,
66                     R5B, R6B, R7B, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B]>;
67
68 def subreg_8bit : PatLeaf<(i32 1)>;
69
70 def GR8 : RegisterClass<"MSP430", [i8], 8,
71    // Volatile registers
72   [R12B, R13B, R14B, R15B, R11B, R10B, R9B, R8B, R7B, R6B, R5B,
73    // Frame pointer, sometimes allocable
74    FPB,
75    // Volatile, but not allocable
76    PCB, SPB, SRB, CGB]>
77 {
78   let MethodProtos = [{
79     iterator allocation_order_end(const MachineFunction &MF) const;
80   }];
81   let MethodBodies = [{
82     GR8Class::iterator
83     GR8Class::allocation_order_end(const MachineFunction &MF) const {
84       const TargetMachine &TM = MF.getTarget();
85       const TargetRegisterInfo *RI = TM.getRegisterInfo();
86       // Depending on whether the function uses frame pointer or not, last 5 or 4
87       // registers on the list above are reserved
88       if (RI->hasFP(MF))
89         return end()-5;
90       else
91         return end()-4;
92     }
93   }];
94 }
95
96 def GR16 : RegisterClass<"MSP430", [i16], 16,
97    // Volatile registers
98   [R12W, R13W, R14W, R15W, R11W, R10W, R9W, R8W, R7W, R6W, R5W,
99    // Frame pointer, sometimes allocable
100    FPW,
101    // Volatile, but not allocable
102    PCW, SPW, SRW, CGW]>
103 {
104   let SubRegClassList = [GR8];
105   let MethodProtos = [{
106     iterator allocation_order_end(const MachineFunction &MF) const;
107   }];
108   let MethodBodies = [{
109     GR16Class::iterator
110     GR16Class::allocation_order_end(const MachineFunction &MF) const {
111       const TargetMachine &TM = MF.getTarget();
112       const TargetRegisterInfo *RI = TM.getRegisterInfo();
113       // Depending on whether the function uses frame pointer or not, last 5 or 4
114       // registers on the list above are reserved
115       if (RI->hasFP(MF))
116         return end()-5;
117       else
118         return end()-4;
119     }
120   }];
121 }
122