Page MenuHomeFreeBSD

0001-arm64-disassem.c-add-aliases-of-shifted-register-ins.patch

Authored By
koliagogsadze_gmail.com
May 13 2023, 2:43 PM
Size
4 KB
Referenced Files
None
Subscribers
None

0001-arm64-disassem.c-add-aliases-of-shifted-register-ins.patch

From 2ab010a4abdd71c162ab35b25fe1c28b017690b6 Mon Sep 17 00:00:00 2001
From: Mykola Hohsadze <koliagogsadze@gmail.com>
Date: Sat, 13 May 2023 11:40:20 +0300
Subject: [PATCH] arm64/disassem.c: add aliases of shifted register
instructions
Differential Revision: https://reviews.freebsd.org/D40006
---
sys/arm64/arm64/disassem.c | 67 ++++++++++++++++++++++++++++++++++----
1 file changed, 60 insertions(+), 7 deletions(-)
diff --git a/sys/arm64/arm64/disassem.c b/sys/arm64/arm64/disassem.c
index a2d21d315629..2402f4f165ee 100644
--- a/sys/arm64/arm64/disassem.c
+++ b/sys/arm64/arm64/disassem.c
@@ -103,6 +103,12 @@ enum arm64_format_type {
/* OP <RT>, #imm SF32/64 */
TYPE_03,
+
+ /*
+ * OP <RD>, <RM> {, <shift> #<imm> }
+ * OP <RN>, <RM> {, <shift> #<imm> }
+ */
+ TYPE_04,
};
/*
@@ -151,9 +157,10 @@ static struct arm64_insn arm64_i[] = {
TYPE_01, OP_RD_SP | OP_RN_SP }, /* mov (to/from sp) */
{ "add", "SF(1)|0010001|SHIFT(2)|IMM(12)|RN(5)|RD(5)",
TYPE_01, OP_RD_SP | OP_RN_SP }, /* add immediate */
+ { "cmn", "SF(1)|0101011|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|11111",
+ TYPE_04, 0 }, /* cmn shifted register */
{ "adds", "SF(1)|0101011|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|RD(5)",
- TYPE_01, 0 },
- /* adds shifted register, alias cmn shifted register */
+ TYPE_01, 0 }, /* adds shifted register */
{ "ldr", "1|SF(1)|111000010|IMM(9)|OPTION(2)|RN(5)|RT(5)",
TYPE_02, OP_SIGN_EXT | OP_RN_SP }, /* ldr immediate post/pre index */
{ "ldr", "1|SF(1)|11100101|IMM(12)|RN(5)|RT(5)",
@@ -219,12 +226,16 @@ static struct arm64_insn arm64_i[] = {
{ "strh", "01111000001|RM(5)|OPTION(3)|SCALE(1)|10|RN(5)|RT(5)",
TYPE_02, OP_SF32 | OP_RN_SP },
/* strh register */
+ { "neg", "SF(1)|1001011|SHIFT(2)|0|RM(5)|IMM(6)|11111|RD(5)",
+ TYPE_04, 0 }, /* neg shifted register */
{ "sub", "SF(1)|1001011|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|RD(5)",
- TYPE_01, 0 },
- /* sub shifted register, alias neg shifted register */
+ TYPE_01, 0 }, /* sub shifted register */
+ { "cmp", "SF(1)|1101011|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|11111",
+ TYPE_04, 0 }, /* cmp shifted register */
+ { "negs", "SF(1)|1101011|SHIFT(2)|0|RM(5)|IMM(6)|11111|RD(5)",
+ TYPE_04, 0 }, /* negs shifted register */
{ "subs", "SF(1)|1101011|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|RD(5)",
- TYPE_01, 0 },
- /* subs shifted register, alias cmp/negs shifted register */
+ TYPE_01, 0 }, /* subs shifted register */
{ NULL, NULL }
};
@@ -406,7 +417,7 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt)
int ret;
int shift, rm, rt, rd, rn, imm, sf, idx, option, scale, amount;
int sign_ext;
- int rm_absent;
+ int rm_absent, rd_absent, rn_absent;
/* Indicate if immediate should be outside or inside brackets */
int inside;
/* Print exclamation mark if pre-incremented */
@@ -612,6 +623,48 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt)
di->di_printf("#%d", imm);
break;
+
+ case TYPE_04:
+ /*
+ * OP <RD>, <RM> {, <shift> #<imm> }
+ * OP <RN>, <RM> {, <shift> #<imm> }
+ */
+
+ /* Mandatory tokens */
+ rm_absent = arm64_disasm_read_token(i_ptr, insn, "RM", &rm);
+ rd_absent = arm64_disasm_read_token(i_ptr, insn, "RD", &rd);
+ rn_absent = arm64_disasm_read_token(i_ptr, insn, "RN", &rn);
+
+ if (rm_absent != 0 || (rd_absent != 0 && rn_absent != 0)) {
+ printf("ERROR: "
+ "Missing mandatory token for op %s type %d\n",
+ i_ptr->name, i_ptr->type);
+ goto undefined;
+ }
+
+ if (rd_absent == 0 && rn_absent == 0) {
+ printf("ERROR: "
+ "Redundant token RD or RN for op %s type %d\n",
+ i_ptr->name, i_ptr->type);
+ goto undefined;
+ }
+
+ di->di_printf("%s\t", i_ptr->name);
+ if (rd_absent == 0)
+ di->di_printf("%s", arm64_reg(sf, rd, rd_sp));
+ else
+ di->di_printf("%s", arm64_reg(sf, rn, rn_sp));
+ di->di_printf(", %s", arm64_reg(sf, rm, rm_sp));
+
+ /* Optional tokens */
+ arm64_disasm_read_token(i_ptr, insn, "SHIFT", &shift);
+ arm64_disasm_read_token(i_ptr, insn, "IMM", &imm);
+
+ if (imm != 0)
+ di->di_printf(", %s #%d", shift_2[shift], imm);
+
+ break;
+
default:
goto undefined;
}
--
2.39.1

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5894732
Default Alt Text
0001-arm64-disassem.c-add-aliases-of-shifted-register-ins.patch (4 KB)

Event Timeline