| //===- XtensaRegisterInfo.td - Xtensa Register defs --------*- tablegen -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| //===----------------------------------------------------------------------===// |
| // Class definitions. |
| //===----------------------------------------------------------------------===// |
| |
| class XtensaReg<string n> : Register<n> { |
| let Namespace = "Xtensa"; |
| } |
| |
| class XtensaRegWithSubRegs<string n, list<Register> subregs> |
| : RegisterWithSubRegs<n, subregs> { |
| let Namespace = "Xtensa"; |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // General-purpose registers |
| //===----------------------------------------------------------------------===// |
| |
| // Xtensa general purpose regs |
| class ARReg<bits<4> num, string n, list<string> alt = []> : XtensaReg<n> { |
| let HWEncoding{3-0} = num; |
| let AltNames = alt; |
| } |
| |
| // Return Address |
| def A0 : ARReg<0, "a0">, DwarfRegNum<[0]>; |
| |
| // Stack Pointer (callee-saved) |
| def SP : ARReg<1, "a1", ["sp"]>, DwarfRegNum<[1]>; |
| |
| // Function Arguments |
| def A2 : ARReg<2, "a2">, DwarfRegNum<[2]>; |
| def A3 : ARReg<3, "a3">, DwarfRegNum<[3]>; |
| def A4 : ARReg<4, "a4">, DwarfRegNum<[4]>; |
| def A5 : ARReg<5, "a5">, DwarfRegNum<[5]>; |
| def A6 : ARReg<6, "a6">, DwarfRegNum<[6]>; |
| def A7 : ARReg<7, "a7">, DwarfRegNum<[7]>; |
| |
| // Static Chain |
| def A8 : ARReg<8, "a8">, DwarfRegNum<[8]>; |
| |
| def A9 : ARReg<9, "a9">, DwarfRegNum<[9]>; |
| def A10 : ARReg<10, "a10">, DwarfRegNum<[10]>; |
| def A11 : ARReg<11, "a11">, DwarfRegNum<[11]>; |
| |
| // Callee-saved |
| def A12 : ARReg<12, "a12">, DwarfRegNum<[12]>; |
| def A13 : ARReg<13, "a13">, DwarfRegNum<[13]>; |
| def A14 : ARReg<14, "a14">, DwarfRegNum<[14]>; |
| |
| // Stack-Frame Pointer (optional) - Callee-Saved |
| def A15 : ARReg<15, "a15">, DwarfRegNum<[15]>; |
| |
| // Register class with allocation order |
| def AR : RegisterClass<"Xtensa", [i32], 32, (add |
| A8, A9, A10, A11, A12, A13, A14, A15, |
| A7, A6, A5, A4, A3, A2, A0, SP)>; |
| //===----------------------------------------------------------------------===// |
| // Special-purpose registers |
| //===----------------------------------------------------------------------===// |
| class SRReg<bits<8> num, string n, list<string> alt = []> : XtensaReg<n> { |
| let HWEncoding{7-0} = num; |
| let AltNames = alt; |
| } |
| |
| // Shift Amount Register |
| def SAR : SRReg<3, "sar", ["SAR","3"]>; |
| |
| def SR : RegisterClass<"Xtensa", [i32], 32, (add SAR)>; |