[v2,04/16] RISC-V: match_*() improvements

Message ID 7b2943ce-eab2-454f-817f-f1de5650a5f9@suse.com
State New
Headers
Series RISC-V: assorted fixes and (hopefully) improvements |

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

Jan Beulich May 15, 2026, 1:30 p.m. UTC
  Match functions referenced by macro insns should not
unconditionally invoke match_opcode(): The macro enumeration can change
(grow), making the function potentially yield false negatives.

In match_rs1_nonzero(), used solely by macro insns, add an assertion to
that effect.

While there also drop the pointless attribute from
match_rs1_nonzero_rs2_even()'s first parameter.
  

Patch

--- a/opcodes/riscv-opc.c
+++ b/opcodes/riscv-opc.c
@@ -22,6 +22,7 @@ 
 
 #include "sysdep.h"
 #include "opcode/riscv.h"
+#include <assert.h>
 #include <stdio.h>
 
 /* Register names used by gas and objdump.  */
@@ -210,14 +211,16 @@  static int
 match_rd_even (const struct riscv_opcode *op, insn_t insn)
 {
   int rd = (insn & MASK_RD) >> OP_SH_RD;
-  return ((rd & 1) == 0) && match_opcode (op, insn);
+  return ((rd & 1) == 0)
+         && (op->pinfo == INSN_MACRO || match_opcode (op, insn));
 }
 
 static int
 match_rs2_even (const struct riscv_opcode *op, insn_t insn)
 {
   int rs2 = (insn & MASK_RS2) >> OP_SH_RS2;
-  return ((rs2 & 1) == 0) && match_opcode (op, insn);
+  return ((rs2 & 1) == 0)
+         && (op->pinfo == INSN_MACRO || match_opcode (op, insn));
 }
 
 static int
@@ -236,11 +239,12 @@  match_rd_even_nonzero (const struct risc
 static int
 match_rs1_nonzero (const struct riscv_opcode *op ATTRIBUTE_UNUSED, insn_t insn)
 {
+  assert (op->pinfo == INSN_MACRO);
   return (insn & MASK_RS1) != 0;
 }
 
 static int
-match_rs1_nonzero_rs2_even (const struct riscv_opcode *op ATTRIBUTE_UNUSED, insn_t insn)
+match_rs1_nonzero_rs2_even (const struct riscv_opcode *op, insn_t insn)
 {
   return match_rs1_nonzero (op, insn) && match_rs2_even (op, insn);
 }