/* tc-nds32.c -- Assemble for the nds32
   Copyright (C) 2012-2026 Free Software Foundation, Inc.
   Contributed by Andes Technology Corporation.

   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 "safe-ctype.h"
#include "subsegs.h"
#include "symcat.h"
#include "dwarf2dbg.h"
#include "dw2gencfi.h"
#include "opcodes/nds32-asm.h"
#include "elf/nds32.h"
#include "bfd/elf32-nds32.h"
#include "hash.h"
#include "sb.h"
#include "macro.h"
#include "opcode/nds32.h"

#include <stdio.h>
#include <errno.h>
#include <limits.h>

/* GAS definitions.  */

/* Characters which start a comment.  */
const char comment_chars[] = "!";
/* Characters which start a comment when they appear at the start of a line.  */
const char line_comment_chars[] = "#!";
/* Characters which separate lines (null and newline are by default).  */
const char line_separator_chars[] = ";";
/* Characters which may be used as the exponent character
   in a floating point number.  */
const char EXP_CHARS[] = "eE";
/* Characters which may be used to indicate a floating point constant.  */
const char FLT_CHARS[] = "dDfF";

static int enable_16bit = 1;
/* Save for md_assemble to distinguish if this instruction is
   expanded from the pseudo instruction.  */
static bool pseudo_opcode = false;
static struct nds32_relocs_pattern *relocs_list = NULL;
/* Save instruction relation to inserting relaxation relocation.  */
struct nds32_relocs_pattern
{
  segT seg;
  fragS *frag;
  frchainS *frchain;
  symbolS *sym;
  fixS* fixP;
  struct nds32_opcode *opcode;
  char *where;
  struct nds32_relocs_pattern *next;
  /* Assembled instruction bytes.  */
  uint32_t insn;
};

/* Suffix name and relocation.  */
struct suffix_name
{
  const char *suffix;
  short unsigned int reloc;
};
static int vec_size = 0;
/* If the assembly code is generated by compiler, it is supposed to have
   ".flag verbatim" at beginning of the content.  We have
   'nds32_flag' to parse it and set this field to be non-zero.  */
static int verbatim = 0;
static htab_t nds32_gprs_hash;
static htab_t nds32_hint_hash;
#define TLS_REG "$r27"
#define GOT_NAME "_GLOBAL_OFFSET_TABLE_"

/* Generate relocation for relax or not, and the default is true.  */
static int enable_relax_relocs = 1;
/* Save option -O for performance.  */
static int optimize = 0;
/* Save option -Os for code size.  */
static int optimize_for_space = 0;
/* Flag to save label exist.  */
static int label_exist = 0;
/* Flag to save state in omit_fp region.  */
static int in_omit_fp = 0;
/* Tag there is relax relocation having to link.  */
static bool relaxing = false;
/* ICT model.  */
enum ict_option {
  ICT_NONE = 0,
  ICT_SMALL,
  ICT_LARGE
};
static enum ict_option ict_flag = ICT_NONE;


static htab_t nds32_relax_info_hash;

/* Branch patterns.  */
static relax_info_t relax_table[] =
{
  {
    .opcode = "jal",
    .br_range = BR_RANGE_S16M,
    .cond_field =
      {
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_JAL	/* jal label */
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_JAL	/* jal label */
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_JAL	/* jal label */
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_JAL	/* jal label */
      },
    .relax_code_size[BR_RANGE_S16M] = 4,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JRAL_TA	/* jral $ta */
      },
    .relax_code_size[BR_RANGE_U4G] = 12,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, 0, BFD_RELOC_NDS32_HI20},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGCALL4},
	{4, 4, NDS32_HINT | NDS32_FIX, BFD_RELOC_NDS32_LO12S0_ORI},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{8, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bgezal",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	  INSN_BGEZAL	/* bgezal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BGEZAL	/* bgezal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BGEZAL	/* bgezal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BLTZ,	/* bltz $rt, $1 */
	INSN_JAL	/* jal label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGCALL5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BLTZ,	/* bltz $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JRAL_TA	/* jral $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGCALL6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bltzal",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	  INSN_BLTZAL	/* bltzal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BLTZAL	/* bltzal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BLTZAL	/* bltzal $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BGEZ,	/* bgez $rt, $1 */
	INSN_JAL	/* jal label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGCALL5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BGEZ,	/* bgez $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JRAL_TA	/* jral $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGCALL6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "j",
    .br_range = BR_RANGE_S16M,
    .cond_field =
      {
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	(INSN_J8 << 16)	/* j8 label */
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_J		/* j label */
      },
    . relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S16M] = 4,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_size[BR_RANGE_U4G] = 12,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, 0, BFD_RELOC_NDS32_HI20},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP4},
	{4, 4, NDS32_HINT | NDS32_FIX, BFD_RELOC_NDS32_LO12S0_ORI},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{8, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "j8",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	(INSN_J8 << 16)	/* j8 label */
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S16M] = 4,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_size[BR_RANGE_U4G] = 12,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, 0, BFD_RELOC_NDS32_HI20},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP4},
	{4, 4, NDS32_HINT | NDS32_FIX, BFD_RELOC_NDS32_LO12S0_ORI},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{8, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beqz",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    /* We do not use beqz38 and beqzs8 here directly because we
       don't want to check register number for specail condition.  */
    .relax_code_seq[BR_RANGE_S256] =
      {
	  INSN_BEQZ	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_INSN16 , BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BEQZ	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQZ	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNEZ,	/* bnez $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	/* bnez range is 17 pcrel, but it use 15 pcrel here since link time
	   relaxtion.  If 17 pcrel can reach, it do not have to use S16M.
	   Therefore, 15 pcrel is just for linker to distinguish LONGJUMP5
	   and LONGJUMP6.  */
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNEZ,	/* bnez $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bgez",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BGEZ	/* bgez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BGEZ	/* bgez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BGEZ	/* bgez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BLTZ,	/* bltz $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },
    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BLTZ,	/* bltz $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bnez",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BNEZ	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 4, NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BNEZ	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNEZ	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQZ,	/* beqz $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQZ,	/* beqz $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bgtz",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BGTZ	/* bgtz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BGTZ	/* bgtz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BGTZ	/* bgtz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BLEZ,	/* blez $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BLEZ,	/* blez $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "blez",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BLEZ	/* blez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BLEZ	/* blez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BLEZ	/* blez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BGTZ,	/* bgtz $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BGTZ,	/* bgtz $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bltz",
    .br_range = BR_RANGE_S64K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BLTZ	/* bltz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BLTZ	/* bltz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BLTZ	/* bltz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BGEZ,	/* bgez $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BGEZ,	/* bgez $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false},
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beq",
    .br_range = BR_RANGE_S16K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BEQ	/* beq $rt, $ra, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BEQ	/* beq $rt, $ra, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNE,	/* bne $rt, $ra, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNE,	/* bne $rt, $ra, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNE,	/* bne $rt, $ra, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bne",
    .br_range = BR_RANGE_S16K,
    .cond_field =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BNE	/* bne $rt, $ra, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BNE	/* bne $rt, $ra, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQ,	/* beq $rt, $ra, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQ,	/* beq $rt, $ra, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQ,	/* beq $rt, $ra, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 15, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beqz38",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BEQZ38 << 16	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BEQZ	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQZ	/* beqz $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNEZ,	/* bnez $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNEZ,	/* bnez $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bnez38",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BNEZ38 << 16	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BNEZ	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNEZ	/* bnez $rt, label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQZ,	/* beqz $rt, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQZ,	/* beqz $rt, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beqzs8",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BEQZS8 << 16	/* beqz $r15, label */
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BEQZ_TA	/* beqz $r15, label */
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQZ_TA	/* beqz $r15, label */
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNEZ_TA,	/* bnez $r15, $1 */
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNEZ_TA,	/* bnez $r15, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bnezs8",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BNEZS8 << 16	/* bnez $r15, label */
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BNEZ_TA	/* bnez $r15, label */
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNEZ_TA	/* bnez $r15, label */
      },
    .relax_code_size[BR_RANGE_S64K] = 4,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_17_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQZ_TA,	/* beqz $r15, $1 */
	INSN_J		/* j label */
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQZ_TA,	/* beqz $r15, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bnes38",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BNES38 << 16	/* bne $rt, $r5, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BNE_R5	/* bne $rt, $r5, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQ_R5,	/* beq $rt, $r5, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQ_R5,	/* beq $rt, $r5, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQ_R5,	/* beq $rt, $r5, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beqs38",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BEQS38 << 16	/* beq $rt, $r5, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 2,
    .relax_branch_isize[BR_RANGE_S256] = 2,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 2, NDS32_PCREL, BFD_RELOC_NDS32_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_BEQ_R5	/* beq $rt, $r5, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 4,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNE_R5,	/* bne $rt, $r5, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNE_R5,	/* bne $rt, $r5, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP5},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{4, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNE_R5,	/* bne $rt, $r5, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP6},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{4, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_FIX | NDS32_HINT, BFD_RELOC_NDS32_LO12S0_ORI},
	{8, 4, NDS32_PTR |NDS32_HINT, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_ABS | NDS32_HINT, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_SYM | NDS32_HINT, BFD_RELOC_NDS32_EMPTY},
	{12, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "beqc",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7FF, true},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	INSN_BEQC	/* beqc $rt, imm11s, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_MOVI_TA,	/* movi $ta, imm11s */
	INSN_BEQ_TA	/* beq $rt, $ta, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 0, 0xFFFFF, false},
	{4, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 8,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP7},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BNEC,	/* bnec $rt, imm11s, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BNEC,	/* bnec $rt, imm11s, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BNEC,	/* bnec $rt, imm11s, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{8, 4, 0, BFD_RELOC_NDS32_LO12S0_ORI},
	{12, 4, NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = "bnec",
    .br_range = BR_RANGE_S256,
    .cond_field =
      {
	{0, 8, 0x7FF, true},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_seq[BR_RANGE_S256] =
      {
	  INSN_BNEC	/* bnec $rt, imm11s, label */
      },
    .relax_code_condition[BR_RANGE_S256] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S256] = 4,
    .relax_branch_isize[BR_RANGE_S256] = 4,
    .relax_fixup[BR_RANGE_S256] =
      {
	{0, 4, NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16K] =
      {
	INSN_MOVI_TA,	/* movi $ta, imm11s */
	INSN_BNE_TA	/* bne $rt, $ta, label */
      },
    .relax_code_condition[BR_RANGE_S16K] =
      {
	{0, 0, 0xFFFFF, false},
	{4, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16K] = 8,
    .relax_branch_isize[BR_RANGE_S16K] = 4,
    .relax_fixup[BR_RANGE_S16K] =
      {
	{0, 4, NDS32_INSN16 | NDS32_HINT, BFD_RELOC_NDS32_INSN16},
	{0, 4, NDS32_PTR | NDS32_HINT, BFD_RELOC_NDS32_LONGJUMP7},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_15_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S64K] =
      {
	INSN_BEQC,	/* beqc $rt, imm11s, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S64K] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S64K] = 8,
    .relax_branch_isize[BR_RANGE_S64K] = 4,
    .relax_fixup[BR_RANGE_S64K] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_S16M] =
      {
	INSN_BEQC,	/* beqc $rt, imm11s, $1 */
	INSN_J		/* j label */
      },
    .relax_code_condition[BR_RANGE_S16M] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_S16M] = 8,
    .relax_branch_isize[BR_RANGE_S16M] = 4,
    .relax_fixup[BR_RANGE_S16M] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, NDS32_PCREL, BFD_RELOC_NDS32_25_PCREL},
	{0, 0, 0, 0}
      },

    .relax_code_seq[BR_RANGE_U4G] =
      {
	INSN_BEQC,	/* beqc $rt, imm11s, $1 */
	INSN_SETHI_TA,	/* sethi $ta, label */
	INSN_ORI_TA,	/* ori $ta, $ta, label */
	INSN_JR_TA	/* jr $ta */
      },
    .relax_code_condition[BR_RANGE_U4G] =
      {
	{0, 8, 0x7FF, false},
	{0, 20, 0x1F, false},
	{0, 0, 0, false}
      },
    .relax_code_size[BR_RANGE_U4G] = 16,
    .relax_branch_isize[BR_RANGE_U4G] = 4,
    .relax_fixup[BR_RANGE_U4G] =
      {
	{0, 4, NDS32_CREATE_LABEL | NDS32_PCREL, BFD_RELOC_NDS32_WORD_9_PCREL},
	{4, 4, 0, BFD_RELOC_NDS32_HI20},
	{8, 4, 0, BFD_RELOC_NDS32_LO12S0_ORI},
	{12, 4, NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      },
  },
  {
    .opcode = NULL,
  },
};


/* GAS definitions for command-line options.  */
enum options
{
  OPTION_BIG = OPTION_MD_BASE,
  OPTION_LITTLE,
  OPTION_TURBO,
  OPTION_PIC,
  OPTION_RELAX_FP_AS_GP_OFF,
  OPTION_RELAX_B2BB_ON,
  OPTION_RELAX_ALL_OFF,
  OPTION_OPTIMIZE,
  OPTION_OPTIMIZE_SPACE
};

const char md_shortopts[] = "m:O:";
const struct option md_longopts[] =
{
  {"O1", no_argument, NULL, OPTION_OPTIMIZE},
  {"Os", no_argument, NULL, OPTION_OPTIMIZE_SPACE},
  {"big", no_argument, NULL, OPTION_BIG},
  {"little", no_argument, NULL, OPTION_LITTLE},
  {"EB", no_argument, NULL, OPTION_BIG},
  {"EL", no_argument, NULL, OPTION_LITTLE},
  {"meb", no_argument, NULL, OPTION_BIG},
  {"mel", no_argument, NULL, OPTION_LITTLE},
  {"mall-ext", no_argument, NULL, OPTION_TURBO},
  {"mext-all", no_argument, NULL, OPTION_TURBO},
  {"mpic", no_argument, NULL, OPTION_PIC},
  /* Relaxation related options.  */
  {"mno-fp-as-gp-relax", no_argument, NULL, OPTION_RELAX_FP_AS_GP_OFF},
  {"mb2bb", no_argument, NULL, OPTION_RELAX_B2BB_ON},
  {"mno-all-relax", no_argument, NULL, OPTION_RELAX_ALL_OFF},
  {NULL, no_argument, NULL, 0}
};

const size_t md_longopts_size = sizeof (md_longopts);

struct nds32_parse_option_table
{
  const char *name;		/* Option string.  */
  const char *help;			/* Help description.  */
  int (*func) (const char *arg);	/* How to parse it.  */
};


/* The value `-1' represents this option has *NOT* been set.  */
#ifdef NDS32_DEFAULT_ARCH_NAME
static const char* nds32_arch_name = NDS32_DEFAULT_ARCH_NAME;
#else
static const char* nds32_arch_name = "v3";
#endif
static int nds32_baseline = -1;
static int nds32_gpr16 = -1;
static int nds32_fpu_sp_ext = -1;
static int nds32_fpu_dp_ext = -1;
static int nds32_freg = -1;
static int nds32_abi = -1;

/* Record ELF flags */
static int nds32_elf_flags = 0;
static int nds32_fpu_com = 0;

static int nds32_parse_arch (const char *str);
static int nds32_parse_baseline (const char *str);
static int nds32_parse_freg (const char *str);
static int nds32_parse_abi (const char *str);
static void add_mapping_symbol (enum mstate state,
				unsigned int padding_byte,
				unsigned int align);

static struct nds32_parse_option_table parse_opts [] =
{
  {"arch=", N_("<arch name>\t  Assemble for architecture <arch name>\n\
			  <arch name> could be\n\
			  v3, v3j, v3m, v3f, v3s, "\
			  "v2, v2j, v2f, v2s"), nds32_parse_arch},
  {"baseline=", N_("<baseline>\t  Assemble for baseline <baseline>\n\
			  <baseline> could be v2, v3, v3m"),
		  nds32_parse_baseline},
  {"fpu-freg=", N_("<freg>\t  Specify a FPU configuration\n\
			  <freg>\n\
			  0:     8 SP /  4 DP registers\n\
			  1:    16 SP /  8 DP registers\n\
			  2:    32 SP / 16 DP registers\n\
			  3:    32 SP / 32 DP registers"), nds32_parse_freg},
  {"abi=", N_("<abi>\t          Specify a abi version\n\
			  <abi> could be v1, v2, v2fp, v2fpp"), nds32_parse_abi},
  {NULL, NULL, NULL}
};

static int nds32_mac = 1;
static int nds32_div = 1;
static int nds32_16bit_ext = 1;
static int nds32_dx_regs = NDS32_DEFAULT_DX_REGS;
static int nds32_perf_ext = NDS32_DEFAULT_PERF_EXT;
static int nds32_perf_ext2 = NDS32_DEFAULT_PERF_EXT2;
static int nds32_string_ext = NDS32_DEFAULT_STRING_EXT;
static int nds32_audio_ext = NDS32_DEFAULT_AUDIO_EXT;
static int nds32_dsp_ext = NDS32_DEFAULT_DSP_EXT;
static int nds32_zol_ext = NDS32_DEFAULT_ZOL_EXT;
static int nds32_fpu_fma = 0;
static int nds32_pic = 0;
static int nds32_relax_fp_as_gp = 1;
static int nds32_relax_b2bb = 0;
static int nds32_relax_all = 1;
struct nds32_set_option_table
{
  const char *name;		/* Option string.  */
  const char *help;			/* Help description.  */
  int *var;			/* Variable to be set.  */
  int value;			/* Value to set.  */
};

/* The option in this group has both Enable/Disable settings.
   Just list on here.  */

static struct nds32_set_option_table toggle_opts [] =
{
  {"mac", N_("Multiply instructions support"), &nds32_mac, 1},
  {"div", N_("Divide instructions support"), &nds32_div, 1},
  {"16bit-ext", N_("16-bit extension"), &nds32_16bit_ext, 1},
  {"dx-regs", N_("d0/d1 registers"), &nds32_dx_regs, 1},
  {"perf-ext", N_("Performance extension"), &nds32_perf_ext, 1},
  {"perf2-ext", N_("Performance extension 2"), &nds32_perf_ext2, 1},
  {"string-ext", N_("String extension"), &nds32_string_ext, 1},
  {"reduced-regs", N_("Reduced Register configuration (GPR16) option"), &nds32_gpr16, 1},
  {"audio-isa-ext", N_("AUDIO ISA extension"), &nds32_audio_ext, 1},
  {"fpu-sp-ext", N_("FPU SP extension"), &nds32_fpu_sp_ext, 1},
  {"fpu-dp-ext", N_("FPU DP extension"), &nds32_fpu_dp_ext, 1},
  {"fpu-fma", N_("FPU fused-multiply-add instructions"), &nds32_fpu_fma, 1},
  {"dsp-ext", N_("DSP extension"), &nds32_dsp_ext, 1},
  {"zol-ext", N_("hardware loop extension"), &nds32_zol_ext, 1},
  {NULL, NULL, NULL, 0}
};


/* GAS declarations.  */

/* This is the callback for nds32-asm.c to parse operands.  */
int
nds32_asm_parse_operand (struct nds32_asm_desc *pdesc,
			 struct nds32_asm_insn *pinsn,
			 char **pstr, int64_t *value);


static struct nds32_asm_desc asm_desc;

/* md_after_parse_args ()

   GAS will call md_after_parse_args whenever it is defined.
   This function checks any conflicting options specified.  */

void
nds32_after_parse_args (void)
{
  /* If -march option is not used in command-line, set the value of option
     variable according to NDS32_DEFAULT_ARCH_NAME.  */
  nds32_parse_arch (nds32_arch_name);
}

/* This function is called when printing usage message (--help).  */

void
md_show_usage (FILE *stream)
{
  struct nds32_parse_option_table *coarse_tune;
  struct nds32_set_option_table *fine_tune;

  fprintf (stream, _("\n NDS32-specific assembler options:\n"));
  fprintf (stream, _("\
  -O1,			  Optimize for performance\n\
  -Os			  Optimize for space\n"));
  fprintf (stream, _("\
  -EL, -mel or -little    Produce little endian output\n\
  -EB, -meb or -big       Produce big endian output\n\
  -mpic			  Generate PIC\n\
  -mno-fp-as-gp-relax	  Suppress fp-as-gp relaxation for this file\n\
  -mb2bb-relax		  Back-to-back branch optimization\n\
  -mno-all-relax	  Suppress all relaxation for this file\n"));

  for (coarse_tune = parse_opts; coarse_tune->name != NULL; coarse_tune++)
    {
      if (coarse_tune->help != NULL)
	fprintf (stream, _("  -m%s%s\n"),
		 coarse_tune->name, _(coarse_tune->help));
    }

  for (fine_tune = toggle_opts; fine_tune->name != NULL; fine_tune++)
    {
      if (fine_tune->help != NULL)
	fprintf (stream, _("  -m[no-]%-17sEnable/Disable %s\n"),
		 fine_tune->name, _(fine_tune->help));
    }

  fprintf (stream, _("\
  -mall-ext		  Turn on all extensions and instructions support\n"));
}

void
nds32_frag_init (fragS *fragp)
{
  fragp->tc_frag_data.flag = 0;
  fragp->tc_frag_data.opcode = NULL;
  fragp->tc_frag_data.fixup = NULL;
}



/* This function reads an expression from a C string and returns a pointer past
   the end of the expression.  */

static char *
parse_expression (char *str, expressionS *exp)
{
  char *s;
  char *tmp;

  tmp = input_line_pointer;	/* Save line pointer.  */
  input_line_pointer = str;
  expression (exp);
  resolve_register (exp);
  s = input_line_pointer;
  input_line_pointer = tmp;	/* Restore line pointer.  */

  return s;			/* Return pointer to where parsing stopped.  */
}

void
nds32_start_line_hook (void)
{
}

/*
 * Pseudo opcodes
 */

typedef void (*nds32_pseudo_opcode_func) (int argc, char *argv[], unsigned int pv);
struct nds32_pseudo_opcode
{
  const char *opcode;
  int argc;
  nds32_pseudo_opcode_func proc;
  unsigned int pseudo_val;

  /* Some instructions are not pseudo opcode, but they might still be
     expanded or changed with other instruction combination for some
     conditions.  We also apply this structure to assist such work.

     For example, if the distance of branch target '.L0' is larger than
     imm8s<<1 range,

     the instruction:

         beqzs8 .L0

     will be transformed into:

         bnezs8  .LCB0
         j  .L0
       .LCB0:

     However, sometimes we do not want assembler to do such changes
     because compiler knows how to generate corresponding instruction sequence.
     Use this field to indicate that this opcode is also a physical instruction.
     If the flag 'verbatim' is nozero and this opcode
     is a physical instruction, we should not expand it.  */
  int physical_op;
};
#define PV_DONT_CARE 0

static htab_t nds32_pseudo_opcode_hash = NULL;

static int
builtin_isreg (const char *s, const char *x ATTRIBUTE_UNUSED)
{
  if (s [0] == '$' && str_hash_find (nds32_gprs_hash, (s + 1)))
    return 1;
  return 0;
}

static int
builtin_regnum (const char *s, const char *x ATTRIBUTE_UNUSED)
{
  struct nds32_keyword *k;
  if (*s != '$')
    return -1;
  s++;
  k = str_hash_find (nds32_gprs_hash, s);

  if (k == NULL)
    return -1;

  return k->value;
}

static int
builtin_addend (const char *s, char *x ATTRIBUTE_UNUSED)
{
  const char *ptr = s;

  while (*ptr != '+' && *ptr != '-' && *ptr)
    ++ptr;

  if (*ptr == 0)
    return 0;
  else
    return strtol (ptr, NULL, 0);
}

static void
md_assemblef (const char *format, ...)
{
  /* FIXME: hope this is long enough.  */
  char line[1024];
  va_list ap;
  unsigned int r;

  va_start (ap, format);
  r = vsnprintf (line, sizeof (line), format, ap);
  md_assemble (line);

  gas_assert (r < sizeof (line));
}

/* Some prototypes here, since some op may use another op.  */
static void do_pseudo_li_internal (const char *rt, int imm32s);
static void do_pseudo_move_reg_internal (char *dst, char *src);

static void
do_pseudo_b (int argc ATTRIBUTE_UNUSED, char *argv[], 
	     unsigned int pv ATTRIBUTE_UNUSED)
{
  char *arg_label = argv[0];
  relaxing = true;
  /* b   label */
  if (nds32_pic)
    {
      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("ori $ta,$ta,lo12(%s)", arg_label);
      md_assemble  ((char *) "add $ta,$ta,$gp");
      md_assemble  ((char *) "jr $ta");
    }
  else
    {
      md_assemblef ("j %s", arg_label);
    }
  relaxing = false;
}

static void
do_pseudo_bal (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  char *arg_label = argv[0];
  relaxing = true;
  /* bal|call  label */
  if (nds32_pic)
    {
      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("ori $ta,$ta,lo12(%s)", arg_label);
      md_assemble ((char *) "add $ta,$ta,$gp");
      md_assemble ((char *) "jral $ta");
    }
  else
    {
      md_assemblef ("jal %s", arg_label);
    }
  relaxing = false;
}

static void
do_pseudo_bge (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  /* rt5, ra5, label */
  md_assemblef ("slt $ta,%s,%s", argv[0], argv[1]);
  md_assemblef ("beqz $ta,%s", argv[2]);
}

static void
do_pseudo_bges (int argc ATTRIBUTE_UNUSED, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  /* rt5, ra5, label */
  md_assemblef ("slts $ta,%s,%s", argv[0], argv[1]);
  md_assemblef ("beqz $ta,%s", argv[2]);
}

static void
do_pseudo_bgt (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  /* bgt rt5, ra5, label */
  md_assemblef ("slt $ta,%s,%s", argv[1], argv[0]);
  md_assemblef ("bnez $ta,%s", argv[2]);
}

static void
do_pseudo_bgts (int argc ATTRIBUTE_UNUSED, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  /* bgt rt5, ra5, label */
  md_assemblef ("slts $ta,%s,%s", argv[1], argv[0]);
  md_assemblef ("bnez $ta,%s", argv[2]);
}

static void
do_pseudo_ble (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  /* bgt rt5, ra5, label */
  md_assemblef ("slt $ta,%s,%s", argv[1], argv[0]);
  md_assemblef ("beqz $ta,%s", argv[2]);
}

static void
do_pseudo_bles (int argc ATTRIBUTE_UNUSED, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  /* bgt rt5, ra5, label */
  md_assemblef ("slts $ta,%s,%s", argv[1], argv[0]);
  md_assemblef ("beqz $ta,%s", argv[2]);
}

static void
do_pseudo_blt (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  /* rt5, ra5, label */
  md_assemblef ("slt $ta,%s,%s", argv[0], argv[1]);
  md_assemblef ("bnez $ta,%s", argv[2]);
}

static void
do_pseudo_blts (int argc ATTRIBUTE_UNUSED, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  /* rt5, ra5, label */
  md_assemblef ("slts $ta,%s,%s", argv[0], argv[1]);
  md_assemblef ("bnez $ta,%s", argv[2]);
}

static void
do_pseudo_br (int argc ATTRIBUTE_UNUSED, char *argv[], 
	      unsigned int pv ATTRIBUTE_UNUSED)
{
  md_assemblef ("jr %s", argv[0]);
}

static void
do_pseudo_bral (int argc, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  if (argc == 1)
    md_assemblef ("jral $lp,%s", argv[0]);
  else
    md_assemblef ("jral %s,%s", argv[0], argv[1]);
}

static void
do_pseudo_la_internal (const char *arg_reg, char *arg_label,
		       const char *line)
{
  expressionS exp;

  parse_expression (arg_label, &exp);
  if (exp.X_op != O_symbol)
    {
      as_bad (_("la must use with symbol. '%s'"), line);
      return;
    }

  relaxing = true;
  /* rt, label */
  if (!nds32_pic && !strstr (arg_label, "@"))
    {
      md_assemblef ("sethi %s,hi20(%s)", arg_reg, arg_label);
      md_assemblef ("ori %s,%s,lo12(%s)", arg_reg, arg_reg, arg_label);
    }
  else if (strstr (arg_label, "@TPOFF"))
    {
      /* la $rt, sym@TPOFF  */
      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("ori $ta,$ta,lo12(%s)", arg_label);
      md_assemblef ("add %s,$ta,%s", arg_reg, TLS_REG);
    }
  else if (strstr(arg_label, "@GOTTPOFF"))
    {
      /* la $rt, sym@GOTTPOFF*/
      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("lwi $ta,[$ta+lo12(%s)]", arg_label);
      md_assemblef ("add %s,$ta,%s", arg_reg, TLS_REG);
    }
  else if (nds32_pic && ((strstr (arg_label, "@PLT")
			  || strstr (arg_label, "@GOTOFF"))))
    {
      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("ori $ta,$ta,lo12(%s)", arg_label);
      md_assemblef ("add %s,$ta,$gp", arg_reg);
    }
  else if (nds32_pic && strstr (arg_label, "@GOT"))
    {
      long addend = builtin_addend (arg_label, NULL);

      md_assemblef ("sethi $ta,hi20(%s)", arg_label);
      md_assemblef ("ori $ta,$ta,lo12(%s)", arg_label);
      md_assemblef ("lw %s,[$gp+$ta]", arg_reg);
      if (addend != 0)
	{
	  if (addend < 0x4000 && addend >= -0x4000)
	    {
	      md_assemblef ("addi %s,%s,%d", arg_reg, arg_reg, addend);
	    }
	  else
	    {
	      do_pseudo_li_internal ("$ta", addend);
	      md_assemblef ("add %s,$ta,%s", arg_reg, arg_reg);
	    }
	}
    }
   else
      as_bad (_("need PIC qualifier with symbol. '%s'"), line);
  relaxing = false;
}

static void
do_pseudo_la (int argc ATTRIBUTE_UNUSED, char *argv[], 
	      unsigned int pv ATTRIBUTE_UNUSED)
{
  do_pseudo_la_internal (argv[0], argv[1], argv[argc]);
}

static void
do_pseudo_li_internal (const char *rt, int imm32s)
{
  if (enable_16bit && imm32s <= 0xf && imm32s >= -0x10)
    md_assemblef ("movi55 %s,%d", rt, imm32s);
  else if (imm32s <= 0x7ffff && imm32s >= -0x80000)
    md_assemblef ("movi %s,%d", rt, imm32s);
  else if ((imm32s & 0xfff) == 0)
    md_assemblef ("sethi %s,hi20(%d)", rt, imm32s);
  else
    {
      md_assemblef ("sethi %s,hi20(%d)", rt, imm32s);
      md_assemblef ("ori %s,%s,lo12(%d)", rt, rt, imm32s);
    }
}

static void
do_pseudo_li (int argc ATTRIBUTE_UNUSED, char *argv[], 
	      unsigned int pv ATTRIBUTE_UNUSED)
{
  /* Validate argv[1] for constant expression.  */
  expressionS exp;

  parse_expression (argv[1], &exp);
  if (exp.X_op != O_constant)
    {
      as_bad (_("Operand is not a constant. `%s'"), argv[argc]);
      return;
    }

  do_pseudo_li_internal (argv[0], exp.X_add_number);
}

static void
do_pseudo_ls_bhw (int argc ATTRIBUTE_UNUSED, char *argv[], 
		  unsigned int pv)
{
  char ls = 'r';
  char size = 'x';
  const char *sign = "";

  /* Prepare arguments for various load/store.  */
  sign = (pv & 0x10) ? "s" : "";
  ls = (pv & 0x80000000) ? 's' : 'l';
  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    }

  if (ls == 's' || size == 'w')
    sign = "";

  if (builtin_isreg (argv[1], NULL))
    {
      /* lwi */
      md_assemblef ("%c%ci %s,[%s]", ls, size, argv[0], argv[1]);
    }
  else if (!nds32_pic)
    {
      relaxing = true;
      if (strstr (argv[1], "@TPOFF"))
	{
	  /* ls.w $rt, sym@TPOFF  */
	  md_assemblef ("sethi $ta,hi20(%s)", argv[1]);
	  md_assemblef ("ori $ta,$ta,lo12(%s)", argv[1]);
	  md_assemblef ("%c%c%s %s,[$ta+%s]", ls, size, sign, argv[0], TLS_REG);
	}
      else if (strstr (argv[1], "@GOTTPOFF"))
	{
	  /* ls.w $rt, sym@GOTTPOFF  */
	  md_assemblef ("sethi $ta,hi20(%s)", argv[1]);
	  md_assemblef ("lwi $ta,[$ta+lo12(%s)]", argv[1]);
	  md_assemblef ("%c%c%s %s,[$ta+%s]", ls, size, sign, argv[0], TLS_REG);
	}
      else
	{
	  /* lwi */
	  md_assemblef ("sethi $ta,hi20(%s)", argv[1]);
	  md_assemblef ("%c%c%si %s,[$ta+lo12(%s)]", ls, size, sign, argv[0], argv[1]);
	}
      relaxing = false;
    }
  else
    {
      relaxing = true;
      /* PIC code.  */
      if (strstr (argv[1], "@GOTOFF"))
	{
	  /* lw */
	  md_assemblef ("sethi $ta,hi20(%s)", argv[1]);
	  md_assemblef ("ori $ta,$ta,lo12(%s)", argv[1]);
	  md_assemblef ("%c%c%s %s,[$ta+$gp]", ls, size, sign, argv[0]);
	}
      else if (strstr (argv[1], "@GOT"))
	{
	  long addend = builtin_addend (argv[1], NULL);
	  /* lw */
	  md_assemblef ("sethi $ta,hi20(%s)", argv[1]);
	  md_assemblef ("ori $ta,$ta,lo12(%s)", argv[1]);
	  md_assemble ((char *) "lw $ta,[$gp+$ta]");	/* Load address word.  */
	  if (addend < 0x10000 && addend >= -0x10000)
	    {
	      md_assemblef ("%c%c%si %s,[$ta+(%d)]", ls, size, sign, argv[0], addend);
	    }
	  else
	    {
	      /* lw */
	      do_pseudo_li_internal (argv[0], addend);
	      md_assemblef ("%c%c%s %s,[$ta+%s]", ls, size, sign, argv[0], argv[0]);
	    }
	}
      else
	{
	  as_bad (_("needs @GOT or @GOTOFF. %s"), argv[argc]);
	}
      relaxing = false;
    }
}

static void
do_pseudo_ls_bhwp (int argc ATTRIBUTE_UNUSED, char *argv[], 
		   unsigned int pv)
{
  char *arg_rt = argv[0];
  char *arg_label = argv[1];
  char *arg_inc = argv[2];
  char ls = 'r';
  char size = 'x';
  const char *sign = "";

  /* Prepare arguments for various load/store.  */
  sign = (pv & 0x10) ? "s" : "";
  ls = (pv & 0x80000000) ? 's' : 'l';
  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    }

  if (ls == 's' || size == 'w')
    sign = "";

  do_pseudo_la_internal ("$ta", arg_label, argv[argc]);
  md_assemblef ("%c%c%si.bi %s,[$ta],%s", ls, size, sign, arg_rt, arg_inc);
}

static void
do_pseudo_ls_bhwpc (int argc ATTRIBUTE_UNUSED, char *argv[],
		    unsigned int pv)
{
  char *arg_rt = argv[0];
  char *arg_inc = argv[1];
  char ls = 'r';
  char size = 'x';
  const char *sign = "";

  /* Prepare arguments for various load/store.  */
  sign = (pv & 0x10) ? "s" : "";
  ls = (pv & 0x80000000) ? 's' : 'l';
  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    }

  if (ls == 's' || size == 'w')
    sign = "";

  md_assemblef ("%c%c%si.bi %s,[$ta],%s", ls, size, sign, arg_rt, arg_inc);
}

static void
do_pseudo_ls_bhwi (int argc ATTRIBUTE_UNUSED, char *argv[], 
		   unsigned int pv)
{
  char ls = 'r';
  char size = 'x';
  const char *sign = "";

  /* Prepare arguments for various load/store.  */
  sign = (pv & 0x10) ? "s" : "";
  ls = (pv & 0x80000000) ? 's' : 'l';
  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    }

  if (ls == 's' || size == 'w')
    sign = "";

  md_assemblef ("%c%c%si.bi %s,%s,%s",
		ls, size, sign, argv[0], argv[1], argv[2]);
}

static void
do_pseudo_move_reg_internal (char *dst, char *src)
{
  if (enable_16bit)
    md_assemblef ("mov55 %s,%s", dst, src);
  else
    md_assemblef ("ori %s,%s,0", dst, src);
}

static void
do_pseudo_move (int argc ATTRIBUTE_UNUSED, char *argv[], 
		unsigned int pv ATTRIBUTE_UNUSED)
{
  expressionS exp;

  if (builtin_isreg (argv[1], NULL))
    do_pseudo_move_reg_internal (argv[0], argv[1]);
  else
    {
      parse_expression (argv[1], &exp);
      if (exp.X_op == O_constant)
	/* move $rt, imm  -> li $rt, imm  */
	do_pseudo_li_internal (argv[0], exp.X_add_number);
      else
	/* l.w $rt, var  -> l.w $rt, var  */
	do_pseudo_ls_bhw (argc, argv, 2);
    }
}

static void
do_pseudo_neg (int argc ATTRIBUTE_UNUSED, char *argv[], 
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  /* Instead of "subri".  */
  md_assemblef ("subri %s,%s,0", argv[0], argv[1]);
}

static void
do_pseudo_not (int argc ATTRIBUTE_UNUSED, char *argv[],
	       unsigned int pv ATTRIBUTE_UNUSED)
{
  md_assemblef ("nor %s,%s,%s", argv[0], argv[1], argv[1]);
}

static void
do_pseudo_pushpopm (int argc, char *argv[],
		    unsigned int pv ATTRIBUTE_UNUSED)
{
  /* posh/pop $ra, $rb */
  /* SMW.{b | a}{i | d}{m?} Rb, [Ra], Re, Enable4 */
  int rb, re, ra, en4;
  int i;
  const char *opc = "pushpopm";

  if (argc == 3)
    as_bad ("'pushm/popm $ra5, $rb5, $label' is deprecated.  "
	    "Only 'pushm/popm $ra5' is supported now. %s", argv[argc]);
  else if (argc == 1)
    as_bad ("'pushm/popm $ra5, $rb5'. %s\n", argv[argc]);

  if (strstr (argv[argc], "pop") == argv[argc])
    opc = "lmw.bim";
  else if (strstr (argv[argc], "push") == argv[argc])
    opc = "smw.adm";
  else
    as_fatal ("nds32-as internal error. %s", argv[argc]);

  rb = builtin_regnum (argv[0], NULL);
  re = builtin_regnum (argv[1], NULL);

  if (re < rb)
    {
      as_warn ("$rb should not be smaller than $ra. %s", argv[argc]);
      /* Swap to right order.  */
      ra = re;
      re = rb;
      rb = ra;
    }

  /* Build enable4 mask.  */
  en4 = 0;
  if (re >= 28 || rb >= 28)
    {
      for (i = (rb >= 28? rb: 28); i <= re; i++)
	en4 |= 1 << (3 - (i - 28));
    }

  /* Adjust $re, $rb.  */
  if (rb >= 28)
    rb = re = 31;
  else if (nds32_gpr16 != 1 && re >= 28)
    re = 27;

  /* Reduce register.  */
  if (nds32_gpr16 && re > 10 && !(rb == 31 && re == 31))
    {
      if (re >= 15 && strstr (opc, "smw") != NULL)
	md_assemblef ("%s $r15,[$sp],$r15,%d", opc, en4);
      if (rb <= 10)
	md_assemblef ("%s $r%d,[$sp],$r10, 0x0", opc, rb);
      if (re >= 15 && strstr (opc, "lmw") != NULL)
	md_assemblef ("%s $r15,[$sp],$r15,%d", opc, en4);
    }
  else
    md_assemblef ("%s $r%d,[$sp],$r%d,%d", opc, rb, re, en4);
}

static void
do_pseudo_pushpop (int argc, char *argv[],
		   unsigned int pv ATTRIBUTE_UNUSED)
{
  /* push/pop $ra5, $label=$sp */
  char *argvm[3];

  if (argc == 2)
    as_bad ("'push/pop $ra5, rb5' is deprecated.  "
	    "Only 'push/pop $ra5' is supported now. %s", argv[argc]);

  argvm[0] = argv[0];
  argvm[1] = argv[0];
  argvm[2] = argv[argc];
  do_pseudo_pushpopm (2, argvm, PV_DONT_CARE);
}

static void
do_pseudo_v3push (int argc ATTRIBUTE_UNUSED, char *argv[],
		  unsigned int pv ATTRIBUTE_UNUSED)
{
  md_assemblef ("push25 %s,%s", argv[0], argv[1]);
}

static void
do_pseudo_v3pop (int argc ATTRIBUTE_UNUSED, char *argv[], 
		 unsigned int pv ATTRIBUTE_UNUSED)
{
  md_assemblef ("pop25 %s,%s", argv[0], argv[1]);
}

/* pv == 0, parsing "push.s" pseudo instruction operands.
   pv != 0, parsing "pop.s" pseudo instruction operands.  */

static void
do_pseudo_pushpop_stack (int argc, char *argv[],
			 unsigned int pv)
{
  /* push.s Rb,Re,{$fp $gp $lp $sp}  ==>  smw.adm Rb,[$sp],Re,Eable4  */
  /* pop.s Rb,Re,{$fp $gp $lp $sp}   ==>  lmw.bim Rb,[$sp],Re,Eable4  */

  int rb, re;
  int en4;
  int last_arg_index;
  const char *opc = (pv == 0) ? "smw.adm" : "lmw.bim";

  rb = re = 0;

  if (argc == 1)
    {
      /* argc=1, operands pattern: { $fp $gp $lp $sp }  */

      /* Set register number Rb = Re = $sp = $r31.  */
      rb = re = 31;
    }
  else if (argc == 2 || argc == 3)
    {
      /* argc=2, operands pattern: Rb, Re  */
      /* argc=3, operands pattern: Rb, Re, { $fp $gp $lp $sp }  */

      /* Get register number in integer.  */
      rb = builtin_regnum (argv[0], NULL);
      re = builtin_regnum (argv[1], NULL);

      /* Rb should be equal/less than Re.  */
      if (rb > re)
	as_bad ("The first operand (%s) should be equal to or smaller than "
		"second operand (%s).", argv[0], argv[1]);

      /* forbid using $fp|$gp|$lp|$sp in Rb or Re
		      r28 r29 r30 r31  */
      if (rb >= 28)
	as_bad ("Cannot use $fp, $gp, $lp, or $sp at first operand !!");
      if (re >= 28)
	as_bad ("Cannot use $fp, $gp, $lp, or $sp at second operand !!");
    }
  else
    {
      as_bad ("Invalid operands pattern !!");
    }

  /* Build Enable4 mask.  */
  /* Using last_arg_index for argc=1|2|3 is safe, because $fp, $gp, $lp,
     and $sp only appear in argc=1 or argc=3 if argc=2, en4 remains 0,
     which is also valid for code generation.  */
  en4 = 0;
  last_arg_index = argc - 1;
  if (strstr (argv[last_arg_index], "$fp"))
    en4 |= 8;
  if (strstr (argv[last_arg_index], "$gp"))
    en4 |= 4;
  if (strstr (argv[last_arg_index], "$lp"))
    en4 |= 2;
  if (strstr (argv[last_arg_index], "$sp"))
    en4 |= 1;

  md_assemblef ("%s $r%d,[$sp],$r%d,%d", opc, rb, re, en4);
}

static void
do_pseudo_push_bhwd (int argc ATTRIBUTE_UNUSED, char *argv[],
		     unsigned int pv ATTRIBUTE_UNUSED)
{
  char size = 'x';
  /* If users omit push location, use $sp as default value.  */
  char location[8] = "$sp";  /* 8 is enough for register name.  */

  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    case 3: size = 'w'; break;
    }

  if (argc == 2)
    {
      strncpy (location, argv[1], sizeof (location) - 1);
      location[sizeof (location) - 1] = '\0';
    }

  md_assemblef ("l.%c $ta,%s", size, argv[0]);
  md_assemblef ("smw.adm $ta,[%s],$ta", location);

  if ((pv & 0x3) == 0x3) /* double-word */
    {
      md_assemblef ("l.w $ta,%s+4", argv[0]);
      md_assemblef ("smw.adm $ta,[%s],$ta", location);
    }
}

static void
do_pseudo_pop_bhwd (int argc ATTRIBUTE_UNUSED, char *argv[],
		    unsigned int pv ATTRIBUTE_UNUSED)
{
  char size = 'x';
  /* If users omit pop location, use $sp as default value.  */
  char location[8] = "$sp";  /* 8 is enough for register name.  */

  switch (pv & 0x3)
    {
    case 0: size = 'b'; break;
    case 1: size = 'h'; break;
    case 2: size = 'w'; break;
    case 3: size = 'w'; break;
    }

  if (argc == 3)
    {
      strncpy (location, argv[2], sizeof (location) - 1);
      location[sizeof (location) - 1] = '\0';
    }

  if ((pv & 0x3) == 0x3) /* double-word */
    {
      md_assemblef ("lmw.bim %s,[%s],%s", argv[1], location, argv[1]);
      md_assemblef ("s.w %s,%s+4", argv[1], argv[0]);
    }

  md_assemblef ("lmw.bim %s,[%s],%s", argv[1], location, argv[1]);
  md_assemblef ("s.%c %s,%s", size, argv[1], argv[0]);
}

static void
do_pseudo_pusha (int argc ATTRIBUTE_UNUSED, char *argv[],
		 unsigned int pv ATTRIBUTE_UNUSED)
{
  /* If users omit push location, use $sp as default value.  */
  char location[8] = "$sp";  /* 8 is enough for register name.  */

  if (argc == 2)
    {
      strncpy (location, argv[1], sizeof (location) - 1);
      location[sizeof (location) - 1] = '\0';
    }

  md_assemblef ("la $ta,%s", argv[0]);
  md_assemblef ("smw.adm $ta,[%s],$ta", location);
}

static void
do_pseudo_pushi (int argc ATTRIBUTE_UNUSED, char *argv[],
		 unsigned int pv ATTRIBUTE_UNUSED)
{
  /* If users omit push location, use $sp as default value.  */
  char location[8] = "$sp";  /* 8 is enough for register name.  */

  if (argc == 2)
    {
      strncpy (location, argv[1], sizeof (location) - 1);
      location[sizeof (location) - 1] = '\0';
    }

  md_assemblef ("li $ta,%s", argv[0]);
  md_assemblef ("smw.adm $ta,[%s],$ta", location);
}

static struct nds32_pseudo_opcode nds32_pseudo_opcode_table[] =
{
  {"b",      1, do_pseudo_b,      0, 0},
  {"bal",    1, do_pseudo_bal,    0, 0},

  {"bge",    3, do_pseudo_bge,    0, 0},
  {"bges",   3, do_pseudo_bges,   0, 0},

  {"bgt",    3, do_pseudo_bgt,    0, 0},
  {"bgts",   3, do_pseudo_bgts,   0, 0},

  {"ble",    3, do_pseudo_ble,    0, 0},
  {"bles",   3, do_pseudo_bles,   0, 0},

  {"blt",    3, do_pseudo_blt,    0, 0},
  {"blts",   3, do_pseudo_blts,   0, 0},

  {"br",     1, do_pseudo_br,     0, 0},
  {"bral",   1, do_pseudo_bral,   0, 0},

  {"call",   1, do_pseudo_bal,    0, 0},

  {"la",     2, do_pseudo_la, 0, 0},
  {"li",     2, do_pseudo_li, 0, 0},

  {"l.b",    2, do_pseudo_ls_bhw, 0, 0},
  {"l.h",    2, do_pseudo_ls_bhw, 1, 0},
  {"l.w",    2, do_pseudo_ls_bhw, 2, 0},
  {"l.bs",   2, do_pseudo_ls_bhw, 0 | 0x10, 0},
  {"l.hs",   2, do_pseudo_ls_bhw, 1 | 0x10, 0},
  {"s.b",    2, do_pseudo_ls_bhw, 0 | 0x80000000, 0},
  {"s.h",    2, do_pseudo_ls_bhw, 1 | 0x80000000, 0},
  {"s.w",    2, do_pseudo_ls_bhw, 2 | 0x80000000, 0},

  {"l.bp",   3, do_pseudo_ls_bhwp, 0, 0},
  {"l.bpc",  3, do_pseudo_ls_bhwpc, 0, 0},
  {"l.hp",   3, do_pseudo_ls_bhwp, 1, 0},
  {"l.hpc",  3, do_pseudo_ls_bhwpc, 1, 0},
  {"l.wp",   3, do_pseudo_ls_bhwp, 2, 0},
  {"l.wpc",  3, do_pseudo_ls_bhwpc, 2, 0},
  {"l.bsp",  3, do_pseudo_ls_bhwp, 0 | 0x10, 0},
  {"l.bspc", 3, do_pseudo_ls_bhwpc, 0 | 0x10, 0},
  {"l.hsp",  3, do_pseudo_ls_bhwp, 1 | 0x10, 0},
  {"l.hspc", 3, do_pseudo_ls_bhwpc, 1 | 0x10, 0},
  {"s.bp",   3, do_pseudo_ls_bhwp, 0 | 0x80000000, 0},
  {"s.bpc",   3, do_pseudo_ls_bhwpc, 0 | 0x80000000, 0},
  {"s.hp",   3, do_pseudo_ls_bhwp, 1 | 0x80000000, 0},
  {"s.hpc",   3, do_pseudo_ls_bhwpc, 1 | 0x80000000, 0},
  {"s.wp",   3, do_pseudo_ls_bhwp, 2 | 0x80000000, 0},
  {"s.wpc",   3, do_pseudo_ls_bhwpc, 2 | 0x80000000, 0},
  {"s.bsp",  3, do_pseudo_ls_bhwp, 0 | 0x80000000 | 0x10, 0},
  {"s.hsp",  3, do_pseudo_ls_bhwp, 1 | 0x80000000 | 0x10, 0},

  {"lbi.p",  3, do_pseudo_ls_bhwi, 0, 0},
  {"lhi.p",  3, do_pseudo_ls_bhwi, 1, 0},
  {"lwi.p",  3, do_pseudo_ls_bhwi, 2, 0},
  {"sbi.p",  3, do_pseudo_ls_bhwi, 0 | 0x80000000, 0},
  {"shi.p",  3, do_pseudo_ls_bhwi, 1 | 0x80000000, 0},
  {"swi.p",  3, do_pseudo_ls_bhwi, 2 | 0x80000000, 0},
  {"lbsi.p", 3, do_pseudo_ls_bhwi, 0 | 0x10, 0},
  {"lhsi.p", 3, do_pseudo_ls_bhwi, 1 | 0x10, 0},
  {"lwsi.p", 3, do_pseudo_ls_bhwi, 2 | 0x10, 0},

  {"move",   2, do_pseudo_move, 0, 0},
  {"neg",    2, do_pseudo_neg,  0, 0},
  {"not",    2, do_pseudo_not,  0, 0},

  {"pop",    2, do_pseudo_pushpop,   0, 0},
  {"push",   2, do_pseudo_pushpop,   0, 0},
  {"popm",   2, do_pseudo_pushpopm,  0, 0},
  {"pushm",   3, do_pseudo_pushpopm, 0, 0},

  {"v3push", 2, do_pseudo_v3push, 0, 0},
  {"v3pop",  2, do_pseudo_v3pop,  0, 0},

  /* Support pseudo instructions of pushing/poping registers into/from stack
     push.s  Rb, Re, { $fp $gp $lp $sp }  ==>  smw.adm  Rb,[$sp],Re,Enable4
     pop.s   Rb, Re, { $fp $gp $lp $sp }  ==>  lmw.bim  Rb,[$sp],Re,Enable4 */
  { "push.s", 3, do_pseudo_pushpop_stack, 0, 0 },
  { "pop.s", 3, do_pseudo_pushpop_stack, 1, 0 },
  { "push.b", 2, do_pseudo_push_bhwd, 0, 0 },
  { "push.h", 2, do_pseudo_push_bhwd, 1, 0 },
  { "push.w", 2, do_pseudo_push_bhwd, 2, 0 },
  { "push.d", 2, do_pseudo_push_bhwd, 3, 0 },
  { "pop.b", 3, do_pseudo_pop_bhwd, 0, 0 },
  { "pop.h", 3, do_pseudo_pop_bhwd, 1, 0 },
  { "pop.w", 3, do_pseudo_pop_bhwd, 2, 0 },
  { "pop.d", 3, do_pseudo_pop_bhwd, 3, 0 },
  { "pusha", 2, do_pseudo_pusha, 0, 0 },
  { "pushi", 2, do_pseudo_pushi, 0, 0 },

  {NULL, 0, NULL, 0, 0}
};

static void
nds32_init_nds32_pseudo_opcodes (void)
{
  struct nds32_pseudo_opcode *opcode;

  nds32_pseudo_opcode_hash = str_htab_create ();
  for (opcode = nds32_pseudo_opcode_table; opcode->opcode; opcode++)
    if (str_hash_insert (nds32_pseudo_opcode_hash, opcode->opcode, opcode, 0))
      as_fatal (_("duplicate %s"), opcode->opcode);
}

static struct nds32_pseudo_opcode *
nds32_lookup_pseudo_opcode (const char *str)
{
  struct nds32_pseudo_opcode *result;
  int i = 0;

  /* (*op) is the first word of current source line (*str)  */
  int maxlen = strlen (str);
  char *op = xmalloc (maxlen + 1);

  for (i = 0; i < maxlen; i++)
    {
      if (is_end_of_stmt (str[i]) || is_whitespace (str[i]))
	break;
      op[i] = str[i];
    }
  op[i] = '\0';

  result = str_hash_find (nds32_pseudo_opcode_hash, op);
  free (op);
  return result;
}

static void
nds32_pseudo_opcode_wrapper (char *line, struct nds32_pseudo_opcode *opcode)
{
  int argc = 0;
  char *argv[8] = {NULL};
  char *s;
  char *str = xstrdup (line);

  /* Parse arguments for opcode.  */
  s = str + strlen (opcode->opcode);

  if (!s[0])
    goto end;

  /* Dummy comma to ease separate arguments as below.  */
  s[0] = ',';
  do
    {
      if (s[0] == ',')
	{
	  if (argc >= opcode->argc
	      || (argc >= (int)ARRAY_SIZE (argv) - 1))
	    as_bad (_("Too many argument. `%s'"), line);

	  argv[argc] = s + 1;
	  argc ++;
	  s[0] = '\0';
	}
      ++s;
    } while (s[0] != '\0');
 end:
  /* Put the origin line for debugging.  */
  argv[argc] = line;
  opcode->proc (argc, argv, opcode->pseudo_val);
  free (str);
}

/* This function will be invoked from function `nds32_after_parse_args'.
   Thus, if the value of option has been set, keep the value the way it is.  */

static int
nds32_parse_arch (const char *str)
{
  static const struct nds32_arch
  {
    const char *name;
    int baseline;
    int reduced_reg;
    int fpu_sp_ext;
    int fpu_dp_ext;
    int fpu_freg;
    int abi;
  } archs[] =
  {
    {"v3m", ISA_V3M, 1, 0, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_AABI},
    {"v3j", ISA_V3,  1, 0, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_AABI},
    {"v3s", ISA_V3,  0, 1, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_V2FP_PLUS},
    {"v3f", ISA_V3,  0, 1, 1, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_V2FP_PLUS},
    {"v3",  ISA_V3,  0, 0, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_AABI},
    {"v2j", ISA_V2,  1, 0, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_AABI},
    {"v2s", ISA_V2,  0, 1, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_V2FP_PLUS},
    {"v2f", ISA_V2,  0, 1, 1, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_V2FP_PLUS},
    {"v2",  ISA_V2,  0, 0, 0, E_NDS32_FPU_REG_32SP_16DP, E_NDS_ABI_AABI},
  };
  size_t i;

  for (i = 0; i < ARRAY_SIZE (archs); i++)
    {
      if (strcmp (str, archs[i].name) != 0)
	continue;

      /* The value `-1' represents this option has *NOT* been set.  */
      nds32_baseline = (-1 != nds32_baseline) ? nds32_baseline : archs[i].baseline;
      nds32_gpr16 = (-1 != nds32_gpr16) ? nds32_gpr16 : archs[i].reduced_reg;
      nds32_fpu_sp_ext = (-1 != nds32_fpu_sp_ext) ? nds32_fpu_sp_ext : archs[i].fpu_sp_ext;
      nds32_fpu_dp_ext = (-1 != nds32_fpu_dp_ext) ? nds32_fpu_dp_ext : archs[i].fpu_dp_ext;
      nds32_freg = (-1 != nds32_freg) ? nds32_freg : archs[i].fpu_freg;
      nds32_abi = (-1 != nds32_abi) ? nds32_abi : archs[i].abi;

      return 1;
    }

  /* Logic here rejects the input arch name.  */
  as_bad (_("unknown arch name `%s'\n"), str);

  return 1;
}

/* This function parses "baseline" specified.  */

static int
nds32_parse_baseline (const char *str)
{
  if (strcmp (str, "v3") == 0)
    nds32_baseline = ISA_V3;
  else if (strcmp (str, "v3m") == 0)
    nds32_baseline = ISA_V3M;
  else if (strcmp (str, "v2") == 0)
    nds32_baseline = ISA_V2;
  else
    {
      /* Logic here rejects the input baseline.  */
      as_bad (_("unknown baseline `%s'\n"), str);
      return 0;
    }

  return 1;
}

/* This function parses "fpu-freg" specified.  */

static int
nds32_parse_freg (const char *str)
{
  if (strcmp (str, "2") == 0)
    nds32_freg = E_NDS32_FPU_REG_32SP_16DP;
  else if (strcmp (str, "3") == 0)
    nds32_freg = E_NDS32_FPU_REG_32SP_32DP;
  else if (strcmp (str, "1") == 0)
    nds32_freg = E_NDS32_FPU_REG_16SP_8DP;
  else if (strcmp (str, "0") == 0)
    nds32_freg = E_NDS32_FPU_REG_8SP_4DP;
  else
    {
      /* Logic here rejects the input FPU configuration.  */
      as_bad (_("unknown FPU configuration `%s'\n"), str);
      return 0;
    }

  return 1;
}

/* This function parse "abi=" specified.  */

static int
nds32_parse_abi (const char *str)
{
  if (strcmp (str, "v2") == 0)
    nds32_abi = E_NDS_ABI_AABI;
  /* Obsolete.  */
  else if (strcmp (str, "v2fp") == 0)
    nds32_abi = E_NDS_ABI_V2FP;
  else if (strcmp (str, "v1") == 0)
    nds32_abi = E_NDS_ABI_V1;
  else if (strcmp (str,"v2fpp") == 0)
    nds32_abi = E_NDS_ABI_V2FP_PLUS;
  else
    {
      /* Logic here rejects the input abi version.  */
      as_bad (_("unknown ABI version`%s'\n"), str);
      return 0;
    }

  return 1;
}

/* This function turn on all extensions and instructions support.  */

static int
nds32_all_ext (void)
{
  nds32_mac = 1;
  nds32_div = 1;
  nds32_dx_regs = 1;
  nds32_16bit_ext = 1;
  nds32_perf_ext = 1;
  nds32_perf_ext2 = 1;
  nds32_string_ext = 1;
  nds32_audio_ext = 1;
  nds32_fpu_fma = 1;
  nds32_fpu_sp_ext = 1;
  nds32_fpu_dp_ext = 1;
  nds32_dsp_ext = 1;
  nds32_zol_ext = 1;
  /* Turn off reduced register.  */
  nds32_gpr16 = 0;

  return 1;
}

/* GAS will call md_parse_option whenever getopt returns an unrecognized code,
   presumably indicating a special code value which appears in md_longopts.
   This function should return non-zero if it handled the option and zero
   otherwise.  There is no need to print a message about an option not being
   recognized.  This will be handled by the generic code.  */

int
nds32_parse_option (int c, const char *arg)
{
  struct nds32_parse_option_table *coarse_tune;
  struct nds32_set_option_table *fine_tune;
  const char *ptr_arg = NULL;

  switch (c)
    {
    case OPTION_OPTIMIZE:
      optimize = 1;
      optimize_for_space = 0;
      break;
    case OPTION_OPTIMIZE_SPACE:
      optimize = 0;
      optimize_for_space = 1;
      break;
    case OPTION_BIG:
      target_big_endian = 1;
      break;
    case OPTION_LITTLE:
      target_big_endian = 0;
      break;
    case OPTION_TURBO:
      nds32_all_ext ();
      break;
    case OPTION_PIC:
      nds32_pic = 1;
      break;
    case OPTION_RELAX_FP_AS_GP_OFF:
      nds32_relax_fp_as_gp = 0;
      break;
    case OPTION_RELAX_B2BB_ON:
      nds32_relax_b2bb = 1;
      break;
    case OPTION_RELAX_ALL_OFF:
      nds32_relax_all = 0;
      break;
    default:
      /* Determination of which option table to search for to save time.  */
      if (!arg)
	return 0;

      ptr_arg = strchr (arg, '=');

      if (ptr_arg)
	{
	  /* Find the value after '='.  */
	  if (ptr_arg != NULL)
	    ptr_arg++;
	  for (coarse_tune = parse_opts; coarse_tune->name != NULL; coarse_tune++)
	    {
	      if (strncmp (arg, coarse_tune->name, (ptr_arg - arg)) == 0)
		{
		  coarse_tune->func (ptr_arg);
		  return 1;
		}
	    }
	}
      else
	{
	  int disable = 0;

	  /* Filter out the Disable option first.  */
	  if (startswith (arg, "no-"))
	    {
	      disable = 1;
	      arg += 3;
	    }

	  for (fine_tune = toggle_opts; fine_tune->name != NULL; fine_tune++)
	    {
	      if (strcmp (arg, fine_tune->name) == 0)
		{
		  if (fine_tune->var != NULL)
		    *fine_tune->var = (disable) ? 0 : 1;
		  return 1;
		}
	    }
	}
      /* Nothing match.  */
      return 0;
    }

  return 1;
}

/* tc_check_label  */

void
nds32_check_label (symbolS *label ATTRIBUTE_UNUSED)
{
  /* The code used to create BB is move to frob_label.
     They should go there.  */
}

static void
set_endian_little (int on)
{
  target_big_endian = !on;
}

/* These functions toggles the generation of 16-bit.  First encounter signals
   the beginning of not generating 16-bit instructions and next encounter
   signals the restoring back to default behavior.  */

static void
trigger_16bit (int trigger)
{
  enable_16bit = trigger;
}

static int backup_16bit_mode;
static void
restore_16bit (int no_use ATTRIBUTE_UNUSED)
{
  enable_16bit = backup_16bit_mode;
}

static void
off_16bit (int no_use ATTRIBUTE_UNUSED)
{
  backup_16bit_mode = enable_16bit;
  enable_16bit = 0;
}

/* Built-in segments for small object.  */
typedef struct nds32_seg_entryT
{
  segT s;
  const char *name;
  flagword flags;
} nds32_seg_entry;

nds32_seg_entry nds32_seg_table[] =
{
  {NULL, ".sdata_f", SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
		     | SEC_HAS_CONTENTS | SEC_SMALL_DATA},
  {NULL, ".sdata_b", SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
		     | SEC_HAS_CONTENTS | SEC_SMALL_DATA},
  {NULL, ".sdata_h", SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
		     | SEC_HAS_CONTENTS | SEC_SMALL_DATA},
  {NULL, ".sdata_w", SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
		     | SEC_HAS_CONTENTS | SEC_SMALL_DATA},
  {NULL, ".sdata_d", SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
		     | SEC_HAS_CONTENTS | SEC_SMALL_DATA},
  {NULL, ".sbss_f", SEC_ALLOC | SEC_SMALL_DATA},
  {NULL, ".sbss_b", SEC_ALLOC | SEC_SMALL_DATA},
  {NULL, ".sbss_h", SEC_ALLOC | SEC_SMALL_DATA},
  {NULL, ".sbss_w", SEC_ALLOC | SEC_SMALL_DATA},
  {NULL, ".sbss_d", SEC_ALLOC | SEC_SMALL_DATA}
};

/* Indexes to nds32_seg_table[].  */
enum NDS32_SECTIONS_ENUM
{
  SDATA_F_SECTION = 0,
  SDATA_B_SECTION = 1,
  SDATA_H_SECTION = 2,
  SDATA_W_SECTION = 3,
  SDATA_D_SECTION = 4,
  SBSS_F_SECTION = 5,
  SBSS_B_SECTION = 6,
  SBSS_H_SECTION = 7,
  SBSS_W_SECTION = 8,
  SBSS_D_SECTION = 9
};

/* The following code is borrowed from v850_seg.  Revise this is needed.  */

static void
do_nds32_seg (int i, subsegT sub)
{
  nds32_seg_entry *seg = nds32_seg_table + i;

  obj_elf_section_change_hook ();

  if (seg->s != NULL)
    subseg_set (seg->s, sub);
  else
    {
      seg->s = subseg_new (seg->name, sub);
      if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
	{
	  bfd_set_section_flags (seg->s, seg->flags);
	  if ((seg->flags & SEC_LOAD) == 0)
	    seg_info (seg->s)->bss = 1;
	}
    }
}

static void
nds32_seg (int i)
{
  subsegT sub = get_absolute_expression ();

  do_nds32_seg (i, sub);
  demand_empty_rest_of_line ();
}

/* Set if label adjustment is needed.  I should not adjust .xbyte in dwarf.  */
static symbolS *nds32_last_label;	/* Last label for alignment.  */

static void
add_mapping_symbol_for_align (int shift, valueT addr, int is_data_align)
{
  if ((shift > 1) && (addr & 1))
    {
      int n = (1 << shift) - 1;
      if (!is_data_align)
	add_mapping_symbol (MAP_CODE, 1, 0);
      else if ((int) (addr & n) != n)
	add_mapping_symbol (MAP_CODE, 1, 0);
    }
  else if ((shift > 1) && ((int) (addr & 1) == 0))
    add_mapping_symbol (MAP_CODE, 0, 0);
}

/* This code is referred from D30V for adjust label to be with pending
   alignment.  For example,
     LBYTE: .byte	0x12
     LHALF: .half	0x12
     LWORD: .word	0x12
   Without this, the above label will not attach to incoming data.  */

static void
nds32_adjust_label (int n)
{
  /* FIXME: I think adjust label and alignment is
     the programmer's obligation.  Sadly, VLSI team doesn't
     properly use .align for their test cases.
     So I re-implement cons_align and auto adjust labels, again.

     I think d30v's implementation is simple and good enough.  */

  symbolS *label = nds32_last_label;
  nds32_last_label = NULL;

  /* SEC_ALLOC is used to eliminate .debug_ sections.
     SEC_CODE is used to include section for ILM.  */
  if (((now_seg->flags & SEC_ALLOC) == 0 && (now_seg->flags & SEC_CODE) == 0)
      || strcmp (now_seg->name, ".eh_frame") == 0
      || strcmp (now_seg->name, ".gcc_except_table") == 0)
    return;

  /* Only frag by alignment when needed.
     Otherwise, it will fail to optimize labels on 4-byte boundary.  (bug8454)
     See md_convert_frag () and RELAX_SET_RELAXABLE (frag) for details.  */
  if (frag_now_fix () & (((addressT) 1 << n) - 1))
    {
      if (subseg_text_p (now_seg))
	{
	  add_mapping_symbol_for_align (n, frag_now_fix (), 1);
	  frag_align_code (n, 0);
	}
      else
	frag_align (n, 0, 0);

      /* Record the minimum alignment for this segment.  */
      record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
    }

  if (label != NULL)
    {
      symbolS *sym;
      int label_seen = false;
      struct frag *old_frag;
      valueT old_value, new_value;

      gas_assert (S_GET_SEGMENT (label) == now_seg);

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

      /* Multiple labels may be on the same address.  And the last symbol
	 may not be a label at all, e.g., register name, external function names,
	 so I have to track the last label in tc_frob_label instead of
	 just using symbol_lastP.  */
      for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
	{
	  if (symbol_get_frag (sym) == old_frag
	      && S_GET_VALUE (sym) == old_value)
	    {
	      /* Warning HERE! */
	      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;
	}
    }
}

void
nds32_cons_align (int size ATTRIBUTE_UNUSED)
{
  /* Do nothing here.
     This is called before `md_flush_pending_output' is called by `cons'.

     There are two things should be done for auto-adjust-label.
     1. Align data/instructions and adjust label to be attached to them.
     2. Clear auto-adjust state, so incoming data/instructions will not
	adjust the label.

     For example,
	  .byte 0x1
	.L0:
	  .word 0x2
	  .word 0x3
     in this case, '.word 0x2' will adjust the label, .L0, but '.word 0x3' should not.

     I think `md_flush_pending_output' is a good place to clear the auto-adjust state,
     but it is also called by `cons' before this function.
     To simplify the code, instead of overriding .zero, .fill, .space, etc,
     I think we should just adjust label in `nds32_aligned_X_cons' instead of here.  */
}

static void
make_mapping_symbol (enum mstate state, valueT value, fragS * frag, unsigned int align)
{
  symbolS *symbol_p = NULL;
  const char *symbol_name = NULL;
  switch (state)
    {
    case MAP_DATA:
      if (align == 0)
	symbol_name = "$d0";
      else if (align == 1)
	symbol_name = "$d1";
      else if (align == 2)
	symbol_name = "$d2";
      else if (align == 3)
	symbol_name = "$d3";
      else if (align == 4)
	symbol_name = "$d4";
      break;
    case MAP_CODE:
      symbol_name = "$c";
      break;
    default:
      abort ();
    }

  symbol_p = symbol_new (symbol_name, now_seg, frag, value);
  /* local scope attribute  */
  symbol_get_bfdsym (symbol_p)->flags |= BSF_NO_FLAGS | BSF_LOCAL;
}

static void
add_mapping_symbol (enum mstate state, unsigned int padding_byte,
		    unsigned int align)
{
  enum mstate current_mapping_state =
    seg_info (now_seg)->tc_segment_info_data.mapstate;

  if (state == MAP_CODE
      && current_mapping_state == state)
    return;

  if (!SEG_NORMAL (now_seg)
      || !subseg_text_p (now_seg))
    return;

  /* start adding mapping symbol  */
  seg_info (now_seg)->tc_segment_info_data.mapstate = state;
  make_mapping_symbol (state, frag_now_fix () + padding_byte,
		       frag_now, align);
}

static void
nds32_aligned_cons (int idx)
{
  nds32_adjust_label (idx);
  add_mapping_symbol (MAP_DATA, 0, idx);
  /* Call default handler.  */
  cons (1 << idx);
  if (now_seg->flags & SEC_CODE
      && now_seg->flags & SEC_ALLOC && now_seg->flags & SEC_RELOC)
    {
      /* Use BFD_RELOC_NDS32_DATA to avoid linker
	 optimization replacing data.  */
      expressionS exp;

      exp.X_add_number = 0;
      exp.X_op = O_constant;
      fix_new_exp (frag_now, frag_now_fix () - (1 << idx), 1 << idx,
		   &exp, 0, BFD_RELOC_NDS32_DATA);
    }
}

/* `.double' directive.  */

static void
nds32_aligned_float_cons (int type)
{
  switch (type)
    {
    case 'f':
    case 'F':
    case 's':
    case 'S':
      nds32_adjust_label (2);
      break;
    case 'd':
    case 'D':
    case 'r':
    case 'R':
      nds32_adjust_label (4);
      break;
    default:
      as_bad ("Unrecognized float type, %c\n", (char)type);
    }
  /* Call default handler.  */
  float_cons (type);
}

static void
nds32_enable_pic (int ignore ATTRIBUTE_UNUSED)
{
  /* Another way to do -mpic.
     This is for GCC internal use and should always be first line
     of code, otherwise, the effect is not determined.  */
  nds32_pic = 1;
}

static void
nds32_set_abi (int ver)
{
  nds32_abi = ver;
}

/* Relax directive to set relocation R_NDS32_RELAX_ENTRY value.  */

static void
nds32_relax_relocs (int relax)
{
  char saved_char;
  char *name;
  int i;
  const char *subtype_relax[] =
    {"", "",};

  name = input_line_pointer;
  while (!is_end_of_stmt (*input_line_pointer)
	 && !is_whitespace (*input_line_pointer))
    input_line_pointer++;
  saved_char = *input_line_pointer;
  *input_line_pointer = 0;

  for (i = 0; i < (int) ARRAY_SIZE (subtype_relax); i++)
    {
      if (strcmp (name, subtype_relax[i]) == 0)
	{
	  switch (i)
	    {
	    case 0:
	    case 1:
	      enable_relax_relocs = relax & enable_relax_relocs;
	      break;
	    default:
	      break;
	    }
	  break;
	}
    }
  *input_line_pointer = saved_char;
  ignore_rest_of_line ();
}

/* Record which arguments register($r0 ~ $r5) is not used in callee.
   bit[i] for $ri  */

static void
nds32_set_hint_func_args (int ignore ATTRIBUTE_UNUSED)
{
  ignore_rest_of_line ();
}

/* Insert relocations to mark the begin and end of a fp-omitted function,
   for further relaxation use.
   bit[i] for $ri  */

static void
nds32_omit_fp_begin (int mode)
{
  expressionS exp;

  if (nds32_relax_fp_as_gp == 0)
    return;
  exp.X_op = O_symbol;
  exp.X_add_symbol = abs_section_sym;
  if (mode == 1)
    {
      in_omit_fp = 1;
      exp.X_add_number = R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
      fix_new_exp (frag_now, frag_now_fix (), 0, &exp, 0,
		   BFD_RELOC_NDS32_RELAX_REGION_BEGIN);
    }
  else
    {
      in_omit_fp = 0;
      exp.X_add_number = R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
      fix_new_exp (frag_now, frag_now_fix (), 0, &exp, 0,
		   BFD_RELOC_NDS32_RELAX_REGION_END);
    }
}

static void
nds32_loop_begin (int mode)
{
  /* Insert loop region relocation here.  */
  expressionS exp;

  exp.X_op = O_symbol;
  exp.X_add_symbol = abs_section_sym;
  if (mode == 1)
    {
      exp.X_add_number = R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG;
      fix_new_exp (frag_now, frag_now_fix (), 0, &exp, 0,
		   BFD_RELOC_NDS32_RELAX_REGION_BEGIN);
    }
  else
    {
      exp.X_add_number = R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG;
      fix_new_exp (frag_now, frag_now_fix (), 0, &exp, 0,
		   BFD_RELOC_NDS32_RELAX_REGION_END);
    }
}

struct nds32_relocs_group
{
  struct nds32_relocs_pattern *pattern;
  struct nds32_relocs_group *next;
};

static struct nds32_relocs_group *nds32_relax_hint_current = NULL;
/* Used to reorder the id for ".relax_hint id".  */
static int relax_hint_bias = 0;
/* Record current relax hint id.  */
static int relax_hint_id_current = -1;
int reset_bias = 0;
/* If ".relax_hint begin" is triggered?  */
int relax_hint_begin = 0;

/* Record the reordered relax hint id.  */

struct relax_hint_id
{
  int old_id;
  int new_id;
  struct relax_hint_id *next;
};

/* FIXME: Need to find somewhere to free the list.  */
struct relax_hint_id *record_id_head = NULL;

/* Is the buffer large enough?  */
#define MAX_BUFFER 12

static char *
nds_itoa (int n)
{
  char *buf = xmalloc (MAX_BUFFER * sizeof (char));
  snprintf (buf, MAX_BUFFER, "%d", n);
  return buf;
}

/* Insert a relax hint.  */

static void
nds32_relax_hint (int mode ATTRIBUTE_UNUSED)
{
  char *name = NULL;
  char saved_char;
  struct nds32_relocs_pattern *relocs = NULL;
  struct nds32_relocs_group *group, *new;
  struct relax_hint_id *record_id;

  name = input_line_pointer;
  while (!is_end_of_stmt (*input_line_pointer)
	 && !is_whitespace (*input_line_pointer))
    input_line_pointer++;
  saved_char = *input_line_pointer;
  *input_line_pointer = 0;
  name = strdup (name);

  if (name && strcmp (name, "begin") == 0)
    {
      if (relax_hint_id_current == -1)
	reset_bias = 1;
      relax_hint_bias++;
      relax_hint_id_current++;
      relax_hint_begin = 1;
    }

  /* Original case ".relax_hint id".  It's id may need to be reordered. */
  if (!relax_hint_begin)
    {
      int tmp = strtol (name, NULL, 10);
      record_id = record_id_head;
      while (record_id)
	{
	  if (record_id->old_id == tmp)
	    {
	      name = nds_itoa (record_id->new_id);
	      goto reordered_id;
	    }
	  record_id = record_id->next;
	}
      if (reset_bias)
	{
	  relax_hint_bias = relax_hint_id_current - atoi (name) + 1;
	  reset_bias = 0;
	}
      relax_hint_id_current = tmp + relax_hint_bias;

      /* Insert the element to the head of the link list.  */
      struct relax_hint_id *tmp_id = malloc (sizeof (struct relax_hint_id));
      tmp_id->old_id = tmp;
      tmp_id->new_id = relax_hint_id_current;
      tmp_id->next = record_id_head;
      record_id_head = tmp_id;
    }

  if (name && strcmp (name, "end") == 0)
    relax_hint_begin = 0;
  name = nds_itoa (relax_hint_id_current);

 reordered_id:

  /* Find relax hint entry for next instruction, and all member will be
     initialized at that time.  */
  relocs = str_hash_find (nds32_hint_hash, name);
  if (relocs == NULL)
    {
      relocs = notes_calloc (1, sizeof (*relocs));
      str_hash_insert (nds32_hint_hash, name, relocs, 0);
    }
  else
    {
      while (relocs->next)
	relocs = relocs->next;
      relocs->next = notes_calloc (1, sizeof (*relocs));
      relocs = relocs->next;
    }

  *input_line_pointer = saved_char;
  ignore_rest_of_line ();

  /* Get the final one of relax hint series.  */

  /* It has to build this list because there are maybe more than one
     instructions relative to the same instruction.  It to connect to
     next instruction after md_assemble.  */
  new = XNEW (struct nds32_relocs_group);
  memset (new, 0, sizeof (struct nds32_relocs_group));
  new->pattern = relocs;
  new->next = NULL;
  group = nds32_relax_hint_current;
  if (!group)
    nds32_relax_hint_current = new;
  else
    {
      while (group->next != NULL)
	group = group->next;
      group->next = new;
    }
  relaxing = true;
}

/* Decide the size of vector entries, only accepts 4 or 16 now.  */

static void
nds32_vec_size (int ignore ATTRIBUTE_UNUSED)
{
  expressionS exp;

  expression (&exp);

  if (exp.X_op == O_constant)
    {
      if (exp.X_add_number == 4 || exp.X_add_number == 16)
	{
	  if (vec_size == 0)
	    vec_size = exp.X_add_number;
	  else if (vec_size != exp.X_add_number)
	    as_warn (_("Different arguments of .vec_size are found, "
		       "previous %d, current %d"),
		     (int) vec_size, (int) exp.X_add_number);
	}
      else
	as_warn (_("Argument of .vec_size is expected 4 or 16, actual: %d."),
		 (int) exp.X_add_number);
    }
  else
    as_warn (_("Argument of .vec_size is not a constant."));
}

/* The behavior of ".flag" directive varies depending on the target.
   In nds32 target, we use it to recognize whether this assembly content is
   generated by compiler.  Other features can also be added in this function
   in the future.  */

static void
nds32_flag (int ignore ATTRIBUTE_UNUSED)
{
  char *name;
  char saved_char;
  int i;
  const char *possible_flags[] = { "verbatim" };

  /* Skip whitespaces.  */
  name = input_line_pointer;
  while (!is_end_of_stmt (*input_line_pointer)
	 && !is_whitespace (*input_line_pointer))
    input_line_pointer++;
  saved_char = *input_line_pointer;
  *input_line_pointer = 0;

  for (i = 0; i < (int) ARRAY_SIZE (possible_flags); i++)
    {
      if (strcmp (name, possible_flags[i]) == 0)
	{
	  switch (i)
	    {
	    case 0:
	      /* flag: verbatim */
	      verbatim = 1;
	      break;
	    default:
	      break;
	    }
	  /* Already found the flag, no need to continue next loop.   */
	  break;
	}
    }

  *input_line_pointer = saved_char;
  ignore_rest_of_line ();
}

static void
ict_model (int ignore ATTRIBUTE_UNUSED)
{
  char *name;
  char saved_char;
  int i;
  const char *possible_flags[] = { "small", "large" };

  /* Skip whitespaces.  */
  name = input_line_pointer;
  while (!is_end_of_stmt (*input_line_pointer)
	 && !is_whitespace (*input_line_pointer))
    input_line_pointer++;
  saved_char = *input_line_pointer;
  *input_line_pointer = 0;

  for (i = 0; i < (int) ARRAY_SIZE (possible_flags); i++)
    {
      if (strcmp (name, possible_flags[i]) == 0)
	{
	  switch (i)
	    {
	    case 0:
	      /* flag: verbatim  */
	      ict_flag = ICT_SMALL;
	      break;
	    case 1:
	      ict_flag = ICT_LARGE;
	      break;
	    default:
	      break;
	    }
	  /* Already found the flag, no need to continue next loop.   */
	  break;
	}
    }

  *input_line_pointer = saved_char;
  ignore_rest_of_line ();
}

static void
nds32_n12hc (int ignore ATTRIBUTE_UNUSED)
{
  /* N1213HC core is used.  */
}


/* The target specific pseudo-ops which we support.  */
const pseudo_typeS md_pseudo_table[] =
{
  /* Forced alignment if declared these ways.  */
  {"ascii", stringer, 8 + 0},
  {"asciz", stringer, 8 + 1},
  {"double", nds32_aligned_float_cons, 'd'},
  {"dword", nds32_aligned_cons, 3},
  {"float", nds32_aligned_float_cons, 'f'},
  {"half", nds32_aligned_cons, 1},
  {"hword", nds32_aligned_cons, 1},
  {"int", nds32_aligned_cons, 2},
  {"long", nds32_aligned_cons, 2},
  {"octa", nds32_aligned_cons, 4},
  {"quad", nds32_aligned_cons, 3},
  {"qword", nds32_aligned_cons, 4},
  {"short", nds32_aligned_cons, 1},
  {"byte", nds32_aligned_cons, 0},
  {"single", nds32_aligned_float_cons, 'f'},
  {"string", stringer, 8 + 1},
  {"word", nds32_aligned_cons, 2},

  {"little", set_endian_little, 1},
  {"big", set_endian_little, 0},
  {"16bit_on", trigger_16bit, 1},
  {"16bit_off", trigger_16bit, 0},
  {"restore_16bit", restore_16bit, 0},
  {"off_16bit", off_16bit, 0},

  {"sdata_d", nds32_seg, SDATA_D_SECTION},
  {"sdata_w", nds32_seg, SDATA_W_SECTION},
  {"sdata_h", nds32_seg, SDATA_H_SECTION},
  {"sdata_b", nds32_seg, SDATA_B_SECTION},
  {"sdata_f", nds32_seg, SDATA_F_SECTION},

  {"sbss_d", nds32_seg, SBSS_D_SECTION},
  {"sbss_w", nds32_seg, SBSS_W_SECTION},
  {"sbss_h", nds32_seg, SBSS_H_SECTION},
  {"sbss_b", nds32_seg, SBSS_B_SECTION},
  {"sbss_f", nds32_seg, SBSS_F_SECTION},

  {"pic", nds32_enable_pic, 0},
  {"n12_hc", nds32_n12hc, 0},
  {"abi_1", nds32_set_abi, E_NDS_ABI_V1},
  {"abi_2", nds32_set_abi, E_NDS_ABI_AABI},
  /* Obsolete.  */
  {"abi_2fp", nds32_set_abi, E_NDS_ABI_V2FP},
  {"abi_2fp_plus", nds32_set_abi, E_NDS_ABI_V2FP_PLUS},
  {"relax", nds32_relax_relocs, 1},
  {"no_relax", nds32_relax_relocs, 0},
  {"hint_func_args", nds32_set_hint_func_args, 0}, /* Abandon??  */
  {"omit_fp_begin", nds32_omit_fp_begin, 1},
  {"omit_fp_end", nds32_omit_fp_begin, 0},
  {"vec_size", nds32_vec_size, 0},
  {"flag", nds32_flag, 0},
  {"innermost_loop_begin", nds32_loop_begin, 1},
  {"innermost_loop_end", nds32_loop_begin, 0},
  {"relax_hint", nds32_relax_hint, 0},
  {"ict_model", ict_model, 0},
  {NULL, NULL, 0}
};

void
nds32_pre_do_align (int n, char *fill, int len, int max)
{
  /* Only make a frag if we HAVE to...  */
  fragS *fragP;
  if (n != 0 && !need_pass_2)
    {
      if (fill == NULL)
	{
	  if (subseg_text_p (now_seg))
	    {
	      dwarf2_emit_insn (0);
	      fragP = frag_now;
	      add_mapping_symbol_for_align (n, frag_now_fix (), 0);
	      frag_align_code (n, max);

	      /* Tag this alignment when there is a label before it.  */
	      if (label_exist)
		{
		  fragP->tc_frag_data.flag = NDS32_FRAG_LABEL;
		  label_exist = 0;
		}
	    }
	  else
	    frag_align (n, 0, max);
	}
      else if (len <= 1)
	frag_align (n, *fill, max);
      else
	frag_align_pattern (n, fill, len, max);
    }
}

void
nds32_do_align (int n)
{
  /* Optimize for space and label exists.  */
  expressionS exp;

  /* FIXME:I think this will break debug info sections and except_table.  */
  if (!enable_relax_relocs || !subseg_text_p (now_seg))
    return;

  /* Create and attach a BFD_RELOC_NDS32_LABEL fixup
     the size of instruction may not be correct because
     it could be relaxable.  */
  exp.X_op = O_symbol;
  exp.X_add_symbol = section_symbol (now_seg);
  exp.X_add_number = n;
  fix_new_exp (frag_now,
	       frag_now_fix (), 0, &exp, 0, BFD_RELOC_NDS32_LABEL);
}

/* Supported Andes machines.  */
struct nds32_machs
{
  enum bfd_architecture bfd_mach;
  int mach_flags;
};

/* This is the callback for nds32-asm.c to parse operands.  */

int
nds32_asm_parse_operand (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
			 struct nds32_asm_insn *pinsn,
			 char **pstr, int64_t *value)
{
  char *hold;
  expressionS *pexp = pinsn->info;

  hold = input_line_pointer;
  input_line_pointer = *pstr;
  expression (pexp);
  resolve_register (pexp);
  *pstr = input_line_pointer;
  input_line_pointer = hold;

  switch (pexp->X_op)
    {
    case O_symbol:
      *value = 0;
      return NASM_R_SYMBOL;
    case O_constant:
      *value = pexp->X_add_number;
      return NASM_R_CONST;
    case O_illegal:
    case O_absent:
    case O_register:
    default:
      return NASM_R_ILLEGAL;
    }
}

/* GAS will call this function at the start of the assembly, after the command
   line arguments have been parsed and all the machine independent
   initializations have been completed.  */

void
md_begin (void)
{
  const struct nds32_keyword *k;
  relax_info_t *relax_info;
  int flags = 0;

  bfd_set_arch_mach (stdoutput, TARGET_ARCH, nds32_baseline);

  nds32_init_nds32_pseudo_opcodes ();
  asm_desc.parse_operand = nds32_asm_parse_operand;
  if (nds32_gpr16)
    flags |= NASM_OPEN_REDUCED_REG;
  nds32_asm_init (&asm_desc, flags);

  /* Initial general purpose registers hash table.  */
  nds32_gprs_hash = str_htab_create ();
  for (k = nds32_keyword_gpr; k->name; k++)
    str_hash_insert (nds32_gprs_hash, k->name, k, 0);

  /* Initial branch hash table.  */
  nds32_relax_info_hash = str_htab_create ();
  for (relax_info = relax_table; relax_info->opcode; relax_info++)
    str_hash_insert (nds32_relax_info_hash, relax_info->opcode, relax_info, 0);

  /* Initial relax hint hash table.  */
  nds32_hint_hash = str_htab_create ();
  enable_16bit = nds32_16bit_ext;
}

/* HANDLE_ALIGN in write.c.  */

void
nds32_handle_align (fragS *fragp)
{
  static const unsigned char nop16[] = { 0x92, 0x00 };
  static const unsigned char nop32[] = { 0x40, 0x00, 0x00, 0x09 };

  if (fragp->fr_type != rs_align_code)
    return;

  int bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
  char *p = fragp->fr_literal + fragp->fr_fix;
  int fix = bytes & 1;

  if (fix != 0)
    {
      *p++ = 0;
      bytes--;
    }

  if (bytes & 2)
    {
      expressionS exp_t;
      exp_t.X_op = O_symbol;
      exp_t.X_add_symbol = abs_section_sym;
      exp_t.X_add_number = R_NDS32_INSN16_CONVERT_FLAG;
      fix_new_exp (fragp, fragp->fr_fix, 2, &exp_t, 0,
		   BFD_RELOC_NDS32_INSN16);
      memcpy (p, nop16, 2);
      p += 2;
      bytes -= 2;
      fix += 2;
    }
  fragp->fr_fix += fix;

  if (bytes != 0)
    {
      fragp->fr_var = 4;
      memcpy (p, nop32, 4);
    }
}

/* md_flush_pending_output  */

void
nds32_flush_pending_output (void)
{
  nds32_last_label = NULL;
}

void
nds32_frob_label (symbolS *label)
{
  dwarf2_emit_label (label);
}

/* TC_START_LABEL  */

int
nds32_start_label (int asmdone ATTRIBUTE_UNUSED, int secdone ATTRIBUTE_UNUSED)
{
  if (optimize && subseg_text_p (now_seg))
    label_exist = 1;
  return 1;
}

/* TARGET_FORMAT  */

const char *
nds32_target_format (void)
{
#ifdef TE_LINUX
  if (target_big_endian)
    return "elf32-nds32be-linux";
  else
    return "elf32-nds32le-linux";
#else
  if (target_big_endian)
    return "elf32-nds32be";
  else
    return "elf32-nds32le";
#endif
}

static enum nds32_br_range
get_range_type (const struct nds32_field *field)
{
  gas_assert (field != NULL);

  if (field->bitpos != 0)
    return BR_RANGE_U4G;

  if (field->bitsize == 24 && field->shift == 1)
    return BR_RANGE_S16M;
  else if (field->bitsize == 16 && field->shift == 1)
    return BR_RANGE_S64K;
  else if (field->bitsize == 14 && field->shift == 1)
    return BR_RANGE_S16K;
  else if (field->bitsize == 8 && field->shift == 1)
    return BR_RANGE_S256;
  else
    return BR_RANGE_U4G;
}

/* Save pseudo instruction relocation list.  */

static struct nds32_relocs_pattern*
nds32_elf_save_pseudo_pattern (fixS* fixP, struct nds32_asm_insn *insn,
			       char *out, symbolS *sym,
			       struct nds32_relocs_pattern *reloc_ptr,
			       fragS *fragP)
{
  struct nds32_opcode *opcode = insn->opcode;
  if (!reloc_ptr)
    reloc_ptr = XNEW (struct nds32_relocs_pattern);
  reloc_ptr->seg = now_seg;
  reloc_ptr->sym = sym;
  reloc_ptr->frag = fragP;
  reloc_ptr->frchain = frchain_now;
  reloc_ptr->fixP = fixP;
  reloc_ptr->opcode = opcode;
  reloc_ptr->where = out;
  reloc_ptr->insn = insn->insn;
  reloc_ptr->next = NULL;
  return reloc_ptr;
}

/* Check X_md to transform relocation.  */

static fixS*
nds32_elf_record_fixup_exp (fragS *fragP, const char *str,
			    const struct nds32_field *fld,
			    expressionS *pexp, char* out,
			    struct nds32_asm_insn *insn)
{
  int reloc = -1;
  expressionS exp;
  fixS *fixP = NULL;

  /* Handle instruction relocation.  */
  if (fld && fld->bitpos == 0 && (insn->attr & NASM_ATTR_HI20))
    {
      /* Relocation for hi20 modifier.  */
      switch (pexp->X_md)
	{
	case BFD_RELOC_NDS32_GOTOFF:	/* @GOTOFF */
	  reloc = BFD_RELOC_NDS32_GOTOFF_HI20;
	  break;
	case BFD_RELOC_NDS32_GOT20:	/* @GOT */
	  reloc = BFD_RELOC_NDS32_GOT_HI20;
	  break;
	case BFD_RELOC_NDS32_25_PLTREL:	/* @PLT */
	  if (!nds32_pic)
	    as_bad (_("Invalid PIC expression."));
	  else
	    reloc = BFD_RELOC_NDS32_PLT_GOTREL_HI20;
	  break;
	case BFD_RELOC_NDS32_GOTPC20:	/* _GLOBAL_OFFSET_TABLE_ */
	  reloc = BFD_RELOC_NDS32_GOTPC_HI20;
	  break;
	case BFD_RELOC_NDS32_TPOFF:	/* @TPOFF */
	  reloc = BFD_RELOC_NDS32_TLS_LE_HI20;
	  break;
	case BFD_RELOC_NDS32_GOTTPOFF:	/* @GOTTPOFF */
	  reloc = nds32_pic ? BFD_RELOC_NDS32_TLS_IEGP_HI20 : BFD_RELOC_NDS32_TLS_IE_HI20;
	  break;
	case BFD_RELOC_NDS32_TLS_DESC:	/* @TLSDESC */
	  reloc = BFD_RELOC_NDS32_TLS_DESC_HI20;
	  break;
	default:	/* No suffix */
	  if (nds32_pic)
	    /* When the file is pic, the address must be offset to gp.
	       It may define another relocation or use GOTOFF.  */
	    reloc = BFD_RELOC_NDS32_PLT_GOTREL_HI20;
	  else
	    reloc = BFD_RELOC_NDS32_HI20;
	  break;
	}
      fixP = fix_new_exp (fragP, out - fragP->fr_literal, insn->opcode->isize,
			  insn->info, 0 /* pcrel */, reloc);
    }
  else if (fld && fld->bitpos == 0 && (insn->attr & NASM_ATTR_LO12))
    {
      /* Relocation for lo12 modifier.  */
      if (fld->bitsize == 15 && fld->shift == 0)
	{
	  /* [ls]bi || ori */
	  switch (pexp->X_md)
	    {
	    case BFD_RELOC_NDS32_GOTOFF:	/* @GOTOFF */
	      reloc = BFD_RELOC_NDS32_GOTOFF_LO12;
	      break;
	    case BFD_RELOC_NDS32_GOT20:		/* @GOT */
	      reloc = BFD_RELOC_NDS32_GOT_LO12;
	      break;
	    case BFD_RELOC_NDS32_25_PLTREL:	/* @PLT */
	      if (!nds32_pic)
		as_bad (_("Invalid PIC expression."));
	      else
		reloc = BFD_RELOC_NDS32_PLT_GOTREL_LO12;
	      break;
	    case BFD_RELOC_NDS32_GOTPC20:	/* _GLOBAL_OFFSET_TABLE_ */
	      reloc = BFD_RELOC_NDS32_GOTPC_LO12;
	      break;
	    case BFD_RELOC_NDS32_TPOFF:		/* @TPOFF */
	      reloc = BFD_RELOC_NDS32_TLS_LE_LO12;
	      break;
	    case BFD_RELOC_NDS32_GOTTPOFF:	/* @GOTTPOFF */
	      reloc = nds32_pic ? BFD_RELOC_NDS32_TLS_IEGP_LO12 : BFD_RELOC_NDS32_TLS_IE_LO12;
	      break;
	    case BFD_RELOC_NDS32_TLS_DESC:	/* @TLSDESC */
	      reloc = BFD_RELOC_NDS32_TLS_DESC_LO12;
	      break;
	    default:	/* No suffix */
	      if (nds32_pic)
		/* When the file is pic, the address must be offset to gp.
		   It may define another relocation or use GOTOFF.  */
		reloc = BFD_RELOC_NDS32_PLT_GOTREL_LO12;
	      else
		reloc = BFD_RELOC_NDS32_LO12S0;
	      break;
	    }
	}
      else if (fld->bitsize == 15 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_LO12S1;		/* [ls]hi */
      else if (fld->bitsize == 15 && fld->shift == 2)
	{
	  /* [ls]wi */
	  switch (pexp->X_md)
	    {
	    case BFD_RELOC_NDS32_GOTTPOFF:	/* @GOTTPOFF */
	      reloc = nds32_pic ? BFD_RELOC_NDS32_TLS_IEGP_LO12S2 : BFD_RELOC_NDS32_TLS_IE_LO12S2;
	      break;
	    default:	/* No suffix */
	      reloc = BFD_RELOC_NDS32_LO12S2;
	      break;
	    }
	}
      else if (fld->bitsize == 15 && fld->shift == 3)
	reloc = BFD_RELOC_NDS32_LO12S3;		/* [ls]di */
      else if (fld->bitsize == 12 && fld->shift == 2)
	reloc = BFD_RELOC_NDS32_LO12S2_SP;	/* f[ls][sd]i */

      fixP = fix_new_exp (fragP, out - fragP->fr_literal, insn->opcode->isize,
			  insn->info, 0 /* pcrel */, reloc);
    }
  else if (fld && fld->bitpos == 0 && insn->opcode->isize == 4
	   && (insn->attr & NASM_ATTR_PCREL))
    {
      /* Relocation for 32-bit branch instructions.  */
      if (fld->bitsize == 24 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_25_PCREL;
      else if (fld->bitsize == 16 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_17_PCREL;
      else if (fld->bitsize == 14 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_15_PCREL;
      else if (fld->bitsize == 8 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_WORD_9_PCREL;
      else
	abort ();

      fixP = fix_new_exp (fragP, out - fragP->fr_literal, insn->opcode->isize,
		   insn->info, 1 /* pcrel */, reloc);
    }
  else if (fld && fld->bitpos == 0 && insn->opcode->isize == 4
	   && (insn->attr & NASM_ATTR_GPREL))
    {
      /* Relocation for 32-bit gp-relative instructions.  */
      if (fld->bitsize == 19 && fld->shift == 0)
	reloc = BFD_RELOC_NDS32_SDA19S0;
      else if (fld->bitsize == 18 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_SDA18S1;
      else if (fld->bitsize == 17 && fld->shift == 2)
	reloc = BFD_RELOC_NDS32_SDA17S2;
      else
	abort ();

      fixP = fix_new_exp (fragP, out - fragP->fr_literal, insn->opcode->isize,
		   insn->info, 0 /* pcrel */, reloc);
      /* Insert INSN16 for converting fp_as_gp.  */
      exp.X_op = O_symbol;
      exp.X_add_symbol = abs_section_sym;
      exp.X_add_number = 0;
      if (in_omit_fp && reloc == BFD_RELOC_NDS32_SDA17S2)
	fix_new_exp (fragP, out - fragP->fr_literal,
		     insn->opcode->isize, &exp, 0 /* pcrel */,
		     BFD_RELOC_NDS32_INSN16);
    }
  else if (fld && fld->bitpos == 0 && insn->opcode->isize == 2
	   && (insn->attr & NASM_ATTR_PCREL))
    {
      /* Relocation for 16-bit branch instructions.  */
      if (fld->bitsize == 8 && fld->shift == 1)
	reloc = BFD_RELOC_NDS32_9_PCREL;
      else
	abort ();

      fixP = fix_new_exp (fragP, out - fragP->fr_literal, insn->opcode->isize,
		   insn->info, 1 /* pcrel */, reloc);
    }
  else if (fld)
    as_bad (_("Don't know how to handle this field. %s"), str);

  return fixP;
}

/* Build instruction pattern to relax.  There are two type group pattern
   including pseudo instruction and relax hint.  */

static void
nds32_elf_build_relax_relation (fixS *fixP, expressionS *pexp, char* out,
				struct nds32_asm_insn *insn, fragS *fragP,
				const struct nds32_field *fld,
				bool pseudo_hint)
{
  struct nds32_relocs_pattern *reloc_ptr;
  struct nds32_relocs_group *group;
  symbolS *sym = NULL;

  /* The expression may be used uninitialized.  */
  if (fld)
    sym = pexp->X_add_symbol;

  if (pseudo_hint)
    {
      /* We cannot know how many instructions will be expanded for
	 the pseudo instruction here.  The first expanded instruction fills
	 the memory created by relax_hint.  The follower will created and link
	 here.  */
      group = nds32_relax_hint_current;
      while (group)
	{
	  if (group->pattern->opcode == NULL)
	    nds32_elf_save_pseudo_pattern (fixP, insn, out, sym,
					   group->pattern, fragP);
	  else
	    {
	      group->pattern->next =
		nds32_elf_save_pseudo_pattern (fixP, insn, out, sym,
					       NULL, fragP);
	      group->pattern = group->pattern->next;
	    }
	  group = group->next;
	}
    }
  else if (pseudo_opcode)
    {
      /* Save instruction relation for pseudo instruction expanding pattern.  */
      reloc_ptr = nds32_elf_save_pseudo_pattern (fixP, insn, out, sym,
						 NULL, fragP);
      if (!relocs_list)
	relocs_list = reloc_ptr;
      else
	{
	  struct nds32_relocs_pattern *temp = relocs_list;
	  while (temp->next)
	    temp = temp->next;
	  temp->next = reloc_ptr;
	}
    }
  else if (nds32_relax_hint_current)
    {
      /* Save instruction relation by relax hint.  */
      group = nds32_relax_hint_current;
      while (group)
	{
	  nds32_elf_save_pseudo_pattern (fixP, insn, out, sym,
					 group->pattern, fragP);
	  group = group->next;
	  free (nds32_relax_hint_current);
	  nds32_relax_hint_current = group;
	}
    }

  /* Set relaxing false only for relax_hint trigger it.  */
  if (!pseudo_opcode)
    relaxing = false;
}

#define N32_MEM_EXT(insn) ((N32_OP6_MEM << 25) | insn)

/* Relax pattern for link time relaxation.  */
/* Relaxation types only! relocation types are not necessary.  */
/* Refer to nds32_elf_record_fixup_exp ().  */

static struct nds32_relax_hint_table relax_ls_table[] =
{
  {
    /* LA and Floating LSI.  */
    .main_type = NDS32_RELAX_HINT_LA_FLSI,
    .relax_code_size = 12,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (LBI),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR, BFD_RELOC_NDS32_PTR},
	{4, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{8, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_LSI},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      }
  },
  {
    /* Load Address / Load-Store (LALS).  */
    .main_type = NDS32_RELAX_HINT_LALS,
    .relax_code_size = 12,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (LBI),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{8, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      }
  },
  {
    /* B(AL) symbol@PLT  */
    .main_type = NDS32_RELAX_HINT_LA_PLT,
    .relax_code_size = 16,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (ALU1),
	OP6 (JREG),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_PTR, BFD_RELOC_NDS32_PTR},
	{12, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PLT_GOT_SUFF},
	{12, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      }
  },
  {
    /* LA (@GOT).  */
    .main_type = NDS32_RELAX_HINT_LA_GOT,
    .relax_code_size = 12,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (MEM),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_GOT_SUFF},
	{0, 0, 0, 0}
      }
  },
  {
    /* LA (@GOTOFF).  */
    .main_type = NDS32_RELAX_HINT_LA_GOTOFF,
    .relax_code_size = 16,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (ALU1),
	OP6 (MEM),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_GOTOFF_SUFF},
	{12, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_GOTOFF_SUFF},
	{0, 0, 0, 0}
      }
  },
  {
    /* TLS LE LS|LA */
    .main_type = NDS32_RELAX_HINT_TLS_LE_LS,
    .relax_code_size = 16,
    .relax_code_seq =
      {
	OP6(SETHI),
	OP6(ORI),
	OP6(MEM),
	OP6(ALU1),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR_MULTIPLE, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_LE_LS},
	{12, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{12, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_LE_ADD},
	{0, 0, 0, 0}
      }
  },
  {
    /* TLS IE LA */
    .main_type = NDS32_RELAX_HINT_TLS_IE_LA,
    .relax_code_size = 8,
    .relax_code_seq =
      {
	OP6(SETHI),
	OP6(LBI),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_INSN16, BFD_RELOC_NDS32_INSN16},
	{0, 0, 0, 0}
      }
  },
  {
    /* TLS IEGP LA */
    .main_type = NDS32_RELAX_HINT_TLS_IEGP_LA,
    .relax_code_size = 12,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (MEM),
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR_PATTERN, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_IEGP_LW},
	{0, 0, 0, 0}
      }
  },
  {
    /* TLS DESC LS:  */
    .main_type = NDS32_RELAX_HINT_TLS_DESC_LS,
    .relax_code_size = 24,
    .relax_code_seq =
      {
	OP6 (SETHI),
	OP6 (ORI),
	OP6 (ALU1),
	OP6 (LBI),	/* load argument */
	OP6 (JREG),
	OP6 (MEM),	/* load/store variable or load argument */
      },
    .relax_fixup =
      {
	{0, 4, NDS32_HINT | NDS32_ADDEND, BFD_RELOC_NDS32_LOADSTORE},
	{4, 4, NDS32_HINT | NDS32_PTR_PATTERN, BFD_RELOC_NDS32_PTR},
	{8, 4, NDS32_HINT | NDS32_ABS, BFD_RELOC_NDS32_PTR_RESOLVED},
	{8, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_DESC_ADD},
	{12, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_DESC_FUNC},
	{16, 4, NDS32_HINT | NDS32_SYM, BFD_RELOC_NDS32_TLS_DESC_CALL},
	{20, 4, NDS32_HINT | NDS32_SYM_DESC_MEM, BFD_RELOC_NDS32_TLS_DESC_MEM},
	{0, 0, 0, 0}
      }
  },
  {
    .main_type = 0,
    .relax_code_seq = {0},
    .relax_fixup = {{0, 0 , 0, 0}}
  }
};

/* Since sethi loadstore relocation has to using next instruction to determine
   elimination itself or not, we have to return the next instruction range.  */

static int
nds32_elf_sethi_range (const struct nds32_relocs_pattern *pattern)
{
  int range = 0;
  while (pattern)
    {
      switch (pattern->opcode->value)
	{
	case INSN_LBI:
	case INSN_SBI:
	case INSN_LBSI:
	case N32_MEM_EXT (N32_MEM_LB):
	case N32_MEM_EXT (N32_MEM_LBS):
	case N32_MEM_EXT (N32_MEM_SB):
	  range = NDS32_LOADSTORE_BYTE;
	  break;
	case INSN_LHI:
	case INSN_SHI:
	case INSN_LHSI:
	case N32_MEM_EXT (N32_MEM_LH):
	case N32_MEM_EXT (N32_MEM_LHS):
	case N32_MEM_EXT (N32_MEM_SH):
	  range = NDS32_LOADSTORE_HALF;
	  break;
	case INSN_LWI:
	case INSN_SWI:
	case N32_MEM_EXT (N32_MEM_LW):
	case N32_MEM_EXT (N32_MEM_SW):
	  range = NDS32_LOADSTORE_WORD;
	  break;
	case INSN_FLSI:
	case INSN_FSSI:
	  range = NDS32_LOADSTORE_FLOAT_S;
	  break;
	case INSN_FLDI:
	case INSN_FSDI:
	  range = NDS32_LOADSTORE_FLOAT_D;
	  break;
	case INSN_ORI:
	  range = NDS32_LOADSTORE_IMM;
	  break;
	default:
	  range = NDS32_LOADSTORE_NONE;
	  break;
	}
      if (range != NDS32_LOADSTORE_NONE)
	break;
      pattern = pattern->next;
    }
  return range;
}

/* The args means: instruction size, the 1st instruction is converted to 16 or
   not, optimize option, 16 bit instruction is enable.  */

#define SET_ADDEND(size, convertible, optimize, insn16_on) \
  (((size) & 0xff) | ((convertible) ? 1u << 31 : 0) \
   | ((optimize) ? 1 << 30 : 0) | (insn16_on ? 1 << 29 : 0))
#define MAC_COMBO (E_NDS32_HAS_FPU_MAC_INST|E_NDS32_HAS_MAC_DX_INST)

static void
nds32_set_elf_flags_by_insn (struct nds32_asm_insn * insn)
{
  static int skip_flags = NASM_ATTR_FPU_FMA
    | NASM_ATTR_BRANCH | NASM_ATTR_SATURATION_EXT
    | NASM_ATTR_GPREL | NASM_ATTR_DXREG
    | NASM_ATTR_ISA_V1 | NASM_ATTR_ISA_V2
    | NASM_ATTR_ISA_V3 | NASM_ATTR_ISA_V3M
    | NASM_ATTR_PCREL;

  int new_flags = insn->opcode->attr & ~skip_flags;
  while (new_flags)
    {
      int next = 1 << (ffs (new_flags) - 1);
      new_flags &= ~next;
      switch (next)
	{
	case NASM_ATTR_PERF_EXT:
	  {
	    if (nds32_perf_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_EXT_INST;
		skip_flags |= NASM_ATTR_PERF_EXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling performance "
			"extension"), insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_PERF2_EXT:
	  {
	    if (nds32_perf_ext2)
	      {
		nds32_elf_flags |= E_NDS32_HAS_EXT2_INST;
		skip_flags |= NASM_ATTR_PERF2_EXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling performance "
			"extension II"), insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_AUDIO_ISAEXT:
	  {
	    if (nds32_audio_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_AUDIO_INST;
		skip_flags |= NASM_ATTR_AUDIO_ISAEXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling AUDIO extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_STR_EXT:
	  {
	    if (nds32_string_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_STRING_INST;
		skip_flags |= NASM_ATTR_STR_EXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling STRING extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_DIV:
	  {
	    if (insn->opcode->attr & NASM_ATTR_DXREG)
	      {
		if (nds32_div && nds32_dx_regs)
		  {
		    nds32_elf_flags |= E_NDS32_HAS_DIV_DX_INST;
		    skip_flags |= NASM_ATTR_DIV;
		  }
		else
		  as_bad (_("instruction %s requires enabling DIV & DX_REGS "
			    "extension"), insn->opcode->opcode);
	      }
	  }
	  break;
	case NASM_ATTR_FPU:
	  {
	    if (nds32_fpu_sp_ext || nds32_fpu_dp_ext)
	      {
		if (!(nds32_elf_flags
		      & (E_NDS32_HAS_FPU_INST | E_NDS32_HAS_FPU_DP_INST)))
		  nds32_fpu_com = 1;
		skip_flags |= NASM_ATTR_FPU;
	      }
	    else
	      as_bad (_("instruction %s requires enabling FPU extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_FPU_SP_EXT:
	  {
	    if (nds32_fpu_sp_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_FPU_INST;
		skip_flags |= NASM_ATTR_FPU_SP_EXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling FPU_SP extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_FPU_DP_EXT:
	  {
	    if (nds32_fpu_dp_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_FPU_DP_INST;
		skip_flags |= NASM_ATTR_FPU_DP_EXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling FPU_DP extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_MAC:
	  {
	    if (insn->opcode->attr & NASM_ATTR_FPU_SP_EXT)
	      {
		if (nds32_fpu_sp_ext && nds32_mac)
		  nds32_elf_flags |= E_NDS32_HAS_FPU_MAC_INST;
		else
		  as_bad (_("instruction %s requires enabling FPU_MAC "
			    "extension"), insn->opcode->opcode);
	      }
	    else if (insn->opcode->attr & NASM_ATTR_FPU_DP_EXT)
	      {
		if (nds32_fpu_dp_ext && nds32_mac)
		  nds32_elf_flags |= E_NDS32_HAS_FPU_MAC_INST;
		else
		  as_bad (_("instruction %s requires enabling FPU_MAC "
			    "extension"), insn->opcode->opcode);
	      }
	    else if (insn->opcode->attr & NASM_ATTR_DXREG)
	      {
		if (nds32_dx_regs && nds32_mac)
		  nds32_elf_flags |= E_NDS32_HAS_MAC_DX_INST;
		else
		  as_bad (_("instruction %s requires enabling DX_REGS "
			    "extension"), insn->opcode->opcode);
	      }

	    if (MAC_COMBO == (MAC_COMBO & nds32_elf_flags))
	      skip_flags |= NASM_ATTR_MAC;
	  }
	  break;
	case NASM_ATTR_DSP_ISAEXT:
	  {
	    if (nds32_dsp_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_DSP_INST;
		skip_flags |= NASM_ATTR_DSP_ISAEXT;
	      }
	    else
	      as_bad (_("instruction %s requires enabling dsp extension"),
		      insn->opcode->opcode);
	  }
	  break;
	case NASM_ATTR_ZOL:
	  {
	    if (nds32_zol_ext)
	      {
		nds32_elf_flags |= E_NDS32_HAS_ZOL;
		skip_flags |= NASM_ATTR_ZOL;
	      }
	    else
	      as_bad (_("instruction %s requires enabling zol extension"),
		      insn->opcode->opcode);
	  }
	  break;
	default:
	  as_bad (_("internal error: unknown instruction attribute: 0x%08x"),
		  next);
	}
    }
}

/* Flag for analysis relaxation type.  */

enum nds32_insn_type
{
  N32_RELAX_SETHI = 1,
  N32_RELAX_BR = (1 << 1),
  N32_RELAX_LSI = (1 << 2),
  N32_RELAX_JUMP = (1 << 3),
  N32_RELAX_CALL = (1 << 4),
  N32_RELAX_ORI = (1 << 5),
  N32_RELAX_MEM = (1 << 6),
  N32_RELAX_MOVI = (1 << 7),
  N32_RELAX_ALU1 = (1 << 8),
  N32_RELAX_16BIT = (1 << 9),
};

struct nds32_hint_map
{
  /* the preamble relocation */
  bfd_reloc_code_real_type hi_type;
  /* mnemonic */
  const char *opc;
  /* relax pattern ID */
  enum nds32_relax_hint_type hint_type;
  /* range */
  enum nds32_br_range range;
  /* pattern character flags */
  enum nds32_insn_type insn_list;
  /* optional pattern character flags */
  enum nds32_insn_type option_list;
};

/* Table to match instructions with hint and relax pattern.  */

static struct nds32_hint_map hint_map [] =
{
  {
    /* LONGCALL4.  */
    BFD_RELOC_NDS32_HI20,
    "jal",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_CALL,
    0,
  },
  {
    /* LONGCALL5.  */
    _dummy_first_bfd_reloc_code_real,
    "bgezal",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_S16M,
    N32_RELAX_BR | N32_RELAX_CALL,
    0,
  },
  {
    /* LONGCALL6.  */
    BFD_RELOC_NDS32_HI20,
    "bgezal",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_U4G,
    N32_RELAX_BR | N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_CALL,
    0,
  },
  {
    /* LONGJUMP4.  */
    BFD_RELOC_NDS32_HI20,
    "j",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_JUMP,
    0,
  },
  {
    /* LONGJUMP5.  */
    /* There is two kinds of variation of LONGJUMP5.  One of them
       generate EMPTY relocation for converted INSN16 if needed.
       But we don't distinguish them here.  */
    _dummy_first_bfd_reloc_code_real,
    "beq",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_S16M,
    N32_RELAX_BR | N32_RELAX_JUMP,
    0,
  },
  {
    /* LONGJUMP6.  */
    BFD_RELOC_NDS32_HI20,
    "beq",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_BR | N32_RELAX_JUMP,
    0,
  },
  {
    /* LONGJUMP7.  */
    _dummy_first_bfd_reloc_code_real,
    "beqc",
    NDS32_RELAX_HINT_NONE,
    BR_RANGE_S16K,
    N32_RELAX_MOVI | N32_RELAX_BR,
    0,
  },
  {
    /* LONGCALL (BAL|JR|LA symbol@PLT).  */
    BFD_RELOC_NDS32_PLT_GOTREL_HI20,
    NULL,
    NDS32_RELAX_HINT_LA_PLT,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI,
    N32_RELAX_ALU1 | N32_RELAX_CALL | N32_RELAX_JUMP,
  },
  /* relative issue: #12566 */
  {
    /* LA and Floating LSI.  */
    BFD_RELOC_NDS32_HI20,
    NULL,
    NDS32_RELAX_HINT_LA_FLSI,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_LSI,
    0,
  },
  /* relative issue: #11685 #11602 */
  {
    /* load address / load-store (LALS).  */
    BFD_RELOC_NDS32_HI20,
    NULL,
    NDS32_RELAX_HINT_LALS,
    BR_RANGE_U4G,
    N32_RELAX_SETHI,
    N32_RELAX_ORI | N32_RELAX_LSI,
  },
  {
    /* setup $GP (_GLOBAL_OFFSET_TABLE_)  */
    BFD_RELOC_NDS32_GOTPC_HI20,
    NULL,
    NDS32_RELAX_HINT_LALS,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI,
    0,
  },
  {
    /* GOT LA/LS (symbol@GOT)  */
    BFD_RELOC_NDS32_GOT_HI20,
    NULL,
    NDS32_RELAX_HINT_LA_GOT,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI,
    N32_RELAX_MEM,
  },
  {
    /* GOTOFF LA/LS (symbol@GOTOFF)  */
    BFD_RELOC_NDS32_GOTOFF_HI20,
    NULL,
    NDS32_RELAX_HINT_LA_GOTOFF,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI,
    N32_RELAX_ALU1  | N32_RELAX_MEM, /* | N32_RELAX_LSI, */
  },
  {
    /* TLS LE LA|LS (@TPOFF)  */
    BFD_RELOC_NDS32_TLS_LE_HI20,
    NULL,
    NDS32_RELAX_HINT_TLS_LE_LS,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI,
    N32_RELAX_ALU1 | N32_RELAX_MEM,
  },
  {
    /* TLS IE LA */
    BFD_RELOC_NDS32_TLS_IE_HI20,
    NULL,
    NDS32_RELAX_HINT_TLS_IE_LA,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_LSI,
    0,
  },
{
    /* TLS IE LS */
    BFD_RELOC_NDS32_TLS_IE_HI20,
    NULL,
    NDS32_RELAX_HINT_TLS_IE_LS,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_LSI | N32_RELAX_MEM,
    0,
  },
  {
    /* TLS IEGP LA */
    BFD_RELOC_NDS32_TLS_IEGP_HI20,
    NULL,
    NDS32_RELAX_HINT_TLS_IEGP_LA,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_MEM,
    0,
  },
  {
    /* TLS DESC LS */
    BFD_RELOC_NDS32_TLS_DESC_HI20,
    NULL,
    NDS32_RELAX_HINT_TLS_DESC_LS,
    BR_RANGE_U4G,
    N32_RELAX_SETHI | N32_RELAX_ORI | N32_RELAX_ALU1 | N32_RELAX_CALL,
    N32_RELAX_LSI | N32_RELAX_MEM,
  },
  /* last one */
  {0, NULL, 0, 0 ,0, 0}
};

/* Find the relaxation pattern according to instructions.  */

static bool
nds32_find_reloc_table (const struct nds32_relocs_pattern *relocs_pattern,
			struct nds32_relax_hint_table *hint_info)
{
  unsigned int opcode, seq_size;
  enum nds32_br_range range;
  const struct nds32_relocs_pattern *pattern, *hi_pattern = NULL;
  const char *opc = NULL;
  relax_info_t *relax_info = NULL;
  nds32_relax_fixup_info_t *fixup_info, *hint_fixup;
  enum nds32_relax_hint_type hint_type = NDS32_RELAX_HINT_NONE;
  struct nds32_relax_hint_table *table_ptr;
  uint32_t *code_seq, *hint_code;
  enum nds32_insn_type relax_type = 0;
  struct nds32_hint_map *map_ptr = hint_map;
  unsigned int i;
  const char *check_insn[] =
    { "bnes38", "beqs38", "bnez38", "bnezs8", "beqz38", "beqzs8" };

  /* TODO: PLT GOT.  */
  /* Traverse all pattern instruction and set flag.  */
  pattern = relocs_pattern;
  while (pattern)
    {
      if (pattern->opcode->isize == 4)
	{
	  /* 4 byte instruction.  */
	  opcode = N32_OP6 (pattern->opcode->value);
	  switch (opcode)
	    {
	    case N32_OP6_SETHI:
	      hi_pattern = pattern;
	      relax_type |= N32_RELAX_SETHI;
	      break;
	    case N32_OP6_MEM:
	      relax_type |= N32_RELAX_MEM;
	      break;
	    case N32_OP6_ALU1:
	      relax_type |= N32_RELAX_ALU1;
	      break;
	    case N32_OP6_ORI:
	      relax_type |= N32_RELAX_ORI;
	      break;
	    case N32_OP6_BR1:
	    case N32_OP6_BR2:
	    case N32_OP6_BR3:
	      relax_type |= N32_RELAX_BR;
	      break;
	    case N32_OP6_MOVI:
	      relax_type |= N32_RELAX_MOVI;
	      break;
	    case N32_OP6_LBI:
	    case N32_OP6_SBI:
	    case N32_OP6_LBSI:
	    case N32_OP6_LHI:
	    case N32_OP6_SHI:
	    case N32_OP6_LHSI:
	    case N32_OP6_LWI:
	    case N32_OP6_SWI:
	    case N32_OP6_LWC:
	    case N32_OP6_SWC:
	    case N32_OP6_LDC:
	    case N32_OP6_SDC:
	      relax_type |= N32_RELAX_LSI;
	      break;
	    case N32_OP6_JREG:
	      if (__GF (pattern->opcode->value, 0, 1) == 1)
		relax_type |= N32_RELAX_CALL;
	      else
		relax_type |= N32_RELAX_JUMP;
	      break;
	    case N32_OP6_JI:
	      if (__GF (pattern->opcode->value, 24, 1) == 1)
		relax_type |= N32_RELAX_CALL;
	      else
		relax_type |= N32_RELAX_JUMP;
	      break;
	    default:
	      as_warn (_("relax hint unrecognized instruction: line %d."),
		       pattern->frag->fr_line);
	      return false;
	    }
	}
      else
	{
	  /* 2 byte instruction.  Compare by opcode name because
	     the opcode of 2byte instruction is not regular.  */
	  int is_matched = 0;
	  for (i = 0; i < ARRAY_SIZE (check_insn); i++)
	    {
	      if (strcmp (pattern->opcode->opcode, check_insn[i]) == 0)
		{
		  relax_type |= N32_RELAX_BR;
		  is_matched += 1;
		  break;
		}
	    }
	  if (!is_matched)
	    relax_type |= N32_RELAX_16BIT;
	}
      pattern = pattern->next;
    }

  /* Analysis instruction flag to choose relaxation table.  */
  while (map_ptr->insn_list != 0)
    {
      struct nds32_hint_map *hint = map_ptr++;
      enum nds32_insn_type must = hint->insn_list;
      enum nds32_insn_type optional = hint->option_list;
      enum nds32_insn_type extra;

      if (must != (must & relax_type))
	continue;

      extra = relax_type ^ must;
      if (extra != (extra & optional))
	continue;

      if (!hi_pattern
	  || (hi_pattern->fixP
	      && hi_pattern->fixP->fx_r_type == hint->hi_type))
	{
	  opc = hint->opc;
	  hint_type = hint->hint_type;
	  range = hint->range;
	  map_ptr = hint;
	  break;
	}
    }

  if (map_ptr->insn_list == 0)
    {
      if (!nds32_pic)
	as_warn (_("Can not find match relax hint.  Line: %d"),
		 relocs_pattern->frag->fr_line);
      return false;
    }

  /* Get the match table.  */
  if (opc)
    {
      /* Branch relax pattern.  */
      relax_info = str_hash_find (nds32_relax_info_hash, opc);
      if (!relax_info)
	return false;
      fixup_info = relax_info->relax_fixup[range];
      code_seq = relax_info->relax_code_seq[range];
      seq_size = relax_info->relax_code_size[range];
    }
  else if (hint_type)
    {
      /* Load-store relax pattern.  */
      table_ptr = relax_ls_table;
      while (table_ptr->main_type != 0)
	{
	  if (table_ptr->main_type == hint_type)
	    {
	      fixup_info = table_ptr->relax_fixup;
	      code_seq = table_ptr->relax_code_seq;
	      seq_size = table_ptr->relax_code_size;
	      break;
	    }
	  table_ptr++;
	}
      if (table_ptr->main_type == 0)
	return false;
    }
  else
    return false;

  hint_fixup = hint_info->relax_fixup;
  hint_code = hint_info->relax_code_seq;
  hint_info->relax_code_size = seq_size;

  while (fixup_info->size != 0)
    {
      if (fixup_info->ramp & NDS32_HINT)
	{
	  memcpy (hint_fixup, fixup_info, sizeof (nds32_relax_fixup_info_t));
	  hint_fixup++;
	}
      fixup_info++;
    }
  /* Clear final relocation.  */
  memset (hint_fixup, 0, sizeof (nds32_relax_fixup_info_t));
  /* Copy code sequence.  */
  memcpy (hint_code, code_seq, seq_size);
  return true;
}

/* Because there are a lot of variant of load-store, check
   all these type here.  */

#define CLEAN_REG(insn) ((insn) & 0xfe0003ff)
#define GET_OPCODE(insn) ((insn) & 0xfe000000)

static bool
nds32_match_hint_insn (struct nds32_opcode *opcode, uint32_t seq)
{
  const char *check_insn[] =
    { "bnes38", "beqs38", "bnez38", "bnezs8", "beqz38", "beqzs8", "jral5" };
  uint32_t insn = opcode->value;
  unsigned int i;

  insn = CLEAN_REG (opcode->value);
  if (insn == seq)
    return true;

  switch (seq)
    {
    case OP6 (LBI):
      /* In relocation_table, it regards instruction LBI as representation
	 of all the NDS32_RELAX_HINT_LS pattern.  */
      if (insn == OP6 (LBI) || insn == OP6 (SBI) || insn == OP6 (LBSI)
	  || insn == OP6 (LHI) || insn == OP6 (SHI) || insn == OP6 (LHSI)
	  || insn == OP6 (LWI) || insn == OP6 (SWI)
	  || insn == OP6 (LWC) || insn == OP6 (SWC)
	  || insn == OP6 (LDC) || insn == OP6 (SDC))
	return true;
      break;
    case OP6 (BR2):
      /* This is for LONGCALL5 and LONGCALL6.  */
      if (insn == OP6 (BR2))
	return true;
      break;
    case OP6 (BR1):
      /* This is for LONGJUMP5 and LONGJUMP6.  */
      if (opcode->isize == 4
	  && (insn == OP6 (BR1) || insn == OP6 (BR2) || insn == OP6 (BR3)))
	return true;
      else if (opcode->isize == 2)
	{
	  for (i = 0; i < ARRAY_SIZE (check_insn); i++)
	    if (strcmp (opcode->opcode, check_insn[i]) == 0)
	      return true;
	}
      break;
    case OP6 (MOVI):
      /* This is for LONGJUMP7.  */
      if (opcode->isize == 2 && strcmp (opcode->opcode, "movi55") == 0)
	return true;
      break;
    case OP6 (MEM):
      if (OP6 (MEM) == GET_OPCODE (insn))
	return true;
      break;
    case OP6 (JREG):
      /* bit 24: N32_JI_JAL  */ /* feed me!  */
      if ((insn & ~(N32_BIT (24))) == JREG (JRAL))
	return true;
      break;
    default:
      if (opcode->isize == 2)
	{
	  for (i = 0; i < ARRAY_SIZE (check_insn); i++)
	    if (strcmp (opcode->opcode, check_insn[i]) == 0)
	      return true;

	  if ((strcmp (opcode->opcode, "add5.pc") == 0) ||
	      (strcmp (opcode->opcode, "add45") == 0))
	    return true;
	}
    }
  return false;
}

/* Append relax relocation for link time relaxing.  */

static void
nds32_elf_append_relax_relocs (const char *key, const void *value)
{
  const struct nds32_relocs_pattern *relocs_pattern = value;
  const struct nds32_relocs_pattern *pattern_temp, *pattern_now;
  symbolS *sym, *hi_sym = NULL;
  expressionS exp;
  fragS *fragP;
  segT seg_bak = now_seg;
  frchainS *frchain_bak = frchain_now;
  struct nds32_relax_hint_table hint_info;
  nds32_relax_fixup_info_t *hint_fixup, *fixup_now;
  size_t fixup_size;
  offsetT branch_offset, hi_branch_offset = 0;
  fixS *fixP;
  int range, offset;
  unsigned int ptr_offset, hint_count, relax_code_size, count = 0;
  uint32_t *code_seq, code_insn;
  char *where;
  int pcrel;

  if (!relocs_pattern || !relocs_pattern->opcode)
    return;

  if (!nds32_find_reloc_table (relocs_pattern, &hint_info))
    return;

  /* Save symbol for some EMPTY relocation using.  */
  pattern_now = relocs_pattern;
  while (pattern_now)
    {
      if (pattern_now->opcode->value == OP6 (SETHI))
	{
	  hi_sym = pattern_now->sym;
	  hi_branch_offset = pattern_now->fixP->fx_offset;
	  break;
	}
      pattern_now = pattern_now->next;
    }

  /* Inserting fix up must specify now_seg or frchain_now.  */
  now_seg = relocs_pattern->seg;
  frchain_now = relocs_pattern->frchain;
  fragP = relocs_pattern->frag;
  branch_offset = fragP->fr_offset;

  hint_fixup = hint_info.relax_fixup;
  code_seq = hint_info.relax_code_seq;
  relax_code_size = hint_info.relax_code_size;
  pattern_now = relocs_pattern;

#ifdef NDS32_LINUX_TOOLCHAIN
  /* prepare group relocation ID (number).  */
  long group_id = 0;
  if (key)
    {
      /* convert .relax_hint key to number */
      errno = 0;
      group_id = strtol (key, NULL, 10);
      if ((errno == ERANGE && (group_id == LONG_MAX || group_id == LONG_MIN))
	  || (errno != 0 && group_id == 0))
	{
	  as_bad (_("Internal error: .relax_hint KEY is not a number!"));
	  goto restore;
	}
    }
#endif

  /* Insert relaxation.  */
  exp.X_op = O_symbol;

  /* For each instruction in the hint group.  */
  while (pattern_now)
    {
      if (count >= relax_code_size / 4)
	count = 0;

      /* Choose the match fixup by instruction.  */
      code_insn = CLEAN_REG (*(code_seq + count));
      if (!nds32_match_hint_insn (pattern_now->opcode, code_insn))
	{
	  /* Try search from head again */
	  count = 0;
	  code_insn = CLEAN_REG (*(code_seq + count));

	  while (!nds32_match_hint_insn (pattern_now->opcode, code_insn))
	    {
	      count++;
	      if (count >= relax_code_size / 4)
		{
		  as_bad (_("Internal error: Relax hint (%s) error. %s: %s (%x)"),
			  key,
			  now_seg->name,
			  pattern_now->opcode->opcode,
			  pattern_now->opcode->value);
		  goto restore;
		}
	      code_insn = CLEAN_REG (*(code_seq + count));
	    }
	}
      fragP = pattern_now->frag;
      sym = pattern_now->sym;
      branch_offset = fragP->fr_offset;
      offset = count * 4;
      where = pattern_now->where;
      /* Find the instruction map fix.  */
      fixup_now = hint_fixup;
      while (fixup_now->offset != offset)
	{
	  fixup_now++;
	  if (fixup_now->size == 0)
	    break;
	}
      /* This element is without relaxation relocation.  */
      if (fixup_now->size == 0)
	{
	  pattern_now = pattern_now->next;
	  continue;
	}
      fixup_size = fixup_now->size;

      /* Insert all fixup.  */
      pcrel = 0;
      while (fixup_size != 0 && fixup_now->offset == offset)
	{
	  /* Set the real instruction size in element.  */
	  fixup_size = pattern_now->opcode->isize;
	  pcrel = ((fixup_now->ramp & NDS32_PCREL) != 0) ? 1 : 0;
	  if (fixup_now->ramp & NDS32_FIX)
	    {
	      /* Convert original relocation.  */
	      pattern_now->fixP->fx_r_type = fixup_now->r_type ;
	      fixup_size = 0;
	    }
	  else if ((fixup_now->ramp & NDS32_PTR) != 0)
	    {
	      /* This relocation has to point to another instruction.  Make
		 sure each resolved relocation has to be pointed.  */
	      pattern_temp = relocs_pattern;
	      /* All instruction in relax_table should be 32-bit.  */
	      hint_count = hint_info.relax_code_size / 4;
	      code_insn = CLEAN_REG (*(code_seq + hint_count - 1));
	      while (pattern_temp)
		{
		  /* Point to every resolved relocation.  */
		  if (nds32_match_hint_insn (pattern_temp->opcode, code_insn))
		    {
		      ptr_offset =
			pattern_temp->where - pattern_temp->frag->fr_literal;
		      exp.X_add_symbol = symbol_temp_new (now_seg,
							  pattern_temp->frag,
							  ptr_offset);
		      exp.X_add_number = 0;
		      fixP =
			fix_new_exp (fragP, where - fragP->fr_literal,
				     fixup_size, &exp, 0, fixup_now->r_type);
		      fixP->fx_addnumber = fixP->fx_offset;
		    }
		  pattern_temp = pattern_temp->next;
		}
	      fixup_size = 0;
	    }
	  else if (fixup_now->ramp & NDS32_ADDEND)
	    {
	      range = nds32_elf_sethi_range (relocs_pattern);
	      if (range == NDS32_LOADSTORE_NONE)
		{
		  as_bad (_("Internal error: Range error. %s"), now_seg->name);
		  return;
		}
	      exp.X_add_symbol = abs_section_sym;
	      exp.X_add_number = SET_ADDEND (4, 0, optimize, enable_16bit);
	      exp.X_add_number |= ((range & 0x3f) << 8);
	    }
	  else if ((fixup_now->ramp & NDS32_ABS) != 0)
	    {
	      /* This is a tag relocation.  */
	      exp.X_add_symbol = abs_section_sym;
	      exp.X_add_number = 0;
	    }
	  else if ((fixup_now->ramp & NDS32_INSN16) != 0)
	    {
	      if (!enable_16bit)
		fixup_size = 0;
	      /* This is a tag relocation.  */
	      exp.X_add_symbol = abs_section_sym;
	      exp.X_add_number = 0;
	    }
	  else if ((fixup_now->ramp & NDS32_SYM) != 0)
	    {
	      /* For EMPTY relocation save the true symbol.  */
	      exp.X_add_symbol = hi_sym;
	      exp.X_add_number = hi_branch_offset;
	    }
	  else if (NDS32_SYM_DESC_MEM & fixup_now->ramp)
	    {
	      /* Do the same as NDS32_SYM.  */
	      exp.X_add_symbol = hi_sym;
	      exp.X_add_number = hi_branch_offset;

	      /* Extra to NDS32_SYM.  */
	      /* Detect if DESC_FUNC relax type do apply.  */
	      if ((REG_GP == N32_RA5 (pattern_now->insn))
		  || (REG_GP == N32_RB5 (pattern_now->insn)))
		{
		  fixP = fix_new_exp (fragP, where - fragP->fr_literal,
				      fixup_size, &exp, pcrel,
				      BFD_RELOC_NDS32_TLS_DESC_FUNC);
		  fixP->fx_addnumber = fixP->fx_offset;

		  fixup_size = 0;
		}
	      /* Else do as usual.  */
	    }
	  else if (fixup_now->ramp & NDS32_PTR_PATTERN)
	    {
	      /* Find out PTR_RESOLVED code pattern.  */
	      nds32_relax_fixup_info_t *next_fixup = fixup_now + 1;
	      uint32_t resolved_pattern = 0;
	      while (next_fixup->offset)
		{
		  if (next_fixup->r_type == BFD_RELOC_NDS32_PTR_RESOLVED)
		    {
		      uint32_t new_pattern = code_seq[next_fixup->offset >> 2];
		      if (!resolved_pattern)
			resolved_pattern = new_pattern;
		      else if (new_pattern != resolved_pattern)
			{
			  as_warn (_("Multiple BFD_RELOC_NDS32_PTR_RESOLVED "
				     "patterns are not supported yet!"));
			  break;
			}
		    }
		  ++next_fixup;
		}

	      /* Find matched code and insert fix-ups.  */
	      struct nds32_relocs_pattern *next_pattern = pattern_now->next;
	      /* This relocation has to point to another instruction.
		 Make sure each resolved relocation has to be pointed.  */
	      /* All instruction in relax_table should be 32-bit.  */
	      while (next_pattern)
		{
		  uint32_t cur_pattern = GET_OPCODE (next_pattern->opcode->value);
		  if (cur_pattern == resolved_pattern)
		    {
		      ptr_offset = next_pattern->where
			- next_pattern->frag->fr_literal;
		      exp.X_add_symbol = symbol_temp_new (now_seg,
							  next_pattern->frag,
							  ptr_offset);
		      exp.X_add_number = 0;
		      fixP = fix_new_exp (fragP, where - fragP->fr_literal,
					  fixup_size, &exp, 0,
					  fixup_now->r_type);
		      fixP->fx_addnumber = fixP->fx_offset;
		    }
		  next_pattern = next_pattern->next;
		}

	      fixup_size = 0;
	    }
	  else if (fixup_now->ramp & NDS32_PTR_MULTIPLE)
	    {
	      /* Find each PTR_RESOLVED pattern after PTR.  */
	      nds32_relax_fixup_info_t *next_fixup = fixup_now + 1;
	      while (next_fixup->offset)
		{
		  if (next_fixup->r_type == BFD_RELOC_NDS32_PTR_RESOLVED)
		    {
		      uint32_t pattern = code_seq[next_fixup->offset >> 2];
		      /* Find matched code to insert fix-ups.  */
		      struct nds32_relocs_pattern *next_insn = pattern_now->next;
		      while (next_insn)
			{
			  uint32_t insn_pattern = GET_OPCODE (next_insn->opcode->value);
			  if (insn_pattern == pattern)
			    {
			      ptr_offset = next_insn->where
				- next_insn->frag->fr_literal;
			      exp.X_add_symbol = symbol_temp_new (now_seg,
								  next_insn->frag,
								  ptr_offset);
			      exp.X_add_number = 0;
			      fixP = fix_new_exp (fragP,
						  where - fragP->fr_literal,
						  fixup_size, &exp, 0,
						  fixup_now->r_type);
			      fixP->fx_addnumber = fixP->fx_offset;
			    }
			  next_insn = next_insn->next;
			}
		    }
		  ++next_fixup;
		}
	      fixup_size = 0;
	    }
	  else
	    {
	      exp.X_add_symbol = sym;
	      exp.X_add_number = branch_offset;
	    }

	  if (fixup_size != 0)
	    {
	      fixP = fix_new_exp (fragP, where - fragP->fr_literal, fixup_size,
				  &exp, pcrel, fixup_now->r_type);
	      fixP->fx_addnumber = fixP->fx_offset;
	    }
	  fixup_now++;
	  fixup_size = fixup_now->size;
	}

#ifdef NDS32_LINUX_TOOLCHAIN
      /* Insert group relocation for each relax hint.  */
      if (key)
	{
	  exp.X_add_symbol = hi_sym; /* for eyes only */
	  exp.X_add_number = group_id;
	  fixP = fix_new_exp (fragP, where - fragP->fr_literal, fixup_size,
			      &exp, pcrel, BFD_RELOC_NDS32_GROUP);
	  fixP->fx_addnumber = fixP->fx_offset;
	}
#endif

      if (count < relax_code_size / 4)
	count++;
      pattern_now = pattern_now->next;
    }

 restore:
  now_seg = seg_bak;
  frchain_now = frchain_bak;
}

static int
nds32_elf_append_relax_relocs_traverse (void **slot, void *arg ATTRIBUTE_UNUSED)
{
  string_tuple_t *tuple = *((string_tuple_t **) slot);
  nds32_elf_append_relax_relocs (tuple->key, (const void *) tuple->value);
  return 1;
}


static void
nds32_str_tolower (const char *src, char *dest)
{
  unsigned int i, len;

  len = strlen (src);

  for (i = 0; i < len; i++)
    *(dest + i) = TOLOWER (*(src + i));

  *(dest + i) = '\0';
}

/* Check instruction if it can be used for the baseline.  */

static bool
nds32_check_insn_available (struct nds32_asm_insn insn, const char *str)
{
  int attr = insn.attr & ATTR_ALL;
  static int baseline_isa = 0;
  char *s;

  s = xmalloc (strlen (str) + 1);
  nds32_str_tolower (str, s);
  if (verbatim
      && (((insn.opcode->value == ALU2 (MTUSR)
	    || insn.opcode->value == ALU2 (MFUSR))
	   && (strstr (s, "lc")
	       || strstr (s, "le")
	       || strstr (s, "lb")))
	  || (insn.attr & NASM_ATTR_ZOL)))
    {
      as_bad (_("Not support instruction %s in verbatim."), str);
      return false;
    }
  free (s);

  if (!enable_16bit && insn.opcode->isize == 2)
    {
      as_bad (_("16-bit instruction is disabled: %s."), str);
      return false;
    }

  /* No isa setting or all isa can use.  */
  if (attr == 0 || attr == ATTR_ALL)
    return true;

  if (baseline_isa == 0)
    {
      /* Map option baseline and instruction attribute.  */
      switch (nds32_baseline)
	{
	case ISA_V2:
	  baseline_isa = ATTR (ISA_V2);
	  break;
	case ISA_V3:
	  baseline_isa = ATTR (ISA_V3);
	  break;
	case ISA_V3M:
	  baseline_isa = ATTR (ISA_V3M);
	  break;
	}
    }

  if  ((baseline_isa & attr) == 0)
    {
      as_bad (_("Instruction %s not supported in the baseline."), str);
      return false;
    }
  return true;
}

/* Stub of machine dependent.  */

void
md_assemble (char *str)
{
  struct nds32_asm_insn insn;
  char *out;
  struct nds32_pseudo_opcode *popcode;
  const struct nds32_field *fld = NULL;
  fixS *fixP;
  uint16_t insn_16;
  struct nds32_relocs_pattern *relocs_temp;
  struct nds32_relocs_group *group_temp;
  fragS *fragP;
  int label = label_exist;
  static bool pseudo_hint = false;

  popcode = nds32_lookup_pseudo_opcode (str);
  /* Note that we need to check 'verbatim' and
     'opcode->physical_op'.  If the assembly content is generated by
     compiler and this opcode is a physical instruction, there is no
     need to perform pseudo instruction expansion/transformation.  */
  if (popcode && !(verbatim && popcode->physical_op))
    {
      /* Pseudo instruction is with relax_hint.  */
      if (relaxing)
	pseudo_hint = true;
      pseudo_opcode = true;
      nds32_pseudo_opcode_wrapper (str, popcode);
      pseudo_opcode = false;
      pseudo_hint = false;
      nds32_elf_append_relax_relocs (NULL, relocs_list);

      /* Free relax_hint group list.  */
      while (nds32_relax_hint_current)
	{
	  group_temp = nds32_relax_hint_current->next;
	  free (nds32_relax_hint_current);
	  nds32_relax_hint_current = group_temp;
	}

      /* Free pseudo list.  */
      relocs_temp = relocs_list;
      while (relocs_temp)
	{
	  relocs_list = relocs_list->next;
	  free (relocs_temp);
	  relocs_temp = relocs_list;
	}

      return;
    }

  label_exist = 0;
  insn.info = XNEW (expressionS);
  asm_desc.result = NASM_OK;
  nds32_assemble (&asm_desc, &insn, str);

  switch (asm_desc.result)
    {
    case NASM_ERR_UNKNOWN_OP:
      as_bad (_("Unrecognized opcode, %s."), str);
      return;
    case NASM_ERR_SYNTAX:
      as_bad (_("Incorrect syntax, %s."), str);
      return;
    case NASM_ERR_OPERAND:
      as_bad (_("Unrecognized operand/register, %s."), str);
      return;
    case NASM_ERR_OUT_OF_RANGE:
      as_bad (_("Operand out of range, %s."), str);
      return;
    case NASM_ERR_REG_REDUCED:
      as_bad (_("Prohibited register used for reduced-register, %s."), str);
      return;
    case NASM_ERR_JUNK_EOL:
      as_bad (_("Junk at end of line, %s."), str);
      return;
    }

  gas_assert (insn.opcode);

  nds32_set_elf_flags_by_insn (&insn);

  gas_assert (insn.opcode->isize == 4 || insn.opcode->isize == 2);

  if (!nds32_check_insn_available (insn, str))
    return;

  /* Make sure the beginning of text being 2-byte align.  */
  nds32_adjust_label (1);
  add_mapping_symbol (MAP_CODE, 0, 0);
  fld = insn.field;
  /* Try to allocate the max size to guarantee relaxable same branch
     instructions in the same fragment.  */
  frag_grow (NDS32_MAXCHAR);
  fragP = frag_now;

  if (fld && (insn.attr & NASM_ATTR_BRANCH)
      && (pseudo_opcode || (insn.opcode->value != INSN_JAL
			    && insn.opcode->value != INSN_J))
      && (!verbatim || pseudo_opcode))
    {
      /* User assembly code branch relax for it.  */
      /* If fld is not NULL, it is a symbol.  */
      /* Branch must relax to proper pattern in user assembly code exclude
	 J and JAL.  Keep these two in original type for users which wants
	 to keep their size be fixed.  In general, assembler does not convert
	 instruction generated by compiler.  But jump instruction may be
	 truncated in text virtual model.  For workaround, compiler generate
	 pseudo jump to fix this issue currently.  */

      /* Get branch range type.  */
      dwarf2_emit_insn (0);
      enum nds32_br_range range_type;
      expressionS *pexp = insn.info;

      range_type = get_range_type (fld);

      out = frag_var (rs_machine_dependent, NDS32_MAXCHAR,
		      0, /* VAR is un-used.  */
		      range_type, /* SUBTYPE is used as range type.  */
		      pexp->X_add_symbol, pexp->X_add_number, 0);

      fragP->fr_fix += insn.opcode->isize;
      fragP->tc_frag_data.opcode = insn.opcode;
      fragP->tc_frag_data.insn = insn.insn;
      if (insn.opcode->isize == 4)
	bfd_putb32 (insn.insn, out);
      else if (insn.opcode->isize == 2)
	bfd_putb16 (insn.insn, out);
      fragP->tc_frag_data.flag |= NDS32_FRAG_BRANCH;

      free (insn.info);
      return;
      /* md_convert_frag will insert relocations.  */
    }
  else if (!relaxing && enable_16bit && (optimize || optimize_for_space)
	   && ((!fld && !verbatim && insn.opcode->isize == 4
		&& bfd_elf_nds32_convert_32_to_16 (stdoutput, insn.insn,
						   &insn_16, NULL))
	       || (insn.opcode->isize == 2
		   && bfd_elf_nds32_convert_16_to_32 (stdoutput, insn.insn,
						      NULL))))
    {
      /* Record this one is relaxable.  */
      expressionS *pexp = insn.info;
      dwarf2_emit_insn (0);
      if (fld)
	{
	  out = frag_var (rs_machine_dependent,
			  4, /* Max size is 32-bit instruction.  */
			  0, /* VAR is un-used.  */
			  0, pexp->X_add_symbol, pexp->X_add_number, 0);
	  fragP->tc_frag_data.flag |= NDS32_FRAG_RELAXABLE_BRANCH;
	}
      else
	out = frag_var (rs_machine_dependent,
			4, /* Max size is 32-bit instruction.  */
			0, /* VAR is un-used.  */
			0, NULL, 0, NULL);
      fragP->tc_frag_data.flag |= NDS32_FRAG_RELAXABLE;
      fragP->tc_frag_data.opcode = insn.opcode;
      fragP->tc_frag_data.insn = insn.insn;
      fragP->fr_fix += 2;

      /* In original, we don't relax the instruction with label on it,
	 but this may cause some redundant nop16.  Therefore, tag this
	 relaxable instruction and relax it carefully.  */
      if (label)
	fragP->tc_frag_data.flag |= NDS32_FRAG_LABEL;

      if (insn.opcode->isize == 4)
	bfd_putb16 (insn_16, out);
      else if (insn.opcode->isize == 2)
	bfd_putb16 (insn.insn, out);

      free (insn.info);
      return;
    }
  else if ((verbatim || !relaxing) && optimize && label)
    {
      /* This instruction is with label.  */
      expressionS exp;
      out = frag_var (rs_machine_dependent, insn.opcode->isize,
		      0, 0, NULL, 0, NULL);
      /* If this instruction is branch target, it is not relaxable.  */
      fragP->tc_frag_data.flag = NDS32_FRAG_LABEL;
      fragP->tc_frag_data.opcode = insn.opcode;
      fragP->tc_frag_data.insn = insn.insn;
      fragP->fr_fix += insn.opcode->isize;
      if (insn.opcode->isize == 4)
	{
	  exp.X_op = O_symbol;
	  exp.X_add_symbol = abs_section_sym;
	  exp.X_add_number = 0;
	  fixP = fix_new_exp (fragP, fragP->fr_fix - 4, 0, &exp,
			      0, BFD_RELOC_NDS32_LABEL);
	  if (!verbatim)
	    fragP->tc_frag_data.flag = NDS32_FRAG_ALIGN;
	}
    }
  else
    out = frag_more (insn.opcode->isize);

  if (insn.opcode->isize == 4)
    bfd_putb32 (insn.insn, out);
  else if (insn.opcode->isize == 2)
    bfd_putb16 (insn.insn, out);

  dwarf2_emit_insn (insn.opcode->isize);

  /* Compiler generating code and user assembly pseudo load-store, insert
     fixup here.  */
  expressionS *pexp = insn.info;
  fixP = nds32_elf_record_fixup_exp (fragP, str, fld, pexp, out, &insn);
  /* Build relaxation pattern when relaxing is enable.  */
  if (relaxing)
    nds32_elf_build_relax_relation (fixP, pexp, out, &insn, fragP, fld,
				    pseudo_hint);

  free (insn.info);
}

/* md_macro_start  */

void
nds32_macro_start (void)
{
}

/* md_macro_info  */

void
nds32_macro_info (void *info ATTRIBUTE_UNUSED)
{
}

/* md_macro_end  */

void
nds32_macro_end (void)
{
}

/* GAS will call this function with one argument, an expressionS pointer, for
   any expression that can not be recognized.  When the function is called,
   input_line_pointer will point to the start of the expression.  */

void
md_operand (expressionS *expressionP)
{
  if (*input_line_pointer == '#')
    {
      input_line_pointer++;
      expression (expressionP);
    }
}

/* GAS will call this function for each section at the end of the assembly, to
   permit the CPU back end to adjust the alignment of a section.  The function
   must take two arguments, a segT for the section and a valueT for the size of
   the section, and return a valueT for the rounded size.  */

valueT
md_section_align (segT segment, valueT size)
{
  int align = bfd_section_alignment (segment);

  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
}

/* GAS will call this function when a symbol table lookup fails, before it
   creates a new symbol.  Typically this would be used to supply symbols whose
   name or value changes dynamically, possibly in a context sensitive way.
   Predefined symbols with fixed values, such as register names or condition
   codes, are typically entered directly into the symbol table when md_begin
   is called.  One argument is passed, a char * for the symbol.  */

symbolS *
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
{
  return NULL;
}

static long
nds32_calc_branch_offset (segT segment, fragS *fragP,
			  long stretch ATTRIBUTE_UNUSED,
			  relax_info_t *relax_info,
			  enum nds32_br_range branch_range_type)
{
  struct nds32_opcode *opcode = fragP->tc_frag_data.opcode;
  symbolS *branch_symbol = fragP->fr_symbol;
  offsetT branch_offset = fragP->fr_offset;
  offsetT branch_target_address;
  offsetT branch_insn_address;
  long offset = 0;

  if ((S_GET_SEGMENT (branch_symbol) != segment)
      || S_IS_WEAK (branch_symbol))
    {
      /* The symbol is not in the SEGMENT.  It could be far far away.  */
      offset = 0x80000000;
    }
  else
    {
      /* Calculate symbol-to-instruction offset.  */
      branch_target_address = S_GET_VALUE (branch_symbol) + branch_offset;
      /* If the destination symbol is beyond current frag address,
	 STRETCH will take effect to symbol's position.  */
      if (S_GET_VALUE (branch_symbol) > fragP->fr_address)
	branch_target_address += stretch;

      branch_insn_address = fragP->fr_address + fragP->fr_fix;
      branch_insn_address -= opcode->isize;

      /* Update BRANCH_INSN_ADDRESS to relaxed position.  */
      branch_insn_address += (relax_info->relax_code_size[branch_range_type]
			      - relax_info->relax_branch_isize[branch_range_type]);

      offset = branch_target_address - branch_insn_address;
    }

  return offset;
}

static enum nds32_br_range
nds32_convert_to_range_type (long offset)
{
  enum nds32_br_range range_type;

  if (-(0x100) <= offset && offset < 0x100) /* 256 bytes */
    range_type = BR_RANGE_S256;
  else if (-(0x4000) <= offset && offset < 0x4000) /* 16K bytes */
    range_type = BR_RANGE_S16K;
  else if (-(0x10000) <= offset && offset < 0x10000) /* 64K bytes */
    range_type = BR_RANGE_S64K;
  else if (-(0x1000000) <= offset && offset < 0x1000000) /* 16M bytes */
    range_type = BR_RANGE_S16M;
  else /* 4G bytes */
    range_type = BR_RANGE_U4G;

  return range_type;
}

/* Set instruction register mask.  */

static void
nds32_elf_get_set_cond (relax_info_t *relax_info, int offset, uint32_t *insn,
			uint32_t ori_insn, int range)
{
  nds32_cond_field_t *cond_fields = relax_info->cond_field;
  nds32_cond_field_t *code_seq_cond = relax_info->relax_code_condition[range];
  uint32_t mask;
  int i = 0;

  /* The instruction has conditions.  Collect condition values.  */
  while (code_seq_cond[i].bitmask != 0)
    {
      if (offset == code_seq_cond[i].offset)
	{
	  mask = (ori_insn >> cond_fields[i].bitpos) & cond_fields[i].bitmask;
	  /* Sign extend.  */
	  if (cond_fields[i].signed_extend)
	    mask = (mask ^ ((cond_fields[i].bitmask + 1) >> 1)) -
	      ((cond_fields[i].bitmask + 1) >> 1);
	  *insn |= (mask & code_seq_cond[i].bitmask) << code_seq_cond[i].bitpos;
	}
      i++;
    }
}

static int
nds32_relax_branch_instructions (segT segment, fragS *fragP,
				 long stretch ATTRIBUTE_UNUSED,
				 int init)
{
  enum nds32_br_range branch_range_type;
  struct nds32_opcode *opcode = fragP->tc_frag_data.opcode;
  long offset = 0;
  enum nds32_br_range real_range_type;
  int adjust = 0;
  relax_info_t *relax_info;
  int diff = 0;
  int i, j, k;
  int code_seq_size;
  uint32_t *code_seq;
  uint32_t insn;
  int insn_size;
  int code_seq_offset;

  /* Replace with gas_assert (fragP->fr_symbol != NULL); */
  if (fragP->fr_symbol == NULL)
    return adjust;

  /* If frag_var is not enough room, the previous frag is fr_full and with
     opcode.  The new one is rs_dependent but without opcode.  */
  if (opcode == NULL)
    return adjust;

  /* Use U4G mode for b and bal in verbatim mode because lto may combine
     functions into a file.  And order the file in the last when linking.
     Once there is multiple definition, the same function will be kicked.
     This may cause relocation truncated error.  */
  if (verbatim && !nds32_pic
      && (strcmp (opcode->opcode, "j") == 0
	  || strcmp (opcode->opcode, "jal") == 0))
    {
      fragP->fr_subtype = BR_RANGE_U4G;
      if (init)
	return 8;
      else
	return 0;
    }

  relax_info = str_hash_find (nds32_relax_info_hash, opcode->opcode);

  if (relax_info == NULL)
    return adjust;

  if (init)
    {
      branch_range_type = relax_info->br_range;
      i = BR_RANGE_S256;
    }
  else
    {
      branch_range_type = fragP->fr_subtype;
      i = branch_range_type;
    }

  offset = nds32_calc_branch_offset (segment, fragP, stretch,
				     relax_info, branch_range_type);

  real_range_type = nds32_convert_to_range_type (offset);

  /* If actual range is equal to instruction jump range, do nothing.  */
  if (real_range_type == branch_range_type)
    {
      fragP->fr_subtype = real_range_type;
      return adjust;
    }

  /* Find out proper relaxation code sequence.  */
  for (; i < BR_RANGE_NUM; i++)
    {
      if (real_range_type <= (unsigned int) i)
	{
	  if (init)
	    diff = relax_info->relax_code_size[i] - opcode->isize;
	  else if (real_range_type < (unsigned int) i)
	    diff = relax_info->relax_code_size[real_range_type]
	      - relax_info->relax_code_size[branch_range_type];
	  else
	    diff = relax_info->relax_code_size[i]
	      - relax_info->relax_code_size[branch_range_type];

	  /* If the instruction could be converted to 16-bits,
	     minus the difference.  */
	  code_seq_offset = 0;
	  j = 0;
	  k = 0;
	  code_seq_size = relax_info->relax_code_size[i];
	  code_seq = relax_info->relax_code_seq[i];
	  while (code_seq_offset < code_seq_size)
	    {
	      insn = code_seq[j];
	      if (insn & 0x80000000) /* 16-bits instruction.  */
		{
		  insn_size = 2;
		}
	      else /* 32-bits instruction.  */
		{
		  insn_size = 4;

		  while (relax_info->relax_fixup[i][k].size !=0
			 && relax_info->relax_fixup[i][k].offset < code_seq_offset)
		    k++;
		}

	      code_seq_offset += insn_size;
	      j++;
	    }

	  /* Update fr_subtype to new NDS32_BR_RANGE.  */
	  fragP->fr_subtype = real_range_type;
	  break;
	}
    }

  return diff + adjust;
}

/* Adjust relaxable frag till current frag.  */

static int
nds32_adjust_relaxable_frag (fragS *startP, fragS *fragP)
{
  int adj;
  if (startP->tc_frag_data.flag & NDS32_FRAG_RELAXED)
    adj = -2;
  else
    adj = 2;

  startP->tc_frag_data.flag ^= NDS32_FRAG_RELAXED;

  while (startP)
    {
      startP = startP->fr_next;
      if (startP)
	{
	  startP->fr_address += adj;
	  if (startP == fragP)
	    break;
	}
    }
  return adj;
}

static addressT
nds32_get_align (addressT address, int align)
{
  addressT mask, new_address;

  mask = ~((addressT) (~0) << align);
  new_address = (address + mask) & (~mask);
  return (new_address - address);
}

/* Check the prev_frag is legal.  */
static void
invalid_prev_frag (fragS * fragP, fragS **prev_frag, bool relax)
{
  addressT address;
  fragS *frag_start = *prev_frag;

  if (!frag_start || !relax)
    return;

  if (frag_start->last_fr_address >= fragP->last_fr_address)
    {
      *prev_frag = NULL;
      return;
    }

  fragS *frag_t = *prev_frag;
  while (frag_t != fragP)
    {
      if (frag_t->fr_type == rs_align
	  || frag_t->fr_type == rs_align_code
	  || frag_t->fr_type == rs_align_test)
	{
	  /* Relax instruction can not walk across label.  */
	  if (frag_t->tc_frag_data.flag & NDS32_FRAG_LABEL)
	    {
	      prev_frag = NULL;
	      return;
	    }
	  /* Relax previous relaxable to align rs_align frag.  */
	  address = frag_t->fr_address + frag_t->fr_fix;
	  addressT offset = nds32_get_align (address, (int) frag_t->fr_offset);
	  if (offset & 0x2)
	    {
	      /* If there is label on the prev_frag, check if it is aligned.  */
	      if (!((*prev_frag)->tc_frag_data.flag & NDS32_FRAG_LABEL)
		  || (((*prev_frag)->fr_address + (*prev_frag)->fr_fix  - 2 )
		      & 0x2) == 0)
		nds32_adjust_relaxable_frag (*prev_frag, frag_t);
	    }
	  *prev_frag = NULL;
	  return;
	}
      frag_t = frag_t->fr_next;
    }

  if (fragP->tc_frag_data.flag & NDS32_FRAG_ALIGN)
    {
      address = fragP->fr_address;
      addressT offset = nds32_get_align (address, 2);
      if (offset & 0x2)
	{
	  /* If there is label on the prev_frag, check if it is aligned.  */
	  if (!((*prev_frag)->tc_frag_data.flag & NDS32_FRAG_LABEL)
	      || (((*prev_frag)->fr_address + (*prev_frag)->fr_fix  - 2 )
		  & 0x2) == 0)
	    nds32_adjust_relaxable_frag (*prev_frag, fragP);
	}
      *prev_frag = NULL;
      return;
    }
}

/* md_relax_frag  */

int
nds32_relax_frag (segT segment, fragS *fragP, long stretch ATTRIBUTE_UNUSED)
{
  /* Currently, there are two kinds of relaxation in nds32 assembler.
     1. relax for branch
     2. relax for 32-bits to 16-bits  */

  static fragS *prev_frag = NULL;
  int adjust = 0;

  invalid_prev_frag (fragP, &prev_frag, true);

  if (fragP->tc_frag_data.flag & NDS32_FRAG_BRANCH)
    adjust = nds32_relax_branch_instructions (segment, fragP, stretch, 0);
  if (fragP->tc_frag_data.flag & NDS32_FRAG_LABEL)
    prev_frag = NULL;
  if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXABLE
      && (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED) == 0)
    /* Here is considered relaxed case originally.  But it may cause
       an endless loop when relaxing.  Once the instruction is relaxed,
       it can not be undone.  */
    prev_frag = fragP;

  return adjust;
}

/* This function returns an initial guess of the length by which a fragment
   must grow to hold a branch to reach its destination.  Also updates
   fr_type/fr_subtype as necessary.

   It is called just before doing relaxation.  Any symbol that is now undefined
   will not become defined.  The guess for fr_var is ACTUALLY the growth beyond
   fr_fix.  Whatever we do to grow fr_fix or fr_var contributes to our returned
   value.  Although it may not be explicit in the frag, pretend fr_var starts
   with a 0 value.  */

int
md_estimate_size_before_relax (fragS *fragP, segT segment)
{
  /* Currently, there are two kinds of relaxation in nds32 assembler.
     1. relax for branch
     2. relax for 32-bits to 16-bits  */

  /* Save previous relaxable frag.  */
  static fragS *prev_frag = NULL;
  int adjust = 0;

  invalid_prev_frag (fragP, &prev_frag, false);

  if (fragP->tc_frag_data.flag & NDS32_FRAG_BRANCH)
    adjust = nds32_relax_branch_instructions (segment, fragP, 0, 1);
  if (fragP->tc_frag_data.flag & NDS32_FRAG_LABEL)
    prev_frag = NULL;
  if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED)
    adjust = 2;
  else if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXABLE)
    prev_frag = fragP;

  return adjust;
}

/* GAS will call this for each rs_machine_dependent fragment.  The instruction
   is completed using the data from the relaxation pass.  It may also create any
   necessary relocations.

   *FRAGP has been relaxed to its final size, and now needs to have the bytes
   inside it modified to conform to the new size.  It is called after relaxation
   is finished.

   fragP->fr_type == rs_machine_dependent.
   fragP->fr_subtype is the subtype of what the address relaxed to.  */

void
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragP)
{
  /* Convert branch relaxation instructions.  */
  symbolS *branch_symbol = fragP->fr_symbol;
  offsetT branch_offset = fragP->fr_offset;
  enum nds32_br_range branch_range_type = fragP->fr_subtype;
  struct nds32_opcode *opcode = fragP->tc_frag_data.opcode;
  uint32_t origin_insn = fragP->tc_frag_data.insn;
  relax_info_t *relax_info;
  char *fr_buffer;
  int fr_where;
  int addend ATTRIBUTE_UNUSED;
  offsetT branch_target_address, branch_insn_address;
  expressionS exp;
  fixS *fixP;
  uint32_t *code_seq;
  uint32_t insn;
  int code_size, insn_size, offset, fixup_size;
  int buf_offset, pcrel;
  int i, k;
  uint16_t insn_16;
  nds32_relax_fixup_info_t fixup_info[MAX_RELAX_FIX];
  /* Save the 1st instruction is converted to 16 bit or not.  */
  unsigned int branch_size;
  enum bfd_reloc_code_real final_r_type;

  /* Replace with gas_assert (branch_symbol != NULL); */
  if (branch_symbol == NULL && !(fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED))
    return;

  /* If frag_var is not enough room, the previous frag is fr_full and with
     opcode.  The new one is rs_dependent but without opcode.  */
  if (opcode == NULL)
    return;

  if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXABLE_BRANCH)
    {
      relax_info = str_hash_find (nds32_relax_info_hash, opcode->opcode);

      if (relax_info == NULL)
	return;

      i = BR_RANGE_S256;
      while (i < BR_RANGE_NUM
	     && relax_info->relax_code_size[i]
	     != (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED ? 4 : 2))
	i++;

      if (i >= BR_RANGE_NUM)
	as_bad ("Internal error: Cannot find relocation of"
		"relaxable branch.");

      exp.X_op = O_symbol;
      exp.X_add_symbol = branch_symbol;
      exp.X_add_number = branch_offset;
      pcrel = ((relax_info->relax_fixup[i][0].ramp & NDS32_PCREL) != 0) ? 1 : 0;
      fr_where = fragP->fr_fix - 2;
      fixP = fix_new_exp (fragP, fr_where, relax_info->relax_fixup[i][0].size,
			  &exp, pcrel, relax_info->relax_fixup[i][0].r_type);
      fixP->fx_addnumber = fixP->fx_offset;

      if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED)
	{
	  insn_16 = fragP->tc_frag_data.insn;
	  bfd_elf_nds32_convert_16_to_32 (stdoutput, insn_16, &insn);
	  fr_buffer = fragP->fr_literal + fr_where;
	  fragP->fr_fix += 2;
	  exp.X_op = O_symbol;
	  exp.X_add_symbol = abs_section_sym;
	  exp.X_add_number = 0;
	  fix_new_exp (fragP, fr_where, 4,
		       &exp, 0, BFD_RELOC_NDS32_INSN16);
	  number_to_chars_bigendian (fr_buffer, insn, 4);
	}
    }
  else if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED)
    {
      if (fragP->tc_frag_data.opcode->isize == 2)
	{
	  insn_16 = fragP->tc_frag_data.insn;
	  bfd_elf_nds32_convert_16_to_32 (stdoutput, insn_16, &insn);
	}
      else
	insn = fragP->tc_frag_data.insn;
      fragP->fr_fix += 2;
      fr_where = fragP->fr_fix - 4;
      fr_buffer = fragP->fr_literal + fr_where;
      exp.X_op = O_symbol;
      exp.X_add_symbol = abs_section_sym;
      exp.X_add_number = 0;
      fix_new_exp (fragP, fr_where, 4, &exp, 0,
		   BFD_RELOC_NDS32_INSN16);
      number_to_chars_bigendian (fr_buffer, insn, 4);
    }
  else if (fragP->tc_frag_data.flag & NDS32_FRAG_BRANCH)
    {
      /* Branch instruction adjust and append relocations.  */
      relax_info = str_hash_find (nds32_relax_info_hash, opcode->opcode);

      if (relax_info == NULL)
	return;

      fr_where = fragP->fr_fix - opcode->isize;
      fr_buffer = fragP->fr_literal + fr_where;

      if ((S_GET_SEGMENT (branch_symbol) != sec)
	  || S_IS_WEAK (branch_symbol))
	{
	  if (fragP->fr_offset & 3)
	    as_warn (_("Addend to unresolved symbol is not on word boundary."));
	  addend = 0;
	}
      else
	{
	  /* Calculate symbol-to-instruction offset.  */
	  branch_target_address = S_GET_VALUE (branch_symbol) + branch_offset;
	  branch_insn_address = fragP->fr_address + fr_where;
	  addend = (branch_target_address - branch_insn_address) >> 1;
	}

      code_size = relax_info->relax_code_size[branch_range_type];
      code_seq = relax_info->relax_code_seq[branch_range_type];

      memcpy (fixup_info, relax_info->relax_fixup[branch_range_type],
	      sizeof (fixup_info));

      /* Fill in frag.  */
      i = 0;
      k = 0;
      offset = 0; /* code_seq offset */
      buf_offset = 0; /* fr_buffer offset */
      while (offset < code_size)
	{
	  insn = code_seq[i];
	  if (insn & 0x80000000) /* 16-bits instruction.  */
	    {
	      insn = (insn >> 16) & 0xFFFF;
	      insn_size = 2;
	    }
	  else /* 32-bits instruction.  */
	    {
	      insn_size = 4;
	    }

	  nds32_elf_get_set_cond (relax_info, offset, &insn,
				  origin_insn, branch_range_type);

	  /* Try to convert to 16-bits instruction.  Currently, only the first
	     instruction in pattern can be converted.  EX: bnez sethi ori jr,
	     only bnez can be converted to 16 bit and ori can't.  */

	  while (fixup_info[k].size != 0
		 && relax_info->relax_fixup[branch_range_type][k].offset < offset)
	    k++;

	  number_to_chars_bigendian (fr_buffer + buf_offset, insn, insn_size);
	  buf_offset += insn_size;

	  offset += insn_size;
	  i++;
	}

      /* Set up fixup.  */
      exp.X_op = O_symbol;

      for (i = 0; fixup_info[i].size != 0; i++)
	{
	  fixup_size = fixup_info[i].size;
	  pcrel = ((fixup_info[i].ramp & NDS32_PCREL) != 0) ? 1 : 0;

	  if ((fixup_info[i].ramp & NDS32_CREATE_LABEL) != 0)
	    {
	      /* This is a reverse branch.  */
	      exp.X_add_symbol = symbol_temp_new (sec, fragP->fr_next, 0);
	      exp.X_add_number = 0;
	    }
	  else if ((fixup_info[i].ramp & NDS32_PTR) != 0)
	    {
	      /* This relocation has to point to another instruction.  */
	      branch_size = fr_where + code_size - 4;
	      exp.X_add_symbol = symbol_temp_new (sec, fragP, branch_size);
	      exp.X_add_number = 0;
	    }
	  else if ((fixup_info[i].ramp & NDS32_ABS) != 0)
	    {
	      /* This is a tag relocation.  */
	      exp.X_add_symbol = abs_section_sym;
	      exp.X_add_number = 0;
	    }
	  else if ((fixup_info[i].ramp & NDS32_INSN16) != 0)
	    {
	      if (!enable_16bit)
		continue;
	      /* This is a tag relocation.  */
	      exp.X_add_symbol = abs_section_sym;
	      exp.X_add_number = 0;
	    }
	  else
	    {
	      exp.X_add_symbol = branch_symbol;
	      exp.X_add_number = branch_offset;
	    }

	  if (fixup_info[i].r_type != 0)
	    {
	      final_r_type = fixup_info[i].r_type;
	      fixP = fix_new_exp (fragP, fr_where + fixup_info[i].offset,
				  fixup_size, &exp, pcrel,
				  final_r_type);
	      fixP->fx_addnumber = fixP->fx_offset;
	    }
	}

      fragP->fr_fix = fr_where + buf_offset;
    }
}

/* tc_frob_file_before_fix  */

void
nds32_frob_file_before_fix (void)
{
}

static bool
nds32_relaxable_section (asection *sec)
{
  return ((sec->flags & SEC_DEBUGGING) == 0
	  && strcmp (sec->name, ".eh_frame") != 0);
}

/* TC_FORCE_RELOCATION */
int
nds32_force_relocation (fixS * fix)
{
  switch (fix->fx_r_type)
    {
    case BFD_RELOC_NDS32_INSN16:
    case BFD_RELOC_NDS32_LABEL:
    case BFD_RELOC_NDS32_LONGCALL1:
    case BFD_RELOC_NDS32_LONGCALL2:
    case BFD_RELOC_NDS32_LONGCALL3:
    case BFD_RELOC_NDS32_LONGJUMP1:
    case BFD_RELOC_NDS32_LONGJUMP2:
    case BFD_RELOC_NDS32_LONGJUMP3:
    case BFD_RELOC_NDS32_LOADSTORE:
    case BFD_RELOC_NDS32_9_FIXED:
    case BFD_RELOC_NDS32_15_FIXED:
    case BFD_RELOC_NDS32_17_FIXED:
    case BFD_RELOC_NDS32_25_FIXED:
    case BFD_RELOC_NDS32_9_PCREL:
    case BFD_RELOC_NDS32_15_PCREL:
    case BFD_RELOC_NDS32_17_PCREL:
    case BFD_RELOC_NDS32_WORD_9_PCREL:
    case BFD_RELOC_NDS32_10_UPCREL:
    case BFD_RELOC_NDS32_25_PCREL:
    case BFD_RELOC_NDS32_MINUEND:
    case BFD_RELOC_NDS32_SUBTRAHEND:
      return 1;

    case BFD_RELOC_8:
    case BFD_RELOC_16:
    case BFD_RELOC_32:
    case BFD_RELOC_NDS32_DIFF_ULEB128:
      /* Linker should handle difference between two symbol.  */
      return fix->fx_subsy != NULL
	&& nds32_relaxable_section (S_GET_SEGMENT (fix->fx_addsy));
    case BFD_RELOC_64:
      if (fix->fx_subsy)
	as_bad ("Double word for difference between two symbols "
		"is not supported across relaxation.");
    default:
      ;
    }

  if (generic_force_reloc (fix))
    return 1;

  return fix->fx_pcrel;
}

/* TC_VALIDATE_FIX_SUB  */

int
nds32_validate_fix_sub (fixS *fix, segT add_symbol_segment)
{
  segT sub_symbol_segment;

  /* This code is referred from Xtensa.  Check their implementation for
     details.  */

  /* Make sure both symbols are in the same segment, and that segment is
     "normal" and relaxable.  */
  sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
  return (sub_symbol_segment == add_symbol_segment
	  && add_symbol_segment != undefined_section);
}

void
md_number_to_chars (char *buf, valueT val, int n)
{
  if (target_big_endian)
    number_to_chars_bigendian (buf, val, n);
  else
    number_to_chars_littleendian (buf, val, n);
}

/* This function is called to convert an ASCII string into a floating point
   value in format used by the CPU.  */

const char *
md_atof (int type, char *litP, int *sizeP)
{
  int i;
  int prec;
  LITTLENUM_TYPE words[MAX_LITTLENUMS];
  char *t;

  switch (type)
    {
    case 'f':
    case 'F':
    case 's':
    case 'S':
      prec = 2;
      break;
    case 'd':
    case 'D':
    case 'r':
    case 'R':
      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 * sizeof (LITTLENUM_TYPE);

  if (target_big_endian)
    {
      for (i = 0; i < prec; i++)
	{
	  md_number_to_chars (litP, words[i], sizeof (LITTLENUM_TYPE));
	  litP += sizeof (LITTLENUM_TYPE);
	}
    }
  else
    {
      for (i = prec - 1; i >= 0; i--)
	{
	  md_number_to_chars (litP, words[i], sizeof (LITTLENUM_TYPE));
	  litP += sizeof (LITTLENUM_TYPE);
	}
    }

  return 0;
}

/* md_elf_section_change_hook  */

void
nds32_elf_section_change_hook (void)
{
}

/* md_cleanup  */

void
nds32_cleanup (void)
{
}

/* This function is used to scan leb128 subtraction expressions,
   and insert fixups for them.

      e.g., .leb128  .L1 - .L0

   These expressions are heavily used in debug information or
   exception tables.  Because relaxation will change code size,
   we must resolve them in link time.  */

static void
nds32_insert_leb128_fixes (bfd *abfd ATTRIBUTE_UNUSED,
			   asection *sec, void *xxx ATTRIBUTE_UNUSED)
{
  segment_info_type *seginfo = seg_info (sec);
  struct frag *fragP;

  subseg_set (sec, 0);

  for (fragP = seginfo->frchainP->frch_root;
       fragP; fragP = fragP->fr_next)
    {
      expressionS *exp;

      /* Only unsigned leb128 can be handle.  */
      if (fragP->fr_type != rs_leb128 || fragP->fr_subtype != 0
	  || fragP->fr_symbol == NULL)
	continue;

      exp = symbol_get_value_expression (fragP->fr_symbol);

      if (exp->X_op != O_subtract)
	continue;

      fix_new_exp (fragP, fragP->fr_fix, 0,
		   exp, 0, BFD_RELOC_NDS32_DIFF_ULEB128);
    }
}

static void
nds32_insert_relax_entry (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
			  void *xxx ATTRIBUTE_UNUSED)
{
  segment_info_type *seginfo;
  fragS *fragP;
  fixS *fixP;
  expressionS exp;
  fixS *fixp;

  seginfo = seg_info (sec);
  if (!seginfo || !symbol_rootP || !subseg_text_p (sec) || sec->size == 0)
    return;

  for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
    if (!fixp->fx_done)
      break;

  if (!fixp && !verbatim && ict_flag == ICT_NONE)
    return;

  subseg_change (sec, 0);

  /* Set RELAX_ENTRY flags for linker.  */
  fragP = seginfo->frchainP->frch_root;
  exp.X_op = O_symbol;
  exp.X_add_symbol = abs_section_sym;
  exp.X_add_number = 0;
  if (!enable_relax_relocs)
    exp.X_add_number |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
  else
    {
      /* These flags are only enabled when global relax is enabled.
	 Maybe we can check DISABLE_RELAX_FLAG at link-time,
	 so we set them anyway.  */
      if (verbatim)
	exp.X_add_number |= R_NDS32_RELAX_ENTRY_VERBATIM_FLAG;
      if (ict_flag == ICT_SMALL)
	exp.X_add_number |= R_NDS32_RELAX_ENTRY_ICT_SMALL;
      else if (ict_flag == ICT_LARGE)
	exp.X_add_number |= R_NDS32_RELAX_ENTRY_ICT_LARGE;
    }
  if (optimize)
    exp.X_add_number |= R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG;
  if (optimize_for_space)
    exp.X_add_number |= R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG;

  fixP = fix_new_exp (fragP, 0, 0, &exp, 0, BFD_RELOC_NDS32_RELAX_ENTRY);
  fixP->fx_no_overflow = 1;
}

/* Analysis relax hint and insert suitable relocation pattern.  */

static void
nds32_elf_analysis_relax_hint (void)
{
  htab_traverse_noresize (nds32_hint_hash,
			  nds32_elf_append_relax_relocs_traverse, NULL);
}

static void
nds32_elf_insert_final_frag (void)
{
  struct frchain *frchainP;
  asection *s;
  fragS *fragP;

  if (!optimize)
    return;

  for (s = stdoutput->sections; s; s = s->next)
    {
      segment_info_type *seginfo = seg_info (s);
      if (!seginfo)
	continue;

      for (frchainP = seginfo->frchainP; frchainP != NULL;
	   frchainP = frchainP->frch_next)
	{
	  subseg_set (s, frchainP->frch_subseg);

	  if (subseg_text_p (now_seg))
	    {
	      fragP = frag_now;
	      frag_var (rs_machine_dependent, 2, /* Max size.  */
			0, /* VAR is un-used.  */ 0, NULL, 0, NULL);
	      fragP->tc_frag_data.flag |= NDS32_FRAG_FINAL;
	    }
	}
    }
}

void
md_finish (void)
{
  nds32_elf_insert_final_frag ();
  nds32_elf_analysis_relax_hint ();
  bfd_map_over_sections (stdoutput, nds32_insert_leb128_fixes, NULL);
}

/* Implement md_allow_local_subtract.  */

bool
nds32_allow_local_subtract (expressionS *expr_l ATTRIBUTE_UNUSED,
			    expressionS *expr_r ATTRIBUTE_UNUSED,
			    segT sec ATTRIBUTE_UNUSED)
{
  /* Don't allow any subtraction, because relax may change the code.  */
  return false;
}

long
nds32_pcrel_from_section (fixS *fixP, segT sec ATTRIBUTE_UNUSED)
{
  if (fixP->fx_addsy == NULL || !S_IS_DEFINED (fixP->fx_addsy)
      || S_IS_EXTERNAL (fixP->fx_addsy) || S_IS_WEAK (fixP->fx_addsy))
    {
      /* Let linker resolve undefined symbols.  */
      return 0;
    }

  return fixP->fx_frag->fr_address + fixP->fx_where;
}

/* md_post_relax_hook ()
   Insert relax entry relocation into sections.  */

void
nds32_post_relax_hook (void)
{
  bfd_map_over_sections (stdoutput, nds32_insert_relax_entry, NULL);
}

/* tc_fix_adjustable ()

   Return whether this symbol (fixup) can be replaced with
   section symbols.  */

bool
nds32_fix_adjustable (fixS *fixP)
{
  switch (fixP->fx_r_type)
    {
    case BFD_RELOC_NDS32_WORD_9_PCREL:
    case BFD_RELOC_NDS32_9_PCREL:
    case BFD_RELOC_NDS32_15_PCREL:
    case BFD_RELOC_NDS32_17_PCREL:
    case BFD_RELOC_NDS32_25_PCREL:
    case BFD_RELOC_NDS32_HI20:
    case BFD_RELOC_NDS32_LO12S0:
    case BFD_RELOC_8:
    case BFD_RELOC_16:
    case BFD_RELOC_32:
    case BFD_RELOC_NDS32_PTR:
    case BFD_RELOC_NDS32_LONGCALL4:
    case BFD_RELOC_NDS32_LONGCALL5:
    case BFD_RELOC_NDS32_LONGCALL6:
    case BFD_RELOC_NDS32_LONGJUMP4:
    case BFD_RELOC_NDS32_LONGJUMP5:
    case BFD_RELOC_NDS32_LONGJUMP6:
    case BFD_RELOC_NDS32_LONGJUMP7:
      return 1;
    default:
      return 0;
    }
}

/* elf_tc_final_processing  */

void
elf_nds32_final_processing (void)
{
  /* An FPU_COM instruction is found without previous non-FPU_COM
     instruction.  */
  if (nds32_fpu_com
      && !(nds32_elf_flags & (E_NDS32_HAS_FPU_INST | E_NDS32_HAS_FPU_DP_INST)))
    {
      /* Since only FPU_COM instructions are used and no other FPU instructions
	 are used.  The nds32_elf_flags will be decided by the enabled options
	 by command line or default configuration.  */
      if (nds32_fpu_dp_ext || nds32_fpu_sp_ext)
	{
	  nds32_elf_flags |= nds32_fpu_dp_ext ? E_NDS32_HAS_FPU_DP_INST : 0;
	  nds32_elf_flags |= nds32_fpu_sp_ext ? E_NDS32_HAS_FPU_INST : 0;
	}
      else
	{
	  /* Should never here.  */
	  as_bad (_("Used FPU instructions requires enabling FPU extension"));
	}
    }

  if (nds32_elf_flags & (E_NDS32_HAS_FPU_INST | E_NDS32_HAS_FPU_DP_INST))
    {
      /* Single/double FPU has been used, set FPU register config.  */
      /* We did not check the actual number of register used.  We may
	 want to do it while assemble.  */
      nds32_elf_flags &= ~E_NDS32_FPU_REG_CONF;
      nds32_elf_flags |= (nds32_freg << E_NDS32_FPU_REG_CONF_SHIFT);
    }

  if (nds32_pic)
    nds32_elf_flags |= E_NDS32_HAS_PIC;

  if (nds32_gpr16)
    nds32_elf_flags |= E_NDS32_HAS_REDUCED_REGS;

  nds32_elf_flags |= (E_NDS32_ELF_VER_1_4 | nds32_abi);
  elf_elfheader (stdoutput)->e_flags |= nds32_elf_flags;
}

/* Implement md_apply_fix.  Apply the fix-up or transform the fix-up for
   later relocation generation.  */

void
nds32_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
{
  char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
  bfd_vma value = *valP;

  if (fixP->fx_r_type < BFD_RELOC_UNUSED
      && fixP->fx_r_type > BFD_RELOC_NONE
      && fixP->fx_r_type != BFD_RELOC_NDS32_DIFF_ULEB128)
    {
      /* In our old nds32 binutils, it must convert relocations which is
	 generated by CGEN.  However, it does not have to consider this anymore.
	 In current, it only deal with data relocations which enum
	 is smaller than BFD_RELOC_NONE and BFD_RELOC_NDS32_DIFF_ULEB128.
	 It is believed that we can construct a better mechanism to
	 deal with the whole relocation issue in nds32 target
	 without using CGEN.  */
      fixP->fx_addnumber = value;
      fixP->tc_fix_data = NULL;

      /* Transform specific relocations here for later relocation generation.
	 Tag tls data for linker.  */
      switch (fixP->fx_r_type)
	{
	case BFD_RELOC_NDS32_DATA:
	  /* This reloc is obselete, we do not need it so far.  */
	  fixP->fx_done = 1;
	  break;
	case BFD_RELOC_NDS32_TPOFF:
	case BFD_RELOC_NDS32_TLS_LE_HI20:
	case BFD_RELOC_NDS32_TLS_LE_LO12:
	case BFD_RELOC_NDS32_TLS_LE_ADD:
	case BFD_RELOC_NDS32_TLS_LE_LS:
	case BFD_RELOC_NDS32_GOTTPOFF:
	case BFD_RELOC_NDS32_TLS_IE_HI20:
	case BFD_RELOC_NDS32_TLS_IE_LO12S2:
	case BFD_RELOC_NDS32_TLS_DESC_HI20:
	case BFD_RELOC_NDS32_TLS_DESC_LO12:
	case BFD_RELOC_NDS32_TLS_IE_LO12:
	case BFD_RELOC_NDS32_TLS_IEGP_HI20:
	case BFD_RELOC_NDS32_TLS_IEGP_LO12:
	case BFD_RELOC_NDS32_TLS_IEGP_LO12S2:
	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
	  break;
	default:
	  break;
	}
      return;
    }

  if (fixP->fx_addsy == NULL)
    fixP->fx_done = 1;

  if (fixP->fx_subsy != NULL)
    {
      /* HOW DIFF RELOCATION WORKS.

	 First of all, this relocation is used to calculate the distance
	 between two symbols in the SAME section.  It is used for  jump-
	 table, debug information, exception table, et al.    Therefore,
	 it is a unsigned positive value.   It is NOT used for  general-
	 purpose arithmetic.

	 Consider this example,  the distance between  .LEND and .LBEGIN
	 is stored at the address of foo.

	 ---- >8 ---- >8 ---- >8 ---- >8 ----
	  .data
	  foo:
	    .word	.LBEGIN - .LEND

	  .text
	     [before]
	  .LBEGIN
			 \
	     [between]    distance
			 /
	  .LEND
	     [after]
	 ---- 8< ---- 8< ---- 8< ---- 8< ----

	 We use a single relocation entry for this expression.
	 * The initial distance value is stored directly in that location
	   specified by r_offset (i.e., foo in this example.)
	 * The begin of the region, i.e., .LBEGIN, is specified by
	   r_info/R_SYM and r_addend, e.g., .text + 0x32.
	 * The end of region, i.e., .LEND, is represented by
	   .LBEGIN + distance instead of .LEND, so we only need
	   a single relocation entry instead of two.

	 When an instruction is relaxed, we adjust the relocation entry
	 depending on where the instruction locates.    There are three
	 cases, before, after and between the region.
	 * between: Distance value is read from r_offset,  adjusted and
	   written back into r_offset.
	 * before: Only r_addend is adjust.
	 * after: We don't care about it.

	 Hereby, there are some limitation.

	 `(.LEND - 1) - .LBEGIN' and `(.LEND - .LBEGIN) - 1'
	 are semantically different, and we cannot handle latter case
	 when relaxation.

	 The latter expression means subtracting 1 from the distance
	 between .LEND and .LBEGIN.  And the former expression means
	 the distance between (.LEND - 1) and .LBEGIN.

	 The nuance affects whether to adjust distance value when relax
	 an instruction.  In another words, whether the instruction
	 locates in the region.  Because we use a single relocation entry,
	 there is no field left for .LEND and the subtrahend.

	 Since GCC-4.5, GCC may produce debug information in such expression
	     .long  .L1-1-.L0
	 in order to describe register clobbering during an function-call.
	     .L0:
		call foo
	     .L1:

	 Check http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01317.html
	 for details.  */

      value -= S_GET_VALUE (fixP->fx_subsy);
      *valP = value;
      fixP->fx_subsy = NULL;
      fixP->fx_offset -= value;

      switch (fixP->fx_r_type)
	{
	case BFD_RELOC_8:
	  fixP->fx_r_type = BFD_RELOC_NDS32_DIFF8;
	  md_number_to_chars (where, value, 1);
	  break;
	case BFD_RELOC_16:
	  fixP->fx_r_type = BFD_RELOC_NDS32_DIFF16;
	  md_number_to_chars (where, value, 2);
	  break;
	case BFD_RELOC_32:
	  fixP->fx_r_type = BFD_RELOC_NDS32_DIFF32;
	  md_number_to_chars (where, value, 4);
	  break;
	case BFD_RELOC_NDS32_DIFF_ULEB128:
	  /* cvt_frag_to_fill () has called output_leb128 () for us.  */
	  break;
	default:
	  as_bad_subtract (fixP);
	  return;
	}
    }
  else if (fixP->fx_done)
    {
      /* We're finished with this fixup.  Install it because
	 bfd_install_relocation won't be called to do it.  */
      switch (fixP->fx_r_type)
	{
	case BFD_RELOC_8:
	  md_number_to_chars (where, value, 1);
	  break;
	case BFD_RELOC_16:
	  md_number_to_chars (where, value, 2);
	  break;
	case BFD_RELOC_32:
	  md_number_to_chars (where, value, 4);
	  break;
	case BFD_RELOC_64:
	  md_number_to_chars (where, value, 8);
	  break;
	default:
	  as_bad_where (fixP->fx_file, fixP->fx_line,
			_("Internal error: Unknown fixup type %d (`%s')"),
			fixP->fx_r_type,
			bfd_get_reloc_code_name (fixP->fx_r_type));
	  break;
	}
    }
}

/* Implement tc_gen_reloc.  Generate ELF relocation for a fix-up.  */

arelent *
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
{
  arelent *reloc;
  bfd_reloc_code_real_type code;

  reloc = notes_alloc (sizeof (arelent));
  reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *));
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
  reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;

  code = fixP->fx_r_type;

  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
  if (reloc->howto == NULL)
    {
      as_bad_where (fixP->fx_file, fixP->fx_line,
		    _("internal error: can't export reloc type %d (`%s')"),
		    fixP->fx_r_type, bfd_get_reloc_code_name (code));
      return NULL;
    }

  /* Add relocation handling here.  */

  switch (fixP->fx_r_type)
    {
    default:
      /* In general, addend of a relocation is the offset to the
	 associated symbol.  */
      reloc->addend = fixP->fx_offset;
      break;

    case BFD_RELOC_NDS32_DATA:
      /* Prevent linker from optimizing data in text sections.
	 For example, jump table.  */
      reloc->addend = fixP->fx_size;
      break;
    }

  return reloc;
}

static struct suffix_name suffix_table[] =
{
  {"GOTOFF",	BFD_RELOC_NDS32_GOTOFF},
  {"GOT",	BFD_RELOC_NDS32_GOT20},
  {"TPOFF",	BFD_RELOC_NDS32_TPOFF},
  {"PLT",	BFD_RELOC_NDS32_25_PLTREL},
  {"GOTTPOFF",	BFD_RELOC_NDS32_GOTTPOFF},
  {"TLSDESC",  BFD_RELOC_NDS32_TLS_DESC},
};

/* Implement md_parse_name.  */

int
nds32_parse_name (char const *name, expressionS *exprP,
		  enum expr_mode mode ATTRIBUTE_UNUSED,
		  char *nextcharP ATTRIBUTE_UNUSED)
{
  segT segment;

  exprP->X_op_symbol = NULL;
  exprP->X_md = BFD_RELOC_UNUSED;

  exprP->X_add_symbol = symbol_find_or_make (name);
  exprP->X_op = O_symbol;
  exprP->X_add_number = 0;

  /* Check the special name if a symbol.  */
  segment = S_GET_SEGMENT (exprP->X_add_symbol);
  if ((segment != undefined_section) && (*nextcharP != '@'))
    return 0;

  if (strcmp (name, GOT_NAME) == 0 && *nextcharP != '@')
    {
      /* Set for _GOT_OFFSET_TABLE_.  */
      exprP->X_md = BFD_RELOC_NDS32_GOTPC20;
    }
  else if (*nextcharP == '@')
    {
      size_t i;
      char *next;
      for (i = 0; i < ARRAY_SIZE (suffix_table); i++)
	{
	  next = input_line_pointer + 1 + strlen (suffix_table[i].suffix);
	  if (strncasecmp (input_line_pointer + 1, suffix_table[i].suffix,
			   strlen (suffix_table[i].suffix)) == 0
	      && !is_part_of_name (*next))
	    {
	      exprP->X_md = suffix_table[i].reloc;
	      *input_line_pointer = *nextcharP;
	      input_line_pointer = next;
	      *nextcharP = *input_line_pointer;
	      *input_line_pointer = '\0';
	      break;
	    }
	}
    }

  return 1;
}

/* Implement tc_regname_to_dw2regnum.  */

int
tc_nds32_regname_to_dw2regnum (char *regname)
{
  struct nds32_keyword *sym = str_hash_find (nds32_gprs_hash, regname);

  if (!sym)
    return -1;

  return sym->value;
}

void
tc_nds32_frame_initial_instructions (void)
{
  /* CIE */
  /* Default cfa is register-31/sp.  */
  cfi_add_CFA_def_cfa (31, 0);
}
