summaryrefslogtreecommitdiff
path: root/arch/arm64/neon_intrinsics.cpp
diff options
context:
space:
mode:
authorGalen Williamson <galen@vector35.com>2025-03-25 21:27:51 -0400
committerGalen Williamson <galen@vector35.com>2025-03-31 18:31:33 -0400
commitb095215397ca8fe7e9808f312403ec4494de76f6 (patch)
tree5eebe61a44d2f95aa5fadd78d9974234fca376be /arch/arm64/neon_intrinsics.cpp
parent8093106217331012734564301118244748535715 (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.cpp247
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)