[1/2] aarch64: Treat operand Rt_IN_SYS_ALIASES as register number (PR 31919)

Message ID 20240621155013.1423979-2-jremus@linux.ibm.com
State Committed
Headers
Series aarch64: Fixes access to struct aarch64_opnd_info members |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Test passed

Commit Message

Jens Remus June 21, 2024, 3:50 p.m. UTC
  The AArch64 instruction table (aarch64-tbl.h) defines the operand
Rt_IN_SYS_ALIASES as register number. During assembly it is correctly
encoded as register number (reg.regno) in parse_operands. During
disassembly it is first correctly decoded as register number (reg.regno)
in aarch64_ext_regno called by aarch64_extract_operand, but then
erroneously treated as immediate value (imm.value) in
aarch64_print_operand.

This resolves the assembler test case "gas/aarch64/brbe-brb-inst" to
erroneously fail on s390. On AArch64 - being little-endian - the struct
aarch64_opnd_info union fields reg.regno and imm.value share their
least-significant bits. On s390 - being big-endian - they do not.

opcodes/
	PR binutils/31919
	* aarch64-opc.c: Treat operand Rt_IN_SYS_ALIASES as register
	number.

Bug: https://sourceware.org/PR31919
Fixes: 72476aca8f58 ("aarch64: add Branch Record Buffer extension instructions")
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
 opcodes/aarch64-opc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Patch

diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c
index ea278bfdfe5f..991b71804bf4 100644
--- a/opcodes/aarch64-opc.c
+++ b/opcodes/aarch64-opc.c
@@ -3987,7 +3987,7 @@  aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
 	{
 	  /* Avoid printing an invalid additional value for Rt in SYS aliases such as
 	     BRB, provide a helpful comment instead */
-	  snprintf (comment, comment_size, "unpredictable encoding (Rt!=31): #%" PRIi64, opnd->imm.value);
+	  snprintf (comment, comment_size, "unpredictable encoding (Rt!=31): #%u", opnd->reg.regno);
 	  break;
 	}
       /* Omit the operand, e.g. RET.  */