2002-11-12 Klee Dienes * 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. --- /Volumes/Storage/Users/kdienes/source/cygnus.cygnus/src/opcodes/avr-dis.c Tue Mar 13 17:58:34 2001 +++ /Volumes/Storage/Users/kdienes/source/cygnus.current/src/opcodes/avr-dis.c Wed Nov 13 17:24:13 2002 @@ -21,7 +21,7 @@ #include "sysdep.h" #include "dis-asm.h" #include "opintl.h" - +#include "libiberty.h" struct avr_opcodes_s { @@ -31,16 +31,15 @@ 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 @@ 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 @@ 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 @@ } 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; }