xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/ARM/ARMSystemRegister.td (revision 4824e7fd18a1223177218d4aec1b3c6c5c4a444e)
10b57cec5SDimitry Andric//===-- ARMSystemRegister.td - ARM Register defs -------------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricinclude "llvm/TableGen/SearchableTable.td"
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric//  Declarations that describe the ARM system-registers
130b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric// M-Class System Registers.
160b57cec5SDimitry Andric// 'Mask' bits create unique keys for searches.
170b57cec5SDimitry Andric//
180b57cec5SDimitry Andricclass MClassSysReg<bits<1> UniqMask1,
190b57cec5SDimitry Andric                   bits<1> UniqMask2,
200b57cec5SDimitry Andric                   bits<1> UniqMask3,
210b57cec5SDimitry Andric                   bits<12> Enc12,
220b57cec5SDimitry Andric                   string name> : SearchableTable {
230b57cec5SDimitry Andric  let SearchableFields = ["Name", "M1Encoding12", "M2M3Encoding8", "Encoding"];
240b57cec5SDimitry Andric  string Name;
250b57cec5SDimitry Andric  bits<13> M1Encoding12;
260b57cec5SDimitry Andric  bits<10> M2M3Encoding8;
270b57cec5SDimitry Andric  bits<12> Encoding;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  let Name = name;
300b57cec5SDimitry Andric  let EnumValueField = "M1Encoding12";
310b57cec5SDimitry Andric  let EnumValueField = "M2M3Encoding8";
320b57cec5SDimitry Andric  let EnumValueField = "Encoding";
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric  let M1Encoding12{12}    = UniqMask1;
350b57cec5SDimitry Andric  let M1Encoding12{11-00} = Enc12;
360b57cec5SDimitry Andric  let Encoding            = Enc12;
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric  let M2M3Encoding8{9}    = UniqMask2;
390b57cec5SDimitry Andric  let M2M3Encoding8{8}    = UniqMask3;
400b57cec5SDimitry Andric  let M2M3Encoding8{7-0}  = Enc12{7-0};
410b57cec5SDimitry Andric  code Requires           = [{ {} }];
420b57cec5SDimitry Andric}
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric// [|i|e|x]apsr_nzcvq has alias [|i|e|x]apsr.
450b57cec5SDimitry Andric//                 Mask1 Mask2 Mask3 Enc12, Name
460b57cec5SDimitry Andriclet Requires = [{ {ARM::FeatureDSP} }] in {
470b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    0,    0x400, "apsr_g">;
480b57cec5SDimitry Andricdef : MClassSysReg<0,    1,    1,    0xc00, "apsr_nzcvqg">;
490b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    0,    0x401, "iapsr_g">;
500b57cec5SDimitry Andricdef : MClassSysReg<0,    1,    1,    0xc01, "iapsr_nzcvqg">;
510b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    0,    0x402, "eapsr_g">;
520b57cec5SDimitry Andricdef : MClassSysReg<0,    1,    1,    0xc02, "eapsr_nzcvqg">;
530b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    0,    0x403, "xpsr_g">;
540b57cec5SDimitry Andricdef : MClassSysReg<0,    1,    1,    0xc03, "xpsr_nzcvqg">;
550b57cec5SDimitry Andric}
560b57cec5SDimitry Andric
570b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x800, "apsr">;
580b57cec5SDimitry Andricdef : MClassSysReg<1,    1,    0,    0x800, "apsr_nzcvq">;
590b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x801, "iapsr">;
600b57cec5SDimitry Andricdef : MClassSysReg<1,    1,    0,    0x801, "iapsr_nzcvq">;
610b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x802, "eapsr">;
620b57cec5SDimitry Andricdef : MClassSysReg<1,    1,    0,    0x802, "eapsr_nzcvq">;
630b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x803, "xpsr">;
640b57cec5SDimitry Andricdef : MClassSysReg<1,    1,    0,    0x803, "xpsr_nzcvq">;
650b57cec5SDimitry Andric
660b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x805, "ipsr">;
670b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x806, "epsr">;
680b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x807, "iepsr">;
690b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x808, "msp">;
700b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x809, "psp">;
710b57cec5SDimitry Andric
720b57cec5SDimitry Andriclet Requires = [{ {ARM::HasV8MBaselineOps} }] in {
730b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x80a, "msplim">;
740b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x80b, "psplim">;
750b57cec5SDimitry Andric}
760b57cec5SDimitry Andric
770b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x810, "primask">;
780b57cec5SDimitry Andric
790b57cec5SDimitry Andriclet Requires = [{ {ARM::HasV7Ops} }] in {
800b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x811, "basepri">;
810b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x812, "basepri_max">;
820b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x813, "faultmask">;
830b57cec5SDimitry Andric}
840b57cec5SDimitry Andric
850b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x814, "control">;
860b57cec5SDimitry Andric
870b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt} }] in {
880b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x888, "msp_ns">;
890b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x889, "psp_ns">;
900b57cec5SDimitry Andric}
910b57cec5SDimitry Andric
920b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt, ARM::HasV8MBaselineOps} }] in {
930b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x88a, "msplim_ns">;
940b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x88b, "psplim_ns">;
950b57cec5SDimitry Andric}
960b57cec5SDimitry Andric
970b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x890, "primask_ns">;
980b57cec5SDimitry Andric
990b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt, ARM::HasV7Ops} }] in {
1000b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x891, "basepri_ns">;
1010b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x893, "faultmask_ns">;
1020b57cec5SDimitry Andric}
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andriclet Requires = [{ {ARM::Feature8MSecExt} }] in {
1050b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x894, "control_ns">;
1060b57cec5SDimitry Andricdef : MClassSysReg<0,    0,    1,    0x898, "sp_ns">;
1070b57cec5SDimitry Andric}
1080b57cec5SDimitry Andric
109*4824e7fdSDimitry Andriclet Requires = [{ {ARM::FeaturePACBTI} }] in {
110*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x820, "pac_key_p_0">;
111*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x821, "pac_key_p_1">;
112*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x822, "pac_key_p_2">;
113*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x823, "pac_key_p_3">;
114*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x824, "pac_key_u_0">;
115*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x825, "pac_key_u_1">;
116*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x826, "pac_key_u_2">;
117*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x827, "pac_key_u_3">;
118*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a0, "pac_key_p_0_ns">;
119*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a1, "pac_key_p_1_ns">;
120*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a2, "pac_key_p_2_ns">;
121*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a3, "pac_key_p_3_ns">;
122*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a4, "pac_key_u_0_ns">;
123*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a5, "pac_key_u_1_ns">;
124*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a6, "pac_key_u_2_ns">;
125*4824e7fdSDimitry Andricdef : MClassSysReg<0,    0,    1,    0x8a7, "pac_key_u_3_ns">;
126*4824e7fdSDimitry Andric}
1270b57cec5SDimitry Andric
1280b57cec5SDimitry Andric// Banked Registers
1290b57cec5SDimitry Andric//
1300b57cec5SDimitry Andricclass BankedReg<string name,  bits<8> enc>
1310b57cec5SDimitry Andric               : SearchableTable {
1320b57cec5SDimitry Andric  string Name;
1330b57cec5SDimitry Andric  bits<8> Encoding;
1340b57cec5SDimitry Andric  let Name = name;
1350b57cec5SDimitry Andric  let Encoding = enc;
1360b57cec5SDimitry Andric  let SearchableFields = ["Name", "Encoding"];
1370b57cec5SDimitry Andric}
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric// The values here come from B9.2.3 of the ARM ARM, where bits 4-0 are SysM
1400b57cec5SDimitry Andric// and bit 5 is R.
1410b57cec5SDimitry Andricdef : BankedReg<"r8_usr",   0x00>;
1420b57cec5SDimitry Andricdef : BankedReg<"r9_usr",   0x01>;
1430b57cec5SDimitry Andricdef : BankedReg<"r10_usr",  0x02>;
1440b57cec5SDimitry Andricdef : BankedReg<"r11_usr",  0x03>;
1450b57cec5SDimitry Andricdef : BankedReg<"r12_usr",  0x04>;
1460b57cec5SDimitry Andricdef : BankedReg<"sp_usr",   0x05>;
1470b57cec5SDimitry Andricdef : BankedReg<"lr_usr",   0x06>;
1480b57cec5SDimitry Andricdef : BankedReg<"r8_fiq",   0x08>;
1490b57cec5SDimitry Andricdef : BankedReg<"r9_fiq",   0x09>;
1500b57cec5SDimitry Andricdef : BankedReg<"r10_fiq",  0x0a>;
1510b57cec5SDimitry Andricdef : BankedReg<"r11_fiq",  0x0b>;
1520b57cec5SDimitry Andricdef : BankedReg<"r12_fiq",  0x0c>;
1530b57cec5SDimitry Andricdef : BankedReg<"sp_fiq",   0x0d>;
1540b57cec5SDimitry Andricdef : BankedReg<"lr_fiq",   0x0e>;
1550b57cec5SDimitry Andricdef : BankedReg<"lr_irq",   0x10>;
1560b57cec5SDimitry Andricdef : BankedReg<"sp_irq",   0x11>;
1570b57cec5SDimitry Andricdef : BankedReg<"lr_svc",   0x12>;
1580b57cec5SDimitry Andricdef : BankedReg<"sp_svc",   0x13>;
1590b57cec5SDimitry Andricdef : BankedReg<"lr_abt",   0x14>;
1600b57cec5SDimitry Andricdef : BankedReg<"sp_abt",   0x15>;
1610b57cec5SDimitry Andricdef : BankedReg<"lr_und",   0x16>;
1620b57cec5SDimitry Andricdef : BankedReg<"sp_und",   0x17>;
1630b57cec5SDimitry Andricdef : BankedReg<"lr_mon",   0x1c>;
1640b57cec5SDimitry Andricdef : BankedReg<"sp_mon",   0x1d>;
1650b57cec5SDimitry Andricdef : BankedReg<"elr_hyp",  0x1e>;
1660b57cec5SDimitry Andricdef : BankedReg<"sp_hyp",   0x1f>;
1670b57cec5SDimitry Andricdef : BankedReg<"spsr_fiq", 0x2e>;
1680b57cec5SDimitry Andricdef : BankedReg<"spsr_irq", 0x30>;
1690b57cec5SDimitry Andricdef : BankedReg<"spsr_svc", 0x32>;
1700b57cec5SDimitry Andricdef : BankedReg<"spsr_abt", 0x34>;
1710b57cec5SDimitry Andricdef : BankedReg<"spsr_und", 0x36>;
1720b57cec5SDimitry Andricdef : BankedReg<"spsr_mon", 0x3c>;
1730b57cec5SDimitry Andricdef : BankedReg<"spsr_hyp", 0x3e>;
174