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