1*0b57cec5SDimitry Andric//===-- ARMSystemRegister.td - ARM Register defs -------------*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andricinclude "llvm/TableGen/SearchableTable.td" 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric// Declarations that describe the ARM system-registers 13*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric// M-Class System Registers. 16*0b57cec5SDimitry Andric// 'Mask' bits create unique keys for searches. 17*0b57cec5SDimitry Andric// 18*0b57cec5SDimitry Andricclass MClassSysReg<bits<1> UniqMask1, 19*0b57cec5SDimitry Andric bits<1> UniqMask2, 20*0b57cec5SDimitry Andric bits<1> UniqMask3, 21*0b57cec5SDimitry Andric bits<12> Enc12, 22*0b57cec5SDimitry Andric string name> : SearchableTable { 23*0b57cec5SDimitry Andric let SearchableFields = ["Name", "M1Encoding12", "M2M3Encoding8", "Encoding"]; 24*0b57cec5SDimitry Andric string Name; 25*0b57cec5SDimitry Andric bits<13> M1Encoding12; 26*0b57cec5SDimitry Andric bits<10> M2M3Encoding8; 27*0b57cec5SDimitry Andric bits<12> Encoding; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric let Name = name; 30*0b57cec5SDimitry Andric let EnumValueField = "M1Encoding12"; 31*0b57cec5SDimitry Andric let EnumValueField = "M2M3Encoding8"; 32*0b57cec5SDimitry Andric let EnumValueField = "Encoding"; 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric let M1Encoding12{12} = UniqMask1; 35*0b57cec5SDimitry Andric let M1Encoding12{11-00} = Enc12; 36*0b57cec5SDimitry Andric let Encoding = Enc12; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric let M2M3Encoding8{9} = UniqMask2; 39*0b57cec5SDimitry Andric let M2M3Encoding8{8} = UniqMask3; 40*0b57cec5SDimitry Andric let M2M3Encoding8{7-0} = Enc12{7-0}; 41*0b57cec5SDimitry Andric code Requires = [{ {} }]; 42*0b57cec5SDimitry Andric} 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric// [|i|e|x]apsr_nzcvq has alias [|i|e|x]apsr. 45*0b57cec5SDimitry Andric// Mask1 Mask2 Mask3 Enc12, Name 46*0b57cec5SDimitry Andriclet Requires = [{ {ARM::FeatureDSP} }] in { 47*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 0, 0x400, "apsr_g">; 48*0b57cec5SDimitry Andricdef : MClassSysReg<0, 1, 1, 0xc00, "apsr_nzcvqg">; 49*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 0, 0x401, "iapsr_g">; 50*0b57cec5SDimitry Andricdef : MClassSysReg<0, 1, 1, 0xc01, "iapsr_nzcvqg">; 51*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 0, 0x402, "eapsr_g">; 52*0b57cec5SDimitry Andricdef : MClassSysReg<0, 1, 1, 0xc02, "eapsr_nzcvqg">; 53*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 0, 0x403, "xpsr_g">; 54*0b57cec5SDimitry Andricdef : MClassSysReg<0, 1, 1, 0xc03, "xpsr_nzcvqg">; 55*0b57cec5SDimitry Andric} 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x800, "apsr">; 58*0b57cec5SDimitry Andricdef : MClassSysReg<1, 1, 0, 0x800, "apsr_nzcvq">; 59*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x801, "iapsr">; 60*0b57cec5SDimitry Andricdef : MClassSysReg<1, 1, 0, 0x801, "iapsr_nzcvq">; 61*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x802, "eapsr">; 62*0b57cec5SDimitry Andricdef : MClassSysReg<1, 1, 0, 0x802, "eapsr_nzcvq">; 63*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x803, "xpsr">; 64*0b57cec5SDimitry Andricdef : MClassSysReg<1, 1, 0, 0x803, "xpsr_nzcvq">; 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x805, "ipsr">; 67*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x806, "epsr">; 68*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x807, "iepsr">; 69*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x808, "msp">; 70*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x809, "psp">; 71*0b57cec5SDimitry Andric 72*0b57cec5SDimitry Andriclet Requires = [{ {ARM::HasV8MBaselineOps} }] in { 73*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x80a, "msplim">; 74*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x80b, "psplim">; 75*0b57cec5SDimitry Andric} 76*0b57cec5SDimitry Andric 77*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x810, "primask">; 78*0b57cec5SDimitry Andric 79*0b57cec5SDimitry Andriclet Requires = [{ {ARM::HasV7Ops} }] in { 80*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x811, "basepri">; 81*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x812, "basepri_max">; 82*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x813, "faultmask">; 83*0b57cec5SDimitry Andric} 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x814, "control">; 86*0b57cec5SDimitry Andric 87*0b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt} }] in { 88*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x888, "msp_ns">; 89*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x889, "psp_ns">; 90*0b57cec5SDimitry Andric} 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt, ARM::HasV8MBaselineOps} }] in { 93*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x88a, "msplim_ns">; 94*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x88b, "psplim_ns">; 95*0b57cec5SDimitry Andric} 96*0b57cec5SDimitry Andric 97*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x890, "primask_ns">; 98*0b57cec5SDimitry Andric 99*0b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt, ARM::HasV7Ops} }] in { 100*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x891, "basepri_ns">; 101*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x893, "faultmask_ns">; 102*0b57cec5SDimitry Andric} 103*0b57cec5SDimitry Andric 104*0b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt} }] in { 105*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x894, "control_ns">; 106*0b57cec5SDimitry Andricdef : MClassSysReg<0, 0, 1, 0x898, "sp_ns">; 107*0b57cec5SDimitry Andric} 108*0b57cec5SDimitry Andric 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andric// Banked Registers 111*0b57cec5SDimitry Andric// 112*0b57cec5SDimitry Andricclass BankedReg<string name, bits<8> enc> 113*0b57cec5SDimitry Andric : SearchableTable { 114*0b57cec5SDimitry Andric string Name; 115*0b57cec5SDimitry Andric bits<8> Encoding; 116*0b57cec5SDimitry Andric let Name = name; 117*0b57cec5SDimitry Andric let Encoding = enc; 118*0b57cec5SDimitry Andric let SearchableFields = ["Name", "Encoding"]; 119*0b57cec5SDimitry Andric} 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric// The values here come from B9.2.3 of the ARM ARM, where bits 4-0 are SysM 122*0b57cec5SDimitry Andric// and bit 5 is R. 123*0b57cec5SDimitry Andricdef : BankedReg<"r8_usr", 0x00>; 124*0b57cec5SDimitry Andricdef : BankedReg<"r9_usr", 0x01>; 125*0b57cec5SDimitry Andricdef : BankedReg<"r10_usr", 0x02>; 126*0b57cec5SDimitry Andricdef : BankedReg<"r11_usr", 0x03>; 127*0b57cec5SDimitry Andricdef : BankedReg<"r12_usr", 0x04>; 128*0b57cec5SDimitry Andricdef : BankedReg<"sp_usr", 0x05>; 129*0b57cec5SDimitry Andricdef : BankedReg<"lr_usr", 0x06>; 130*0b57cec5SDimitry Andricdef : BankedReg<"r8_fiq", 0x08>; 131*0b57cec5SDimitry Andricdef : BankedReg<"r9_fiq", 0x09>; 132*0b57cec5SDimitry Andricdef : BankedReg<"r10_fiq", 0x0a>; 133*0b57cec5SDimitry Andricdef : BankedReg<"r11_fiq", 0x0b>; 134*0b57cec5SDimitry Andricdef : BankedReg<"r12_fiq", 0x0c>; 135*0b57cec5SDimitry Andricdef : BankedReg<"sp_fiq", 0x0d>; 136*0b57cec5SDimitry Andricdef : BankedReg<"lr_fiq", 0x0e>; 137*0b57cec5SDimitry Andricdef : BankedReg<"lr_irq", 0x10>; 138*0b57cec5SDimitry Andricdef : BankedReg<"sp_irq", 0x11>; 139*0b57cec5SDimitry Andricdef : BankedReg<"lr_svc", 0x12>; 140*0b57cec5SDimitry Andricdef : BankedReg<"sp_svc", 0x13>; 141*0b57cec5SDimitry Andricdef : BankedReg<"lr_abt", 0x14>; 142*0b57cec5SDimitry Andricdef : BankedReg<"sp_abt", 0x15>; 143*0b57cec5SDimitry Andricdef : BankedReg<"lr_und", 0x16>; 144*0b57cec5SDimitry Andricdef : BankedReg<"sp_und", 0x17>; 145*0b57cec5SDimitry Andricdef : BankedReg<"lr_mon", 0x1c>; 146*0b57cec5SDimitry Andricdef : BankedReg<"sp_mon", 0x1d>; 147*0b57cec5SDimitry Andricdef : BankedReg<"elr_hyp", 0x1e>; 148*0b57cec5SDimitry Andricdef : BankedReg<"sp_hyp", 0x1f>; 149*0b57cec5SDimitry Andricdef : BankedReg<"spsr_fiq", 0x2e>; 150*0b57cec5SDimitry Andricdef : BankedReg<"spsr_irq", 0x30>; 151*0b57cec5SDimitry Andricdef : BankedReg<"spsr_svc", 0x32>; 152*0b57cec5SDimitry Andricdef : BankedReg<"spsr_abt", 0x34>; 153*0b57cec5SDimitry Andricdef : BankedReg<"spsr_und", 0x36>; 154*0b57cec5SDimitry Andricdef : BankedReg<"spsr_mon", 0x3c>; 155*0b57cec5SDimitry Andricdef : BankedReg<"spsr_hyp", 0x3e>; 156