From b2459327a660d444dfe4832d31d7b5ec2d5c2ba2 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 22 Sep 2010 21:39:08 +0000 Subject: opcodes: blackfin: decode all ASTAT bits All ASTAT bits work in the hardware even though they aren't part of the official Blackfin ISA. So decode every ASTAT field to make the output a bit nicer when working with hand generated opcodes. Signed-off-by: Mike Frysinger --- opcodes/ChangeLog | 4 ++++ opcodes/bfin-dis.c | 29 +++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) (limited to 'opcodes') diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3925880..5ffc5c9 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,7 @@ +2010-09-22 Mike Frysinger + + * bfin-dis.c (decode_CC2stat_0): Decode all ASTAT bits. + 2010-09-22 Robin Getz * bfin-dis.c (IS_DREG, IS_PREG, IS_GENREG, IS_DAGREG): Reject diff --git a/opcodes/bfin-dis.c b/opcodes/bfin-dis.c index ef7c7b5..f124f14 100644 --- a/opcodes/bfin-dis.c +++ b/opcodes/bfin-dis.c @@ -1227,44 +1227,57 @@ decode_CC2stat_0 (TIword iw0, disassemble_info *outf) int op = ((iw0 >> CC2stat_op_bits) & CC2stat_op_mask); int cbit = ((iw0 >> CC2stat_cbit_bits) & CC2stat_cbit_mask); + const char *bitname = statbits (cbit); + if (decode_statbits[cbit] == REG_LASTREG) + { + /* All ASTAT bits except CC may be operated on in hardware, but may + not have a dedicated insn, so still decode "valid" insns. */ + static char bitnames[64]; + if (cbit != 5) + sprintf (bitnames, "ASTAT[%i /* unused bit */]", cbit); + else + strcpy (bitnames, "CC /* ... Illegal register ... */"); + bitname = bitnames; + } + if (op == 0 && D == 0) { OUTS (outf, "CC = "); - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); } else if (op == 1 && D == 0) { OUTS (outf, "CC |= "); - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); } else if (op == 2 && D == 0) { OUTS (outf, "CC &= "); - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); } else if (op == 3 && D == 0) { OUTS (outf, "CC ^= "); - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); } else if (op == 0 && D == 1) { - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); OUTS (outf, " = CC"); } else if (op == 1 && D == 1) { - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); OUTS (outf, " |= CC"); } else if (op == 2 && D == 1) { - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); OUTS (outf, " &= CC"); } else if (op == 3 && D == 1) { - OUTS (outf, statbits (cbit)); + OUTS (outf, bitname); OUTS (outf, " ^= CC"); } else -- cgit v1.1