This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
patch for cgen generated decoders
- To: binutils at sources dot redhat dot com
- subject: patch for cgen generated decoders
- From: matthew green <mrg at cygnus dot com>
- Date: Sun, 05 Nov 2000 17:47:09 +1100
- Cc: cgen at sources dot redhat dot com
- organisation: Red Hat, Inc.
hi folks.
i need this patch for an architecture where the standard instruction
bitsize is 16 bits, yet there exists a 48-bit instruction (which
causes CGEN_INT_INSN_P to be false). the problem i was seeing is
that for the 32-bit instruction my ifields were not being extracted
correctly, because only 16 bits were present in the "insn_value".
the patch below enables the code previously only available for the
CGEN_INT_INSN_P==1 case, but ensures that 32-bit instructions are
passed in their entirity in all cases.
(actually, this code uses "unsigned long" to hold this value, where
it should probably use a "CGEN_INSN_INT". i'm not sure exactly if
it will work correctly on a LP64 host...)
i've tested this change with the fr30 & m32r ports and it does not
affect their operation (fr30 is the only other port that sets
CGEN_INT_INSN_P to be false).
2000-11-05 matthew green <mrg@redhat.com>
* cgen-dis.in (print_insn): Load a full CGEN_INSN_INT in the
!CGEN_INT_INSN_P case as well.
Index: cgen-dis.in
===================================================================
RCS file: /cvs/src/src/opcodes/cgen-dis.in,v
retrieving revision 1.2
diff -p -r1.2 cgen-dis.in
*** cgen-dis.in 2000/08/28 18:36:53 1.2
--- cgen-dis.in 2000/11/05 02:28:01
*************** print_insn (cd, pc, info, buf, buflen)
*** 281,289 ****
machine insn and extracts the fields. The second pass prints
them. */
! #if CGEN_INT_INSN_P
! /* Make sure the entire insn is loaded into insn_value. */
! if (CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize)
{
unsigned long full_insn_value;
int rc = read_insn (cd, pc, info, buf,
--- 281,290 ----
machine insn and extracts the fields. The second pass prints
them. */
! /* Make sure the entire insn is loaded into insn_value, if it
! can fit. */
! if (CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize &&
! (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
{
unsigned long full_insn_value;
int rc = read_insn (cd, pc, info, buf,
*************** print_insn (cd, pc, info, buf, buflen)
*** 295,304 ****
(cd, insn, &ex_info, full_insn_value, &fields, pc);
}
else
! #endif
- length = CGEN_EXTRACT_FN (cd, insn)
- (cd, insn, &ex_info, insn_value, &fields, pc);
/* length < 0 -> error */
if (length < 0)
return length;
--- 296,304 ----
(cd, insn, &ex_info, full_insn_value, &fields, pc);
}
else
! length = CGEN_EXTRACT_FN (cd, insn)
! (cd, insn, &ex_info, insn_value, &fields, pc);
/* length < 0 -> error */
if (length < 0)
return length;