xref: /aosp_15_r20/external/llvm/lib/Target/Lanai/LanaiRegisterInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- LanaiRegisterInfo.td - Lanai Register defs ------------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//  Declarations that describe the Lanai register file
10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker// Registers are identified with 5-bit ID numbers.
13*9880d681SAndroid Build Coastguard Workerclass LanaiReg<bits<5> num, string n, list<Register> subregs = [],
14*9880d681SAndroid Build Coastguard Worker               list<string> altNames = []> : Register<n, altNames> {
15*9880d681SAndroid Build Coastguard Worker  field bits<5> Num;
16*9880d681SAndroid Build Coastguard Worker  let Num = num;
17*9880d681SAndroid Build Coastguard Worker  let Namespace = "Lanai";
18*9880d681SAndroid Build Coastguard Worker  let SubRegs = subregs;
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerlet Namespace = "Lanai" in {
22*9880d681SAndroid Build Coastguard Worker  def sub_32 : SubRegIndex<32>;
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker// Integer registers
26*9880d681SAndroid Build Coastguard Workerforeach i = 0-31 in {
27*9880d681SAndroid Build Coastguard Worker  def R#i : LanaiReg<i, "r"#i>, DwarfRegNum<[i]>;
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// Register aliases
31*9880d681SAndroid Build Coastguard Workerlet SubRegIndices = [sub_32] in {
32*9880d681SAndroid Build Coastguard Worker  def PC  : LanaiReg< 2,  "pc",  [R2]>,  DwarfRegAlias<R2>;
33*9880d681SAndroid Build Coastguard Worker  def SP  : LanaiReg< 4,  "sp",  [R4]>,  DwarfRegAlias<R4>;
34*9880d681SAndroid Build Coastguard Worker  def FP  : LanaiReg< 5,  "fp",  [R5]>,  DwarfRegAlias<R5>;
35*9880d681SAndroid Build Coastguard Worker  def RV  : LanaiReg< 8,  "rv",  [R8]>,  DwarfRegAlias<R8>;
36*9880d681SAndroid Build Coastguard Worker  def RR1 : LanaiReg<10, "rr1", [R10]>, DwarfRegAlias<R10>;
37*9880d681SAndroid Build Coastguard Worker  def RR2 : LanaiReg<11, "rr2", [R11]>, DwarfRegAlias<R11>;
38*9880d681SAndroid Build Coastguard Worker  def RCA : LanaiReg<15, "rca", [R15]>, DwarfRegAlias<R15>;
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// Define a status register to capture the dependencies between the set flag
42*9880d681SAndroid Build Coastguard Worker// and setcc instructions
43*9880d681SAndroid Build Coastguard Workerdef SR : LanaiReg< 0, "sw">;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker// Register classes.
46*9880d681SAndroid Build Coastguard Workerdef GPR : RegisterClass<"Lanai", [i32], 32,
47*9880d681SAndroid Build Coastguard Worker    (add R3, R9, R12, R13, R14, R16, R17,
48*9880d681SAndroid Build Coastguard Worker     (sequence "R%i", 20, 31),
49*9880d681SAndroid Build Coastguard Worker     R6, R7, R18, R19, // registers for passing arguments
50*9880d681SAndroid Build Coastguard Worker     R15, RCA, // register for constant addresses
51*9880d681SAndroid Build Coastguard Worker     R10, RR1, R11, RR2, // programmer controlled registers
52*9880d681SAndroid Build Coastguard Worker     R8,  RV,  // return value
53*9880d681SAndroid Build Coastguard Worker     R5,  FP,  // frame pointer
54*9880d681SAndroid Build Coastguard Worker     R4,  SP,  // stack pointer
55*9880d681SAndroid Build Coastguard Worker     R2,  PC,  // program counter
56*9880d681SAndroid Build Coastguard Worker     R1,       // all 1s (0xffffffff)
57*9880d681SAndroid Build Coastguard Worker     R0        // constant 0
58*9880d681SAndroid Build Coastguard Worker    )>;
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker// Condition code register class
61*9880d681SAndroid Build Coastguard Workerdef CCR : RegisterClass<"Lanai", [i32], 32, (add SR)> {
62*9880d681SAndroid Build Coastguard Worker  let CopyCost = -1; // Don't allow copying of status registers
63*9880d681SAndroid Build Coastguard Worker  let isAllocatable = 0;
64*9880d681SAndroid Build Coastguard Worker}
65