aboutsummaryrefslogtreecommitdiff
path: root/opcodes/avr-dis.c
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/avr-dis.c')
-rw-r--r--opcodes/avr-dis.c34
1 files changed, 23 insertions, 11 deletions
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;
}