/* ARC target-dependent stuff. Extension data structures.
   Copyright 1995, 1997, 2000, 2001, 2005, 2007 Free Software Foundation, Inc.

   This file is part of libopcodes.

   This library is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   It is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef ARCEXT_H
#define ARCEXT_H

enum {EXT_INSTRUCTION   = 0,
      EXT_CORE_REGISTER = 1,
      EXT_AUX_REGISTER  = 2,
      EXT_COND_CODE     = 3};

enum {NUM_EXT_INST = (0x1f-0x10+1) + (0x3f-0x09+1)};
enum {NUM_EXT_CORE = 59-32+1};
enum {NUM_EXT_COND = 0x1f-0x10+1};

struct ExtInstruction 
{
  char flags;
  char *name;
}; 

struct ExtAuxRegister 
{
  long address;
  char *name;
  struct ExtAuxRegister *next; 
};

struct arcExtMap 
{
  struct ExtAuxRegister *auxRegisters;
  struct ExtInstruction *instructions[NUM_EXT_INST];
  char *coreRegisters[NUM_EXT_CORE];
  char *condCodes[NUM_EXT_COND];
};

extern int arcExtMap_add(void*, unsigned long);
extern const char *arcExtMap_coreRegName(int);
extern const char *arcExtMap_auxRegName(long);
extern const char *arcExtMap_condCodeName(int);
extern const char *arcExtMap_instName(int, int, int*);
extern void build_ARC_extmap(bfd *);

#define IGNORE_FIRST_OPD 1

#endif
