[Patch][AArch64] - Error on load pair to same register

Jiong Wang jiong.wang@arm.com
Thu Nov 13 10:20:00 GMT 2014


On 12/11/14 20:07, Ryan Mansfield wrote:

> Hi,
>
> I came across a SIGILL at runtime caused by a typo specifying the same
> register in a load pair.
>
> The ARM DDI 0487A says on page C6-507
>
> if memop == MemOp_LOAD && t == t2 then
> 	Constraint c = ConstrainUnpredictable();
> 	assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP};
> 	case c of
> 		when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN
> 		when Constraint_UNDEF UnallocatedEncoding();
> 		when Constraint_NOP EndOfInstruction();
>
> I doubt that any one would intentionally do this operation since the
> behaviour is unpredictable so it just seems safer to reject the code.

Hi Ryan,

   thanks for reporting  this.

   I think the encoding of same register is allowed in ISA manual, while
   the behavior is unpredictable. In principle, all allowed encoding need
   to be supported, while if its behavior is unpredictable, then we need
   to give warning instead of error which abort the assembling.

   for the code, see my comments below.

>
> 2014-11-12  Ryan Mansfield  <rmansfield@qnx.com>
>
>           * aarch64-opc.c (operand_general_constraint_met_p): Add constraint
>           that load pair must have different registers.

==> could you please add a testcase for this?

+
+      switch (opcode->iclass)
+	{
+	  case ldstpair_indexed:
+	  case ldstpair_off:
+	  case ldstnapair_offs:
+	    if (type == AARCH64_OPND_Rt2)
+	      {
+		assert (idx == 1 && (aarch64_get_operand_class (opnds[0].type)
+				     == AARCH64_OPND_CLASS_INT_REG));

==> the indention above is not very clear, better to be

     assert (idx == 1
             && (aarch64_get_operand_class (opnds[0].type)
                 == AARCH64_OPND_CLASS_INT_REG));

+		if ((opcode->opcode & (1 << 22)) && opnds[idx].reg.regno
+		    == opnds[idx - 1].reg.regno)

==> likewise.


+		  {
+		    set_other_error (mismatch_detail, idx,
+				     _("reg pair must differ"));
+		    return 0;
+		  }
+	      }
+	    break;
+	  default:
+	    break;
+	}
+

  ===> above same register check code are duplicated for both INT and FP.
  ===> just remain the check in FP, and let INT fall through. something like

     AARCH64_OPND_CLASS_INT_REG:
     ...
     /* Fall through.  */
     
     AARCH64_OPND_CLASS_FP_REG:
       switch (opcode->iclass)
	{
	  case ldstpair_indexed:
	  case ldstpair_off:
           ...
           ...
    

Regards,
Jiong

>
> Regards,
>
> Ryan Mansfield




More information about the Binutils mailing list