Line 1... |
Line 1... |
/* Disassembler code for CR16.
|
/* Disassembler code for CR16.
|
Copyright 2007 Free Software Foundation, Inc.
|
Copyright 2007, 2008, 2009 Free Software Foundation, Inc.
|
Contributed by M R Swami Reddy (MR.Swami.Reddy@nsc.com).
|
Contributed by M R Swami Reddy (MR.Swami.Reddy@nsc.com).
|
|
|
This file is part of GAS, GDB and the GNU binutils.
|
This file is part of GAS, GDB and the GNU binutils.
|
|
|
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
Line 305... |
Line 305... |
|
|
static unsigned long
|
static unsigned long
|
build_mask (void)
|
build_mask (void)
|
{
|
{
|
unsigned long mask = SBM (instruction->match_bits);
|
unsigned long mask = SBM (instruction->match_bits);
|
|
|
|
/* Adjust mask for bcond with 32-bit size instruction. */
|
|
if ((IS_INSN_MNEMONIC("b") && instruction->size == 2))
|
|
mask = 0xff0f0000;
|
|
|
return mask;
|
return mask;
|
}
|
}
|
|
|
/* Search for a matching opcode. Return 1 for success, 0 for failure. */
|
/* Search for a matching opcode. Return 1 for success, 0 for failure. */
|
|
|
static int
|
static int
|
match_opcode (void)
|
match_opcode (void)
|
{
|
{
|
unsigned long mask;
|
unsigned long mask;
|
/* The instruction 'constant' opcode doewsn't exceed 32 bits. */
|
/* The instruction 'constant' opcode doewsn't exceed 32 bits. */
|
unsigned long doubleWord = words[1] + (words[0] << 16);
|
unsigned long doubleWord = (words[1] + (words[0] << 16)) & 0xffffffff;
|
|
|
/* Start searching from end of instruction table. */
|
/* Start searching from end of instruction table. */
|
instruction = &cr16_instruction[NUMOPCODES - 2];
|
instruction = &cr16_instruction[NUMOPCODES - 2];
|
|
|
/* Loop over instruction table until a full match is found. */
|
/* Loop over instruction table until a full match is found. */
|
while (instruction >= cr16_instruction)
|
while (instruction >= cr16_instruction)
|
{
|
{
|
mask = build_mask ();
|
mask = build_mask ();
|
|
/* Adjust mask for bcond with 32-bit size instruction */
|
|
if ((IS_INSN_MNEMONIC("b") && instruction->size == 2))
|
|
mask = 0xff0f0000;
|
|
|
if ((doubleWord & mask) == BIN (instruction->match,
|
if ((doubleWord & mask) == BIN (instruction->match,
|
instruction->match_bits))
|
instruction->match_bits))
|
return 1;
|
return 1;
|
else
|
else
|
instruction--;
|
instruction--;
|
Line 667... |
Line 676... |
a->constant = 2 * a->constant + 2;
|
a->constant = 2 * a->constant + 2;
|
|
|
if ((!IS_INSN_TYPE (CSTBIT_INS)) && (!IS_INSN_TYPE (LD_STOR_INS)))
|
if ((!IS_INSN_TYPE (CSTBIT_INS)) && (!IS_INSN_TYPE (LD_STOR_INS)))
|
(sign_flag) ? func (stream, "%s", "*-"): func (stream, "%s","*+");
|
(sign_flag) ? func (stream, "%s", "*-"): func (stream, "%s","*+");
|
|
|
|
/* PR 10173: Avoid printing the 0x prefix twice. */
|
|
if (info->num_symbols > 0)
|
func (stream, "%s", "0x");
|
func (stream, "%s", "0x");
|
number = ((relative ? memaddr : 0) +
|
number = ((relative ? memaddr : 0) +
|
(sign_flag ? ((- a->constant) & 0xffffffe) : a->constant));
|
(sign_flag ? ((- a->constant) & 0xffffffe) : a->constant));
|
|
|
(*info->print_address_func) ((number & ((1 << 24) - 1)), info);
|
(*info->print_address_func) ((number & ((1 << 24) - 1)), info);
|