/* Altera Nios II assembler.
   Copyright (C) 2012-2016 Free Software Foundation, Inc.
   Contributed by Nigel Gray (ngray@altera.com).
   Contributed by Mentor Graphics, Inc.

   This file is part of GAS, the GNU Assembler.

   GAS 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.

   GAS 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 GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */

#include "as.h"
#include "opcode/nios2.h"
#include "elf/nios2.h"
#include "tc-nios2.h"
#include "bfd.h"
#include "libbfd.h"
#include "dwarf2dbg.h"
#include "subsegs.h"
#include "safe-ctype.h"
#include "dw2gencfi.h"

#ifndef OBJ_ELF
/* We are not supporting any other target so we throw a compile time error.  */
OBJ_ELF not defined
#endif

/* We can choose our endianness at run-time, regardless of configuration.  */
extern int target_big_endian;

/* This array holds the chars that always start a comment.  If the
   pre-processor is disabled, these aren't very useful.  */
const char comment_chars[] = "#";

/* This array holds the chars that only start a comment at the beginning of
   a line.  If the line seems to have the form '# 123 filename'
   .line and .file directives will appear in the pre-processed output.  */
/* Note that input_file.c hand checks for '#' at the beginning of the
   first line of the input file.  This is because the compiler outputs
   #NO_APP at the beginning of its output.  */
/* Also note that C style comments are always supported.  */
const char line_comment_chars[] = "#";

/* This array holds machine specific line separator characters.  */
const char line_separator_chars[] = ";";

/* Chars that can be used to separate mant from exp in floating point nums.  */
const char EXP_CHARS[] = "eE";

/* Chars that mean this number is a floating point constant.  */
/* As in 0f12.456 */
/* or	 0d1.2345e12 */
const char FLT_CHARS[] = "rRsSfFdDxXpP";

/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
   changed in read.c.  Ideally it shouldn't have to know about it at all,
   but nothing is ideal around here.  */

/* Machine-dependent command-line options.  */

const char *md_shortopts = "r";

struct option md_longopts[] = {
#define OPTION_RELAX_ALL (OPTION_MD_BASE + 0)
  {"relax-all", no_argument, NULL, OPTION_RELAX_ALL},
#define OPTION_NORELAX (OPTION_MD_BASE + 1)
  {"no-relax", no_argument, NULL, OPTION_NORELAX},
#define OPTION_RELAX_SECTION (OPTION_MD_BASE + 2)
  {"relax-section", no_argument, NULL, OPTION_RELAX_SECTION},
#define OPTION_EB (OPTION_MD_BASE + 3)
  {"EB", no_argument, NULL, OPTION_EB},
#define OPTION_EL (OPTION_MD_BASE + 4)
  {"EL", no_argument, NULL, OPTION_EL},
#define OPTION_MARCH (OPTION_MD_BASE + 5)
  {"march", required_argument, NULL, OPTION_MARCH}
};

size_t md_longopts_size = sizeof (md_longopts);

/* The assembler supports three different relaxation modes, controlled by
   command-line options.  */
typedef enum
{
  relax_section = 0,
  relax_none,
  relax_all
} relax_optionT;

/* Struct contains all assembler options set with .set.  */
static struct
{
  /* .set noat -> noat = 1 allows assembly code to use at without warning
     and macro expansions generate a warning.
     .set at -> noat = 0, assembly code using at warn but macro expansions
     do not generate warnings.  */
  bfd_boolean noat;

  /* .set nobreak -> nobreak = 1 allows assembly code to use ba,bt without
				 warning.
     .set break -> nobreak = 0, assembly code using ba,bt warns.  */
  bfd_boolean nobreak;

  /* .cmd line option -relax-all allows all branches and calls to be replaced
     with longer versions.
     -no-relax inhibits branch/call conversion.
     The default value is relax_section, which relaxes branches within
     a section.  */
  relax_optionT relax;

} nios2_as_options = {FALSE, FALSE, relax_section};


typedef struct nios2_insn_reloc
{
  /* Any expression in the instruction is parsed into this field,
     which is passed to fix_new_exp() to generate a fixup.  */
  expressionS reloc_expression;

  /* The type of the relocation to be applied.  */
  bfd_reloc_code_real_type reloc_type;

  /* PC-relative.  */
  unsigned int reloc_pcrel;

  /* The next relocation to be applied to the instruction.  */
  struct nios2_insn_reloc *reloc_next;
} nios2_insn_relocS;

/* This struct is used to hold state when assembling instructions.  */
typedef struct nios2_insn_info
{
  /* Assembled instruction.  */
  unsigned long insn_code;

  /* Constant bits masked into insn_code for self-check mode.  */
  unsigned long constant_bits;

  /* Pointer to the relevant bit of the opcode table.  */
  const struct nios2_opcode *insn_nios2_opcode;
  /* After parsing ptrs to the tokens in the instruction fill this array
     it is terminated with a null pointer (hence the first +1).
     The second +1 is because in some parts of the code the opcode
     is not counted as a token, but still placed in this array.  */
  const char *insn_tokens[NIOS2_MAX_INSN_TOKENS + 1 + 1];

  /* This holds information used to generate fixups
     and eventually relocations if it is not null.  */
  nios2_insn_relocS *insn_reloc;
} nios2_insn_infoS;


/* This struct is used to convert Nios II pseudo-ops into the
   corresponding real op.  */
typedef struct nios2_ps_insn_info
{
  /* Map this pseudo_op... */
  const char *pseudo_insn;

  /* ...to this real instruction.  */
  const char *insn;

  /* Call this function to modify the operands....  */
  void (*arg_modifer_func) (char ** parsed_args, const char *arg, int num,
			    int start);

  /* ...with these arguments.  */
  const char *arg_modifier;
  int num;
  int index;

  /* If arg_modifier_func allocates new memory, provide this function
     to free it afterwards.  */
  void (*arg_cleanup_func) (char **parsed_args, int num, int start);
} nios2_ps_insn_infoS;

/* Opcode hash table.  */
static struct hash_control *nios2_opcode_hash = NULL;
#define nios2_opcode_lookup(NAME) \
  ((struct nios2_opcode *) hash_find (nios2_opcode_hash, (NAME)))

/* Register hash table.  */
static struct hash_control *nios2_reg_hash = NULL;
#define nios2_reg_lookup(NAME) \
  ((struct nios2_reg *) hash_find (nios2_reg_hash, (NAME)))


/* Pseudo-op hash table.  */
static struct hash_control *nios2_ps_hash = NULL;
#define nios2_ps_lookup(NAME) \
  ((nios2_ps_insn_infoS *) hash_find (nios2_ps_hash, (NAME)))

/* The known current alignment of the current section.  */
static int nios2_current_align;
static segT nios2_current_align_seg;

static int nios2_auto_align_on = 1;

/* The last seen label in the current section.  This is used to auto-align
   labels preceeding instructions.  */
static symbolS *nios2_last_label;

/* If we saw a 16-bit CDX instruction, we can align on 2-byte boundaries
   instead of 4-bytes.  Use this to keep track of the minimum power-of-2
   alignment.  */
static int nios2_min_align = 2;

#ifdef OBJ_ELF
/* Pre-defined "_GLOBAL_OFFSET_TABLE_"	*/
symbolS *GOT_symbol;
#endif

/* The processor architecture value, EF_NIOS2_ARCH_R1 by default.  */
static int nios2_architecture = EF_NIOS2_ARCH_R1;


/** Utility routines.  */
/* Function md_chars_to_number takes the sequence of
   bytes in buf and returns the corresponding value
   in an int. n must be 1, 2 or 4.  */
static valueT
md_chars_to_number (char *buf, int n)
{
  int i;
  valueT val;

  gas_assert (n == 1 || n == 2 || n == 4);

  val = 0;
  if (target_big_endian)
    for (i = 0; i < n; ++i)
      val = val | ((buf[i] & 0xff) << 8 * (n - (i + 1)));
  else
    for (i = 0; i < n; ++i)
      val = val | ((buf[i] & 0xff) << 8 * i);
  return val;
}


/* This function turns a C long int, short int or char
   into the series of bytes that represent the number
   on the target machine.  */
void
md_number_to_chars (char *buf, valueT val, int n)
{
  gas_assert (n == 1 || n == 2 || n == 4 || n == 8);
  if (target_big_endian)
    number_to_chars_bigendian (buf, val, n);
  else
    number_to_chars_littleendian (buf, val, n);
}

/* Turn a string in input_line_pointer into a floating point constant
   of type TYPE, and store the appropriate bytes in *LITP.  The number
   of LITTLENUMS emitted is stored in *SIZEP.  An error message is
   returned, or NULL on OK.  */
const char *
md_atof (int type, char *litP, int *sizeP)
{
  int prec;
  LITTLENUM_TYPE words[4];
  char *t;
  int i;

  switch (type)
    {
    case 'f':
      prec = 2;
      break;
    case 'd':
      prec = 4;
      break;
    default:
      *sizeP = 0;
      return _("bad call to md_atof");
    }

  t = atof_ieee (input_line_pointer, type, words);
  if (t)
    input_line_pointer = t;

  *sizeP = prec * 2;

  if (! target_big_endian)
    for (i = prec - 1; i >= 0; i--, litP += 2)
      md_number_to_chars (litP, (valueT) words[i], 2);
  else
    for (i = 0; i < prec; i++, litP += 2)
      md_number_to_chars (litP, (valueT) words[i], 2);

  return NULL;
}

/* Return true if STR starts with PREFIX, which should be a string literal.  */
#define strprefix(STR, PREFIX) \
  (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0)


/* Return true if STR is prefixed with a special relocation operator.  */
static int
nios2_special_relocation_p (const char *str)
{
  return (strprefix (str, "%lo")
	  || strprefix (str, "%hi")
	  || strprefix (str, "%hiadj")
	  || strprefix (str, "%gprel")
	  || strprefix (str, "%got")
	  || strprefix (str, "%call")
	  || strprefix (str, "%gotoff_lo")
	  || strprefix (str, "%gotoff_hiadj")
	  || strprefix (str, "%tls_gd")
	  || strprefix (str, "%tls_ldm")
	  || strprefix (str, "%tls_ldo")
	  || strprefix (str, "%tls_ie")
	  || strprefix (str, "%tls_le")
	  || strprefix (str, "%gotoff"));
}


/* nop fill patterns for text section.  */
static char const nop_r1[4] = { 0x3a, 0x88, 0x01, 0x00 };
static char const nop_r2[4] = { 0x20, 0x00, 0x00, 0xc4 };
static char const nop_r2_cdx[2] = { 0x3b, 0x00 };
static char const *nop32 = nop_r1;
static char const *nop16 = NULL;

/* Handles all machine-dependent alignment needs.  */
static void
nios2_align (int log_size, const char *pfill, symbolS *label)
{
  int align;
  long max_alignment = 15;

  /* The front end is prone to changing segments out from under us
     temporarily when -g is in effect.  */
  int switched_seg_p = (nios2_current_align_seg != now_seg);

  align = log_size;
  if (align > max_alignment)
    {
      align = max_alignment;
      as_bad (_("Alignment too large: %d. assumed"), align);
    }
  else if (align < 0)
    {
      as_warn (_("Alignment negative: 0 assumed"));
      align = 0;
    }

  if (align != 0)
    {
      if (subseg_text_p (now_seg) && align >= nios2_min_align)
	{
	  /* First, make sure we're on the minimum boundary, in case
	     someone has been putting .byte values the text section.  */
	  if (nios2_current_align < nios2_min_align || switched_seg_p)
	    frag_align (nios2_min_align, 0, 0);

	  /* If we might be on a 2-byte boundary, first align to a
	     4-byte boundary using the 2-byte nop as fill.  */
	  if (nios2_min_align == 1
	      && align > nios2_min_align
	      && pfill == nop32 )
	    {
	      gas_assert (nop16);
	      frag_align_pattern (2, nop16, 2, 0);
	    }

	  /* Now fill in the alignment pattern.  */
	  if (pfill != NULL)
	    frag_align_pattern (align, pfill, 4, 0);
	  else
	    frag_align (align, 0, 0);
	}
      else
	frag_align (align, 0, 0);

      if (!switched_seg_p)
	nios2_current_align = align;

      /* If the last label was in a different section we can't align it.  */
      if (label != NULL && !switched_seg_p)
	{
	  symbolS *sym;
	  int label_seen = FALSE;
	  struct frag *old_frag;
	  valueT old_value;
	  valueT new_value;

	  gas_assert (S_GET_SEGMENT (label) == now_seg);

	  old_frag = symbol_get_frag (label);
	  old_value = S_GET_VALUE (label);
	  new_value = (valueT) frag_now_fix ();

	  /* It is possible to have more than one label at a particular
	     address, especially if debugging is enabled, so we must
	     take care to adjust all the labels at this address in this
	     fragment.  To save time we search from the end of the symbol
	     list, backwards, since the symbols we are interested in are
	     almost certainly the ones that were most recently added.
	     Also to save time we stop searching once we have seen at least
	     one matching label, and we encounter a label that is no longer
	     in the target fragment.  Note, this search is guaranteed to
	     find at least one match when sym == label, so no special case
	     code is necessary.  */
	  for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
	    if (symbol_get_frag (sym) == old_frag
		&& S_GET_VALUE (sym) == old_value)
	      {
		label_seen = TRUE;
		symbol_set_frag (sym, frag_now);
		S_SET_VALUE (sym, new_value);
	      }
	    else if (label_seen && symbol_get_frag (sym) != old_frag)
	      break;
	}
      record_alignment (now_seg, align);
    }
}


/** Support for self-check mode.  */

/* Mode of the assembler.  */
typedef enum
{
  NIOS2_MODE_ASSEMBLE,		/* Ordinary operation.  */
  NIOS2_MODE_TEST		/* Hidden mode used for self testing.  */
} NIOS2_MODE;

static NIOS2_MODE nios2_mode = NIOS2_MODE_ASSEMBLE;

/* This function is used to in self-checking mode
   to check the assembled instruction
   opcode should be the assembled opcode, and exp_opcode
   the parsed string representing the expected opcode.  */
static void
nios2_check_assembly (unsigned int opcode, const char *exp_opcode)
{
  if (nios2_mode == NIOS2_MODE_TEST)
    {
      if (exp_opcode == NULL)
	as_bad (_("expecting opcode string in self test mode"));
      else if (opcode != strtoul (exp_opcode, NULL, 16))
	as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode);
    }
}


/** Support for machine-dependent assembler directives.  */
/* Handle the .align pseudo-op.  This aligns to a power of two.  It
   also adjusts any current instruction label.  We treat this the same
   way the MIPS port does: .align 0 turns off auto alignment.  */
static void
s_nios2_align (int ignore ATTRIBUTE_UNUSED)
{
  int align;
  char fill;
  const char *pfill = NULL;
  long max_alignment = 15;

  align = get_absolute_expression ();
  if (align > max_alignment)
    {
      align = max_alignment;
      as_bad (_("Alignment too large: %d. assumed"), align);
    }
  else if (align < 0)
    {
      as_warn (_("Alignment negative: 0 assumed"));
      align = 0;
    }

  if (*input_line_pointer == ',')
    {
      input_line_pointer++;
      fill = get_absolute_expression ();
      pfill = (const char *) &fill;
    }
  else if (subseg_text_p (now_seg))
    pfill = (const char *) nop32;
  else
    {
      pfill = NULL;
      nios2_last_label = NULL;
    }

  if (align != 0)
    {
      nios2_auto_align_on = 1;
      nios2_align (align, pfill, nios2_last_label);
      nios2_last_label = NULL;
    }
  else
    nios2_auto_align_on = 0;

  demand_empty_rest_of_line ();
}

/* Handle the .text pseudo-op.  This is like the usual one, but it
   clears the saved last label and resets known alignment.  */
static void
s_nios2_text (int i)
{
  s_text (i);
  nios2_last_label = NULL;
  nios2_current_align = 0;
  nios2_current_align_seg = now_seg;
}

/* Handle the .data pseudo-op.  This is like the usual one, but it
   clears the saved last label and resets known alignment.  */
static void
s_nios2_data (int i)
{
  s_data (i);
  nios2_last_label = NULL;
  nios2_current_align = 0;
  nios2_current_align_seg = now_seg;
}

/* Handle the .section pseudo-op.  This is like the usual one, but it
   clears the saved last label and resets known alignment.  */
static void
s_nios2_section (int ignore)
{
  obj_elf_section (ignore);
  nios2_last_label = NULL;
  nios2_current_align = 0;
  nios2_current_align_seg = now_seg;
}

/* Explicitly unaligned cons.  */
static void
s_nios2_ucons (int nbytes)
{
  int hold;
  hold = nios2_auto_align_on;
  nios2_auto_align_on = 0;
  cons (nbytes);
  nios2_auto_align_on = hold;
}

/* Handle the .sdata directive.  */
static void
s_nios2_sdata (int ignore ATTRIBUTE_UNUSED)
{
  get_absolute_expression ();  /* Ignored.  */
  subseg_new (".sdata", 0);
  demand_empty_rest_of_line ();
}

/* .set sets assembler options eg noat/at and is also used
   to set symbol values (.equ, .equiv ).  */
static void
s_nios2_set (int equiv)
{
  char *save = input_line_pointer;
  char *directive;
  char delim = get_symbol_name (&directive);
  char *endline = input_line_pointer;

  (void) restore_line_pointer (delim);

  /* We only want to handle ".set XXX" if the
     user has tried ".set XXX, YYY" they are not
     trying a directive.  This prevents
     us from polluting the name space.  */
  SKIP_WHITESPACE ();
  if (is_end_of_line[(unsigned char) *input_line_pointer])
    {
      bfd_boolean done = TRUE;
      *endline = 0;

      if (!strcmp (directive, "noat"))
	  nios2_as_options.noat = TRUE;
      else if (!strcmp (directive, "at"))
	  nios2_as_options.noat = FALSE;
      else if (!strcmp (directive, "nobreak"))
	  nios2_as_options.nobreak = TRUE;
      else if (!strcmp (directive, "break"))
	  nios2_as_options.nobreak = FALSE;
      else if (!strcmp (directive, "norelax"))
	  nios2_as_options.relax = relax_none;
      else if (!strcmp (directive, "relaxsection"))
	  nios2_as_options.relax = relax_section;
      else if (!strcmp (directive, "relaxall"))
	  nios2_as_options.relax = relax_all;
      else
	done = FALSE;

      if (done)
	{
	  *endline = delim;
	  demand_empty_rest_of_line ();
	  return;
	}
    }

  /* If we fall through to here, either we have ".set XXX, YYY"
     or we have ".set XXX" where XXX is unknown or we have
     a syntax error.  */
  input_line_pointer = save;
  s_set (equiv);
}

/* Machine-dependent assembler directives.
   Format of each entry is:
   { "directive", handler_func, param }	 */
const pseudo_typeS md_pseudo_table[] = {
  {"align", s_nios2_align, 0},
  {"text", s_nios2_text, 0},
  {"data", s_nios2_data, 0},
  {"section", s_nios2_section, 0},
  {"section.s", s_nios2_section, 0},
  {"sect", s_nios2_section, 0},
  {"sect.s", s_nios2_section, 0},
  /* .dword and .half are included for compatibility with MIPS.  */
  {"dword", cons, 8},
  {"half", cons, 2},
  /* NIOS2 native word size is 4 bytes, so we override
     the GAS default of 2.  */
  {"word", cons, 4},
  /* Explicitly unaligned directives.  */
  {"2byte", s_nios2_ucons, 2},
  {"4byte", s_nios2_ucons, 4},
  {"8byte", s_nios2_ucons, 8},
  {"16byte", s_nios2_ucons, 16},
#ifdef OBJ_ELF
  {"sdata", s_nios2_sdata, 0},
#endif
  {"set", s_nios2_set, 0},
  {NULL, NULL, 0}
};


/** Relaxation support. */

/* We support two relaxation modes:  a limited PC-relative mode with
   -relax-section (the default), and an absolute jump mode with -relax-all.

   Nios II PC-relative branch instructions only support 16-bit offsets.
   And, there's no good way to add a 32-bit constant to the PC without
   using two registers.

   To deal with this, for the pc-relative relaxation mode we convert
     br label
   into a series of 16-bit adds, like:
     nextpc at
     addi at, at, 32767
     ...
     addi at, at, remainder
     jmp at

   Similarly, conditional branches are converted from
     b(condition) r, s, label
   into a series like:
     b(opposite condition) r, s, skip
     nextpc at
     addi at, at, 32767
     ...
     addi at, at, remainder
     jmp at
     skip:

   The compiler can do a better job, either by converting the branch
   directly into a JMP (going through the GOT for PIC) or by allocating
   a second register for the 32-bit displacement.

   For the -relax-all relaxation mode, the conversions are
     movhi at, %hi(symbol+offset)
     ori at, %lo(symbol+offset)
     jmp at
   and
     b(opposite condition), r, s, skip
     movhi at, %hi(symbol+offset)
     ori at, %lo(symbol+offset)
     jmp at
     skip:
   respectively.

   16-bit CDX branch instructions are relaxed first into equivalent
   32-bit branches and then the above transformations are applied
   if necessary.

*/

/* Arbitrarily limit the number of addis we can insert; we need to be able
   to specify the maximum growth size for each frag that contains a
   relaxable branch.  There's no point in specifying a huge number here
   since that means the assembler needs to allocate that much extra
   memory for every branch, and almost no real code will ever need it.
   Plus, as already noted a better solution is to just use a jmp, or
   allocate a second register to hold a 32-bit displacement.
   FIXME:  Rather than making this a constant, it could be controlled by
   a command-line argument.  */
#define RELAX_MAX_ADDI 32

/* The fr_subtype field represents the target-specific relocation state.
   It has type relax_substateT (unsigned int).  We use it to track the
   number of addis necessary, plus a bit to track whether this is a
   conditional branch and a bit for 16-bit CDX instructions.
   Regardless of the smaller RELAX_MAX_ADDI limit, we reserve 16 bits
   in the fr_subtype to encode the number of addis so that the whole
   theoretically-valid range is representable.
   For the -relax-all mode, N = 0 represents an in-range branch and N = 1
   represents a branch that needs to be relaxed.  */
#define UBRANCH (0 << 16)
#define CBRANCH (1 << 16)
#define CDXBRANCH (1 << 17)
#define IS_CBRANCH(SUBTYPE) ((SUBTYPE) & CBRANCH)
#define IS_UBRANCH(SUBTYPE) (!IS_CBRANCH (SUBTYPE))
#define IS_CDXBRANCH(SUBTYPE) ((SUBTYPE) & CDXBRANCH)
#define UBRANCH_SUBTYPE(N) (UBRANCH | (N))
#define CBRANCH_SUBTYPE(N) (CBRANCH | (N))
#define CDX_UBRANCH_SUBTYPE(N) (CDXBRANCH | UBRANCH | (N))
#define CDX_CBRANCH_SUBTYPE(N) (CDXBRANCH | CBRANCH | (N))
#define SUBTYPE_ADDIS(SUBTYPE) ((SUBTYPE) & 0xffff)

/* For the -relax-section mode, unconditional branches require 2 extra i
   nstructions besides the addis, conditional branches require 3.  */
#define UBRANCH_ADDIS_TO_SIZE(N) (((N) + 2) * 4)
#define CBRANCH_ADDIS_TO_SIZE(N) (((N) + 3) * 4)

/* For the -relax-all mode, unconditional branches require 3 instructions
   and conditional branches require 4.  */
#define UBRANCH_JUMP_SIZE 12
#define CBRANCH_JUMP_SIZE 16

/* Maximum sizes of relaxation sequences.  */
#define UBRANCH_MAX_SIZE \
  (nios2_as_options.relax == relax_all		\
   ? UBRANCH_JUMP_SIZE				\
   : UBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))
#define CBRANCH_MAX_SIZE \
  (nios2_as_options.relax == relax_all		\
   ? CBRANCH_JUMP_SIZE				\
   : CBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))

/* Register number of AT, the assembler temporary.  */
#define AT_REGNUM 1

/* Determine how many bytes are required to represent the sequence
   indicated by SUBTYPE.  */
static int
nios2_relax_subtype_size (relax_substateT subtype)
{
  int n = SUBTYPE_ADDIS (subtype);
  if (n == 0)
    /* Regular conditional/unconditional branch instruction.  */
    return (IS_CDXBRANCH (subtype) ? 2 : 4);
  else if (nios2_as_options.relax == relax_all)
    return (IS_CBRANCH (subtype) ? CBRANCH_JUMP_SIZE : UBRANCH_JUMP_SIZE);
  else if (IS_CBRANCH (subtype))
    return CBRANCH_ADDIS_TO_SIZE (n);
  else
    return UBRANCH_ADDIS_TO_SIZE (n);
}

/* Estimate size of fragp before relaxation.
   This could also examine the offset in fragp and adjust
   fragp->fr_subtype, but we will do that in nios2_relax_frag anyway.  */
int
md_estimate_size_before_relax (fragS *fragp, segT segment ATTRIBUTE_UNUSED)
{
  return nios2_relax_subtype_size (fragp->fr_subtype);
}

/* Implement md_relax_frag, returning the change in size of the frag.  */
long
nios2_relax_frag (segT segment, fragS *fragp, long stretch)
{
  addressT target = fragp->fr_offset;
  relax_substateT subtype = fragp->fr_subtype;
  symbolS *symbolp = fragp->fr_symbol;

  if (symbolp)
    {
      fragS *sym_frag = symbol_get_frag (symbolp);
      offsetT offset;
      int n;
      bfd_boolean is_cdx = FALSE;

      target += S_GET_VALUE (symbolp);

      /* See comments in write.c:relax_frag about handling of stretch.  */
      if (stretch != 0
	  && sym_frag->relax_marker != fragp->relax_marker)
	{
	  if (stretch < 0 || sym_frag->region == fragp->region)
	    target += stretch;
	  else if (target < fragp->fr_address)
	    target = fragp->fr_next->fr_address + stretch;
	}

      /* We subtract fr_var (4 for 32-bit insns) because all pc relative
	 branches are from the next instruction.  */
      offset = target - fragp->fr_address - fragp->fr_fix - fragp->fr_var;
      if (IS_CDXBRANCH (subtype) && IS_UBRANCH (subtype)
	  && offset >= -1024 && offset < 1024)
	/* PC-relative CDX branch with 11-bit offset.  */
	is_cdx = TRUE;
      else if (IS_CDXBRANCH (subtype) && IS_CBRANCH (subtype)
	       && offset >= -128 && offset < 128)
	/* PC-relative CDX branch with 8-bit offset.  */
	is_cdx = TRUE;
      else if (offset >= -32768 && offset < 32768)
	/* Fits in PC-relative branch.  */
	n = 0;
      else if (nios2_as_options.relax == relax_all)
	/* Convert to jump.  */
	n = 1;
      else if (nios2_as_options.relax == relax_section
	       && S_GET_SEGMENT (symbolp) == segment
	       && S_IS_DEFINED (symbolp))
	/* Attempt a PC-relative relaxation on a branch to a defined
	   symbol in the same segment.  */
	{
	  /* The relaxation for conditional branches is offset by 4
	     bytes because we insert the inverted branch around the
	     sequence.  */
	  if (IS_CBRANCH (subtype))
	    offset = offset - 4;
	  if (offset > 0)
	    n = offset / 32767 + 1;
	  else
	    n = offset / -32768 + 1;

	  /* Bail out immediately if relaxation has failed.  If we try to
	     defer the diagnostic to md_convert_frag, some pathological test
	     cases (e.g. gcc/testsuite/gcc.c-torture/compile/20001226-1.c)
	     apparently never converge.  By returning 0 here we could pretend
	     to the caller that nothing has changed, but that leaves things
	     in an inconsistent state when we get to md_convert_frag.  */
	  if (n > RELAX_MAX_ADDI)
	    {
	      as_bad_where (fragp->fr_file, fragp->fr_line,
			    _("branch offset out of range\n"));
	      as_fatal (_("branch relaxation failed\n"));
	    }
	}
      else
	/* We cannot handle this case, diagnose overflow later.  */
	return 0;

      if (is_cdx)
	fragp->fr_subtype = subtype;
      else if (IS_CBRANCH (subtype))
	fragp->fr_subtype = CBRANCH_SUBTYPE (n);
      else
	fragp->fr_subtype = UBRANCH_SUBTYPE (n);

      return (nios2_relax_subtype_size (fragp->fr_subtype)
	      - nios2_relax_subtype_size (subtype));
    }

  /* If we got here, it's probably an error.  */
  return 0;
}


/* Complete fragp using the data from the relaxation pass. */
void
md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED,
		 fragS *fragp)
{
  char *buffer = fragp->fr_literal + fragp->fr_fix;
  relax_substateT subtype = fragp->fr_subtype;
  int n = SUBTYPE_ADDIS (subtype);
  addressT target = fragp->fr_offset;
  symbolS *symbolp = fragp->fr_symbol;
  offsetT offset;
  unsigned int addend_mask, addi_mask, op;
  offsetT addend, remainder;
  int i;
  bfd_boolean is_r2 = (bfd_get_mach (stdoutput) == bfd_mach_nios2r2);

  /* If this is a CDX branch we're not relaxing, just generate the fixup.  */
  if (IS_CDXBRANCH (subtype))
    {
      gas_assert (is_r2);
      fix_new (fragp, fragp->fr_fix, 2, fragp->fr_symbol,
	       fragp->fr_offset, 1,
	       (IS_UBRANCH (subtype)
		? BFD_RELOC_NIOS2_R2_I10_1_PCREL
		: BFD_RELOC_NIOS2_R2_T1I7_1_PCREL));
      fragp->fr_fix += 2;
      return;
    }

  /* If this is a CDX branch we are relaxing, turn it into an equivalent
     32-bit branch and then fall through to the normal non-CDX cases.  */
  if (fragp->fr_var == 2)
    {
      unsigned int opcode = md_chars_to_number (buffer, 2);
      gas_assert (is_r2);
      if (IS_CBRANCH (subtype))
	{
	  unsigned int reg = nios2_r2_reg3_mappings[GET_IW_T1I7_A3 (opcode)];
	  if (GET_IW_R2_OP (opcode) == R2_OP_BNEZ_N)
	    opcode = MATCH_R2_BNE | SET_IW_F2I16_A (reg);
	  else
	    opcode = MATCH_R2_BEQ | SET_IW_F2I16_A (reg);
	}
      else
	opcode = MATCH_R2_BR;
      md_number_to_chars (buffer, opcode, 4);
      fragp->fr_var = 4;
    }

  /* If we didn't or can't relax, this is a regular branch instruction.
     We just need to generate the fixup for the symbol and offset.  */
  if (n == 0)
    {
      fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol,
	       fragp->fr_offset, 1, BFD_RELOC_16_PCREL);
      fragp->fr_fix += 4;
      return;
    }

  /* Replace the cbranch at fr_fix with one that has the opposite condition
     in order to jump around the block of instructions we'll be adding.  */
  if (IS_CBRANCH (subtype))
    {
      unsigned int br_opcode;
      unsigned int old_op, new_op;
      int nbytes;

      /* Account for the nextpc and jmp in the pc-relative case, or the two
	 load instructions and jump in the absolute case.  */
      if (nios2_as_options.relax == relax_section)
	nbytes = (n + 2) * 4;
      else
	nbytes = 12;

      br_opcode = md_chars_to_number (buffer, 4);
      if (is_r2)
	{
	  old_op = GET_IW_R2_OP (br_opcode);
	  switch (old_op)
	    {
	    case R2_OP_BEQ:
	      new_op = R2_OP_BNE;
	      break;
	    case R2_OP_BNE:
	      new_op = R2_OP_BEQ;
	      break;
	    case R2_OP_BGE:
	      new_op = R2_OP_BLT;
	      break;
	    case R2_OP_BGEU:
	      new_op = R2_OP_BLTU;
	      break;
	    case R2_OP_BLT:
	      new_op = R2_OP_BGE;
	      break;
	    case R2_OP_BLTU:
	      new_op = R2_OP_BGEU;
	      break;
	    default:
	      abort ();
	    }
	  br_opcode = ((br_opcode & ~IW_R2_OP_SHIFTED_MASK)
		       | SET_IW_R2_OP (new_op));
	  br_opcode = br_opcode | SET_IW_F2I16_IMM16 (nbytes);
	}
      else
	{
	  old_op = GET_IW_R1_OP (br_opcode);
	  switch (old_op)
	    {
	    case R1_OP_BEQ:
	      new_op = R1_OP_BNE;
	      break;
	    case R1_OP_BNE:
	      new_op = R1_OP_BEQ;
	      break;
	    case R1_OP_BGE:
	      new_op = R1_OP_BLT;
	      break;
	    case R1_OP_BGEU:
	      new_op = R1_OP_BLTU;
	      break;
	    case R1_OP_BLT:
	      new_op = R1_OP_BGE;
	      break;
	    case R1_OP_BLTU:
	      new_op = R1_OP_BGEU;
	      break;
	    default:
	      abort ();
	    }
	  br_opcode = ((br_opcode & ~IW_R1_OP_SHIFTED_MASK)
		       | SET_IW_R1_OP (new_op));
	  br_opcode = br_opcode | SET_IW_I_IMM16 (nbytes);
	}
      md_number_to_chars (buffer, br_opcode, 4);
      fragp->fr_fix += 4;
      buffer += 4;
    }

  /* Load at for the PC-relative case.  */
  if (nios2_as_options.relax == relax_section)
    {
      /* Insert the nextpc instruction.  */
      if (is_r2)
	op = MATCH_R2_NEXTPC | SET_IW_F3X6L5_C (AT_REGNUM);
      else
	op = MATCH_R1_NEXTPC | SET_IW_R_C (AT_REGNUM);
      md_number_to_chars (buffer, op, 4);
      fragp->fr_fix += 4;
      buffer += 4;

      /* We need to know whether the offset is positive or negative.  */
      target += S_GET_VALUE (symbolp);
      offset = target - fragp->fr_address - fragp->fr_fix;
      if (offset > 0)
	addend = 32767;
      else
	addend = -32768;
      if (is_r2)
	addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)addend);
      else
	addend_mask = SET_IW_I_IMM16 ((unsigned int)addend);

      /* Insert n-1 addi instructions.  */
      if (is_r2)
	addi_mask = (MATCH_R2_ADDI
		     | SET_IW_F2I16_B (AT_REGNUM)
		     | SET_IW_F2I16_A (AT_REGNUM));
      else
	addi_mask = (MATCH_R1_ADDI
		     | SET_IW_I_B (AT_REGNUM)
		     | SET_IW_I_A (AT_REGNUM));
      for (i = 0; i < n - 1; i ++)
	{
	  md_number_to_chars (buffer, addi_mask | addend_mask, 4);
	  fragp->fr_fix += 4;
	  buffer += 4;
	}

      /* Insert the last addi instruction to hold the remainder.  */
      remainder = offset - addend * (n - 1);
      gas_assert (remainder >= -32768 && remainder <= 32767);
      if (is_r2)
	addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)remainder);
      else
	addend_mask = SET_IW_I_IMM16 ((unsigned int)remainder);
      md_number_to_chars (buffer, addi_mask | addend_mask, 4);
      fragp->fr_fix += 4;
      buffer += 4;
    }

  /* Load at for the absolute case.  */
  else
    {
      if (is_r2)
	op = MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM) | SET_IW_F2I16_A (0);
      else
	op = MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM) | SET_IW_I_A (0);
      md_number_to_chars (buffer, op, 4);
      fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
	       0, BFD_RELOC_NIOS2_HI16);
      fragp->fr_fix += 4;
      buffer += 4;
      if (is_r2)
	op = (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM)
	      | SET_IW_F2I16_A (AT_REGNUM));
      else
	op = (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM)
	      | SET_IW_I_A (AT_REGNUM));
      md_number_to_chars (buffer, op, 4);
      fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
	       0, BFD_RELOC_NIOS2_LO16);
      fragp->fr_fix += 4;
      buffer += 4;
    }

  /* Insert the jmp instruction.  */
  if (is_r2)
    op = MATCH_R2_JMP | SET_IW_F3X6L5_A (AT_REGNUM);
  else
    op = MATCH_R1_JMP | SET_IW_R_A (AT_REGNUM);
  md_number_to_chars (buffer, op, 4);
  fragp->fr_fix += 4;
  buffer += 4;
}


/** Fixups and overflow checking.  */

/* Check a fixup for overflow. */
static bfd_boolean
nios2_check_overflow (valueT fixup, reloc_howto_type *howto)
{
  /* If there is a rightshift, check that the low-order bits are
     zero before applying it.  */
  if (howto->rightshift)
    {
      if ((~(~((valueT) 0) << howto->rightshift) & fixup)
	  && howto->complain_on_overflow != complain_overflow_dont)
	return TRUE;
      fixup = ((signed)fixup) >> howto->rightshift;
    }

  /* Check for overflow - return TRUE if overflow, FALSE if not.  */
  switch (howto->complain_on_overflow)
    {
    case complain_overflow_dont:
      break;
    case complain_overflow_bitfield:
      if ((fixup >> howto->bitsize) != 0
	  && ((signed) fixup >> howto->bitsize) != -1)
	return TRUE;
      break;
    case complain_overflow_signed:
      if ((fixup & 0x80000000) > 0)
	{
	  /* Check for negative overflow.  */
	  if ((signed) fixup < (signed) (~0U << (howto->bitsize - 1)))
	    return TRUE;
	}
      else
	{
	  /* Check for positive overflow.  */
	  if (fixup >= ((unsigned) 1 << (howto->bitsize - 1)))
	    return TRUE;
	}
      break;
    case complain_overflow_unsigned:
      if ((fixup >> howto->bitsize) != 0)
	return TRUE;
      break;
    default:
      as_bad (_("error checking for overflow - broken assembler"));
      break;
    }
  return FALSE;
}

/* Emit diagnostic for fixup overflow.  */
static void
nios2_diagnose_overflow (valueT fixup, reloc_howto_type *howto,
			 fixS *fixP, valueT value)
{
  if (fixP->fx_r_type == BFD_RELOC_8
      || fixP->fx_r_type == BFD_RELOC_16
      || fixP->fx_r_type == BFD_RELOC_32)
    /* These relocs are against data, not instructions.  */
    as_bad_where (fixP->fx_file, fixP->fx_line,
		  _("immediate value 0x%x truncated to 0x%x"),
		  (unsigned int) fixup,
		  (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup));
  else
    {
      /* What opcode is the instruction?  This will determine
	 whether we check for overflow in immediate values
	 and what error message we get.  */
      const struct nios2_opcode *opcode;
      enum overflow_type overflow_msg_type;
      unsigned int range_min;
      unsigned int range_max;
      unsigned int address;

      opcode = nios2_find_opcode_hash (value, bfd_get_mach (stdoutput));
      gas_assert (opcode);
      gas_assert (fixP->fx_size == opcode->size);
      overflow_msg_type = opcode->overflow_msg;
      switch (overflow_msg_type)
	{
	case call_target_overflow:
	  range_min
	    = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000);
	  range_max = range_min + 0x0fffffff;
	  address = fixup | range_min;

	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("call target address 0x%08x out of range 0x%08x to 0x%08x"),
			address, range_min, range_max);
	  break;
	case branch_target_overflow:
	  if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type)
	    as_bad_where (fixP->fx_file, fixP->fx_line,
			  _("branch offset %d out of range %d to %d"),
			  (int)fixup, -32768, 32767);
	  else
	    as_bad_where (fixP->fx_file, fixP->fx_line,
			  _("branch offset %d out of range"),
			  (int)fixup);
	  break;
	case address_offset_overflow:
	  if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type)
	    as_bad_where (fixP->fx_file, fixP->fx_line,
			  _("%s offset %d out of range %d to %d"),
			  opcode->name, (int)fixup, -32768, 32767);
	  else
	    as_bad_where (fixP->fx_file, fixP->fx_line,
			  _("%s offset %d out of range"),
			  opcode->name, (int)fixup);
	  break;
	case signed_immed16_overflow:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("immediate value %d out of range %d to %d"),
			(int)fixup, -32768, 32767);
	  break;
	case unsigned_immed16_overflow:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("immediate value %u out of range %u to %u"),
			(unsigned int)fixup, 0, 65535);
	  break;
	case unsigned_immed5_overflow:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("immediate value %u out of range %u to %u"),
			(unsigned int)fixup, 0, 31);
	  break;
	case signed_immed12_overflow:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("immediate value %d out of range %d to %d"),
			(int)fixup, -2048, 2047);
	  break;
	case custom_opcode_overflow:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("custom instruction opcode %u out of range %u to %u"),
			(unsigned int)fixup, 0, 255);
	  break;
	default:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("overflow in immediate argument"));
	  break;
	}
    }
}

/* Apply a fixup to the object file.  */
void
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
{
  /* Assert that the fixup is one we can handle.  */
  gas_assert (fixP != NULL && valP != NULL
	      && (fixP->fx_r_type == BFD_RELOC_8
		  || fixP->fx_r_type == BFD_RELOC_16
		  || fixP->fx_r_type == BFD_RELOC_32
		  || fixP->fx_r_type == BFD_RELOC_64
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_S16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_U16
		  || fixP->fx_r_type == BFD_RELOC_16_PCREL
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM8
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_HI16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_LO16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_HIADJ16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GPREL
		  || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
		  || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_UJMP
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CJMP
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALLR
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_ALIGN
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_S12
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_I10_1_PCREL
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_1_PCREL
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_2
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_1
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_2
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X1I7_2
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X2L5
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_F1I5_2
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_L5I4X1
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6
		  || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6_2
		  /* Add other relocs here as we generate them.  */
		  ));

  if (fixP->fx_r_type == BFD_RELOC_64)
    {
      /* We may reach here due to .8byte directives, but we never output
	 BFD_RELOC_64; it must be resolved.  */
      if (fixP->fx_addsy != NULL)
	as_bad_where (fixP->fx_file, fixP->fx_line,
		      _("cannot create 64-bit relocation"));
      else
	{
	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
			      *valP, 8);
	  fixP->fx_done = 1;
	}
      return;
    }

  /* The value passed in valP can be the value of a fully
     resolved expression, or it can be the value of a partially
     resolved expression.  In the former case, both fixP->fx_addsy
     and fixP->fx_subsy are NULL, and fixP->fx_offset == *valP, and
     we can fix up the instruction that fixP relates to.
     In the latter case, one or both of fixP->fx_addsy and
     fixP->fx_subsy are not NULL, and fixP->fx_offset may or may not
     equal *valP.  We don't need to check for fixP->fx_subsy being null
     because the generic part of the assembler generates an error if
     it is not an absolute symbol.  */
  if (fixP->fx_addsy != NULL)
    /* Partially resolved expression.  */
    {
      fixP->fx_addnumber = fixP->fx_offset;
      fixP->fx_done = 0;

      switch (fixP->fx_r_type)
	{
	case BFD_RELOC_NIOS2_TLS_GD16:
	case BFD_RELOC_NIOS2_TLS_LDM16:
	case BFD_RELOC_NIOS2_TLS_LDO16:
	case BFD_RELOC_NIOS2_TLS_IE16:
	case BFD_RELOC_NIOS2_TLS_LE16:
	case BFD_RELOC_NIOS2_TLS_DTPMOD:
	case BFD_RELOC_NIOS2_TLS_DTPREL:
	case BFD_RELOC_NIOS2_TLS_TPREL:
	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
	  break;
	default:
	  break;
	}
    }
  else
    /* Fully resolved fixup.  */
    {
      reloc_howto_type *howto
	= bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);

      if (howto == NULL)
	as_bad_where (fixP->fx_file, fixP->fx_line,
		      _("relocation is not supported"));
      else
	{
	  valueT fixup = *valP;
	  valueT value;
	  char *buf;

	  /* If this is a pc-relative relocation, we need to
	     subtract the current offset within the object file
	     FIXME : for some reason fixP->fx_pcrel isn't 1 when it should be
	     so I'm using the howto structure instead to determine this.  */
	  if (howto->pc_relative == 1)
	    {
	      fixup = (fixup - (fixP->fx_frag->fr_address + fixP->fx_where
				+ fixP->fx_size));
	      *valP = fixup;
	    }

	  /* Get the instruction or data to be fixed up.  */
	  buf = fixP->fx_frag->fr_literal + fixP->fx_where;
	  value = md_chars_to_number (buf, fixP->fx_size);

	  /* Check for overflow, emitting a diagnostic if necessary.  */
	  if (nios2_check_overflow (fixup, howto))
	    nios2_diagnose_overflow (fixup, howto, fixP, value);

	  /* Apply the right shift.  */
	  fixup = ((signed)fixup) >> howto->rightshift;

	  /* Truncate the fixup to right size.  */
	  switch (fixP->fx_r_type)
	    {
	    case BFD_RELOC_NIOS2_HI16:
	      fixup = (fixup >> 16) & 0xFFFF;
	      break;
	    case BFD_RELOC_NIOS2_LO16:
	      fixup = fixup & 0xFFFF;
	      break;
	    case BFD_RELOC_NIOS2_HIADJ16:
	      fixup = ((((fixup >> 16) & 0xFFFF) + ((fixup >> 15) & 0x01))
		       & 0xFFFF);
	      break;
	    default:
	      {
		int n = sizeof (fixup) * 8 - howto->bitsize;
		fixup = (fixup << n) >> n;
		break;
	      }
	    }

	  /* Fix up the instruction.  */
	  value = (value & ~howto->dst_mask) | (fixup << howto->bitpos);
	  md_number_to_chars (buf, value, fixP->fx_size);
	}

      fixP->fx_done = 1;
    }

  if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
    {
      fixP->fx_done = 0;
      if (fixP->fx_addsy
	  && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy))
	S_SET_WEAK (fixP->fx_addsy);
    }
  else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
    fixP->fx_done = 0;
}



/** Instruction parsing support. */

/* General internal error routine.  */

static void
bad_opcode (const struct nios2_opcode *op)
{
  fprintf (stderr, _("internal error: broken opcode descriptor for `%s %s'\n"),
	   op->name, op->args);
  as_fatal (_("Broken assembler.  No assembly attempted."));
}

/* Special relocation directive strings.  */

struct nios2_special_relocS
{
  const char *string;
  bfd_reloc_code_real_type reloc_type;
};

/* This table is sorted so that prefix strings are listed after the longer
   strings that include them -- e.g., %got after %got_hiadj, etc.  */

struct nios2_special_relocS nios2_special_reloc[] = {
  {"%hiadj", BFD_RELOC_NIOS2_HIADJ16},
  {"%hi", BFD_RELOC_NIOS2_HI16},
  {"%lo", BFD_RELOC_NIOS2_LO16},
  {"%gprel", BFD_RELOC_NIOS2_GPREL},
  {"%call_lo", BFD_RELOC_NIOS2_CALL_LO},
  {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA},
  {"%call", BFD_RELOC_NIOS2_CALL16},
  {"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO},
  {"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA},
  {"%gotoff", BFD_RELOC_NIOS2_GOTOFF},
  {"%got_hiadj", BFD_RELOC_NIOS2_GOT_HA},
  {"%got_lo", BFD_RELOC_NIOS2_GOT_LO},
  {"%got", BFD_RELOC_NIOS2_GOT16},
  {"%tls_gd", BFD_RELOC_NIOS2_TLS_GD16},
  {"%tls_ldm", BFD_RELOC_NIOS2_TLS_LDM16},
  {"%tls_ldo", BFD_RELOC_NIOS2_TLS_LDO16},
  {"%tls_ie", BFD_RELOC_NIOS2_TLS_IE16},
  {"%tls_le", BFD_RELOC_NIOS2_TLS_LE16},
};

#define NIOS2_NUM_SPECIAL_RELOCS \
	(sizeof(nios2_special_reloc)/sizeof(nios2_special_reloc[0]))
const int nios2_num_special_relocs = NIOS2_NUM_SPECIAL_RELOCS;

/* Creates a new nios2_insn_relocS and returns a pointer to it.  */
static nios2_insn_relocS *
nios2_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel)
{
  nios2_insn_relocS *retval;
  retval = XNEW (nios2_insn_relocS);
  if (retval == NULL)
    {
      as_bad (_("can't create relocation"));
      abort ();
    }

  /* Fill out the fields with default values.  */
  retval->reloc_next = NULL;
  retval->reloc_type = reloc_type;
  retval->reloc_pcrel = pcrel;
  return retval;
}

/* Frees up memory previously allocated by nios2_insn_reloc_new().  */
/* FIXME:  this is never called; memory leak?  */
#if 0
static void
nios2_insn_reloc_destroy (nios2_insn_relocS *reloc)
{
  gas_assert (reloc != NULL);
  free (reloc);
}
#endif

/* Look up a register name and validate it for the given regtype.
   Return the register mapping or NULL on failure.  */
static struct nios2_reg *
nios2_parse_reg (const char *token, unsigned long regtype)
{
  struct nios2_reg *reg = nios2_reg_lookup (token);

  if (reg == NULL)
    {
      as_bad (_("unknown register %s"), token);
      return NULL;
    }

  /* Matched a register, but is it the wrong type?  */
  if (!(regtype & reg->regtype))
    {
      if (regtype & REG_CONTROL)
	as_bad (_("expecting control register"));
      else if (reg->regtype & REG_CONTROL)
	as_bad (_("illegal use of control register"));
      else if (reg->regtype & REG_COPROCESSOR)
	as_bad (_("illegal use of coprocessor register"));
      else
	as_bad (_("invalid register %s"), token);
      return NULL;
    }

  /* Warn for explicit use of special registers.  */
  if (reg->regtype & REG_NORMAL)
    {
      if (!nios2_as_options.noat && reg->index == 1)
	as_warn (_("Register at (r1) can sometimes be corrupted by "
		   "assembler optimizations.\n"
		   "Use .set noat to turn off those optimizations "
		   "(and this warning)."));
      if (!nios2_as_options.nobreak && reg->index == 25)
	as_warn (_("The debugger will corrupt bt (r25).\n"
		   "If you don't need to debug this "
		   "code use .set nobreak to turn off this warning."));
      if (!nios2_as_options.nobreak && reg->index == 30)
	as_warn (_("The debugger will corrupt sstatus/ba (r30).\n"
		   "If you don't need to debug this "
		   "code use .set nobreak to turn off this warning."));
    }

  return reg;
}

/* This function parses a reglist for ldwm/stwm and push.n/pop.n
   instructions, given as a brace-enclosed register list.  The tokenizer
   has replaced commas in the token with spaces.
   The return value is a bitmask of registers in the set.  It also
   sets nios2_reglist_mask and nios2_reglist_dir to allow error checking
   when parsing the base register.  */

static unsigned long nios2_reglist_mask;
static int nios2_reglist_dir;

static unsigned long
nios2_parse_reglist (char *token, const struct nios2_opcode *op)
{
  unsigned long mask = 0;
  int dir = 0;
  unsigned long regtype = 0;
  int last = -1;
  const char *regname;

  nios2_reglist_mask = 0;
  nios2_reglist_dir = 0;

  if (op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM)
    {
      regtype = REG_LDWM;
      dir = 0;
    }
  else if (op->match == MATCH_R2_PUSH_N)
    {
      regtype = REG_POP;
      dir = -1;
    }
  else if (op->match == MATCH_R2_POP_N)
    {
      regtype = REG_POP;
      dir = 1;
    }
  else
    bad_opcode (op);

  for (regname = strtok (token, "{ }");
       regname;
       regname = strtok (NULL, "{ }"))
    {
      int regno;
      struct nios2_reg *reg = nios2_parse_reg (regname, regtype);

      if (!reg)
	break;
      regno = reg->index;

      /* Make sure registers are listed in proper sequence.  */
      if (last >= 0)
	{
	  if (regno == last)
	    {
	      as_bad ("duplicate register %s\n", reg->name);
	      return 0;
	    }
	  else if (dir == 0)
	    dir = (regno < last ? -1 : 1);
	  else if ((dir > 0 && regno < last)
		   || (dir < 0 && regno > last)
		   || (op->match == MATCH_R2_PUSH_N
		       && ! ((last == 31 && regno == 28)
			     || (last == 31 && regno <= 23)
			     || (last == 28 && regno <= 23)
			     || (regno < 23 && regno == last - 1)))
		   || (op->match == MATCH_R2_POP_N
		       && ! ((regno == 31 && last == 28)
			     || (regno == 31 && last <= 23)
			     || (regno == 28 && last <= 23)
			     || (last < 23 && last == regno - 1))))
	    {
	      as_bad ("invalid register order");
	      return 0;
	    }
	}

      mask |= 1 << regno;
      last = regno;
    }

  /* Check that all ldwm/stwm regs belong to the same set.  */
  if ((op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM)
      && (mask & 0x00003ffc) && (mask & 0x90ffc000))
    {
      as_bad ("invalid register set in reglist");
      return 0;
    }

  /* Check that push.n/pop.n regs include RA.  */
  if ((op->match == MATCH_R2_PUSH_N || op->match == MATCH_R2_POP_N)
      && ((mask & 0x80000000) == 0))
    {
      as_bad ("reglist must include ra (r31)");
      return 0;
    }

  /* Check that there is at least one register in the set.  */
  if (!mask)
    {
      as_bad ("reglist must include at least one register");
      return 0;
    }

  /* OK, reglist passed validation.  */
  nios2_reglist_mask = mask;
  nios2_reglist_dir = dir;
  return mask;
}

/* This function parses the base register and options used by the ldwm/stwm
   instructions.  Returns the base register and sets the option arguments
   accordingly.  On failure, returns NULL.  */
static struct nios2_reg *
nios2_parse_base_register (char *str, int *direction, int *writeback, int *ret)
{
  char *regname;
  struct nios2_reg *reg;

  *direction = 0;
  *writeback = 0;
  *ret = 0;

  /* Check for --.  */
  if (strncmp (str, "--", 2) == 0)
    {
      str += 2;
      *direction -= 1;
    }

  /* Extract the base register.  */
  if (*str != '(')
    {
      as_bad ("expected '(' before base register");
      return NULL;
    }
  str++;
  regname = str;
  str = strchr (str, ')');
  if (!str)
    {
      as_bad ("expected ')' after base register");
      return NULL;
    }
  *str = '\0';
  str++;
  reg = nios2_parse_reg (regname, REG_NORMAL);
  if (reg == NULL)
    return NULL;

  /* Check for ++.  */
  if (strncmp (str, "++", 2) == 0)
    {
      str += 2;
      *direction += 1;
    }

  /* Ensure that either -- or ++ is specified, but not both.  */
  if (*direction == 0)
    {
      as_bad ("invalid base register syntax");
      return NULL;;
    }

  /* Check for options.  The tokenizer has replaced commas with spaces.  */
  while (*str)
    {
      while (*str == ' ')
	str++;
      if (strncmp (str, "writeback", 9) == 0)
	{
	  *writeback = 1;
	  str += 9;
	}
      else if (strncmp (str, "ret", 3) == 0)
	{
	  *ret = 1;
	  str += 3;
	}
      else if (*str)
	{
	  as_bad ("invalid option syntax");
	  return NULL;
	}
    }

  return reg;
}


/* The various nios2_assemble_* functions call this
   function to generate an expression from a string representing an expression.
   It then tries to evaluate the expression, and if it can, returns its value.
   If not, it creates a new nios2_insn_relocS and stores the expression and
   reloc_type for future use.  */
static unsigned long
nios2_assemble_expression (const char *exprstr,
			   nios2_insn_infoS *insn,
			   bfd_reloc_code_real_type orig_reloc_type,
			   unsigned int pcrel)
{
  nios2_insn_relocS *reloc;
  char *saved_line_ptr;
  unsigned long value = 0;
  int i;
  bfd_reloc_code_real_type reloc_type = orig_reloc_type;

  gas_assert (exprstr != NULL);
  gas_assert (insn != NULL);

  /* Check for relocation operators.
     Change the relocation type and advance the ptr to the start of
     the expression proper. */
  for (i = 0; i < nios2_num_special_relocs; i++)
    if (strstr (exprstr, nios2_special_reloc[i].string) != NULL)
      {
	reloc_type = nios2_special_reloc[i].reloc_type;
	exprstr += strlen (nios2_special_reloc[i].string) + 1;

	/* %lo and %hiadj have different meanings for PC-relative
	   expressions.  */
	if (pcrel)
	  {
	    if (reloc_type == BFD_RELOC_NIOS2_LO16)
	      reloc_type = BFD_RELOC_NIOS2_PCREL_LO;
	    if (reloc_type == BFD_RELOC_NIOS2_HIADJ16)
	      reloc_type = BFD_RELOC_NIOS2_PCREL_HA;
	  }

	break;
      }

  /* No relocation allowed; we must have a constant expression.  */
  if (orig_reloc_type == BFD_RELOC_NONE)
    {
      expressionS exp;

      /* Parse the expression string.  */
      saved_line_ptr = input_line_pointer;
      input_line_pointer = (char *) exprstr;
      expression (&exp);
      input_line_pointer = saved_line_ptr;

      /* If we don't have a constant, give an error.  */
      if (reloc_type != orig_reloc_type || exp.X_op != O_constant)
	as_bad (_("expression must be constant"));
      else
	value = exp.X_add_number;
      return (unsigned long) value;
    }

  /* We potentially have a relocation.  */
  reloc = nios2_insn_reloc_new (reloc_type, pcrel);
  reloc->reloc_next = insn->insn_reloc;
  insn->insn_reloc = reloc;

  /* Parse the expression string.  */
  saved_line_ptr = input_line_pointer;
  input_line_pointer = (char *) exprstr;
  expression (&reloc->reloc_expression);
  input_line_pointer = saved_line_ptr;

  /* This is redundant as the fixup will put this into
     the instruction, but it is included here so that
     self-test mode (-r) works.  */
  if (nios2_mode == NIOS2_MODE_TEST
      && reloc->reloc_expression.X_op == O_constant)
    value = reloc->reloc_expression.X_add_number;

  return (unsigned long) value;
}

/* Encode a 3-bit register number, giving an error if this is not possible.  */
static unsigned int
nios2_assemble_reg3 (const char *token)
{
  struct nios2_reg *reg = nios2_parse_reg (token, REG_3BIT);
  int j;

  if (reg == NULL)
    return 0;

  for (j = 0; j < nios2_num_r2_reg3_mappings; j++)
    if (nios2_r2_reg3_mappings[j] == reg->index)
      return j;

  /* Should never get here if we passed validation.  */
  as_bad (_("invalid register %s"), token);
  return 0;
}

/* Argument assemble functions.  */


/* Control register index.  */
static void
nios2_assemble_arg_c (const char *token, nios2_insn_infoS *insn)
{
  struct nios2_reg *reg = nios2_parse_reg (token, REG_CONTROL);
  const struct nios2_opcode *op = insn->insn_nios2_opcode;

  if (reg == NULL)
    return;

  switch (op->format)
    {
    case iw_r_type:
      insn->insn_code |= SET_IW_R_IMM5 (reg->index);
      break;
    case iw_F3X6L5_type:
      insn->insn_code |= SET_IW_F3X6L5_IMM5 (reg->index);
      break;
    default:
      bad_opcode (op);
    }
}

/* Destination register.  */
static void
nios2_assemble_arg_d (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned long regtype = REG_NORMAL;
  struct nios2_reg *reg;

  if (op->format == iw_custom_type || op->format == iw_F3X8_type)
    regtype |= REG_COPROCESSOR;
  reg = nios2_parse_reg (token, regtype);
  if (reg == NULL)
    return;

  switch (op->format)
    {
    case iw_r_type:
      insn->insn_code |= SET_IW_R_C (reg->index);
      break;
    case iw_custom_type:
      insn->insn_code |= SET_IW_CUSTOM_C (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_CUSTOM_READC (0);
      else
	insn->insn_code |= SET_IW_CUSTOM_READC (1);
      break;
    case iw_F3X6L5_type:
    case iw_F3X6_type:
      insn->insn_code |= SET_IW_F3X6L5_C (reg->index);
      break;
    case iw_F3X8_type:
      insn->insn_code |= SET_IW_F3X8_C (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_F3X8_READC (0);
      else
	insn->insn_code |= SET_IW_F3X8_READC (1);
      break;
    case iw_F2_type:
      insn->insn_code |= SET_IW_F2_B (reg->index);
      break;
    default:
      bad_opcode (op);
    }
}

/* Source register 1.  */
static void
nios2_assemble_arg_s (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned long regtype = REG_NORMAL;
  struct nios2_reg *reg;

  if (op->format == iw_custom_type || op->format == iw_F3X8_type)
    regtype |= REG_COPROCESSOR;
  reg = nios2_parse_reg (token, regtype);
  if (reg == NULL)
    return;

  switch (op->format)
    {
    case iw_r_type:
      if (op->match == MATCH_R1_JMP && reg->index == 31)
	as_bad (_("r31 cannot be used with jmp; use ret instead"));
      insn->insn_code |= SET_IW_R_A (reg->index);
      break;
    case iw_i_type:
      insn->insn_code |= SET_IW_I_A (reg->index);
      break;
    case iw_custom_type:
      insn->insn_code |= SET_IW_CUSTOM_A (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_CUSTOM_READA (0);
      else
	insn->insn_code |= SET_IW_CUSTOM_READA (1);
      break;
    case iw_F2I16_type:
      insn->insn_code |= SET_IW_F2I16_A (reg->index);
      break;
    case iw_F2X4I12_type:
      insn->insn_code |= SET_IW_F2X4I12_A (reg->index);
      break;
    case iw_F1X4I12_type:
      insn->insn_code |= SET_IW_F1X4I12_A (reg->index);
      break;
    case iw_F1X4L17_type:
      insn->insn_code |= SET_IW_F1X4L17_A (reg->index);
      break;
    case iw_F3X6L5_type:
    case iw_F3X6_type:
      if (op->match == MATCH_R2_JMP && reg->index == 31)
	as_bad (_("r31 cannot be used with jmp; use ret instead"));
      insn->insn_code |= SET_IW_F3X6L5_A (reg->index);
      break;
    case iw_F2X6L10_type:
      insn->insn_code |= SET_IW_F2X6L10_A (reg->index);
      break;
    case iw_F3X8_type:
      insn->insn_code |= SET_IW_F3X8_A (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_F3X8_READA (0);
      else
	insn->insn_code |= SET_IW_F3X8_READA (1);
      break;
    case iw_F1X1_type:
      if (op->match == MATCH_R2_JMPR_N && reg->index == 31)
	as_bad (_("r31 cannot be used with jmpr.n; use ret.n instead"));
      insn->insn_code |= SET_IW_F1X1_A (reg->index);
      break;
    case iw_F1I5_type:
      /* Implicit stack pointer reference.  */
      if (reg->index != 27)
	as_bad (_("invalid register %s"), token);
      break;
    case iw_F2_type:
      insn->insn_code |= SET_IW_F2_A (reg->index);
      break;
    default:
      bad_opcode (op);
    }
}

/* Source register 2.  */
static void
nios2_assemble_arg_t (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned long regtype = REG_NORMAL;
  struct nios2_reg *reg;

  if (op->format == iw_custom_type || op->format == iw_F3X8_type)
    regtype |= REG_COPROCESSOR;
  reg = nios2_parse_reg (token, regtype);
  if (reg == NULL)
    return;

  switch (op->format)
    {
    case iw_r_type:
      insn->insn_code |= SET_IW_R_B (reg->index);
      break;
    case iw_i_type:
      insn->insn_code |= SET_IW_I_B (reg->index);
      break;
    case iw_custom_type:
      insn->insn_code |= SET_IW_CUSTOM_B (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_CUSTOM_READB (0);
      else
	insn->insn_code |= SET_IW_CUSTOM_READB (1);
      break;
    case iw_F2I16_type:
      insn->insn_code |= SET_IW_F2I16_B (reg->index);
      break;
    case iw_F2X4I12_type:
      insn->insn_code |= SET_IW_F2X4I12_B (reg->index);
      break;
    case iw_F3X6L5_type:
    case iw_F3X6_type:
      insn->insn_code |= SET_IW_F3X6L5_B (reg->index);
      break;
    case iw_F2X6L10_type:
      insn->insn_code |= SET_IW_F2X6L10_B (reg->index);
      break;
    case iw_F3X8_type:
      insn->insn_code |= SET_IW_F3X8_B (reg->index);
      if (reg->regtype & REG_COPROCESSOR)
	insn->insn_code |= SET_IW_F3X8_READB (0);
      else
	insn->insn_code |= SET_IW_F3X8_READB (1);
      break;
    case iw_F1I5_type:
      insn->insn_code |= SET_IW_F1I5_B (reg->index);
      break;
    case iw_F2_type:
      insn->insn_code |= SET_IW_F2_B (reg->index);
      break;
    case iw_T1X1I6_type:
      /* Implicit zero register reference.  */
      if (reg->index != 0)
	as_bad (_("invalid register %s"), token);
      break;

    default:
      bad_opcode (op);
    }
}

/* Destination register w/3-bit encoding.  */
static void
nios2_assemble_arg_D (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  int reg = nios2_assemble_reg3 (token);

  switch (op->format)
    {
    case iw_T1I7_type:
      insn->insn_code |= SET_IW_T1I7_A3 (reg);
      break;
    case iw_T2X1L3_type:
      insn->insn_code |= SET_IW_T2X1L3_B3 (reg);
      break;
    case iw_T2X1I3_type:
      insn->insn_code |= SET_IW_T2X1I3_B3 (reg);
      break;
    case iw_T3X1_type:
      insn->insn_code |= SET_IW_T3X1_C3 (reg);
      break;
    case iw_T2X3_type:
      /* Some instructions using this encoding take 3 register arguments,
	 requiring the destination register to be the same as the first
	 source register.  */
      if (op->num_args == 3)
	insn->insn_code |= SET_IW_T2X3_A3 (reg);
      else
	insn->insn_code |= SET_IW_T2X3_B3 (reg);
      break;
    default:
      bad_opcode (op);
    }
}

/* Source register w/3-bit encoding.  */
static void
nios2_assemble_arg_S (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  int reg = nios2_assemble_reg3 (token);

  switch (op->format)
    {
    case iw_T1I7_type:
      insn->insn_code |= SET_IW_T1I7_A3 (reg);
      break;
    case iw_T2I4_type:
      insn->insn_code |= SET_IW_T2I4_A3 (reg);
      break;
    case iw_T2X1L3_type:
      insn->insn_code |= SET_IW_T2X1L3_A3 (reg);
      break;
    case iw_T2X1I3_type:
      insn->insn_code |= SET_IW_T2X1I3_A3 (reg);
      break;
    case iw_T3X1_type:
      insn->insn_code |= SET_IW_T3X1_A3 (reg);
      break;
    case iw_T2X3_type:
      /* Some instructions using this encoding take 3 register arguments,
	 requiring the destination register to be the same as the first
	 source register.  */
      if (op->num_args == 3)
	{
	  int dreg = GET_IW_T2X3_A3 (insn->insn_code);
	  if (dreg != reg)
	    as_bad ("source and destination registers must be the same");
	}
      else
	insn->insn_code |= SET_IW_T2X3_A3 (reg);
      break;
    case iw_T1X1I6_type:
      insn->insn_code |= SET_IW_T1X1I6_A3 (reg);
      break;
    default:
      bad_opcode (op);
    }
}

/* Source register 2 w/3-bit encoding.  */
static void
nios2_assemble_arg_T (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  int reg = nios2_assemble_reg3 (token);

  switch (op->format)
    {
    case iw_T2I4_type:
      insn->insn_code |= SET_IW_T2I4_B3 (reg);
      break;
    case iw_T3X1_type:
      insn->insn_code |= SET_IW_T3X1_B3 (reg);
      break;
    case iw_T2X3_type:
      insn->insn_code |= SET_IW_T2X3_B3 (reg);
      break;
    default:
      bad_opcode (op);
    }
}

/* 16-bit signed immediate.  */
static void
nios2_assemble_arg_i (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_i_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_S16, 0);
      insn->constant_bits |= SET_IW_I_IMM16 (val);
      break;
    case iw_F2I16_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_S16, 0);
      insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 12-bit signed immediate.  */
static void
nios2_assemble_arg_I (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_F2X4I12_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_S12, 0);
      insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val);
      break;
    case iw_F1X4I12_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_S12, 0);
      insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 16-bit unsigned immediate.  */
static void
nios2_assemble_arg_u (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_i_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_U16, 0);
      insn->constant_bits |= SET_IW_I_IMM16 (val);
      break;
    case iw_F2I16_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_U16, 0);
      insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 7-bit unsigned immediate with 2-bit shift.  */
static void
nios2_assemble_arg_U (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T1I7_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T1I7_2, 0);
      insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 2);
      break;
    case iw_X1I7_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_X1I7_2, 0);
      insn->constant_bits |= SET_IW_X1I7_IMM7 (val >> 2);
      break;
    default:
      bad_opcode (op);
    }
}

/* 5-bit unsigned immediate with 2-bit shift.  */
static void
nios2_assemble_arg_V (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_F1I5_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_F1I5_2, 0);
      insn->constant_bits |= SET_IW_F1I5_IMM5 (val >> 2);
      break;
    default:
      bad_opcode (op);
    }
}

/* 4-bit unsigned immediate with 2-bit shift.  */
static void
nios2_assemble_arg_W (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T2I4_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T2I4_2, 0);
      insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 2);
      break;
    case iw_L5I4X1_type:
      /* This argument is optional for push.n/pop.n, and defaults to
	 zero if unspecified.  */
      if (token == NULL)
	return;

      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_L5I4X1, 0);
      insn->constant_bits |= SET_IW_L5I4X1_IMM4 (val >> 2);
      break;
    default:
      bad_opcode (op);
    }
}

/* 4-bit unsigned immediate with 1-bit shift.  */
static void
nios2_assemble_arg_X (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T2I4_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T2I4_1, 0);
      insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 1);
      break;
    default:
      bad_opcode (op);
    }
}

/* 4-bit unsigned immediate without shift.  */
static void
nios2_assemble_arg_Y (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T2I4_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T2I4, 0);
      insn->constant_bits |= SET_IW_T2I4_IMM4 (val);
      break;
    default:
      bad_opcode (op);
    }
}


/* 16-bit signed immediate address offset.  */
static void
nios2_assemble_arg_o (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_i_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_16_PCREL, 1);
      insn->constant_bits |= SET_IW_I_IMM16 (val);
      break;
    case iw_F2I16_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_16_PCREL, 1);
      insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 10-bit signed address offset with 1-bit shift.  */
static void
nios2_assemble_arg_O (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_I10_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_I10_1_PCREL, 1);
      insn->constant_bits |= SET_IW_I10_IMM10 (val >> 1);
      break;
    default:
      bad_opcode (op);
    }
}

/* 7-bit signed address offset with 1-bit shift.  */
static void
nios2_assemble_arg_P (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T1I7_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, 1);
      insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 1);
      break;
    default:
      bad_opcode (op);
    }
}

/* 5-bit unsigned immediate.  */
static void
nios2_assemble_arg_j (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_r_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_IMM5, 0);
      insn->constant_bits |= SET_IW_R_IMM5 (val);
      break;
    case iw_F3X6L5_type:
      if (op->match == MATCH_R2_ENI)
	/* Value must be constant 0 or 1.  */
	{
	  val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
	  if (val != 0 && val != 1)
	    as_bad ("invalid eni argument %u", val);
	  insn->insn_code |= SET_IW_F3X6L5_IMM5 (val);
	}
      else
	{
	  val = nios2_assemble_expression (token, insn,
					   BFD_RELOC_NIOS2_IMM5, 0);
	  insn->constant_bits |= SET_IW_F3X6L5_IMM5 (val);
	}
      break;
    case iw_F2X6L10_type:
      /* Only constant expression without relocation permitted for
	 bit position.  */
      val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
      if (val > 31)
	as_bad ("invalid bit position %u", val);
      insn->insn_code |= SET_IW_F2X6L10_MSB (val);
      break;
    case iw_X2L5_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_X2L5, 0);
      insn->constant_bits |= SET_IW_X2L5_IMM5 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* Second 5-bit unsigned immediate field.  */
static void
nios2_assemble_arg_k (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_F2X6L10_type:
      /* Only constant expression without relocation permitted for
	 bit position.  */
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NONE, 0);
      if (val > 31)
	as_bad ("invalid bit position %u", val);
      else if (GET_IW_F2X6L10_MSB (insn->insn_code) < val)
	as_bad ("MSB must be greater than or equal to LSB");
      insn->insn_code |= SET_IW_F2X6L10_LSB (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 8-bit unsigned immediate.  */
static void
nios2_assemble_arg_l (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_custom_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_IMM8, 0);
      insn->constant_bits |= SET_IW_CUSTOM_N (val);
      break;
    case iw_F3X8_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_IMM8, 0);
      insn->constant_bits |= SET_IW_F3X8_N (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 26-bit unsigned immediate.  */
static void
nios2_assemble_arg_m (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_j_type:
      val = nios2_assemble_expression (token, insn,
				       (nios2_as_options.noat
					? BFD_RELOC_NIOS2_CALL26_NOAT
					: BFD_RELOC_NIOS2_CALL26),
				       0);
      insn->constant_bits |= SET_IW_J_IMM26 (val);
      break;
    case iw_L26_type:
      val = nios2_assemble_expression (token, insn,
				       (nios2_as_options.noat
					? BFD_RELOC_NIOS2_CALL26_NOAT
					: BFD_RELOC_NIOS2_CALL26),
				       0);
      insn->constant_bits |= SET_IW_L26_IMM26 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 6-bit unsigned immediate with no shifting.  */
static void
nios2_assemble_arg_M (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T1X1I6_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T1X1I6, 0);
      insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* 6-bit unsigned immediate with 2-bit shift.  */
static void
nios2_assemble_arg_N (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;

  switch (op->format)
    {
    case iw_T1X1I6_type:
      val = nios2_assemble_expression (token, insn,
				       BFD_RELOC_NIOS2_R2_T1X1I6_2, 0);
      insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val >> 2);
      break;
    default:
      bad_opcode (op);
    }
}


/* Encoded enumeration for addi.n/subi.n.  */
static void
nios2_assemble_arg_e (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;
  int i;

  switch (op->format)
    {
    case iw_T2X1I3_type:
      val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
      for (i = 0; i < nios2_num_r2_asi_n_mappings; i++)
	if (val == nios2_r2_asi_n_mappings[i])
	  break;
      if (i == nios2_num_r2_asi_n_mappings)
	{
	  as_bad (_("Invalid constant operand %s"), token);
	  return;
	}
      insn->insn_code |= SET_IW_T2X1I3_IMM3 ((unsigned)i);
      break;
    default:
      bad_opcode (op);
    }
}

/* Encoded enumeration for slli.n/srli.n.  */
static void
nios2_assemble_arg_f (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;
  int i;

  switch (op->format)
    {
    case iw_T2X1L3_type:
      val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
      for (i = 0; i < nios2_num_r2_shi_n_mappings; i++)
	if (val == nios2_r2_shi_n_mappings[i])
	  break;
      if (i == nios2_num_r2_shi_n_mappings)
	{
	  as_bad (_("Invalid constant operand %s"), token);
	  return;
	}
      insn->insn_code |= SET_IW_T2X1L3_SHAMT ((unsigned)i);
      break;
    default:
      bad_opcode (op);
    }
}

/* Encoded enumeration for andi.n.  */
static void
nios2_assemble_arg_g (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;
  int i;

  switch (op->format)
    {
    case iw_T2I4_type:
      val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
      for (i = 0; i < nios2_num_r2_andi_n_mappings; i++)
	if (val == nios2_r2_andi_n_mappings[i])
	  break;
      if (i == nios2_num_r2_andi_n_mappings)
	{
	  as_bad (_("Invalid constant operand %s"), token);
	  return;
	}
      insn->insn_code |= SET_IW_T2I4_IMM4 ((unsigned)i);
      break;
    default:
      bad_opcode (op);
    }
}

/* Encoded enumeration for movi.n.  */
static void
nios2_assemble_arg_h (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned int val;
  int i;

  switch (op->format)
    {
    case iw_T1I7_type:
      val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
      i = (signed) val;
      if ((signed) i == -1)
	val = 127;
      else if (i == -2)
	val = 126;
      else if (i == 0xff)
	val = 125;
      else if (i < 0 || i > 125)
	{
	  as_bad (_("Invalid constant operand %s"), token);
	  return;
	}
      insn->insn_code |= SET_IW_T1I7_IMM7 (val);
      break;
    default:
      bad_opcode (op);
    }
}

/* Encoded REGMASK for ldwm/stwm or push.n/pop.n.  */
static void
nios2_assemble_arg_R (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  unsigned long mask;
  char *buf = strdup (token);
  unsigned long reglist = nios2_parse_reglist (buf, op);
  free (buf);

  if (reglist == 0)
    return;

  switch (op->format)
    {
    case iw_F1X4L17_type:
      /* Encoding for ldwm/stwm.  */
      if (reglist & 0x00003ffc)
	mask = reglist >> 2;
      else
	{
	  insn->insn_code |= SET_IW_F1X4L17_RS (1);
	  mask = (reglist & 0x00ffc000) >> 14;
	  if (reglist & (1 << 28))
	    mask |= 1 << 10;
	  if (reglist & (1 << 31))
	    mask |= 1 << 11;
	}
      insn->insn_code |= SET_IW_F1X4L17_REGMASK (mask);
      break;

    case iw_L5I4X1_type:
      /* Encoding for push.n/pop.n.  */
      if (reglist & (1 << 28))
	insn->insn_code |= SET_IW_L5I4X1_FP (1);
      mask = reglist & 0x00ff0000;
      if (mask)
	{
	  int i;

	  for (i = 0; i < nios2_num_r2_reg_range_mappings; i++)
	    if (nios2_r2_reg_range_mappings[i] == mask)
	      break;
	  if (i == nios2_num_r2_reg_range_mappings)
	    {
	      as_bad ("invalid reglist");
	      return;
	    }
	  insn->insn_code |= SET_IW_L5I4X1_REGRANGE (i);
	  insn->insn_code |= SET_IW_L5I4X1_CS (1);
	}
      break;

    default:
      bad_opcode (op);
    }
}

/* Base register for ldwm/stwm.  */
static void
nios2_assemble_arg_B (const char *token, nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  int direction, writeback, ret;
  char *str = strdup (token);
  struct nios2_reg *reg
    = nios2_parse_base_register (str, &direction, &writeback, &ret);

  free (str);
  if (!reg)
    return;

  switch (op->format)
    {
    case iw_F1X4L17_type:
      /* For ldwm, check to see if the base register is already inside the
	 register list.  */
      if (op->match == MATCH_R2_LDWM
	  && (nios2_reglist_mask & (1 << reg->index)))
	{
	  as_bad ("invalid base register; %s is inside the reglist", reg->name);
	  return;
	}

      /* For stwm, ret option is not allowed.  */
      if (op->match == MATCH_R2_STWM && ret)
	{
	  as_bad ("invalid option syntax");
	  return;
	}

      /* Check that the direction matches the ordering of the reglist.  */
      if (nios2_reglist_dir && direction != nios2_reglist_dir)
	{
	  as_bad ("reglist order does not match increment/decrement mode");
	  return;
	}

      insn->insn_code |= SET_IW_F1X4L17_A (reg->index);
      if (direction > 0)
	insn->insn_code |= SET_IW_F1X4L17_ID (1);
      if (writeback)
	insn->insn_code |= SET_IW_F1X4L17_WB (1);
      if (ret)
	insn->insn_code |= SET_IW_F1X4L17_PC (1);
      break;

    default:
      bad_opcode (op);
    }
}

static void
nios2_assemble_args (nios2_insn_infoS *insn)
{
  const struct nios2_opcode *op = insn->insn_nios2_opcode;
  const char *argptr;
  unsigned int tokidx, ntok;

  /* Make sure there are enough arguments.  */
  ntok = (op->pinfo & NIOS2_INSN_OPTARG) ? op->num_args - 1 : op->num_args;
  for (tokidx = 1; tokidx <= ntok; tokidx++)
    if (insn->insn_tokens[tokidx] == NULL)
      {
	as_bad ("missing argument");
	return;
      }

  for (argptr = op->args, tokidx = 1;
       *argptr && insn->insn_tokens[tokidx];
       argptr++)
    switch (*argptr)
      {
      case ',':
      case '(':
      case ')':
	break;

      case 'c':
	nios2_assemble_arg_c (insn->insn_tokens[tokidx++], insn);
	break;

      case 'd':
	nios2_assemble_arg_d (insn->insn_tokens[tokidx++], insn);
	break;

      case 's':
	nios2_assemble_arg_s (insn->insn_tokens[tokidx++], insn);
	break;

      case 't':
	nios2_assemble_arg_t (insn->insn_tokens[tokidx++], insn);
	break;

      case 'D':
	nios2_assemble_arg_D (insn->insn_tokens[tokidx++], insn);
	break;

      case 'S':
	nios2_assemble_arg_S (insn->insn_tokens[tokidx++], insn);
	break;

      case 'T':
	nios2_assemble_arg_T (insn->insn_tokens[tokidx++], insn);
	break;

      case 'i':
	nios2_assemble_arg_i (insn->insn_tokens[tokidx++], insn);
	break;

      case 'I':
	nios2_assemble_arg_I (insn->insn_tokens[tokidx++], insn);
	break;

      case 'u':
	nios2_assemble_arg_u (insn->insn_tokens[tokidx++], insn);
	break;

      case 'U':
	nios2_assemble_arg_U (insn->insn_tokens[tokidx++], insn);
	break;

      case 'V':
	nios2_assemble_arg_V (insn->insn_tokens[tokidx++], insn);
	break;

      case 'W':
	nios2_assemble_arg_W (insn->insn_tokens[tokidx++], insn);
	break;

      case 'X':
	nios2_assemble_arg_X (insn->insn_tokens[tokidx++], insn);
	break;

      case 'Y':
	nios2_assemble_arg_Y (insn->insn_tokens[tokidx++], insn);
	break;

      case 'o':
	nios2_assemble_arg_o (insn->insn_tokens[tokidx++], insn);
	break;

      case 'O':
	nios2_assemble_arg_O (insn->insn_tokens[tokidx++], insn);
	break;

      case 'P':
	nios2_assemble_arg_P (insn->insn_tokens[tokidx++], insn);
	break;

      case 'j':
	nios2_assemble_arg_j (insn->insn_tokens[tokidx++], insn);
	break;

      case 'k':
	nios2_assemble_arg_k (insn->insn_tokens[tokidx++], insn);
	break;

      case 'l':
	nios2_assemble_arg_l (insn->insn_tokens[tokidx++], insn);
	break;

      case 'm':
	nios2_assemble_arg_m (insn->insn_tokens[tokidx++], insn);
	break;

      case 'M':
	nios2_assemble_arg_M (insn->insn_tokens[tokidx++], insn);
	break;

      case 'N':
	nios2_assemble_arg_N (insn->insn_tokens[tokidx++], insn);
	break;

      case 'e':
	nios2_assemble_arg_e (insn->insn_tokens[tokidx++], insn);
	break;

      case 'f':
	nios2_assemble_arg_f (insn->insn_tokens[tokidx++], insn);
	break;

      case 'g':
	nios2_assemble_arg_g (insn->insn_tokens[tokidx++], insn);
	break;

      case 'h':
	nios2_assemble_arg_h (insn->insn_tokens[tokidx++], insn);
	break;

      case 'R':
	nios2_assemble_arg_R (insn->insn_tokens[tokidx++], insn);
	break;

      case 'B':
	nios2_assemble_arg_B (insn->insn_tokens[tokidx++], insn);
	break;

      default:
	bad_opcode (op);
	break;
      }

  /* Perform argument checking.  */
  nios2_check_assembly (insn->insn_code | insn->constant_bits,
			insn->insn_tokens[tokidx]);
}


/* The function consume_arg takes a pointer into a string
   of instruction tokens (args) and a pointer into a string
   representing the expected sequence of tokens and separators.
   It checks whether the first argument in argstr is of the
   expected type, throwing an error if it is not, and returns
   the pointer argstr.  */
static char *
nios2_consume_arg (char *argstr, const char *parsestr)
{
  char *temp;

  switch (*parsestr)
    {
    case 'c':
    case 'd':
    case 's':
    case 't':
    case 'D':
    case 'S':
    case 'T':
      break;

    case 'i':
    case 'u':
      if (*argstr == '%')
	{
	  if (nios2_special_relocation_p (argstr))
	    {
	      /* We zap the parentheses because we don't want them confused
		 with separators.  */
	      temp = strchr (argstr, '(');
	      if (temp != NULL)
		*temp = ' ';
	      temp = strchr (argstr, ')');
	      if (temp != NULL)
		*temp = ' ';
	    }
	  else
	    as_bad (_("badly formed expression near %s"), argstr);
	}
      break;
    case 'm':
    case 'j':
    case 'k':
    case 'l':
    case 'I':
    case 'U':
    case 'V':
    case 'W':
    case 'X':
    case 'Y':
    case 'O':
    case 'P':
    case 'e':
    case 'f':
    case 'g':
    case 'h':
    case 'M':
    case 'N':

      /* We can't have %hi, %lo or %hiadj here.  */
      if (*argstr == '%')
	as_bad (_("badly formed expression near %s"), argstr);
      break;

    case 'R':
      /* Register list for ldwm/stwm or push.n/pop.n.  Replace the commas
	 in the list with spaces so we don't confuse them with separators.  */
      if (*argstr != '{')
	{
	  as_bad ("missing '{' in register list");
	  break;
	}
      for (temp = argstr + 1; *temp; temp++)
	{
	  if (*temp == '}')
	    break;
	  else if (*temp == ',')
	    *temp = ' ';
	}
      if (!*temp)
	{
	  as_bad ("missing '}' in register list");
	  break;
	}
      break;

    case 'B':
      /* Base register and options for ldwm/stwm.  This is the final argument
	 and consumes the rest of the argument string; replace commas
	 with spaces so that the token splitter doesn't think they are
	 separate arguments.  */
      for (temp = argstr; *temp; temp++)
	if (*temp == ',')
	  *temp = ' ';
      break;

    case 'o':
    case 'E':
      break;
    default:
      BAD_CASE (*parsestr);
      break;
    }

  return argstr;
}

/* The function consume_separator takes a pointer into a string
   of instruction tokens (args) and a pointer into a string representing
   the expected sequence of tokens and separators.  It finds the first
   instance of the character pointed to by separator in argstr, and
   returns a pointer to the next element of argstr, which is the
   following token in the sequence.  */
static char *
nios2_consume_separator (char *argstr, const char *separator)
{
  char *p;

  /* If we have a opcode reg, expr(reg) type instruction, and
   * we are separating the expr from the (reg), we find the last
   * (, just in case the expression has parentheses.  */

  if (*separator == '(')
    p = strrchr (argstr, *separator);
  else
    p = strchr (argstr, *separator);

  if (p != NULL)
    *p++ = 0;
  return p;
}

/* The principal argument parsing function which takes a string argstr
   representing the instruction arguments for insn, and extracts the argument
   tokens matching parsestr into parsed_args.  */
static void
nios2_parse_args (nios2_insn_infoS *insn, char *argstr,
		  const char *parsestr, char **parsed_args)
{
  char *p;
  char *end = NULL;
  int i;
  p = argstr;
  i = 0;
  bfd_boolean terminate = FALSE;

  /* This rest of this function is it too fragile and it mostly works,
     therefore special case this one.  */
  if (*parsestr == 0 && argstr != 0)
    {
      as_bad (_("too many arguments"));
      parsed_args[0] = NULL;
      return;
    }

  while (p != NULL && !terminate && i < NIOS2_MAX_INSN_TOKENS)
    {
      parsed_args[i] = nios2_consume_arg (p, parsestr);
      ++parsestr;
      while (*parsestr == '(' || *parsestr == ')' || *parsestr == ',')
	{
	  char *context = p;
	  p = nios2_consume_separator (p, parsestr);
	  /* Check for missing separators.  */
	  if (!p && !(insn->insn_nios2_opcode->pinfo & NIOS2_INSN_OPTARG))
	    {
	      as_bad (_("expecting %c near %s"), *parsestr, context);
	      break;
	    }
	  ++parsestr;
	}

      if (*parsestr == '\0')
	{
	  /* Check that the argument string has no trailing arguments.  */
	  end = strpbrk (p, ",");
	  if (end != NULL)
	    as_bad (_("too many arguments"));
	}

      if (*parsestr == '\0' || (p != NULL && *p == '\0'))
	terminate = TRUE;
      ++i;
    }

  parsed_args[i] = NULL;
}



/** Support for pseudo-op parsing.  These are macro-like opcodes that
    expand into real insns by suitable fiddling with the operands.  */

/* Append the string modifier to the string contained in the argument at
   parsed_args[ndx].  */
static void
nios2_modify_arg (char **parsed_args, const char *modifier,
		  int unused ATTRIBUTE_UNUSED, int ndx)
{
  char *tmp = parsed_args[ndx];

  parsed_args[ndx] = concat (tmp, modifier, (char *) NULL);
}

/* Modify parsed_args[ndx] by negating that argument.  */
static void
nios2_negate_arg (char **parsed_args, const char *modifier ATTRIBUTE_UNUSED,
		  int unused ATTRIBUTE_UNUSED, int ndx)
{
  char *tmp = parsed_args[ndx];

  parsed_args[ndx] = concat ("~(", tmp, ")+1", (char *) NULL);
}

/* The function nios2_swap_args swaps the pointers at indices index_1 and
   index_2 in the array parsed_args[] - this is used for operand swapping
   for comparison operations.  */
static void
nios2_swap_args (char **parsed_args, const char *unused ATTRIBUTE_UNUSED,
		 int index_1, int index_2)
{
  char *tmp;
  gas_assert (index_1 < NIOS2_MAX_INSN_TOKENS
	      && index_2 < NIOS2_MAX_INSN_TOKENS);
  tmp = parsed_args[index_1];
  parsed_args[index_1] = parsed_args[index_2];
  parsed_args[index_2] = tmp;
}

/* This function appends the string appnd to the array of strings in
   parsed_args num times starting at index start in the array.  */
static void
nios2_append_arg (char **parsed_args, const char *appnd, int num,
		  int start)
{
  int i, count;
  char *tmp;

  gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);

  if (nios2_mode == NIOS2_MODE_TEST)
    tmp = parsed_args[start];
  else
    tmp = NULL;

  for (i = start, count = num; count > 0; ++i, --count)
    parsed_args[i] = (char *) appnd;

  gas_assert (i == (start + num));
  parsed_args[i] = tmp;
  parsed_args[i + 1] = NULL;
}

/* This function inserts the string insert num times in the array
   parsed_args, starting at the index start.  */
static void
nios2_insert_arg (char **parsed_args, const char *insert, int num,
		  int start)
{
  int i, count;

  gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);

  /* Move the existing arguments up to create space.  */
  for (i = NIOS2_MAX_INSN_TOKENS; i - num >= start; --i)
    parsed_args[i] = parsed_args[i - num];

  for (i = start, count = num; count > 0; ++i, --count)
    parsed_args[i] = (char *) insert;
}

/* Cleanup function to free malloc'ed arg strings.  */
static void
nios2_free_arg (char **parsed_args, int num ATTRIBUTE_UNUSED, int start)
{
  if (parsed_args[start])
    {
      free (parsed_args[start]);
      parsed_args[start] = NULL;
    }
}

/* This function swaps the pseudo-op for a real op.  */
static nios2_ps_insn_infoS*
nios2_translate_pseudo_insn (nios2_insn_infoS *insn)
{

  nios2_ps_insn_infoS *ps_insn;

  /* Find which real insn the pseudo-op transates to and
     switch the insn_info ptr to point to it.  */
  ps_insn = nios2_ps_lookup (insn->insn_nios2_opcode->name);

  if (ps_insn != NULL)
    {
      insn->insn_nios2_opcode = nios2_opcode_lookup (ps_insn->insn);
      insn->insn_tokens[0] = insn->insn_nios2_opcode->name;
      /* Modify the args so they work with the real insn.  */
      ps_insn->arg_modifer_func ((char **) insn->insn_tokens,
				 ps_insn->arg_modifier, ps_insn->num,
				 ps_insn->index);
    }
  else
    /* we cannot recover from this.  */
    as_fatal (_("unrecognized pseudo-instruction %s"),
	      insn->insn_nios2_opcode->name);
  return ps_insn;
}

/* Invoke the cleanup handler for pseudo-insn ps_insn on insn.  */
static void
nios2_cleanup_pseudo_insn (nios2_insn_infoS *insn,
			   nios2_ps_insn_infoS *ps_insn)
{
  if (ps_insn->arg_cleanup_func)
    (ps_insn->arg_cleanup_func) ((char **) insn->insn_tokens,
				 ps_insn->num, ps_insn->index);
}

const nios2_ps_insn_infoS nios2_ps_insn_info_structs[] = {
  /* pseudo-op, real-op, arg, arg_modifier_func, num, index, arg_cleanup_func */
  {"mov", "add", nios2_append_arg, "zero", 1, 3, NULL},
  {"movi", "addi", nios2_insert_arg, "zero", 1, 2, NULL},
  {"movhi", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
  {"movui", "ori", nios2_insert_arg, "zero", 1, 2, NULL},
  {"movia", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
  {"nop", "add", nios2_append_arg, "zero", 3, 1, NULL},
  {"bgt", "blt", nios2_swap_args, "", 1, 2, NULL},
  {"bgtu", "bltu", nios2_swap_args, "", 1, 2, NULL},
  {"ble", "bge", nios2_swap_args, "", 1, 2, NULL},
  {"bleu", "bgeu", nios2_swap_args, "", 1, 2, NULL},
  {"cmpgt", "cmplt", nios2_swap_args, "", 2, 3, NULL},
  {"cmpgtu", "cmpltu", nios2_swap_args, "", 2, 3, NULL},
  {"cmple", "cmpge", nios2_swap_args, "", 2, 3, NULL},
  {"cmpleu", "cmpgeu", nios2_swap_args, "", 2, 3, NULL},
  {"cmpgti", "cmpgei", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
  {"cmpgtui", "cmpgeui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
  {"cmplei", "cmplti", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
  {"cmpleui", "cmpltui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
  {"subi", "addi", nios2_negate_arg, "", 0, 3, nios2_free_arg},
  {"nop.n", "mov.n", nios2_append_arg, "zero", 2, 1, NULL}
  /* Add further pseudo-ops here.  */
};

#define NIOS2_NUM_PSEUDO_INSNS \
	((sizeof(nios2_ps_insn_info_structs)/ \
	  sizeof(nios2_ps_insn_info_structs[0])))
const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS;


/** Assembler output support.  */

/* Output a normal instruction.  */
static void
output_insn (nios2_insn_infoS *insn)
{
  char *f;
  nios2_insn_relocS *reloc;
  f = frag_more (insn->insn_nios2_opcode->size);
  /* This allocates enough space for the instruction
     and puts it in the current frag.  */
  md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);
  /* Emit debug info.  */
  dwarf2_emit_insn (insn->insn_nios2_opcode->size);
  /* Create any fixups to be acted on later.  */

  for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
    fix_new_exp (frag_now, f - frag_now->fr_literal,
		 insn->insn_nios2_opcode->size,
		 &reloc->reloc_expression, reloc->reloc_pcrel,
		 reloc->reloc_type);
}

/* Output an unconditional branch.  */
static void
output_ubranch (nios2_insn_infoS *insn)
{
  nios2_insn_relocS *reloc = insn->insn_reloc;

  /* If the reloc is NULL, there was an error assembling the branch.  */
  if (reloc != NULL)
    {
      symbolS *symp = reloc->reloc_expression.X_add_symbol;
      offsetT offset = reloc->reloc_expression.X_add_number;
      char *f;
      bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2);

      /* Tag dwarf2 debug info to the address at the start of the insn.
	 We must do it before frag_var() below closes off the frag.  */
      dwarf2_emit_insn (0);

      /* We create a machine dependent frag which can grow
	 to accommodate the largest possible instruction sequence
	 this may generate.  */
      f = frag_var (rs_machine_dependent,
		    UBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size,
		    (is_cdx ? CDX_UBRANCH_SUBTYPE (0) : UBRANCH_SUBTYPE (0)),
		    symp, offset, NULL);

      md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);

      /* We leave fixup generation to md_convert_frag.  */
    }
}

/* Output a conditional branch.  */
static void
output_cbranch (nios2_insn_infoS *insn)
{
  nios2_insn_relocS *reloc = insn->insn_reloc;

  /* If the reloc is NULL, there was an error assembling the branch.  */
  if (reloc != NULL)
    {
      symbolS *symp = reloc->reloc_expression.X_add_symbol;
      offsetT offset = reloc->reloc_expression.X_add_number;
      char *f;
      bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2);

      /* Tag dwarf2 debug info to the address at the start of the insn.
	 We must do it before frag_var() below closes off the frag.  */
      dwarf2_emit_insn (0);

      /* We create a machine dependent frag which can grow
	 to accommodate the largest possible instruction sequence
	 this may generate.  */
      f = frag_var (rs_machine_dependent,
		    CBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size,
		    (is_cdx ? CDX_CBRANCH_SUBTYPE (0) : CBRANCH_SUBTYPE (0)),
		    symp, offset, NULL);

      md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);

      /* We leave fixup generation to md_convert_frag.  */
    }
}

/* Output a call sequence.  Since calls are not pc-relative for NIOS2,
   but are page-relative, we cannot tell at any stage in assembly
   whether a call will be out of range since a section may be linked
   at any address.  So if we are relaxing, we convert all call instructions
   to long call sequences, and rely on the linker to relax them back to
   short calls.  */
static void
output_call (nios2_insn_infoS *insn)
{
  /* This allocates enough space for the instruction
     and puts it in the current frag.  */
  char *f = frag_more (12);
  nios2_insn_relocS *reloc = insn->insn_reloc;
  const struct nios2_opcode *op = insn->insn_nios2_opcode;

  switch (op->format)
    {
    case iw_j_type:
      md_number_to_chars (f,
			  (MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM)
			   | SET_IW_I_A (0)),
			  4);
      dwarf2_emit_insn (4);
      fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
		   &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16);
      md_number_to_chars (f + 4,
			  (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM)
			   | SET_IW_I_A (AT_REGNUM)),
			  4);
      dwarf2_emit_insn (4);
      fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4,
		   &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16);
      md_number_to_chars (f + 8, MATCH_R1_CALLR | SET_IW_R_A (AT_REGNUM), 4);
      dwarf2_emit_insn (4);
      break;
    case iw_L26_type:
      md_number_to_chars (f,
			  (MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM)
			   | SET_IW_F2I16_A (0)),
			  4);
      dwarf2_emit_insn (4);
      fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
		   &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16);
      md_number_to_chars (f + 4,
			  (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM)
			   | SET_IW_F2I16_A (AT_REGNUM)),
			  4);
      dwarf2_emit_insn (4);
      fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4,
		   &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16);
      md_number_to_chars (f + 8, MATCH_R2_CALLR | SET_IW_F3X6L5_A (AT_REGNUM),
			  4);
      dwarf2_emit_insn (4);
      break;
    default:
      bad_opcode (op);
    }
}

/* Output a movhi/addi pair for the movia pseudo-op.  */
static void
output_movia (nios2_insn_infoS *insn)
{
  /* This allocates enough space for the instruction
     and puts it in the current frag.  */
  char *f = frag_more (8);
  nios2_insn_relocS *reloc = insn->insn_reloc;
  unsigned long reg, code = 0;
  const struct nios2_opcode *op = insn->insn_nios2_opcode;

  /* If the reloc is NULL, there was an error assembling the movia.  */
  if (reloc != NULL)
    {
      switch (op->format)
	{
	case iw_i_type:
	  reg = GET_IW_I_B (insn->insn_code);
	  code = MATCH_R1_ADDI | SET_IW_I_A (reg) | SET_IW_I_B (reg);
	  break;
	case iw_F2I16_type:
	  reg = GET_IW_F2I16_B (insn->insn_code);
	  code = MATCH_R2_ADDI | SET_IW_F2I16_A (reg) | SET_IW_F2I16_B (reg);
	  break;
	default:
	  bad_opcode (op);
	}

      md_number_to_chars (f, insn->insn_code, 4);
      dwarf2_emit_insn (4);
      fix_new (frag_now, f - frag_now->fr_literal, 4,
	       reloc->reloc_expression.X_add_symbol,
	       reloc->reloc_expression.X_add_number, 0,
	       BFD_RELOC_NIOS2_HIADJ16);
      md_number_to_chars (f + 4, code, 4);
      dwarf2_emit_insn (4);
      fix_new (frag_now, f + 4 - frag_now->fr_literal, 4,
	       reloc->reloc_expression.X_add_symbol,
	       reloc->reloc_expression.X_add_number, 0, BFD_RELOC_NIOS2_LO16);
    }
}



/** External interfaces.  */

/* Update the selected architecture based on ARCH, giving an error if
   ARCH is an invalid value.  */

static void
nios2_use_arch (const char *arch)
{
  if (strcmp (arch, "nios2") == 0 || strcmp (arch, "r1") == 0)
    {
      nios2_architecture |= EF_NIOS2_ARCH_R1;
      nios2_opcodes = (struct nios2_opcode *) nios2_r1_opcodes;
      nios2_num_opcodes = nios2_num_r1_opcodes;
      nop32 = nop_r1;
      nop16 = NULL;
      return;
    }
  else if (strcmp (arch, "r2") == 0)
    {
      nios2_architecture |= EF_NIOS2_ARCH_R2;
      nios2_opcodes = (struct nios2_opcode *) nios2_r2_opcodes;
      nios2_num_opcodes = nios2_num_r2_opcodes;
      nop32 = nop_r2;
      nop16 = nop_r2_cdx;
      return;
    }

  as_bad (_("unknown architecture '%s'"), arch);
}

/* The following functions are called by machine-independent parts of
   the assembler. */
int
md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
{
  switch (c)
    {
    case 'r':
      /* Hidden option for self-test mode.  */
      nios2_mode = NIOS2_MODE_TEST;
      break;
    case OPTION_RELAX_ALL:
      nios2_as_options.relax = relax_all;
      break;
    case OPTION_NORELAX:
      nios2_as_options.relax = relax_none;
      break;
    case OPTION_RELAX_SECTION:
      nios2_as_options.relax = relax_section;
      break;
    case OPTION_EB:
      target_big_endian = 1;
      break;
    case OPTION_EL:
      target_big_endian = 0;
      break;
    case OPTION_MARCH:
      nios2_use_arch (arg);
      break;
    default:
      return 0;
      break;
    }

  return 1;
}

/* Implement TARGET_FORMAT.  We can choose to be big-endian or
   little-endian at runtime based on a switch.  */
const char *
nios2_target_format (void)
{
  return target_big_endian ? "elf32-bignios2" : "elf32-littlenios2";
}

/* Machine-dependent usage message. */
void
md_show_usage (FILE *stream)
{
  fprintf (stream, "	    NIOS2 options:\n"
	   "  -relax-all	    replace all branch and call "
	   "instructions with jmp and callr sequences\n"
	   "  -relax-section	    replace identified out of range "
	   "branches with jmp sequences (default)\n"
	   "  -no-relax		    do not replace any branches or calls\n"
	   "  -EB		    force big-endian byte ordering\n"
	   "  -EL		    force little-endian byte ordering\n"
	   "  -march=ARCH	    enable instructions from architecture ARCH\n");
}


/* This function is called once, at assembler startup time.
   It should set up all the tables, etc. that the MD part of the
   assembler will need. */
void
md_begin (void)
{
  int i;
  const char *inserted;

  switch (nios2_architecture)
    {
    default:
    case EF_NIOS2_ARCH_R1:
      bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r1);
      break;
    case EF_NIOS2_ARCH_R2:
      if (target_big_endian)
	as_fatal (_("Big-endian R2 is not supported."));
      bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r2);
      break;
    }

  /* Create and fill a hashtable for the Nios II opcodes, registers and
     arguments.  */
  nios2_opcode_hash = hash_new ();
  nios2_reg_hash = hash_new ();
  nios2_ps_hash = hash_new ();

  for (i = 0; i < nios2_num_opcodes; ++i)
    {
      inserted
	= hash_insert (nios2_opcode_hash, nios2_opcodes[i].name,
		       (PTR) & nios2_opcodes[i]);
      if (inserted != NULL)
	{
	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
		   nios2_opcodes[i].name, inserted);
	  /* Probably a memory allocation problem?  Give up now.  */
	  as_fatal (_("Broken assembler.  No assembly attempted."));
	}
    }

  for (i = 0; i < nios2_num_regs; ++i)
    {
      inserted
	= hash_insert (nios2_reg_hash, nios2_regs[i].name,
		       (PTR) & nios2_regs[i]);
      if (inserted != NULL)
	{
	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
		   nios2_regs[i].name, inserted);
	  /* Probably a memory allocation problem?  Give up now.  */
	  as_fatal (_("Broken assembler.  No assembly attempted."));
	}

    }

  for (i = 0; i < nios2_num_ps_insn_info_structs; ++i)
    {
      inserted
	= hash_insert (nios2_ps_hash, nios2_ps_insn_info_structs[i].pseudo_insn,
		       (PTR) & nios2_ps_insn_info_structs[i]);
      if (inserted != NULL)
	{
	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
		   nios2_ps_insn_info_structs[i].pseudo_insn, inserted);
	  /* Probably a memory allocation problem?  Give up now.  */
	  as_fatal (_("Broken assembler.  No assembly attempted."));
	}
    }

  /* Assembler option defaults.  */
  nios2_as_options.noat = FALSE;
  nios2_as_options.nobreak = FALSE;

  /* Debug information is incompatible with relaxation.  */
  if (debug_type != DEBUG_UNSPECIFIED)
    nios2_as_options.relax = relax_none;

  /* Initialize the alignment data.  */
  nios2_current_align_seg = now_seg;
  nios2_last_label = NULL;
  nios2_current_align = 0;
  nios2_min_align = 2;
}


/* Assembles a single line of Nios II assembly language.  */
void
md_assemble (char *op_str)
{
  char *argstr;
  char *op_strdup = NULL;
  unsigned long saved_pinfo = 0;
  nios2_insn_infoS thisinsn;
  nios2_insn_infoS *insn = &thisinsn;

  /* Make sure we are aligned on an appropriate boundary.  */
  if (nios2_current_align < nios2_min_align)
    nios2_align (nios2_min_align, NULL, nios2_last_label);
  else if (nios2_current_align > nios2_min_align)
    nios2_current_align = nios2_min_align;
  nios2_last_label = NULL;

  /* We don't want to clobber to op_str
     because we want to be able to use it in messages.  */
  op_strdup = strdup (op_str);
  insn->insn_tokens[0] = strtok (op_strdup, " ");
  argstr = strtok (NULL, "");

  /* Assemble the opcode.  */
  insn->insn_nios2_opcode = nios2_opcode_lookup (insn->insn_tokens[0]);
  insn->insn_reloc = NULL;

  if (insn->insn_nios2_opcode != NULL)
    {
      nios2_ps_insn_infoS *ps_insn = NULL;

      /* Note if we've seen a 16-bit instruction.  */
      if (insn->insn_nios2_opcode->size == 2)
	nios2_min_align = 1;

      /* Set the opcode for the instruction.  */
      insn->insn_code = insn->insn_nios2_opcode->match;
      insn->constant_bits = 0;

      /* Parse the arguments pointed to by argstr.  */
      if (nios2_mode == NIOS2_MODE_ASSEMBLE)
	nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args,
			  (char **) &insn->insn_tokens[1]);
      else
	nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args_test,
			  (char **) &insn->insn_tokens[1]);

      /* We need to preserve the MOVIA macro as this is clobbered by
	 translate_pseudo_insn.  */
      if (insn->insn_nios2_opcode->pinfo == NIOS2_INSN_MACRO_MOVIA)
	saved_pinfo = NIOS2_INSN_MACRO_MOVIA;
      /* If the instruction is an pseudo-instruction, we want to replace it
	 with its real equivalent, and then continue.  */
      if ((insn->insn_nios2_opcode->pinfo & NIOS2_INSN_MACRO)
	  == NIOS2_INSN_MACRO)
	ps_insn = nios2_translate_pseudo_insn (insn);

      /* Assemble the parsed arguments into the instruction word.  */
      nios2_assemble_args (insn);

      /* Handle relaxation and other transformations.  */
      if (nios2_as_options.relax != relax_none
	  && !nios2_as_options.noat
	  && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_UBRANCH)
	output_ubranch (insn);
      else if (nios2_as_options.relax != relax_none
	       && !nios2_as_options.noat
	       && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CBRANCH)
	output_cbranch (insn);
      else if (nios2_as_options.relax == relax_all
	       && !nios2_as_options.noat
	       && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CALL
	       && insn->insn_reloc
	       && ((insn->insn_reloc->reloc_type
		    == BFD_RELOC_NIOS2_CALL26)
		   || (insn->insn_reloc->reloc_type
		       == BFD_RELOC_NIOS2_CALL26_NOAT)))
	output_call (insn);
      else if (saved_pinfo == NIOS2_INSN_MACRO_MOVIA)
	output_movia (insn);
      else
	output_insn (insn);
      if (ps_insn)
	nios2_cleanup_pseudo_insn (insn, ps_insn);
    }
  else
    /* Unrecognised instruction - error.  */
    as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]);

  /* Don't leak memory.  */
  free (op_strdup);
}

/* Round up section size.  */
valueT
md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT size)
{
  /* I think byte alignment is fine here.  */
  return size;
}

/* Implement TC_FORCE_RELOCATION.  */
int
nios2_force_relocation (fixS *fixp)
{
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
      || fixp->fx_r_type == BFD_RELOC_NIOS2_ALIGN)
    return 1;

  return generic_force_reloc (fixp);
}

/* Implement tc_fix_adjustable.  */
int
nios2_fix_adjustable (fixS *fixp)
{
  if (fixp->fx_addsy == NULL)
    return 1;

#ifdef OBJ_ELF
  /* Prevent all adjustments to global symbols.  */
  if (OUTPUT_FLAVOR == bfd_target_elf_flavour
      && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
    return 0;
#endif
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
    return 0;

  /* Preserve relocations against symbols with function type.  */
  if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION)
    return 0;

  /* Don't allow symbols to be discarded on GOT related relocs.  */
  if (fixp->fx_r_type == BFD_RELOC_NIOS2_GOT16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
      || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPMOD
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
      || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_TPREL
      || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
      || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
      || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
      || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
      || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
      )
    return 0;

  return 1;
}

/* Implement tc_frob_symbol.  This is called in adjust_reloc_syms;
   it is used to remove *ABS* references from the symbol table.  */
int
nios2_frob_symbol (symbolS *symp)
{
  if ((OUTPUT_FLAVOR == bfd_target_elf_flavour
       && symp == section_symbol (absolute_section))
      || !S_IS_DEFINED (symp))
    return 1;
  else
    return 0;
}

/* The function tc_gen_reloc creates a relocation structure for the
   fixup fixp, and returns a pointer to it.  This structure is passed
   to bfd_install_relocation so that it can be written to the object
   file for linking.  */
arelent *
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
{
  arelent *reloc = XNEW (arelent);
  reloc->sym_ptr_ptr = XNEW (asymbol *);
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);

  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
  reloc->addend = fixp->fx_offset;  /* fixp->fx_addnumber; */

  if (fixp->fx_pcrel)
    {
      switch (fixp->fx_r_type)
	{
	case BFD_RELOC_16:
	  fixp->fx_r_type = BFD_RELOC_16_PCREL;
	  break;
	case BFD_RELOC_NIOS2_LO16:
	  fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_LO;
	  break;
	case BFD_RELOC_NIOS2_HIADJ16:
	  fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_HA;
	  break;
	default:
	  break;
	}
    }

  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
  if (reloc->howto == NULL)
    {
      as_bad_where (fixp->fx_file, fixp->fx_line,
		    _("can't represent relocation type %s"),
		    bfd_get_reloc_code_name (fixp->fx_r_type));

      /* Set howto to a garbage value so that we can keep going.  */
      reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
      gas_assert (reloc->howto != NULL);
    }
  return reloc;
}

long
md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
{
  return 0;
}

/* Called just before the assembler exits.  */
void
md_end (void)
{
  /* FIXME - not yet implemented */
}

/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
   Otherwise we have no need to default values of symbols.  */
symbolS *
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
{
#ifdef OBJ_ELF
  if (name[0] == '_' && name[1] == 'G'
      && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
    {
      if (!GOT_symbol)
	{
	  if (symbol_find (name))
	    as_bad ("GOT already in the symbol table");

	  GOT_symbol = symbol_new (name, undefined_section,
				   (valueT) 0, &zero_address_frag);
	}

      return GOT_symbol;
    }
#endif

  return 0;
}

/* Implement tc_frob_label.  */
void
nios2_frob_label (symbolS *lab)
{
  /* Emit dwarf information.  */
  dwarf2_emit_label (lab);

  /* Update the label's address with the current output pointer.  */
  symbol_set_frag (lab, frag_now);
  S_SET_VALUE (lab, (valueT) frag_now_fix ());

  /* Record this label for future adjustment after we find out what
     kind of data it references, and the required alignment therewith.  */
  nios2_last_label = lab;
}

/* Implement md_cons_align.  */
void
nios2_cons_align (int size)
{
  int log_size = 0;
  const char *pfill = NULL;

  while ((size >>= 1) != 0)
    ++log_size;

  if (subseg_text_p (now_seg))
    pfill = (const char *) nop32;
  else
    pfill = NULL;

  if (nios2_auto_align_on)
    nios2_align (log_size, pfill, NULL);

  nios2_last_label = NULL;
}

/* Map 's' to SHF_NIOS2_GPREL.  */
/* This is from the Alpha code tc-alpha.c.  */
int
nios2_elf_section_letter (int letter, const char **ptr_msg)
{
  if (letter == 's')
    return SHF_NIOS2_GPREL;

  *ptr_msg = _("Bad .section directive: want a,s,w,x,M,S,G,T in string");
  return -1;
}

/* Map SHF_ALPHA_GPREL to SEC_SMALL_DATA.  */
/* This is from the Alpha code tc-alpha.c.  */
flagword
nios2_elf_section_flags (flagword flags, int attr, int type ATTRIBUTE_UNUSED)
{
  if (attr & SHF_NIOS2_GPREL)
    flags |= SEC_SMALL_DATA;
  return flags;
}

/* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */
bfd_reloc_code_real_type
nios2_cons (expressionS *exp, int size)
{
  bfd_reloc_code_real_type nios2_tls_ldo_reloc = BFD_RELOC_NONE;

  SKIP_WHITESPACE ();
  if (input_line_pointer[0] == '%')
    {
      if (strprefix (input_line_pointer + 1, "tls_ldo"))
	{
	  if (size != 4)
	    as_bad (_("Illegal operands: %%tls_ldo in %d-byte data field"),
		    size);
	  else
	    {
	      input_line_pointer += 8;
	      nios2_tls_ldo_reloc = BFD_RELOC_NIOS2_TLS_DTPREL;
	    }
	}
      if (nios2_tls_ldo_reloc != BFD_RELOC_NONE)
	{
	  SKIP_WHITESPACE ();
	  if (input_line_pointer[0] != '(')
	    as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
	  else
	    {
	      int c;
	      char *end = ++input_line_pointer;
	      int npar = 0;

	      for (c = *end; !is_end_of_line[c]; end++, c = *end)
		if (c == '(')
		  npar++;
		else if (c == ')')
		  {
		    if (!npar)
		      break;
		    npar--;
		  }

	      if (c != ')')
		as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
	      else
		{
		  *end = '\0';
		  expression (exp);
		  *end = c;
		  if (input_line_pointer != end)
		    as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
		  else
		    {
		      input_line_pointer++;
		      SKIP_WHITESPACE ();
		      c = *input_line_pointer;
		      if (! is_end_of_line[c] && c != ',')
			as_bad (_("Illegal operands: garbage after %%tls_ldo()"));
		    }
		}
	    }
	}
    }
  if (nios2_tls_ldo_reloc == BFD_RELOC_NONE)
    expression (exp);
  return nios2_tls_ldo_reloc;
}

/* Implement HANDLE_ALIGN.  */
void
nios2_handle_align (fragS *fragp)
{
  /* If we are expecting to relax in the linker, then we must output a
     relocation to tell the linker we are aligning code.  */
  if (nios2_as_options.relax == relax_all
      && (fragp->fr_type == rs_align || fragp->fr_type == rs_align_code)
      && fragp->fr_address + fragp->fr_fix > 0
      && fragp->fr_offset > 1
      && now_seg != bss_section)
    fix_new (fragp, fragp->fr_fix, 0, &abs_symbol, fragp->fr_offset, 0,
	     BFD_RELOC_NIOS2_ALIGN);
}

/* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
   register number.  */
int
nios2_regname_to_dw2regnum (char *regname)
{
  struct nios2_reg *r = nios2_reg_lookup (regname);
  if (r == NULL)
    return -1;
  return r->index;
}

/* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
   unwind information for this procedure.  */
void
nios2_frame_initial_instructions (void)
{
  cfi_add_CFA_def_cfa (27, 0);
}

#ifdef OBJ_ELF
/* Some special processing for a Nios II ELF file.  */

void
nios2_elf_final_processing (void)
{
  elf_elfheader (stdoutput)->e_flags = nios2_architecture;
}
#endif
