diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-04-10 17:22:23 +0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2023-04-24 12:32:22 +0000 |
commit | 72b4699314e0a6eeeb29cea33d0410612c80f533 (patch) | |
tree | ec22c6b820cc03de86f76d9dab09b24181de0d38 | |
parent | 596581a8d771338edaa7620385a19b3fe953fd71 (diff) | |
download | orc-72b4699314e0a6eeeb29cea33d0410612c80f533.tar.gz |
orcarm: Fix generation of SBFM/UBFM alias instructions
See alias tables in ARMv8-A Architecture Reference Manual.
CID 1522409
Part-of: <https://gitlab.freedesktop.org/gstreamer/orc/-/merge_requests/95>
-rw-r--r-- | orc/orcarm.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/orc/orcarm.c b/orc/orcarm.c index 2080392..bb334b6 100644 --- a/orc/orcarm.c +++ b/orc/orcarm.c @@ -1557,9 +1557,8 @@ orc_arm64_emit_bfm (OrcCompiler *p, OrcArm64RegBits bits, OrcArm64DP opcode, /** find its alias */ switch (opcode) { case ORC_ARM64_DP_SBFM: - if (imms == 0x1f) { - if (bits == ORC_ARM64_REG_64) - imms |= 0x20; + if ((imms == 0x1f && bits == ORC_ARM64_REG_32) || + (imms == 0x3f && bits == ORC_ARM64_REG_64)) { snprintf (opt_immr, ARM64_MAX_OP_LEN, ", #%u", immr); alias = 0; } else if (imms < immr) { @@ -1596,14 +1595,11 @@ orc_arm64_emit_bfm (OrcCompiler *p, OrcArm64RegBits bits, OrcArm64DP opcode, } break; case ORC_ARM64_DP_UBFM: - if (imms == 0x1f) { - if (bits == ORC_ARM64_REG_64) - imms |= 0x20; + if ((imms == 0x1f && bits == ORC_ARM64_REG_32) || + (imms == 0x3f && bits == ORC_ARM64_REG_64)) { snprintf (opt_immr, ARM64_MAX_OP_LEN, ", #%u", immr); alias = 1; } else if (imms + 1 == immr) { - if (bits == ORC_ARM64_REG_64) - imms |= 0x20; snprintf (opt_immr, ARM64_MAX_OP_LEN, ", #%u", immr); alias = 0; } else if (imms < immr) { |