| //===- ARCRegisterInfo.td - ARC Register defs --------------*- tablegen -*-===// | |
| // | |
| // 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| //===----------------------------------------------------------------------===// | |
| // Declarations that describe the ARC register file | |
| //===----------------------------------------------------------------------===// | |
| class ARCReg<string n, list<string> altNames> : Register<n, altNames> { | |
| field bits<6> HwEncoding; | |
| let Namespace = "ARC"; | |
| } | |
| // Registers are identified with 6-bit ID numbers. | |
| // Core - 32-bit core registers | |
| class Core<int num, string n, list<string>altNames=[]> : ARCReg<n, altNames> { | |
| let HWEncoding = num; | |
| } | |
| // Auxilary register | |
| class Aux<int num, string n, list<string> altNames=[]> : ARCReg<n, altNames> { | |
| let HWEncoding = num; | |
| } | |
| // Integer registers | |
| foreach i = 0 - 3 in | |
| def R#i : Core<i, "%r"#i>, DwarfRegNum<[i]>; | |
| let CostPerUse=[1] in { | |
| foreach i = 4 - 11 in | |
| def R#i : Core<i, "%r"#i>, DwarfRegNum<[i]>; | |
| } | |
| foreach i = 12 - 15 in | |
| def R#i : Core<i, "%r"#i>, DwarfRegNum<[i]>; | |
| let CostPerUse=[1] in { | |
| foreach i = 16 - 25 in | |
| def R#i : Core<i, "%r"#i>, DwarfRegNum<[i]>; | |
| def GP : Core<26, "%gp",["%r26"]>, DwarfRegNum<[26]>; | |
| def FP : Core<27, "%fp", ["%r27"]>, DwarfRegNum<[27]>; | |
| def SP : Core<28, "%sp", ["%r28"]>, DwarfRegNum<[28]>; | |
| def ILINK : Core<29, "%ilink">, DwarfRegNum<[29]>; | |
| def R30 : Core<30, "%r30">, DwarfRegNum<[30]>; | |
| def BLINK : Core<31, "%blink">, DwarfRegNum<[31]>; | |
| // Define extended core registers R32..R63 | |
| foreach i = 32 - 63 in | |
| def R#i : Core<i, "%r"#i>, DwarfRegNum<[i]>; | |
| } | |
| // Auxilary registers | |
| let CostPerUse=[1] in { | |
| def STATUS32 : Aux<10, "status32">; // No DwarfRegNum defined in the ARC ABI | |
| } | |
| def GPR32: RegisterClass<"ARC", [i32], 32, | |
| (add (sequence "R%u", 0, 25), GP, FP, SP, ILINK, R30, BLINK, (sequence "R%u", 32, 63))> { | |
| let AltOrders=[(add (sequence "R%u", 0, 25), GP, FP, SP, ILINK, R30, BLINK)]; | |
| let AltOrderSelect = [{ | |
| // When referenced in a C++ code block like this | |
| // 0 is all Core32 regs | |
| // 1 is AltOrders[0] | |
| // 2 is AltOrders[1] and so on | |
| return 1; | |
| }]; | |
| } | |
| def SREG : RegisterClass<"ARC", [i32], 1, (add STATUS32)>; | |
| def GPR_S : RegisterClass<"ARC", [i32], 8, | |
| (add R0, R1, R2, R3, R12, R13, R14, R15)>; | |