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