summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2023-04-10 17:22:23 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2023-04-24 12:32:22 +0000
commit72b4699314e0a6eeeb29cea33d0410612c80f533 (patch)
treeec22c6b820cc03de86f76d9dab09b24181de0d38
parent596581a8d771338edaa7620385a19b3fe953fd71 (diff)
downloadorc-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.c12
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) {