[binutils-gdb] aarch64: rcpc3: add support in general_constraint_met_p

Victor Do Nascimento victorldn@sourceware.org
Mon Jan 15 13:16:37 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5c77e72e015ec1fcdcbf78b4f2a4f245922e666f

commit 5c77e72e015ec1fcdcbf78b4f2a4f245922e666f
Author: Victor Do Nascimento <victor.donascimento@arm.com>
Date:   Tue Jan 9 10:04:11 2024 +0000

    aarch64: rcpc3: add support in general_constraint_met_p
    
    Given the introduction of the new address operand types for rcpc3
    instructions, this patch adds the necessary logic to teach
    `general_constraint_met_p` how to proper handle these.

Diff:
---
 opcodes/aarch64-opc.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c
index 06d74870cba..5b76f2cfa21 100644
--- a/opcodes/aarch64-opc.c
+++ b/opcodes/aarch64-opc.c
@@ -2114,6 +2114,19 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
 	      return 0;
 	    }
 	  break;
+	case rcpc3:
+	  if (opnd->addr.writeback)
+	    if ((type == AARCH64_OPND_RCPC3_ADDR_PREIND_WB
+		 && !opnd->addr.preind)
+		|| (type == AARCH64_OPND_RCPC3_ADDR_POSTIND
+		    && !opnd->addr.postind))
+	      {
+		set_syntax_error (mismatch_detail, idx,
+				  _("unexpected address writeback"));
+		return 0;
+	      }
+
+	  break;
 	default:
 	  assert (opnd->addr.writeback == 0);
 	  break;
@@ -2493,6 +2506,33 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
 	  modifiers = 1 << AARCH64_MOD_UXTW;
 	  goto sve_zz_operand;
 
+	case AARCH64_OPND_RCPC3_ADDR_OPT_PREIND_WB:
+	case AARCH64_OPND_RCPC3_ADDR_OPT_POSTIND:
+	case AARCH64_OPND_RCPC3_ADDR_PREIND_WB:
+	case AARCH64_OPND_RCPC3_ADDR_POSTIND:
+	  {
+	    int num_bytes = calc_ldst_datasize (opnds);
+	    int abs_offset = (type == AARCH64_OPND_RCPC3_ADDR_OPT_PREIND_WB
+			      || type == AARCH64_OPND_RCPC3_ADDR_PREIND_WB)
+	      ? opnd->addr.offset.imm * -1
+	      : opnd->addr.offset.imm;
+	    if ((int) num_bytes != abs_offset
+		&& opnd->addr.offset.imm != 0)
+	      {
+		set_other_error (mismatch_detail, idx,
+				 _("invalid increment amount"));
+		return 0;
+	      }
+	  }
+	  break;
+
+	case AARCH64_OPND_RCPC3_ADDR_OFFSET:
+	  if (!value_in_range_p (opnd->addr.offset.imm, -256, 255))
+	    {
+	      set_imm_out_of_range_error (mismatch_detail, idx, -256, 255);
+	      return 0;
+	    }
+
 	default:
 	  break;
 	}


More information about the Binutils-cvs mailing list