aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--opcodes/ChangeLog11
-rw-r--r--opcodes/avr-dis.c34
2 files changed, 34 insertions, 11 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index ce23088..56f62d8 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,16 @@
2002-11-18 Klee Dienes <kdienes@apple.com>
+ * avr-dis.c: Include libiberty.h (for xmalloc).
+ (struct avr_opcodes_s): Remove 'bin_mask' field (it's
+ automatically computed in the init routine).
+ (AVR_INSN): No longer provide bin_mask field in initializer.
+ (avr_opcodes_s): Declare as const.
+ (print_insn_avr): Store the bin_mask field in a separate table
+ (allocated with xmalloc); iterate through it at the same time as
+ we iterate through the opcodes.
+
+2002-11-18 Klee Dienes <kdienes@apple.com>
+
* h8300-dis.c: Include libiberty.h (for xmalloc).
(struct h8_instruction): New type, used to wrap h8_opcodes with a
length field (computed at run-time).
diff --git a/opcodes/avr-dis.c b/opcodes/avr-dis.c
index 4598cab..adc4680 100644
--- a/opcodes/avr-dis.c
+++ b/opcodes/avr-dis.c
@@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sysdep.h"
#include "dis-asm.h"
#include "opintl.h"
-
+#include "libiberty.h"
struct avr_opcodes_s
{
@@ -31,16 +31,15 @@ struct avr_opcodes_s
int insn_size; /* in words */
int isa;
unsigned int bin_opcode;
- unsigned int bin_mask;
};
#define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
-{#NAME, CONSTR, OPCODE, SIZE, ISA, BIN, 0},
+{#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
-struct avr_opcodes_s avr_opcodes[] =
+const struct avr_opcodes_s avr_opcodes[] =
{
#include "opcode/avr.h"
- {NULL, NULL, NULL, 0, 0, 0, 0}
+ {NULL, NULL, NULL, 0, 0, 0}
};
static int avr_operand PARAMS ((unsigned int, unsigned int,
@@ -257,9 +256,11 @@ print_insn_avr(addr, info)
disassemble_info *info;
{
unsigned int insn, insn2;
- struct avr_opcodes_s *opcode;
+ const struct avr_opcodes_s *opcode;
+ static unsigned int *maskptr;
void *stream = info->stream;
fprintf_ftype prin = info->fprintf_func;
+ static unsigned int *avr_bin_masks;
static int initialized;
int cmd_len = 2;
int ok = 0;
@@ -267,9 +268,16 @@ print_insn_avr(addr, info)
if (!initialized)
{
- initialized = 1;
+ unsigned int nopcodes;
+
+ nopcodes = sizeof (avr_opcodes) / sizeof (struct avr_opcodes_s);
- for (opcode = avr_opcodes; opcode->name; opcode++)
+ avr_bin_masks = (unsigned int *)
+ xmalloc (nopcodes * sizeof (unsigned int));
+
+ for (opcode = avr_opcodes, maskptr = avr_bin_masks;
+ opcode->name;
+ opcode++, maskptr++)
{
char * s;
unsigned int bin = 0;
@@ -284,15 +292,19 @@ print_insn_avr(addr, info)
}
assert (s - opcode->opcode == 16);
assert (opcode->bin_opcode == bin);
- opcode->bin_mask = mask;
+ *maskptr = mask;
}
+
+ initialized = 1;
}
insn = avrdis_opcode (addr, info);
- for (opcode = avr_opcodes; opcode->name; opcode++)
+ for (opcode = avr_opcodes, maskptr = avr_bin_masks;
+ opcode->name;
+ opcode++, maskptr++)
{
- if ((insn & opcode->bin_mask) == opcode->bin_opcode)
+ if ((insn & *maskptr) == opcode->bin_opcode)
break;
}