xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARM/ARMSystemRegister.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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