10b57cec5SDimitry Andric//===-- MSP430RegisterInfo.td - MSP430 Register defs -------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
100b57cec5SDimitry Andric//  Declarations that describe the MSP430 register file
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricclass MSP430Reg<bits<4> num, string n, list<string> alt = []> : Register<n> {
140b57cec5SDimitry Andric  field bits<4> Num = num;
150b57cec5SDimitry Andric  let Namespace = "MSP430";
160b57cec5SDimitry Andric  let HWEncoding{3-0} = num;
170b57cec5SDimitry Andric  let AltNames = alt;
185ffd83dbSDimitry Andric  let DwarfNumbers = [num];
190b57cec5SDimitry Andric}
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricclass MSP430RegWithSubregs<bits<4> num, string n, list<Register> subregs,
220b57cec5SDimitry Andric                           list<string> alt = []>
230b57cec5SDimitry Andric  : RegisterWithSubRegs<n, subregs> {
240b57cec5SDimitry Andric  field bits<4> Num = num;
250b57cec5SDimitry Andric  let Namespace = "MSP430";
260b57cec5SDimitry Andric  let HWEncoding{3-0} = num;
270b57cec5SDimitry Andric  let AltNames = alt;
285ffd83dbSDimitry Andric  let DwarfNumbers = [num];
290b57cec5SDimitry Andric}
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
320b57cec5SDimitry Andric//  Registers
330b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
340b57cec5SDimitry Andric
3506c3fb27SDimitry Andricdef PCB  : MSP430Reg<0,  "r0", ["pc"]>, DwarfRegNum<[16]>;
3606c3fb27SDimitry Andricdef SPB  : MSP430Reg<1,  "r1", ["sp"]>, DwarfRegNum<[17]>;
3706c3fb27SDimitry Andricdef SRB  : MSP430Reg<2,  "r2", ["sr"]>, DwarfRegNum<[18]>;
3806c3fb27SDimitry Andricdef CGB  : MSP430Reg<3,  "r3", ["cg"]>, DwarfRegNum<[19]>;
3906c3fb27SDimitry Andricdef R4B  : MSP430Reg<4,  "r4", ["fp"]>, DwarfRegNum<[20]>;
4006c3fb27SDimitry Andricdef R5B  : MSP430Reg<5,  "r5">,  DwarfRegNum<[21]>;
4106c3fb27SDimitry Andricdef R6B  : MSP430Reg<6,  "r6">,  DwarfRegNum<[22]>;
4206c3fb27SDimitry Andricdef R7B  : MSP430Reg<7,  "r7">,  DwarfRegNum<[23]>;
4306c3fb27SDimitry Andricdef R8B  : MSP430Reg<8,  "r8">,  DwarfRegNum<[24]>;
4406c3fb27SDimitry Andricdef R9B  : MSP430Reg<9,  "r9">,  DwarfRegNum<[25]>;
4506c3fb27SDimitry Andricdef R10B : MSP430Reg<10, "r10">, DwarfRegNum<[26]>;
4606c3fb27SDimitry Andricdef R11B : MSP430Reg<11, "r11">, DwarfRegNum<[27]>;
4706c3fb27SDimitry Andricdef R12B : MSP430Reg<12, "r12">, DwarfRegNum<[28]>;
4806c3fb27SDimitry Andricdef R13B : MSP430Reg<13, "r13">, DwarfRegNum<[29]>;
4906c3fb27SDimitry Andricdef R14B : MSP430Reg<14, "r14">, DwarfRegNum<[30]>;
5006c3fb27SDimitry Andricdef R15B : MSP430Reg<15, "r15">, DwarfRegNum<[31]>;
510b57cec5SDimitry Andric
520b57cec5SDimitry Andricdef subreg_8bit : SubRegIndex<8> { let Namespace = "MSP430"; }
530b57cec5SDimitry Andric
540b57cec5SDimitry Andriclet SubRegIndices = [subreg_8bit] in {
5506c3fb27SDimitry Andricdef PC  : MSP430RegWithSubregs<0,  "r0",  [PCB], ["pc"]>, DwarfRegNum<[0]>;
5606c3fb27SDimitry Andricdef SP  : MSP430RegWithSubregs<1,  "r1",  [SPB], ["sp"]>, DwarfRegNum<[1]>;
5706c3fb27SDimitry Andricdef SR  : MSP430RegWithSubregs<2,  "r2",  [SRB], ["sr"]>, DwarfRegNum<[2]>;
5806c3fb27SDimitry Andricdef CG  : MSP430RegWithSubregs<3,  "r3",  [CGB], ["cg"]>, DwarfRegNum<[3]>;
5906c3fb27SDimitry Andricdef R4  : MSP430RegWithSubregs<4,  "r4",  [R4B], ["fp"]>, DwarfRegNum<[4]>;
6006c3fb27SDimitry Andricdef R5  : MSP430RegWithSubregs<5,  "r5",  [R5B]>,  DwarfRegNum<[5]>;
6106c3fb27SDimitry Andricdef R6  : MSP430RegWithSubregs<6,  "r6",  [R6B]>,  DwarfRegNum<[6]>;
6206c3fb27SDimitry Andricdef R7  : MSP430RegWithSubregs<7,  "r7",  [R7B]>,  DwarfRegNum<[7]>;
6306c3fb27SDimitry Andricdef R8  : MSP430RegWithSubregs<8,  "r8",  [R8B]>,  DwarfRegNum<[8]>;
6406c3fb27SDimitry Andricdef R9  : MSP430RegWithSubregs<9,  "r9",  [R9B]>,  DwarfRegNum<[9]>;
6506c3fb27SDimitry Andricdef R10 : MSP430RegWithSubregs<10, "r10", [R10B]>, DwarfRegNum<[10]>;
6606c3fb27SDimitry Andricdef R11 : MSP430RegWithSubregs<11, "r11", [R11B]>, DwarfRegNum<[11]>;
6706c3fb27SDimitry Andricdef R12 : MSP430RegWithSubregs<12, "r12", [R12B]>, DwarfRegNum<[12]>;
6806c3fb27SDimitry Andricdef R13 : MSP430RegWithSubregs<13, "r13", [R13B]>, DwarfRegNum<[13]>;
6906c3fb27SDimitry Andricdef R14 : MSP430RegWithSubregs<14, "r14", [R14B]>, DwarfRegNum<[14]>;
7006c3fb27SDimitry Andricdef R15 : MSP430RegWithSubregs<15, "r15", [R15B]>, DwarfRegNum<[15]>;
710b57cec5SDimitry Andric}
720b57cec5SDimitry Andric
730b57cec5SDimitry Andricdef GR8 : RegisterClass<"MSP430", [i8], 8,
740b57cec5SDimitry Andric   // Volatile registers
750b57cec5SDimitry Andric  (add R12B, R13B, R14B, R15B, R11B, R10B, R9B, R8B, R7B, R6B, R5B,
760b57cec5SDimitry Andric   // Frame pointer, sometimes allocable
775ffd83dbSDimitry Andric   R4B,
780b57cec5SDimitry Andric   // Volatile, but not allocable
790b57cec5SDimitry Andric   PCB, SPB, SRB, CGB)>;
800b57cec5SDimitry Andric
810b57cec5SDimitry Andricdef GR16 : RegisterClass<"MSP430", [i16], 16,
820b57cec5SDimitry Andric   // Volatile registers
830b57cec5SDimitry Andric  (add R12, R13, R14, R15, R11, R10, R9, R8, R7, R6, R5,
840b57cec5SDimitry Andric   // Frame pointer, sometimes allocable
855ffd83dbSDimitry Andric   R4,
860b57cec5SDimitry Andric   // Volatile, but not allocable
870b57cec5SDimitry Andric   PC, SP, SR, CG)>;
88