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