This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] ARC incorrect encoding of ST limm, [shimm, shimm] instruction


This patch fixes the following problem in the ARC target:

The assembler encodes:
   st limm, [shimm, shimm]
as:
   st shimm, [shimm, shimm]
when (limm == 2*shimm)

This appears to be an attempt at optimizing the encoding
from a 64bit --> 32bit opcode.  Doing this, however, yields
the wrong result as seen in:
   st 0x100, [0x80, 0x80]
      encoded as 101FFE80 (big endian)
which results in a store of 0x80 to address 0x100 (wrong) instead
of storing 0x100 to address 0x100 (right).

Removing this bit of code results in the the limm value remaining
limm, and being encoded correctly.

Note: This diff should be applied after the one in 2001-06/msg00555

Please let me know if there are any problems with this patch.

Stacey.


diff -p -r1.5 arc-opc.c
*** binutils/opcodes/arc-opc.c	2001/06/20 17:30:45	1.5
--- binutils/opcodes/arc-opc.c	2001/06/20 19:08:57
*************** insert_st_syntax (insn, operand, mods, r
*** 1154,1167 ****
      {
        limm += arc_limm_fixup_adjust(insn);
      }
-   if (ST_SYNTAX(OP_LIMM,OP_SHIMM,OP_SHIMM) && (shimm * 2 == limm))
-     {
-       insn &= ~C(-1);
-       limm_p = 0;
-       limm = 0;
-       insn |= C(ARC_REG_SHIMM);
-       ls_operand[LS_VALUE] = OP_SHIMM;
-     }
    if (!(ST_SYNTAX(OP_REG,OP_REG,OP_NONE)
  	|| ST_SYNTAX(OP_REG,OP_LIMM,OP_NONE)
  	|| ST_SYNTAX(OP_REG,OP_REG,OP_SHIMM)
--- 1154,1159 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]