git: 6cc69b793bbd - stable/13 - arm64/disassem.c: Fix typo sxts to sxts and amount for TYPE_02

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Fri, 09 Jun 2023 19:57:56 UTC
The branch stable/13 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=6cc69b793bbd761ec04eee0b379392dd75f09351

commit 6cc69b793bbd761ec04eee0b379392dd75f09351
Author:     Mykola Hohsadze <koliagogsadze@gmail.com>
AuthorDate: 2023-04-18 15:50:58 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2023-06-09 18:14:58 +0000

    arm64/disassem.c: Fix typo sxts to sxts and amount for TYPE_02
    
    The current implementation is wrong, since it unconditionally sets the
    amount equal to the <size> field of the instruction. However, when the
    <S> bit (scale) is not set, it must be zero.
    
    Also fix a typo, sxts to sxtx, according to the Arm64 documentation.
    
    Reviewed by:    mhorne
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D39334
    
    (cherry picked from commit cb923f03faa068f0c8ed5ffa7c3485ad7918be10)
---
 sys/arm64/arm64/disassem.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/sys/arm64/arm64/disassem.c b/sys/arm64/arm64/disassem.c
index ea6193655a5f..0f7b040e7b06 100644
--- a/sys/arm64/arm64/disassem.c
+++ b/sys/arm64/arm64/disassem.c
@@ -521,9 +521,13 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt)
 			    arm64_reg(sf, rt), arm64_reg(1, rn),
 			    arm64_reg(option & 1, rm));
 
-			/* Calculate amount, it's op(31:30) */
-			amount = (insn >> ARM_INSN_SIZE_OFFSET) &
-			    ARM_INSN_SIZE_MASK;
+			if (scale == 0)
+				amount = 0;
+			else {
+				/* Calculate amount, it's op(31:30) */
+				amount = (insn >> ARM_INSN_SIZE_OFFSET) &
+			            ARM_INSN_SIZE_MASK;
+			}
 
 			switch (option) {
 			case 0x2:
@@ -537,7 +541,7 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt)
 				di->di_printf(", sxtw #%d", amount);
 				break;
 			case 0x7:
-				di->di_printf(", sxts #%d", amount);
+				di->di_printf(", sxtx #%d", amount);
 				break;
 			default:
 				di->di_printf(", RSVD");