@@ -2480,3 +2480,211 @@ def : MLBI<"ALLE1", 0b100, 0b0111, 0b0000, 0b100, 0>;
24802480def : MLBI<"VMALLE1", 0b100, 0b0111, 0b0000, 0b101, 0>;
24812481def : MLBI<"VPIDE1", 0b100, 0b0111, 0b0000, 0b110, 1>;
24822482def : MLBI<"VPMGE1", 0b100, 0b0111, 0b0000, 0b111, 1>;
2483+
2484+
2485+ // v9.7-A GICv5 (FEAT_GCIE)
2486+ // CPU Interface Registers
2487+ // Op0 Op1 CRn CRm Op2
2488+ def : RWSysReg<"ICC_APR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b000>;
2489+ def : RWSysReg<"ICC_APR_EL3", 0b11, 0b110, 0b1100, 0b1000, 0b000>;
2490+ def : RWSysReg<"ICC_CR0_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b001>;
2491+ def : RWSysReg<"ICC_CR0_EL3", 0b11, 0b110, 0b1100, 0b1001, 0b000>;
2492+ def : ROSysReg<"ICC_DOMHPPIR_EL3", 0b11, 0b110, 0b1100, 0b1000, 0b010>;
2493+ def : ROSysReg<"ICC_HAPR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b011>;
2494+ def : ROSysReg<"ICC_HPPIR_EL1", 0b11, 0b000, 0b1100, 0b1010, 0b011>;
2495+ def : ROSysReg<"ICC_HPPIR_EL3", 0b11, 0b110, 0b1100, 0b1001, 0b001>;
2496+ def : ROSysReg<"ICC_IAFFIDR_EL1", 0b11, 0b000, 0b1100, 0b1010, 0b101>;
2497+ def : RWSysReg<"ICC_ICSR_EL1", 0b11, 0b000, 0b1100, 0b1010, 0b100>;
2498+ def : ROSysReg<"ICC_IDR0_EL1", 0b11, 0b000, 0b1100, 0b1010, 0b010>;
2499+ def : RWSysReg<"ICC_PCR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b010>;
2500+ def : RWSysReg<"ICC_PCR_EL3", 0b11, 0b110, 0b1100, 0b1000, 0b001>;
2501+
2502+ // Virtual CPU Interface Registers
2503+ // Op0 Op1 CRn CRm Op2
2504+ def : RWSysReg<"ICV_APR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b000>;
2505+ def : RWSysReg<"ICV_CR0_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b001>;
2506+ def : RWSysReg<"ICV_HAPR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b011>;
2507+ def : RWSysReg<"ICV_HPPIR_EL1", 0b11, 0b000, 0b1100, 0b1010, 0b011>;
2508+ def : RWSysReg<"ICV_PCR_EL1", 0b11, 0b001, 0b1100, 0b0000, 0b010>;
2509+
2510+ // PPI Registers
2511+ foreach n=0-1 in {
2512+ defvar nb = !cast<bit>(n);
2513+ // Op0 Op1 CRn CRm Op2
2514+ def : RWSysReg<"ICC_PPI_CACTIVER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b00,nb}>;
2515+ def : RWSysReg<"ICC_PPI_CPENDR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b10,nb}>;
2516+ def : RWSysReg<"ICC_PPI_ENABLER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1010, {0b11,nb}>;
2517+ def : RWSysReg<"ICC_PPI_SACTIVER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b01,nb}>;
2518+ def : RWSysReg<"ICC_PPI_SPENDR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b11,nb}>;
2519+ def : ROSysReg<"ICC_PPI_HMR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1010, {0b00,nb}>;
2520+ }
2521+
2522+ foreach n=0-3 in {
2523+ defvar nb = !cast<bits<2>>(n);
2524+ // Op0 Op1 CRn CRm Op2
2525+ def : RWSysReg<"ICC_PPI_DOMAINR"#n#"_EL3", 0b11, 0b110, 0b1100, 0b1000, {0b1,nb{1-0}}>;
2526+
2527+ }
2528+
2529+ foreach n=0-15 in{
2530+ defvar nb = !cast<bits<4>>(n);
2531+ // Op0 Op1 CRn CRm Op2
2532+ def : RWSysReg<"ICC_PPI_PRIORITYR"#n#"_EL1", 0b11, 0b000, 0b1100, {0b111,nb{3}}, nb{2-0}>;
2533+ }
2534+
2535+ // Virtual PPI Registers
2536+ foreach n=0-1 in {
2537+ defvar nb = !cast<bit>(n);
2538+ // Op0 Op1 CRn CRm Op2
2539+ def : RWSysReg<"ICV_PPI_CACTIVER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b00,nb}>;
2540+ def : RWSysReg<"ICV_PPI_CPENDR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b10,nb}>;
2541+ def : RWSysReg<"ICV_PPI_ENABLER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1010, {0b11,nb}>;
2542+ def : RWSysReg<"ICV_PPI_SACTIVER"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b01,nb}>;
2543+ def : RWSysReg<"ICV_PPI_SPENDR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1101, {0b11,nb}>;
2544+ def : RWSysReg<"ICV_PPI_HMR"#n#"_EL1", 0b11, 0b000, 0b1100, 0b1010, {0b00,nb}>;
2545+ }
2546+
2547+ foreach n=0-15 in {
2548+ defvar nb = !cast<bits<4>>(n);
2549+ // Op0 Op1 CRn CRm Op2
2550+ def : RWSysReg<"ICV_PPI_PRIORITYR"#n#"_EL1", 0b11, 0b000, 0b1100, {0b111,nb{3}}, nb{2-0}>;
2551+ }
2552+
2553+ // Hypervisor Control Registers
2554+ // Op0 Op1 CRn CRm Op2
2555+ def : RWSysReg<"ICH_APR_EL2", 0b11, 0b100, 0b1100, 0b1000, 0b100>;
2556+ def : RWSysReg<"ICH_CONTEXTR_EL2", 0b11, 0b100, 0b1100, 0b1011, 0b110>;
2557+ def : RWSysReg<"ICH_HFGITR_EL2", 0b11, 0b100, 0b1100, 0b1001, 0b111>;
2558+ def : RWSysReg<"ICH_HFGRTR_EL2", 0b11, 0b100, 0b1100, 0b1001, 0b100>;
2559+ def : RWSysReg<"ICH_HFGWTR_EL2", 0b11, 0b100, 0b1100, 0b1001, 0b110>;
2560+ def : ROSysReg<"ICH_HPPIR_EL2", 0b11, 0b100, 0b1100, 0b1000, 0b101>;
2561+ def : RWSysReg<"ICH_VCTLR_EL2", 0b11, 0b100, 0b1100, 0b1011, 0b100>;
2562+
2563+ foreach n=0-1 in {
2564+ defvar nb = !cast<bit>(n);
2565+ // Op0 Op1 CRn CRm Op2
2566+ def : RWSysReg<"ICH_PPI_ACTIVER"#n#"_EL2", 0b11, 0b100, 0b1100, 0b1010, {0b11,nb}>;
2567+ def : RWSysReg<"ICH_PPI_DVIR"#n#"_EL2", 0b11, 0b100, 0b1100, 0b1010, {0b00,nb}>;
2568+ def : RWSysReg<"ICH_PPI_ENABLER"#n#"_EL2", 0b11, 0b100, 0b1100, 0b1010, {0b01,nb}>;
2569+ def : RWSysReg<"ICH_PPI_PENDR"#n#"_EL2", 0b11, 0b100, 0b1100, 0b1010, {0b10,nb}>;
2570+ }
2571+
2572+ foreach n=0-15 in {
2573+ defvar nb = !cast<bits<4>>(n);
2574+ // Op0 Op1 CRn CRm Op2
2575+ def : RWSysReg<"ICH_PPI_PRIORITYR"#n#"_EL2", 0b11, 0b100, 0b1100, {0b111,nb{3}}, nb{2-0}>;
2576+ }
2577+
2578+ //===----------------------------------------------------------------------===//
2579+ // GICv5 instruction options.
2580+ //===----------------------------------------------------------------------===//
2581+
2582+ // GIC
2583+ class GIC<string name, bits<3> op1, bits<4> crn, bits<4> crm, bits<3> op2, bit needsreg> {
2584+ string Name = name;
2585+ bits<14> Encoding;
2586+ let Encoding{13-11} = op1;
2587+ let Encoding{10-7} = crn;
2588+ let Encoding{6-3} = crm;
2589+ let Encoding{2-0} = op2;
2590+ bit NeedsReg = needsreg;
2591+ string RequiresStr = [{ {AArch64::FeatureGCIE} }];
2592+ }
2593+
2594+ // GSB
2595+ class GSB<string name, bits<3> op1, bits<4> crn, bits<4> crm, bits<3> op2> {
2596+ string Name = name;
2597+ bits<14> Encoding;
2598+ let Encoding{13-11} = op1;
2599+ let Encoding{10-7} = crn;
2600+ let Encoding{6-3} = crm;
2601+ let Encoding{2-0} = op2;
2602+ string RequiresStr = [{ {AArch64::FeatureGCIE} }];
2603+ }
2604+
2605+ // GICR
2606+ class GICR<string name, bits<3> op1, bits<4> crn, bits<4> crm, bits<3> op2, bit needsreg> {
2607+ string Name = name;
2608+ bits<14> Encoding;
2609+ let Encoding{13-11} = op1;
2610+ let Encoding{10-7} = crn;
2611+ let Encoding{6-3} = crm;
2612+ let Encoding{2-0} = op2;
2613+ bit NeedsReg = needsreg;
2614+ string RequiresStr = [{ {AArch64::FeatureGCIE} }];
2615+ }
2616+
2617+ def GICTable : GenericTable {
2618+ let FilterClass = "GIC";
2619+ let CppTypeName = "GIC";
2620+ let Fields = ["Name", "Encoding", "NeedsReg", "RequiresStr"];
2621+
2622+ let PrimaryKey = ["Encoding"];
2623+ let PrimaryKeyName = "lookupGICByEncoding";
2624+ }
2625+
2626+ def GSBTable : GenericTable {
2627+ let FilterClass = "GSB";
2628+ let CppTypeName = "GSB";
2629+ let Fields = ["Name", "Encoding", "RequiresStr"];
2630+
2631+ let PrimaryKey = ["Encoding"];
2632+ let PrimaryKeyName = "lookupGSBByEncoding";
2633+ }
2634+
2635+ def GICRTable : GenericTable {
2636+ let FilterClass = "GICR";
2637+ let CppTypeName = "GICR";
2638+ let Fields = ["Name", "Encoding", "NeedsReg", "RequiresStr"];
2639+
2640+ let PrimaryKey = ["Encoding"];
2641+ let PrimaryKeyName = "lookupGICRByEncoding";
2642+ }
2643+
2644+ def lookupGICByName : SearchIndex {
2645+ let Table = GICTable;
2646+ let Key = ["Name"];
2647+ }
2648+
2649+ def lookupGSBByName : SearchIndex {
2650+ let Table = GSBTable;
2651+ let Key = ["Name"];
2652+ }
2653+
2654+ def lookupGICRByName : SearchIndex {
2655+ let Table = GICRTable;
2656+ let Key = ["Name"];
2657+ }
2658+
2659+ // Op1 CRn CRm Op2
2660+ def : GSB<"sys", 0b000, 0b1100, 0b0000, 0b000>;
2661+ def : GSB<"ack", 0b000, 0b1100, 0b0000, 0b001>;
2662+
2663+ // Op1 CRn CRm Op2 needsReg
2664+ def : GIC<"cdaff", 0b000, 0b1100, 0b0001, 0b011, 1>;
2665+ def : GIC<"cddi", 0b000, 0b1100, 0b0010, 0b000, 1>;
2666+ def : GIC<"cddis", 0b000, 0b1100, 0b0001, 0b000, 1>;
2667+ def : GIC<"cden", 0b000, 0b1100, 0b0001, 0b001, 1>;
2668+ def : GIC<"cdeoi", 0b000, 0b1100, 0b0001, 0b111, 1>;
2669+ def : GIC<"cdhm", 0b000, 0b1100, 0b0010, 0b001, 1>;
2670+ def : GIC<"cdpend", 0b000, 0b1100, 0b0001, 0b100, 1>;
2671+ def : GIC<"cdpri", 0b000, 0b1100, 0b0001, 0b010, 1>;
2672+ def : GIC<"cdrcfg", 0b000, 0b1100, 0b0001, 0b101, 1>;
2673+ def : GICR<"cdia", 0b000, 0b1100, 0b0011, 0b000, 1>;
2674+ def : GICR<"cdnmia", 0b000, 0b1100, 0b0011, 0b001, 1>;
2675+ def : GIC<"vdaff", 0b100, 0b1100, 0b0001, 0b011, 1>;
2676+ def : GIC<"vddi", 0b100, 0b1100, 0b0010, 0b000, 1>;
2677+ def : GIC<"vddis", 0b100, 0b1100, 0b0001, 0b000, 1>;
2678+ def : GIC<"vden", 0b100, 0b1100, 0b0001, 0b001, 1>;
2679+ def : GIC<"vdhm", 0b100, 0b1100, 0b0010, 0b001, 1>;
2680+ def : GIC<"vdpend", 0b100, 0b1100, 0b0001, 0b100, 1>;
2681+ def : GIC<"vdpri", 0b100, 0b1100, 0b0001, 0b010, 1>;
2682+ def : GIC<"vdrcfg", 0b100, 0b1100, 0b0001, 0b101, 1>;
2683+ def : GIC<"ldaff", 0b110, 0b1100, 0b0001, 0b011, 1>;
2684+ def : GIC<"lddi", 0b110, 0b1100, 0b0010, 0b000, 1>;
2685+ def : GIC<"lddis", 0b110, 0b1100, 0b0001, 0b000, 1>;
2686+ def : GIC<"lden", 0b110, 0b1100, 0b0001, 0b001, 1>;
2687+ def : GIC<"ldhm", 0b110, 0b1100, 0b0010, 0b001, 1>;
2688+ def : GIC<"ldpend", 0b110, 0b1100, 0b0001, 0b100, 1>;
2689+ def : GIC<"ldpri", 0b110, 0b1100, 0b0001, 0b010, 1>;
2690+ def : GIC<"ldrcfg", 0b110, 0b1100, 0b0001, 0b101, 1>;
0 commit comments