+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).
#include "sysdep.h"
#include "dis-asm.h"
#include "opintl.h"
-
+#include "libiberty.h"
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,
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;
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;
}
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;
}