Home | History | Annotate | Download | only in opcodes
      1 /* NDS32-specific support for 32-bit ELF.
      2    Copyright (C) 2012-2014 Free Software Foundation, Inc.
      3    Contributed by Andes Technology Corporation.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     20    02110-1301, USA.  */
     21 
     22 #include "sysdep.h"
     23 #include <stdio.h>
     24 #include "ansidecl.h"
     25 #include "dis-asm.h"
     26 #include "bfd.h"
     27 #include "symcat.h"
     28 #include "libiberty.h"
     29 #include "opintl.h"
     30 #include "bfd_stdint.h"
     31 #include "hashtab.h"
     32 #include "nds32-asm.h"
     33 #include "opcode/nds32.h"
     34 
     35 /* Get fields macro define.  */
     36 #define MASK_OP(insn, mask)	((insn) & (0x3f << 25 | (mask)))
     37 
     38 /* Default text to print if an instruction isn't recognized.  */
     39 #define UNKNOWN_INSN_MSG _("*unknown*")
     40 #define NDS32_PARSE_INSN16      0x01
     41 #define NDS32_PARSE_INSN32      0x02
     42 #define NDS32_PARSE_EX9IT       0x04
     43 #define NDS32_PARSE_EX9TAB      0x08
     44 
     45 extern struct nds32_opcode nds32_opcodes[];
     46 extern const field_t operand_fields[];
     47 extern const keyword_t *keywords[];
     48 extern const keyword_t keyword_gpr[];
     49 static void print_insn16 (bfd_vma pc, disassemble_info *info,
     50 			  uint32_t insn, uint32_t parse_mode);
     51 static void print_insn32 (bfd_vma pc, disassemble_info *info, uint32_t insn,
     52 			  uint32_t parse_mode);
     53 static uint32_t nds32_mask_opcode (uint32_t);
     54 static void nds32_special_opcode (uint32_t, struct nds32_opcode **);
     55 
     56 /* define in objdump.c.  */
     57 struct objdump_disasm_info
     58 {
     59   bfd *              abfd;
     60   asection *         sec;
     61   bfd_boolean        require_sec;
     62   arelent **         dynrelbuf;
     63   long               dynrelcount;
     64   disassembler_ftype disassemble_fn;
     65   arelent *          reloc;
     66 };
     67 
     68 /* file_ptr    ex9_filepos=NULL;.  */
     69 bfd_byte *ex9_data = NULL;
     70 int ex9_ready = 0, ex9_base_offset = 0;
     71 
     72 /* Hash function for disassemble.  */
     73 
     74 static htab_t opcode_htab;
     75 
     76 static void
     77 nds32_ex9_info (bfd_vma pc ATTRIBUTE_UNUSED,
     78 		disassemble_info *info, uint32_t ex9_index)
     79 {
     80   uint32_t insn;
     81   static asymbol *itb = NULL;
     82   bfd_byte buffer[4];
     83   long unsigned int isec_vma;
     84 
     85   /* Lookup itb symbol.  */
     86   if (!itb)
     87     {
     88       int i;
     89 
     90       for (i = 0; i < info->symtab_size; i++)
     91 	if (bfd_asymbol_name (info->symtab[i])
     92 	    && (strcmp (bfd_asymbol_name (info->symtab[i]), "$_ITB_BASE_") == 0
     93 		|| strcmp (bfd_asymbol_name (info->symtab[i]),
     94 			   "_ITB_BASE_") == 0))
     95 	  {
     96 	    itb = info->symtab[i];
     97 	    break;
     98 	  }
     99 
    100       /* Lookup it only once, in case _ITB_BASE_ doesn't exist at all.  */
    101       if (itb == NULL)
    102 	itb = (void *) -1;
    103     }
    104 
    105   if (itb == (void *) -1)
    106     return;
    107 
    108   isec_vma = itb->section->vma;
    109   isec_vma = itb->section->vma - bfd_asymbol_value (itb);
    110   if (!itb->section || !itb->section->owner)
    111     return;
    112   bfd_get_section_contents (itb->section->owner, itb->section, buffer,
    113 			    ex9_index * 4 - isec_vma, 4);
    114   insn = bfd_getb32 (buffer);
    115   /* 16-bit instructions in ex9 table.  */
    116   if (insn & 0x80000000)
    117     print_insn16 (pc, info, (insn & 0x0000FFFF),
    118 		  NDS32_PARSE_INSN16 | NDS32_PARSE_EX9IT);
    119   /* 32-bit instructions in ex9 table.  */
    120   else
    121     print_insn32 (pc, info, insn, NDS32_PARSE_INSN32 | NDS32_PARSE_EX9IT);
    122 }
    123 
    124 /* Find the value map register name.  */
    125 
    126 static keyword_t *
    127 nds32_find_reg_keyword (keyword_t *reg, int value)
    128 {
    129   if (!reg)
    130     return NULL;
    131 
    132   while (reg->name != NULL && reg->value != value)
    133     {
    134       reg++;
    135     }
    136   if (reg->name == NULL)
    137     return NULL;
    138   return reg;
    139 }
    140 
    141 static void
    142 nds32_parse_audio_ext (const field_t *pfd,
    143 		       disassemble_info *info, uint32_t insn)
    144 {
    145   fprintf_ftype func = info->fprintf_func;
    146   void *stream = info->stream;
    147   keyword_t *psys_reg;
    148   int int_value, new_value;
    149 
    150   if (pfd->hw_res == HW_INT || pfd->hw_res == HW_UINT)
    151     {
    152       if (pfd->hw_res == HW_INT)
    153 	int_value =
    154 	  N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
    155       else
    156 	int_value = __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    157 
    158       if (int_value < 0)
    159 	func (stream, "#%d", int_value);
    160       else
    161 	func (stream, "#0x%x", int_value);
    162       return;
    163     }
    164   int_value =
    165     __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    166   new_value = int_value;
    167   psys_reg = (keyword_t*) keywords[pfd->hw_res];
    168 
    169   /* p = bit[4].bit[1:0], r = bit[4].bit[3:2].  */
    170   if (strcmp (pfd->name, "im5_i") == 0)
    171     {
    172       new_value = int_value & 0x03;
    173       new_value |= ((int_value & 0x10) >> 2);
    174     }
    175   else if (strcmp (pfd->name, "im5_m") == 0)
    176     {
    177       new_value = ((int_value & 0x1C) >> 2);
    178     }
    179   /* p = 0.bit[1:0], r = 0.bit[3:2].  */
    180   /* q = 1.bit[1:0], s = 1.bit[5:4].  */
    181   else if (strcmp (pfd->name, "im6_iq") == 0)
    182     {
    183       new_value |= 0x04;
    184     }
    185   else if (strcmp (pfd->name, "im6_ms") == 0)
    186     {
    187       new_value |= 0x04;
    188     }
    189   /*  Rt CONCAT(c, t21, t0).  */
    190   else if (strcmp (pfd->name, "a_rt21") == 0)
    191     {
    192       new_value = (insn & 0x00000020) >> 5;
    193       new_value |= (insn & 0x00000C00) >> 9;
    194       new_value |= (insn & 0x00008000) >> 12;
    195     }
    196   else if (strcmp (pfd->name, "a_rte") == 0)
    197     {
    198       new_value = (insn & 0x00000C00) >> 9;
    199       new_value |= (insn & 0x00008000) >> 12;
    200     }
    201   else if (strcmp (pfd->name, "a_rte1") == 0)
    202     {
    203       new_value = (insn & 0x00000C00) >> 9;
    204       new_value |= (insn & 0x00008000) >> 12;
    205       new_value |= 0x01;
    206     }
    207   else if (strcmp (pfd->name, "a_rte69") == 0)
    208     {
    209       new_value = int_value << 1;
    210     }
    211   else if (strcmp (pfd->name, "a_rte69_1") == 0)
    212     {
    213       new_value = int_value << 1;
    214       new_value |= 0x01;
    215     }
    216 
    217   psys_reg = nds32_find_reg_keyword (psys_reg, new_value);
    218   if (!psys_reg)
    219     func (stream, "???");
    220   else
    221     func (stream, "$%s", psys_reg->name);
    222 }
    223 
    224 /* Dump instruction.  If the opcode is unknown, return FALSE.  */
    225 
    226 static void
    227 nds32_parse_opcode (struct nds32_opcode *opc, bfd_vma pc ATTRIBUTE_UNUSED,
    228 		    disassemble_info *info, uint32_t insn,
    229 		    uint32_t parse_mode)
    230 {
    231   int op = 0;
    232   fprintf_ftype func = info->fprintf_func;
    233   void *stream = info->stream;
    234   const char *pstr_src;
    235   char *pstr_tmp;
    236   char tmp_string[16];
    237   unsigned int push25gpr = 0, lsmwRb, lsmwRe, lsmwEnb4, checkbit, i;
    238   int int_value, ifthe1st = 1;
    239   const field_t *pfd;
    240   keyword_t *psys_reg;
    241 
    242   if (opc == NULL)
    243     {
    244       func (stream, UNKNOWN_INSN_MSG);
    245       return;
    246     }
    247 
    248   if (parse_mode & NDS32_PARSE_EX9IT)
    249     func (stream, "		!");
    250 
    251   pstr_src = opc->instruction;
    252   if (*pstr_src == 0)
    253     {
    254       func (stream, "%s", opc->opcode);
    255       return;
    256     }
    257   /* NDS32_PARSE_INSN16.  */
    258   if (parse_mode & NDS32_PARSE_INSN16)
    259     {
    260       func (stream, "%s ", opc->opcode);
    261     }
    262 
    263   /* NDS32_PARSE_INSN32.  */
    264   else
    265     {
    266       op = N32_OP6 (insn);
    267       if (op == N32_OP6_LSMW)
    268 	func (stream, "%s.", opc->opcode);
    269       else if (strstr (opc->instruction, "tito"))
    270 	func (stream, "%s", opc->opcode);
    271       else
    272 	func (stream, "%s ", opc->opcode);
    273     }
    274 
    275   while (*pstr_src)
    276     {
    277       switch (*pstr_src)
    278 	{
    279 	case '%':
    280 	case '=':
    281 	case '&':
    282 	  pstr_src++;
    283 	  /* compare with operand_fields[].name.  */
    284 	  pstr_tmp = &tmp_string[0];
    285 	  while (*pstr_src)
    286 	    {
    287 	      if ((*pstr_src == ',') || (*pstr_src == ' ')
    288 		  || (*pstr_src == '{') || (*pstr_src == '}')
    289 		  || (*pstr_src == '[') || (*pstr_src == ']')
    290 		  || (*pstr_src == '(') || (*pstr_src == ')')
    291 		  || (*pstr_src == '+') || (*pstr_src == '<'))
    292 		break;
    293 	      *pstr_tmp++ = *pstr_src++;
    294 	    }
    295 	  *pstr_tmp = 0;
    296 
    297 	  pfd = (const field_t *) &operand_fields[0];
    298 	  while (1)
    299 	    {
    300 	      if (pfd->name == NULL)
    301 		return;
    302 	      else if (strcmp (&tmp_string[0], pfd->name) == 0)
    303 		break;
    304 	      pfd++;
    305 	    }
    306 
    307 	  /* for insn-16.  */
    308 	  if (parse_mode & NDS32_PARSE_INSN16)
    309 	    {
    310 	      if (pfd->hw_res == HW_GPR)
    311 		{
    312 		  int_value =
    313 		    __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    314 		  /* push25/pop25.  */
    315 		  if ((opc->value == 0xfc00) || (opc->value == 0xfc80))
    316 		    {
    317 		      if (int_value == 0)
    318 			int_value = 6;
    319 		      else
    320 			int_value = (6 + (0x01 << int_value));
    321 		      push25gpr = int_value;
    322 		    }
    323 		  else if (strcmp (pfd->name, "rt4") == 0)
    324 		    {
    325 		      int_value = nds32_r45map[int_value];
    326 		    }
    327 		  func (stream, "$%s", keyword_gpr[int_value].name);
    328 		}
    329 	      else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
    330 		{
    331 		  if (pfd->hw_res == HW_INT)
    332 		    int_value =
    333 		      N32_IMMS ((insn >> pfd->bitpos),
    334 			    pfd->bitsize) << pfd->shift;
    335 		  else
    336 		    int_value =
    337 		      __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    338 
    339 		  /* movpi45.  */
    340 		  if (opc->value == 0xfa00)
    341 		    {
    342 		      int_value += 16;
    343 		      func (stream, "#0x%x", int_value);
    344 		    }
    345 		  /* lwi45.fe.  */
    346 		  else if (opc->value == 0xb200)
    347 		    {
    348 		      int_value = 0 - (128 - int_value);
    349 		      func (stream, "#%d", int_value);
    350 		    }
    351 		  /* beqz38/bnez38/beqs38/bnes38/j8/beqzs8/bnezs8/ifcall9.  */
    352 		  else if ((opc->value == 0xc000) || (opc->value == 0xc800)
    353 			   || (opc->value == 0xd000) || (opc->value == 0xd800)
    354 			   || (opc->value == 0xd500) || (opc->value == 0xe800)
    355 			   || (opc->value == 0xe900)
    356 			   || (opc->value == 0xf800))
    357 		    {
    358 		      info->print_address_func (int_value + pc, info);
    359 		    }
    360 		  /* push25/pop25.  */
    361 		  else if ((opc->value == 0xfc00) || (opc->value == 0xfc80))
    362 		    {
    363 		      func (stream, "#%d    ! {$r6", int_value);
    364 		      if (push25gpr != 6)
    365 			func (stream, "~$%s", keyword_gpr[push25gpr].name);
    366 		      func (stream, ", $fp, $gp, $lp}");
    367 		    }
    368 		  /* ex9.it.  */
    369 		  else if ((opc->value == 0xdd40) || (opc->value == 0xea00))
    370 		    {
    371 		      func (stream, "#%d", int_value);
    372 		      nds32_ex9_info (pc, info, int_value);
    373 		    }
    374 		  else if (pfd->hw_res == HW_INT)
    375 		    {
    376 		      if (int_value < 0)
    377 			func (stream, "#%d", int_value);
    378 		      else
    379 			func (stream, "#0x%x", int_value);
    380 		    }
    381 		  else		/* if(pfd->hw_res == HW_UINT).  */
    382 		    func (stream, "#0x%x", int_value);
    383 		}
    384 
    385 	    }
    386 	  /* for audio-ext.  */
    387 	  else if (op == N32_OP6_AEXT)
    388 	    {
    389 	      nds32_parse_audio_ext (pfd, info, insn);
    390 	    }
    391 	  /* for insn-32.  */
    392 	  else if (pfd->hw_res < _HW_LAST)
    393 	    {
    394 	      int_value =
    395 		__GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    396 
    397 	      psys_reg = (keyword_t*) keywords[pfd->hw_res];
    398 
    399 	      psys_reg = nds32_find_reg_keyword (psys_reg, int_value);
    400 	      /* For HW_SR, dump the index when it can't
    401 		 map the register name.  */
    402 	      if (!psys_reg && pfd->hw_res == HW_SR)
    403 		func (stream, "%d", int_value);
    404 	      else if (!psys_reg)
    405 		func (stream, "???");
    406 	      else
    407 		{
    408 		  if (pfd->hw_res == HW_GPR || pfd->hw_res == HW_CPR
    409 		      || pfd->hw_res == HW_FDR || pfd->hw_res == HW_FSR
    410 		      || pfd->hw_res == HW_DXR || pfd->hw_res == HW_SR
    411 		      || pfd->hw_res == HW_USR)
    412 		    func (stream, "$%s", psys_reg->name);
    413 		  else if (pfd->hw_res == HW_DTITON
    414 			   || pfd->hw_res == HW_DTITOFF)
    415 		    func (stream, ".%s", psys_reg->name);
    416 		  else
    417 		    func (stream, "%s", psys_reg->name);
    418 		}
    419 	    }
    420 	  else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
    421 	    {
    422 	      if (pfd->hw_res == HW_INT)
    423 		int_value =
    424 		  N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
    425 	      else
    426 		int_value =
    427 		  __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
    428 
    429 	      if ((op == N32_OP6_BR1) || (op == N32_OP6_BR2))
    430 		{
    431 		  info->print_address_func (int_value + pc, info);
    432 		}
    433 	      else if ((op == N32_OP6_BR3) && (pfd->bitpos == 0))
    434 		{
    435 		  info->print_address_func (int_value + pc, info);
    436 		}
    437 	      else if (op == N32_OP6_JI)
    438 		{
    439 		  /* FIXME: Handle relocation.  */
    440 		  if (info->flags & INSN_HAS_RELOC)
    441 		    pc = 0;
    442 		  /* Check if insn32 in ex9 table.  */
    443 		  if (parse_mode & NDS32_PARSE_EX9IT)
    444 		    info->print_address_func ((pc & 0xFE000000) | int_value,
    445 					      info);
    446 		  /* Check if decode ex9 table,  PC(31,25)|Inst(23,0)<<1.  */
    447 		  else if (parse_mode & NDS32_PARSE_EX9TAB)
    448 		    func (stream, "PC(31,25)|#0x%x", int_value);
    449 		  else
    450 		    info->print_address_func (int_value + pc, info);
    451 		}
    452 	      else if (op == N32_OP6_LSMW)
    453 		{
    454 		  /* lmw.adm/smw.adm.  */
    455 		  func (stream, "#0x%x    ! {", int_value);
    456 		  lsmwEnb4 = int_value;
    457 		  lsmwRb = ((insn >> 20) & 0x1F);
    458 		  lsmwRe = ((insn >> 10) & 0x1F);
    459 
    460 		  /* If [Rb, Re] specifies at least one register,
    461 		     Rb(4,0) <= Re(4,0) and 0 <= Rb(4,0), Re(4,0) < 28.
    462 		     Disassembling does not consider this currently because of
    463 		     the convience comparing with bsp320.  */
    464 		  if (lsmwRb != 31 || lsmwRe != 31)
    465 		    {
    466 		      func (stream, "$%s", keyword_gpr[lsmwRb].name);
    467 		      if (lsmwRb != lsmwRe)
    468 			func (stream, "~$%s", keyword_gpr[lsmwRe].name);
    469 		      ifthe1st = 0;
    470 		    }
    471 		  if (lsmwEnb4 != 0)
    472 		    {
    473 		      /* $fp, $gp, $lp, $sp.  */
    474 		      checkbit = 0x08;
    475 		      for (i = 0; i < 4; i++)
    476 			{
    477 			  if (lsmwEnb4 & checkbit)
    478 			    {
    479 			      if (ifthe1st == 1)
    480 				{
    481 				  ifthe1st = 0;
    482 				  func (stream, "$%s", keyword_gpr[28 + i].name);
    483 				}
    484 			      else
    485 				func (stream, ", $%s", keyword_gpr[28 + i].name);
    486 			    }
    487 			  checkbit >>= 1;
    488 			}
    489 		    }
    490 		  func (stream, "}");
    491 		}
    492 	      else if (pfd->hw_res == HW_INT)
    493 		{
    494 		  if (int_value < 0)
    495 		    func (stream, "#%d", int_value);
    496 		  else
    497 		    func (stream, "#0x%x", int_value);
    498 		}
    499 	      else		/* if(pfd->hw_res == HW_UINT).  */
    500 		{
    501 		  func (stream, "#0x%x", int_value);
    502 		}
    503 	    }
    504 	  break;
    505 
    506 	case '{':
    507 	case '}':
    508 	  pstr_src++;
    509 	  break;
    510 
    511 	default:
    512 	  func (stream, "%c", *pstr_src++);
    513 	  break;
    514 	}			/* switch (*pstr_src).  */
    515 
    516     }				/* while (*pstr_src).  */
    517   return;
    518 }
    519 
    520 /* Filter instructions with some bits must be fixed.  */
    521 
    522 static void
    523 nds32_filter_unknown_insn (uint32_t insn, struct nds32_opcode **opc)
    524 {
    525   if (!(*opc))
    526     return;
    527 
    528   switch ((*opc)->value)
    529     {
    530     case JREG (JR):
    531     case JREG (JRNEZ):
    532       /* jr jr.xtoff */
    533       if (__GF (insn, 6, 2) != 0 || __GF (insn, 15, 10) != 0)
    534         *opc = NULL;
    535       break;
    536     case MISC (STANDBY):
    537       if (__GF (insn, 7, 18) != 0)
    538         *opc = NULL;
    539       break;
    540     case SIMD (PBSAD):
    541     case SIMD (PBSADA):
    542       if (__GF (insn, 5, 5) != 0)
    543         *opc = NULL;
    544       break;
    545     case BR2 (IFCALL):
    546       if (__GF (insn, 20, 5) != 0)
    547         *opc = NULL;
    548       break;
    549     case JREG (JRAL):
    550       if (__GF (insn, 5, 3) != 0 || __GF (insn, 15, 5) != 0)
    551         *opc = NULL;
    552       break;
    553     case ALU1 (NOR):
    554     case ALU1 (SLT):
    555     case ALU1 (SLTS):
    556     case ALU1 (SLLI):
    557     case ALU1 (SRLI):
    558     case ALU1 (SRAI):
    559     case ALU1 (ROTRI):
    560     case ALU1 (SLL):
    561     case ALU1 (SRL):
    562     case ALU1 (SRA):
    563     case ALU1 (ROTR):
    564     case ALU1 (SEB):
    565     case ALU1 (SEH):
    566     case ALU1 (ZEH):
    567     case ALU1 (WSBH):
    568     case ALU1 (SVA):
    569     case ALU1 (SVS):
    570     case ALU1 (CMOVZ):
    571     case ALU1 (CMOVN):
    572       if (__GF (insn, 5, 5) != 0)
    573         *opc = NULL;
    574       break;
    575     case MISC (IRET):
    576     case MISC (ISB):
    577     case MISC (DSB):
    578       if (__GF (insn, 5, 20) != 0)
    579         *opc = NULL;
    580       break;
    581     }
    582 }
    583 
    584 static void
    585 print_insn32 (bfd_vma pc, disassemble_info *info, uint32_t insn,
    586 	      uint32_t parse_mode)
    587 {
    588   /* Get the final correct opcode and parse.  */
    589   struct nds32_opcode *opc;
    590   uint32_t opcode = nds32_mask_opcode (insn);
    591   opc = (struct nds32_opcode *) htab_find (opcode_htab, &opcode);
    592 
    593   nds32_special_opcode (insn, &opc);
    594   nds32_filter_unknown_insn (insn, &opc);
    595   nds32_parse_opcode (opc, pc, info, insn, parse_mode);
    596 }
    597 
    598 static void
    599 print_insn16 (bfd_vma pc, disassemble_info *info,
    600 	      uint32_t insn, uint32_t parse_mode)
    601 {
    602   struct nds32_opcode *opc;
    603   uint32_t opcode;
    604 
    605   /* Get highest 7 bit in default.  */
    606   unsigned int mask = 0xfe00;
    607 
    608   /* Classify 16-bit instruction to 4 sets by bit 13 and 14.  */
    609   switch (__GF (insn, 13, 2))
    610     {
    611     case 0x0:
    612       /* mov55 movi55 */
    613       if (__GF (insn, 11, 2) == 0)
    614 	{
    615 	  mask = 0xfc00;
    616 	  /* ifret16 = mov55 $sp, $sp*/
    617 	  if (__GF (insn, 0, 11) == 0x3ff)
    618 	    mask = 0xffff;
    619 	}
    620       else if (__GF (insn, 9, 4) == 0xb)
    621 	mask = 0xfe07;
    622       break;
    623     case 0x1:
    624       /* lwi37 swi37 */
    625       if (__GF (insn, 11, 2) == 0x3)
    626 	mask = 0xf880;
    627       break;
    628     case 0x2:
    629       mask = 0xf800;
    630       /* Exclude beqz38, bnez38, beqs38, and bnes38.  */
    631       if (__GF (insn, 12, 1) == 0x1
    632 	  && __GF (insn, 8, 3) == 0x5)
    633 	{
    634 	  if (__GF (insn, 11, 1) == 0x0)
    635 	    mask = 0xff00;
    636 	  else
    637 	    mask = 0xffe0;
    638 	}
    639       break;
    640     case 0x3:
    641       switch (__GF (insn, 11, 2))
    642 	{
    643 	case 0x1:
    644 	  /* beqzs8 bnezs8 */
    645 	  if (__GF (insn, 9, 2) == 0x0)
    646 	    mask = 0xff00;
    647 	  /* addi10s */
    648 	  else if (__GF(insn, 10, 1) == 0x1)
    649 	    mask = 0xfc00;
    650 	  break;
    651 	case 0x2:
    652 	  /* lwi37.sp swi37.sp */
    653 	  mask = 0xf880;
    654 	  break;
    655 	case 0x3:
    656 	  if (__GF (insn, 8, 3) == 0x5)
    657 	    mask = 0xff00;
    658 	  else if (__GF (insn, 8, 3) == 0x4)
    659 	    mask = 0xff80;
    660 	  else if (__GF (insn, 9 , 2) == 0x3)
    661 	    mask = 0xfe07;
    662 	  break;
    663 	}
    664       break;
    665     }
    666   opcode = insn & mask;
    667   opc = (struct nds32_opcode *) htab_find (opcode_htab, &opcode);
    668 
    669   nds32_special_opcode (insn, &opc);
    670   /* Get the final correct opcode and parse it.  */
    671   nds32_parse_opcode (opc, pc, info, insn, parse_mode);
    672 }
    673 
    674 static hashval_t
    675 htab_hash_hash (const void *p)
    676 {
    677   return (*(unsigned int *) p) % 49;
    678 }
    679 
    680 static int
    681 htab_hash_eq (const void *p, const void *q)
    682 {
    683   uint32_t pinsn = ((struct nds32_opcode *) p)->value;
    684   uint32_t qinsn = *((uint32_t *) q);
    685 
    686   return (pinsn == qinsn);
    687 }
    688 
    689 /* Get the format of instruction.  */
    690 
    691 static uint32_t
    692 nds32_mask_opcode (uint32_t insn)
    693 {
    694   uint32_t opcode = N32_OP6 (insn);
    695   switch (opcode)
    696     {
    697     case N32_OP6_LBI:
    698     case N32_OP6_LHI:
    699     case N32_OP6_LWI:
    700     case N32_OP6_LDI:
    701     case N32_OP6_LBI_BI:
    702     case N32_OP6_LHI_BI:
    703     case N32_OP6_LWI_BI:
    704     case N32_OP6_LDI_BI:
    705     case N32_OP6_SBI:
    706     case N32_OP6_SHI:
    707     case N32_OP6_SWI:
    708     case N32_OP6_SDI:
    709     case N32_OP6_SBI_BI:
    710     case N32_OP6_SHI_BI:
    711     case N32_OP6_SWI_BI:
    712     case N32_OP6_SDI_BI:
    713     case N32_OP6_LBSI:
    714     case N32_OP6_LHSI:
    715     case N32_OP6_LWSI:
    716     case N32_OP6_LBSI_BI:
    717     case N32_OP6_LHSI_BI:
    718     case N32_OP6_LWSI_BI:
    719     case N32_OP6_MOVI:
    720     case N32_OP6_SETHI:
    721     case N32_OP6_ADDI:
    722     case N32_OP6_SUBRI:
    723     case N32_OP6_ANDI:
    724     case N32_OP6_XORI:
    725     case N32_OP6_ORI:
    726     case N32_OP6_SLTI:
    727     case N32_OP6_SLTSI:
    728     case N32_OP6_CEXT:
    729     case N32_OP6_BITCI:
    730       return MASK_OP (insn, 0);
    731     case N32_OP6_ALU2:
    732       /* FFBI */
    733       if (__GF (insn, 0, 7) == (N32_ALU2_FFBI | __BIT (6)))
    734 	return MASK_OP (insn, 0x7f);
    735       else if (__GF (insn, 0, 7) == (N32_ALU2_MFUSR | __BIT (6))
    736 	       || __GF (insn, 0, 7) == (N32_ALU2_MTUSR | __BIT (6)))
    737 	/* RDOV CLROV */
    738 	return MASK_OP (insn, 0xf81ff);
    739       return MASK_OP (insn, 0x1ff);
    740     case N32_OP6_ALU1:
    741     case N32_OP6_SIMD:
    742       return MASK_OP (insn, 0x1f);
    743     case N32_OP6_MEM:
    744       return MASK_OP (insn, 0xff);
    745     case N32_OP6_JREG:
    746       return MASK_OP (insn, 0x7f);
    747     case N32_OP6_LSMW:
    748       return MASK_OP (insn, 0x23);
    749     case N32_OP6_SBGP:
    750     case N32_OP6_LBGP:
    751       return MASK_OP (insn, 0x1 << 19);
    752     case N32_OP6_HWGP:
    753       if (__GF (insn, 18, 2) == 0x3)
    754 	return MASK_OP (insn, 0x7 << 17);
    755       return MASK_OP (insn, 0x3 << 18);
    756     case N32_OP6_DPREFI:
    757       return MASK_OP (insn, 0x1 << 24);
    758     case N32_OP6_LWC:
    759     case N32_OP6_SWC:
    760     case N32_OP6_LDC:
    761     case N32_OP6_SDC:
    762       return MASK_OP (insn, 0x1 << 12);
    763     case N32_OP6_JI:
    764       return MASK_OP (insn, 0x1 << 24);
    765     case N32_OP6_BR1:
    766       return MASK_OP (insn, 0x1 << 14);
    767     case N32_OP6_BR2:
    768       return MASK_OP (insn, 0xf << 16);
    769     case N32_OP6_BR3:
    770       return MASK_OP (insn, 0x1 << 19);
    771     case N32_OP6_MISC:
    772       switch (__GF (insn, 0, 5))
    773 	{
    774 	case N32_MISC_MTSR:
    775 	  /* SETGIE and SETEND  */
    776 	  if (__GF (insn, 5, 5) == 0x1 || __GF (insn, 5, 5) == 0x2)
    777 	    return MASK_OP (insn, 0x1fffff);
    778 	  return MASK_OP (insn, 0x1f);
    779 	case N32_MISC_TLBOP:
    780 	  if (__GF (insn, 5, 5) == 5 || __GF (insn, 5, 5) == 7)
    781 	    /* PB FLUA  */
    782 	    return MASK_OP (insn, 0x3ff);
    783 	  return MASK_OP (insn, 0x1f);
    784 	default:
    785 	  return MASK_OP (insn, 0x1f);
    786 	}
    787     case N32_OP6_COP:
    788       if (__GF (insn, 4, 2) == 0)
    789 	{
    790 	  /* FPU */
    791 	  switch (__GF (insn, 0, 4))
    792 	    {
    793 	    case 0x0:
    794 	    case 0x8:
    795 	      /* FS1/F2OP FD1/F2OP */
    796 	      if (__GF (insn, 6, 4) == 0xf)
    797 		return MASK_OP (insn, 0x7fff);
    798 	      /* FS1 FD1 */
    799 	      return MASK_OP (insn, 0x3ff);
    800 	    case 0x4:
    801 	    case 0xc:
    802 	      /* FS2 */
    803 	      return MASK_OP (insn, 0x3ff);
    804 	    case 0x1:
    805 	    case 0x9:
    806 	      /* XR */
    807 	      if (__GF (insn, 6, 4) == 0xc)
    808 		return MASK_OP (insn, 0x7fff);
    809 	      /* MFCP MTCP */
    810 	      return MASK_OP (insn, 0x3ff);
    811 	    default:
    812 	      return MASK_OP (insn, 0xff);
    813 	    }
    814 	}
    815       else if  (__GF (insn, 0, 2) == 0)
    816 	return MASK_OP (insn, 0xf);
    817       return MASK_OP (insn, 0xcf);
    818     case N32_OP6_AEXT:
    819       /* AUDIO */
    820       switch (__GF (insn, 23, 2))
    821 	{
    822 	case 0x0:
    823 	  if (__GF (insn, 5, 4) == 0)
    824 	    /* AMxxx AMAyyS AMyyS AMAWzS AMWzS */
    825 	    return MASK_OP (insn, (0x1f << 20) | 0x1ff);
    826 	  else if (__GF (insn, 5, 4) == 1)
    827 	    /* ALR ASR ALA ASA AUPI */
    828 	    return MASK_OP (insn, (0x1f << 20) | (0xf << 5));
    829 	  else if (__GF (insn, 20, 3) == 0 && __GF (insn, 6, 3) == 1)
    830 	    /* ALR2 */
    831 	    return MASK_OP (insn, (0x1f << 20) | (0x7 << 6));
    832 	  else if (__GF (insn, 20 ,3) == 2 && __GF (insn, 6, 3) == 1)
    833 	    /* AWEXT ASATS48 */
    834 	    return MASK_OP (insn, (0x1f << 20) | (0xf << 5));
    835 	  else if (__GF (insn, 20 ,3) == 3 && __GF (insn, 6, 3) == 1)
    836 	    /* AMTAR AMTAR2 AMFAR AMFAR2 */
    837 	    return MASK_OP (insn, (0x1f << 20) | (0x1f << 5));
    838 	  else if (__GF (insn, 7, 2) == 3)
    839 	    /* AMxxxSA */
    840 	    return MASK_OP (insn, (0x1f << 20) | (0x3 << 7));
    841 	  else if (__GF (insn, 6, 3) == 2)
    842 	    /* AMxxxL.S  */
    843 	    return MASK_OP (insn, (0x1f << 20) | (0xf << 5));
    844 	  else
    845 	    /* AmxxxL.l AmxxxL2.S AMxxxL2.L  */
    846 	    return MASK_OP (insn, (0x1f << 20) | (0x7 << 6));
    847 	case 0x1:
    848 	  if (__GF (insn, 20, 3) == 0)
    849 	    /* AADDL ASUBL */
    850 	    return MASK_OP (insn, (0x1f << 20) | (0x1 << 5));
    851 	  else if (__GF (insn, 20, 3) == 1)
    852 	    /* AMTARI Ix AMTARI Mx */
    853 	    return MASK_OP (insn, (0x1f << 20));
    854 	  else if (__GF (insn, 6, 3) == 2)
    855 	    /* AMAWzSl.S AMWzSl.S */
    856 	    return MASK_OP (insn, (0x1f << 20) | (0xf << 5));
    857 	  else if (__GF (insn, 7, 2) == 3)
    858 	    /* AMAWzSSA AMWzSSA */
    859 	    return MASK_OP (insn, (0x1f << 20) | (0x3 << 7));
    860 	  else
    861 	    /* AMAWzSL.L AMAWzSL2.S AMAWzSL2.L AMWzSL.L AMWzSL.L AMWzSL2.S */
    862 	    return MASK_OP (insn, (0x1f << 20) | (0x7 << 6));
    863 	case 0x2:
    864 	  if (__GF (insn, 6, 3) == 2)
    865 	    /* AMAyySl.S AMWyySl.S */
    866 	    return MASK_OP (insn, (0x1f << 20) | (0xf << 5));
    867 	  else if (__GF (insn, 7, 2) == 3)
    868 	    /* AMAWyySSA AMWyySSA */
    869 	    return MASK_OP (insn, (0x1f << 20) | (0x3 << 7));
    870 	  else
    871 	    /* AMAWyySL.L AMAWyySL2.S AMAWyySL2.L AMWyySL.L AMWyySL.L AMWyySL2.S */
    872 	    return MASK_OP (insn, (0x1f << 20) | (0x7 << 6));
    873 	}
    874       return MASK_OP (insn, 0x1f << 20);
    875     default:
    876       return (1 << 31);
    877     }
    878 }
    879 
    880 /* Define cctl subtype.  */
    881 static char *cctl_subtype [] =
    882 {
    883   /* 0x0 */
    884   "st0", "st0", "st0", "st2", "st2", "st3", "st3", "st4",
    885   "st1", "st1", "st1", "st0", "st0", NULL, NULL, "st5",
    886   /* 0x10 */
    887   "st0", NULL, NULL, "st2", "st2", "st3", "st3", NULL,
    888   "st1", NULL, NULL, "st0", "st0", NULL, NULL, NULL
    889 };
    890 
    891 /* Check the subset of opcode.  */
    892 
    893 static void
    894 nds32_special_opcode (uint32_t insn, struct nds32_opcode **opc)
    895 {
    896   char *string = NULL;
    897   uint32_t op;
    898 
    899   if (!(*opc))
    900     return;
    901 
    902   /* Check if special case.  */
    903   switch ((*opc)->value)
    904     {
    905     case OP6 (LWC):
    906     case OP6 (SWC):
    907     case OP6 (LDC):
    908     case OP6 (SDC):
    909     case FPU_RA_IMMBI (LWC):
    910     case FPU_RA_IMMBI (SWC):
    911     case FPU_RA_IMMBI (LDC):
    912     case FPU_RA_IMMBI (SDC):
    913       /* Check if cp0 => FPU.  */
    914       if (__GF (insn, 13, 2) == 0)
    915       {
    916 	while (!((*opc)->attr & ATTR (FPU)) && (*opc)->next)
    917 	  *opc = (*opc)->next;
    918       }
    919       break;
    920     case ALU1 (ADD):
    921     case ALU1 (SUB):
    922     case ALU1 (AND):
    923     case ALU1 (XOR):
    924     case ALU1 (OR):
    925       /* Check if (add/add_slli) (sub/sub_slli) (and/and_slli).  */
    926       if (N32_SH5(insn) != 0)
    927         string = "sh";
    928       break;
    929     case ALU1 (SRLI):
    930       /* Check if nop.  */
    931       if (__GF (insn, 10, 15) == 0)
    932         string = "nop";
    933       break;
    934     case MISC (CCTL):
    935       string = cctl_subtype [__GF (insn, 5, 5)];
    936       break;
    937     case JREG (JR):
    938     case JREG (JRAL):
    939     case JREG (JR) | JREG_RET:
    940       if (__GF (insn, 8, 2) != 0)
    941 	string = "tit";
    942     break;
    943     case N32_OP6_COP:
    944     break;
    945     case 0xea00:
    946       /* break16 ex9 */
    947       if (__GF (insn, 5, 4) != 0)
    948 	string = "ex9";
    949       break;
    950     case 0x9200:
    951       /* nop16 */
    952       if (__GF (insn, 0, 9) == 0)
    953 	string = "nop16";
    954       break;
    955     }
    956 
    957   if (string)
    958     {
    959       while (strstr ((*opc)->opcode, string) == NULL
    960 	     && strstr ((*opc)->instruction, string) == NULL && (*opc)->next)
    961 	*opc = (*opc)->next;
    962       return;
    963     }
    964 
    965   /* Classify instruction is COP or FPU.  */
    966   op = N32_OP6 (insn);
    967   if (op == N32_OP6_COP && __GF (insn, 4, 2) != 0)
    968     {
    969       while (((*opc)->attr & ATTR (FPU)) != 0 && (*opc)->next)
    970 	*opc = (*opc)->next;
    971     }
    972 }
    973 
    974 int
    975 print_insn_nds32 (bfd_vma pc, disassemble_info *info)
    976 {
    977   int status;
    978   bfd_byte buf[4];
    979   uint32_t insn;
    980   static int init = 1;
    981   int i = 0;
    982   struct nds32_opcode *opc;
    983   struct nds32_opcode **slot;
    984 
    985   if (init)
    986     {
    987       /* Build opcode table.  */
    988       opcode_htab = htab_create_alloc (1024, htab_hash_hash, htab_hash_eq,
    989 				       NULL, xcalloc, free);
    990 
    991       while (nds32_opcodes[i].opcode != NULL)
    992 	{
    993 	  opc = &nds32_opcodes[i];
    994 	  slot =
    995 	    (struct nds32_opcode **) htab_find_slot (opcode_htab, &opc->value,
    996 						     INSERT);
    997 	  if (*slot == NULL)
    998 	    {
    999 	      /* This is the new one.  */
   1000 	      *slot = opc;
   1001 	    }
   1002 	  else
   1003 	    {
   1004 	      /* Already exists.  Append to the list.  */
   1005 	      opc = *slot;
   1006 	      while (opc->next)
   1007 		opc = opc->next;
   1008 	      opc->next = &nds32_opcodes[i];
   1009 	    }
   1010 	  i++;
   1011 	}
   1012       init = 0;
   1013     }
   1014 
   1015   status = info->read_memory_func (pc, (bfd_byte *) buf, 4, info);
   1016   if (status)
   1017     {
   1018       /* for the last 16-bit instruction.  */
   1019       status = info->read_memory_func (pc, (bfd_byte *) buf, 2, info);
   1020       if (status)
   1021 	{
   1022 	  (*info->memory_error_func)(status, pc, info);
   1023 	  return -1;
   1024 	}
   1025     }
   1026 
   1027   insn = bfd_getb32 (buf);
   1028   /* 16-bit instruction.  */
   1029   if (insn & 0x80000000)
   1030     {
   1031       if (info->section && strstr (info->section->name, ".ex9.itable") != NULL)
   1032 	{
   1033 	  print_insn16 (pc, info, (insn & 0x0000FFFF),
   1034 			NDS32_PARSE_INSN16 | NDS32_PARSE_EX9TAB);
   1035 	  return 4;
   1036 	}
   1037       print_insn16 (pc, info, (insn >> 16), NDS32_PARSE_INSN16);
   1038       return 2;
   1039     }
   1040 
   1041   /* 32-bit instructions.  */
   1042   else
   1043     {
   1044       if (info->section
   1045 	  && strstr (info->section->name, ".ex9.itable") != NULL)
   1046 	print_insn32 (pc, info, insn, NDS32_PARSE_INSN32 | NDS32_PARSE_EX9TAB);
   1047       else
   1048 	print_insn32 (pc, info, insn, NDS32_PARSE_INSN32);
   1049       return 4;
   1050     }
   1051 }
   1052