ARM print_insn_mve assertion

Message ID ZqL2JcqXS7uGiosE@squeak.grove.modra.org
State Committed
Headers
Series ARM print_insn_mve assertion |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm warning Patch is already merged
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 warning Patch is already merged

Commit Message

Alan Modra July 26, 2024, 1:04 a.m. UTC
  This corrects objdump -d -m armv8.1-m.main output for a testcase found
by oss-fuzz, .inst 0xee2fee79, which hits an assertion.

Obviously the switch case constants should be binary, not hex.
Correcting that is enough to cure this assertion, but I don't see any
point in singling out the invalid case 0b10.  In fact, it is just plain
wrong to print "undefined instruction: size equals zero    undefined
instruction: size equals two".

I also don't see the need for defensive programming here as is done
elsewhere in checking that "value" is in range before indexing
mve_vec_sizename.  There is exactly one MVE_VSHLL_T2 entry in
mve_opcodes so it is easy to verify that "value" is only two bits.
  

Patch

diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index 480e4c21655..d1d7ca30993 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -9887,23 +9887,8 @@  print_insn_mve (struct disassemble_info *info, long given)
 			    if (mve_shift_insn_p (insn->mve_op))
 			      print_mve_shift_n (info, given, insn->mve_op);
 			    else if (insn->mve_op == MVE_VSHLL_T2)
-			      {
-				switch (value)
-				  {
-				  case 0x00:
-				    func (stream, dis_style_immediate, "8");
-				    break;
-				  case 0x01:
-				    func (stream, dis_style_immediate, "16");
-				    break;
-				  case 0x10:
-				    print_mve_undefined (info, UNDEF_SIZE_0);
-				    break;
-				  default:
-				    assert (0);
-				    break;
-				  }
-			      }
+			      func (stream, dis_style_immediate, "%s",
+				    mve_vec_sizename[value]);
 			    else
 			      {
 				if (insn->mve_op == MVE_VSHLC && value == 0)