diff options
| author | Galen Williamson <galen@vector35.com> | 2025-03-25 21:27:51 -0400 |
|---|---|---|
| committer | Galen Williamson <galen@vector35.com> | 2025-03-31 18:31:33 -0400 |
| commit | b095215397ca8fe7e9808f312403ec4494de76f6 (patch) | |
| tree | 5eebe61a44d2f95aa5fadd78d9974234fca376be /arch/arm64/neon_intrinsics.cpp | |
| parent | 8093106217331012734564301118244748535715 (diff) | |
[aarch64] Updating Aarch64 system registers to 2024-12 spec, fix MSR/MRS lifting to use ReadMSR/WriteMSR intrinsics that take enums, removing the sysregs from the register list of the architecture
* sysregs are no longer registers, add enum for TLBI and AT operands
* add erroneously missing cases for unsupported encodings, add enum for DC operands
Diffstat (limited to 'arch/arm64/neon_intrinsics.cpp')
| -rw-r--r-- | arch/arm64/neon_intrinsics.cpp | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/arch/arm64/neon_intrinsics.cpp b/arch/arm64/neon_intrinsics.cpp index 9557fd27..02e13047 100644 --- a/arch/arm64/neon_intrinsics.cpp +++ b/arch/arm64/neon_intrinsics.cpp @@ -1,6 +1,253 @@ #include "neon_intrinsics.h" #include "il_macros.h" + +Ref<Enumeration> get_tlbi_op_enum() +{ + EnumerationBuilder builder; + builder.AddMemberWithValue("invalid", TLBI_INVALID); + builder.AddMemberWithValue("vmalle1os", TLBI_VMALLE1OS); + builder.AddMemberWithValue("vae1os", TLBI_VAE1OS); + builder.AddMemberWithValue("aside1os", TLBI_ASIDE1OS); + builder.AddMemberWithValue("vaae1os", TLBI_VAAE1OS); + builder.AddMemberWithValue("vale1os", TLBI_VALE1OS); + builder.AddMemberWithValue("vaale1os", TLBI_VAALE1OS); + builder.AddMemberWithValue("rvae1is", TLBI_RVAE1IS); + builder.AddMemberWithValue("rvaae1is", TLBI_RVAAE1IS); + builder.AddMemberWithValue("rvale1is", TLBI_RVALE1IS); + builder.AddMemberWithValue("rvaale1is", TLBI_RVAALE1IS); + builder.AddMemberWithValue("vmalle1is", TLBI_VMALLE1IS); + builder.AddMemberWithValue("vae1is", TLBI_VAE1IS); + builder.AddMemberWithValue("aside1is", TLBI_ASIDE1IS); + builder.AddMemberWithValue("vaae1is", TLBI_VAAE1IS); + builder.AddMemberWithValue("vale1is", TLBI_VALE1IS); + builder.AddMemberWithValue("vaale1is", TLBI_VAALE1IS); + builder.AddMemberWithValue("rvae1os", TLBI_RVAE1OS); + builder.AddMemberWithValue("rvaae1os", TLBI_RVAAE1OS); + builder.AddMemberWithValue("rvale1os", TLBI_RVALE1OS); + builder.AddMemberWithValue("rvaale1os", TLBI_RVAALE1OS); + builder.AddMemberWithValue("rvae1", TLBI_RVAE1); + builder.AddMemberWithValue("rvaae1", TLBI_RVAAE1); + builder.AddMemberWithValue("rvale1", TLBI_RVALE1); + builder.AddMemberWithValue("rvaale1", TLBI_RVAALE1); + builder.AddMemberWithValue("vmalle1", TLBI_VMALLE1); + builder.AddMemberWithValue("vae1", TLBI_VAE1); + builder.AddMemberWithValue("aside1", TLBI_ASIDE1); + builder.AddMemberWithValue("vaae1", TLBI_VAAE1); + builder.AddMemberWithValue("vale1", TLBI_VALE1); + builder.AddMemberWithValue("vaale1", TLBI_VAALE1); + builder.AddMemberWithValue("vmalle1osnxs", TLBI_VMALLE1OSNXS); + builder.AddMemberWithValue("vae1osnxs", TLBI_VAE1OSNXS); + builder.AddMemberWithValue("aside1osnxs", TLBI_ASIDE1OSNXS); + builder.AddMemberWithValue("vaae1osnxs", TLBI_VAAE1OSNXS); + builder.AddMemberWithValue("vale1osnxs", TLBI_VALE1OSNXS); + builder.AddMemberWithValue("vaale1osnxs", TLBI_VAALE1OSNXS); + builder.AddMemberWithValue("rvae1isnxs", TLBI_RVAE1ISNXS); + builder.AddMemberWithValue("rvaae1isnxs", TLBI_RVAAE1ISNXS); + builder.AddMemberWithValue("rvale1isnxs", TLBI_RVALE1ISNXS); + builder.AddMemberWithValue("rvaale1isnxs", TLBI_RVAALE1ISNXS); + builder.AddMemberWithValue("vmalle1isnxs", TLBI_VMALLE1ISNXS); + builder.AddMemberWithValue("vae1isnxs", TLBI_VAE1ISNXS); + builder.AddMemberWithValue("aside1isnxs", TLBI_ASIDE1ISNXS); + builder.AddMemberWithValue("vaae1isnxs", TLBI_VAAE1ISNXS); + builder.AddMemberWithValue("vale1isnxs", TLBI_VALE1ISNXS); + builder.AddMemberWithValue("vaale1isnxs", TLBI_VAALE1ISNXS); + builder.AddMemberWithValue("rvae1osnxs", TLBI_RVAE1OSNXS); + builder.AddMemberWithValue("rvaae1osnxs", TLBI_RVAAE1OSNXS); + builder.AddMemberWithValue("rvale1osnxs", TLBI_RVALE1OSNXS); + builder.AddMemberWithValue("rvaale1osnxs", TLBI_RVAALE1OSNXS); + builder.AddMemberWithValue("rvae1nxs", TLBI_RVAE1NXS); + builder.AddMemberWithValue("rvaae1nxs", TLBI_RVAAE1NXS); + builder.AddMemberWithValue("rvale1nxs", TLBI_RVALE1NXS); + builder.AddMemberWithValue("rvaale1nxs", TLBI_RVAALE1NXS); + builder.AddMemberWithValue("vmalle1nxs", TLBI_VMALLE1NXS); + builder.AddMemberWithValue("vae1nxs", TLBI_VAE1NXS); + builder.AddMemberWithValue("aside1nxs", TLBI_ASIDE1NXS); + builder.AddMemberWithValue("vaae1nxs", TLBI_VAAE1NXS); + builder.AddMemberWithValue("vale1nxs", TLBI_VALE1NXS); + builder.AddMemberWithValue("vaale1nxs", TLBI_VAALE1NXS); + builder.AddMemberWithValue("ipas2e1is", TLBI_IPAS2E1IS); + builder.AddMemberWithValue("ripas2e1is", TLBI_RIPAS2E1IS); + builder.AddMemberWithValue("ipas2le1is", TLBI_IPAS2LE1IS); + builder.AddMemberWithValue("ripas2le1is", TLBI_RIPAS2LE1IS); + builder.AddMemberWithValue("alle2os", TLBI_ALLE2OS); + builder.AddMemberWithValue("vae2os", TLBI_VAE2OS); + builder.AddMemberWithValue("alle1os", TLBI_ALLE1OS); + builder.AddMemberWithValue("vale2os", TLBI_VALE2OS); + builder.AddMemberWithValue("vmalls12e1os", TLBI_VMALLS12E1OS); + builder.AddMemberWithValue("rvae2is", TLBI_RVAE2IS); + builder.AddMemberWithValue("vmallws2e1is", TLBI_VMALLWS2E1IS); + builder.AddMemberWithValue("rvale2is", TLBI_RVALE2IS); + builder.AddMemberWithValue("alle2is", TLBI_ALLE2IS); + builder.AddMemberWithValue("vae2is", TLBI_VAE2IS); + builder.AddMemberWithValue("alle1is", TLBI_ALLE1IS); + builder.AddMemberWithValue("vale2is", TLBI_VALE2IS); + builder.AddMemberWithValue("vmalls12e1is", TLBI_VMALLS12E1IS); + builder.AddMemberWithValue("ipas2e1os", TLBI_IPAS2E1OS); + builder.AddMemberWithValue("ipas2e1", TLBI_IPAS2E1); + builder.AddMemberWithValue("ripas2e1", TLBI_RIPAS2E1); + builder.AddMemberWithValue("ripas2e1os", TLBI_RIPAS2E1OS); + builder.AddMemberWithValue("ipas2le1os", TLBI_IPAS2LE1OS); + builder.AddMemberWithValue("ipas2le1", TLBI_IPAS2LE1); + builder.AddMemberWithValue("ripas2le1", TLBI_RIPAS2LE1); + builder.AddMemberWithValue("ripas2le1os", TLBI_RIPAS2LE1OS); + builder.AddMemberWithValue("rvae2os", TLBI_RVAE2OS); + builder.AddMemberWithValue("vmallws2e1os", TLBI_VMALLWS2E1OS); + builder.AddMemberWithValue("rvale2os", TLBI_RVALE2OS); + builder.AddMemberWithValue("rvae2", TLBI_RVAE2); + builder.AddMemberWithValue("vmallws2e1", TLBI_VMALLWS2E1); + builder.AddMemberWithValue("rvale2", TLBI_RVALE2); + builder.AddMemberWithValue("alle2", TLBI_ALLE2); + builder.AddMemberWithValue("vae2", TLBI_VAE2); + builder.AddMemberWithValue("alle1", TLBI_ALLE1); + builder.AddMemberWithValue("vale2", TLBI_VALE2); + builder.AddMemberWithValue("vmalls12e1", TLBI_VMALLS12E1); + builder.AddMemberWithValue("ipas2e1isnxs", TLBI_IPAS2E1ISNXS); + builder.AddMemberWithValue("ripas2e1isnxs", TLBI_RIPAS2E1ISNXS); + builder.AddMemberWithValue("ipas2le1isnxs", TLBI_IPAS2LE1ISNXS); + builder.AddMemberWithValue("ripas2le1isnxs", TLBI_RIPAS2LE1ISNXS); + builder.AddMemberWithValue("alle2osnxs", TLBI_ALLE2OSNXS); + builder.AddMemberWithValue("vae2osnxs", TLBI_VAE2OSNXS); + builder.AddMemberWithValue("alle1osnxs", TLBI_ALLE1OSNXS); + builder.AddMemberWithValue("vale2osnxs", TLBI_VALE2OSNXS); + builder.AddMemberWithValue("vmalls12e1osnxs", TLBI_VMALLS12E1OSNXS); + builder.AddMemberWithValue("rvae2isnxs", TLBI_RVAE2ISNXS); + builder.AddMemberWithValue("vmallws2e1isnxs", TLBI_VMALLWS2E1ISNXS); + builder.AddMemberWithValue("rvale2isnxs", TLBI_RVALE2ISNXS); + builder.AddMemberWithValue("alle2isnxs", TLBI_ALLE2ISNXS); + builder.AddMemberWithValue("vae2isnxs", TLBI_VAE2ISNXS); + builder.AddMemberWithValue("alle1isnxs", TLBI_ALLE1ISNXS); + builder.AddMemberWithValue("vale2isnxs", TLBI_VALE2ISNXS); + builder.AddMemberWithValue("vmalls12e1isnxs", TLBI_VMALLS12E1ISNXS); + builder.AddMemberWithValue("ipas2e1osnxs", TLBI_IPAS2E1OSNXS); + builder.AddMemberWithValue("ipas2e1nxs", TLBI_IPAS2E1NXS); + builder.AddMemberWithValue("ripas2e1nxs", TLBI_RIPAS2E1NXS); + builder.AddMemberWithValue("ripas2e1osnxs", TLBI_RIPAS2E1OSNXS); + builder.AddMemberWithValue("ipas2le1osnxs", TLBI_IPAS2LE1OSNXS); + builder.AddMemberWithValue("ipas2le1nxs", TLBI_IPAS2LE1NXS); + builder.AddMemberWithValue("ripas2le1nxs", TLBI_RIPAS2LE1NXS); + builder.AddMemberWithValue("ripas2le1osnxs", TLBI_RIPAS2LE1OSNXS); + builder.AddMemberWithValue("rvae2osnxs", TLBI_RVAE2OSNXS); + builder.AddMemberWithValue("vmallws2e1osnxs", TLBI_VMALLWS2E1OSNXS); + builder.AddMemberWithValue("rvale2osnxs", TLBI_RVALE2OSNXS); + builder.AddMemberWithValue("rvae2nxs", TLBI_RVAE2NXS); + builder.AddMemberWithValue("vmallws2e1nxs", TLBI_VMALLWS2E1NXS); + builder.AddMemberWithValue("rvale2nxs", TLBI_RVALE2NXS); + builder.AddMemberWithValue("alle2nxs", TLBI_ALLE2NXS); + builder.AddMemberWithValue("vae2nxs", TLBI_VAE2NXS); + builder.AddMemberWithValue("alle1nxs", TLBI_ALLE1NXS); + builder.AddMemberWithValue("vale2nxs", TLBI_VALE2NXS); + builder.AddMemberWithValue("vmalls12e1nxs", TLBI_VMALLS12E1NXS); + builder.AddMemberWithValue("alle3os", TLBI_ALLE3OS); + builder.AddMemberWithValue("vae3os", TLBI_VAE3OS); + builder.AddMemberWithValue("paallos", TLBI_PAALLOS); + builder.AddMemberWithValue("vale3os", TLBI_VALE3OS); + builder.AddMemberWithValue("rvae3is", TLBI_RVAE3IS); + builder.AddMemberWithValue("rvale3is", TLBI_RVALE3IS); + builder.AddMemberWithValue("alle3is", TLBI_ALLE3IS); + builder.AddMemberWithValue("vae3is", TLBI_VAE3IS); + builder.AddMemberWithValue("vale3is", TLBI_VALE3IS); + builder.AddMemberWithValue("rpaos", TLBI_RPAOS); + builder.AddMemberWithValue("rpalos", TLBI_RPALOS); + builder.AddMemberWithValue("rvae3os", TLBI_RVAE3OS); + builder.AddMemberWithValue("rvale3os", TLBI_RVALE3OS); + builder.AddMemberWithValue("rvae3", TLBI_RVAE3); + builder.AddMemberWithValue("rvale3", TLBI_RVALE3); + builder.AddMemberWithValue("alle3", TLBI_ALLE3); + builder.AddMemberWithValue("vae3", TLBI_VAE3); + builder.AddMemberWithValue("paall", TLBI_PAALL); + builder.AddMemberWithValue("vale3", TLBI_VALE3); + builder.AddMemberWithValue("alle3osnxs", TLBI_ALLE3OSNXS); + builder.AddMemberWithValue("vae3osnxs", TLBI_VAE3OSNXS); + builder.AddMemberWithValue("vale3osnxs", TLBI_VALE3OSNXS); + builder.AddMemberWithValue("rvae3isnxs", TLBI_RVAE3ISNXS); + builder.AddMemberWithValue("rvale3isnxs", TLBI_RVALE3ISNXS); + builder.AddMemberWithValue("alle3isnxs", TLBI_ALLE3ISNXS); + builder.AddMemberWithValue("vae3isnxs", TLBI_VAE3ISNXS); + builder.AddMemberWithValue("vale3isnxs", TLBI_VALE3ISNXS); + builder.AddMemberWithValue("rvae3osnxs", TLBI_RVAE3OSNXS); + builder.AddMemberWithValue("rvale3osnxs", TLBI_RVALE3OSNXS); + builder.AddMemberWithValue("rvae3nxs", TLBI_RVAE3NXS); + builder.AddMemberWithValue("rvale3nxs", TLBI_RVALE3NXS); + builder.AddMemberWithValue("alle3nxs", TLBI_ALLE3NXS); + builder.AddMemberWithValue("vae3nxs", TLBI_VAE3NXS); + builder.AddMemberWithValue("vale3nxs", TLBI_VALE3NXS); + + Ref<Enumeration> _enum = builder.Finalize(); + return _enum; +} + +Ref<Enumeration> get_at_op_enum() +{ + EnumerationBuilder builder; + builder.AddMemberWithValue("invalid", AT_OP_INVALID); + builder.AddMemberWithValue("s1e1r", AT_OP_S1E1R); + builder.AddMemberWithValue("s1e1w", AT_OP_S1E1W); + builder.AddMemberWithValue("s1e0r", AT_OP_S1E0R); + builder.AddMemberWithValue("s1e0w", AT_OP_S1E0W); + builder.AddMemberWithValue("s1e1rp", AT_OP_S1E1RP); + builder.AddMemberWithValue("s1e1wp", AT_OP_S1E1WP); + builder.AddMemberWithValue("s1e1a", AT_OP_S1E1A); + builder.AddMemberWithValue("s1e2r", AT_OP_S1E2R); + builder.AddMemberWithValue("s1e2w", AT_OP_S1E2W); + builder.AddMemberWithValue("s12e1r", AT_OP_S12E1R); + builder.AddMemberWithValue("s12e1w", AT_OP_S12E1W); + builder.AddMemberWithValue("s12e0r", AT_OP_S12E0R); + builder.AddMemberWithValue("s12e0w", AT_OP_S12E0W); + builder.AddMemberWithValue("s1e2a", AT_OP_S1E2A); + builder.AddMemberWithValue("s1e3r", AT_OP_S1E3R); + builder.AddMemberWithValue("s1e3w", AT_OP_S1E3W); + builder.AddMemberWithValue("s1e3a", AT_OP_S1E3A); + Ref<Enumeration> _enum = builder.Finalize(); + return _enum; +} + +Ref<Enumeration> get_dc_op_enum() +{ + EnumerationBuilder builder; + builder.AddMemberWithValue("invalid", DC_OP_INVALID); + builder.AddMemberWithValue("IVAC", DC_OP_IVAC); + builder.AddMemberWithValue("ISW", DC_OP_ISW); + builder.AddMemberWithValue("IGVAC", DC_OP_IGVAC); + builder.AddMemberWithValue("IGSW", DC_OP_IGSW); + builder.AddMemberWithValue("IGDVAC", DC_OP_IGDVAC); + builder.AddMemberWithValue("IGDSW", DC_OP_IGDSW); + builder.AddMemberWithValue("CSW", DC_OP_CSW); + builder.AddMemberWithValue("CGSW", DC_OP_CGSW); + builder.AddMemberWithValue("CGDSW", DC_OP_CGDSW); + builder.AddMemberWithValue("CISW", DC_OP_CISW); + builder.AddMemberWithValue("CIGSW", DC_OP_CIGSW); + builder.AddMemberWithValue("CIGDSW", DC_OP_CIGDSW); + builder.AddMemberWithValue("CIVAPS", DC_OP_CIVAPS); + builder.AddMemberWithValue("CIGDVAPS", DC_OP_CIGDVAPS); + builder.AddMemberWithValue("ZVA", DC_OP_ZVA); + builder.AddMemberWithValue("GVA", DC_OP_GVA); + builder.AddMemberWithValue("GZVA", DC_OP_GZVA); + builder.AddMemberWithValue("CVAC", DC_OP_CVAC); + builder.AddMemberWithValue("CGVAC", DC_OP_CGVAC); + builder.AddMemberWithValue("CGDVAC", DC_OP_CGDVAC); + builder.AddMemberWithValue("CVAOC", DC_OP_CVAOC); + builder.AddMemberWithValue("CVAU", DC_OP_CVAU); + builder.AddMemberWithValue("CGDVAOC", DC_OP_CGDVAOC); + builder.AddMemberWithValue("CVAP", DC_OP_CVAP); + builder.AddMemberWithValue("CGVAP", DC_OP_CGVAP); + builder.AddMemberWithValue("CGDVAP", DC_OP_CGDVAP); + builder.AddMemberWithValue("CVADP", DC_OP_CVADP); + builder.AddMemberWithValue("CGVADP", DC_OP_CGVADP); + builder.AddMemberWithValue("CGDVADP", DC_OP_CGDVADP); + builder.AddMemberWithValue("CIVAC", DC_OP_CIVAC); + builder.AddMemberWithValue("CIGVAC", DC_OP_CIGVAC); + builder.AddMemberWithValue("CIGDVAC", DC_OP_CIGDVAC); + builder.AddMemberWithValue("CIVAOC", DC_OP_CIVAOC); + builder.AddMemberWithValue("CIGDVAOC", DC_OP_CIGDVAOC); + builder.AddMemberWithValue("CIPAE", DC_OP_CIPAE); + builder.AddMemberWithValue("CIGDPAE", DC_OP_CIGDPAE); + builder.AddMemberWithValue("CIPAPA", DC_OP_CIPAPA); + builder.AddMemberWithValue("CIGDPAPA", DC_OP_CIGDPAPA); + Ref<Enumeration> _enum = builder.Finalize(); + return _enum; +} + string NeonGetIntrinsicName(uint32_t intrinsic) { switch (intrinsic) |
