hppa-dis.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,190 行 · 第 1/3 页

C
1,190
字号
					       compare_cond_names[GET_COND (insn)]);			break;		      case 'S':			(*info->fprintf_func) (info->stream, "%s ",					       compare_cond_64_names[GET_COND (insn)]);			break;		      case 'a':			(*info->fprintf_func) (info->stream, "%s ",					       add_cond_names[GET_COND (insn)]);			break;		      case 'A':			(*info->fprintf_func) (info->stream, "%s ",					       add_cond_64_names[GET_COND (insn)]);			break;		      case 'd':			(*info->fprintf_func) (info->stream, "%s",					       add_cond_names[GET_FIELD (insn, 16, 18)]);			break;		      case 'W':			(*info->fprintf_func) 			  (info->stream, "%s",			   wide_add_cond_names[GET_FIELD (insn, 16, 18) + 					      GET_FIELD (insn, 4, 4) * 8]);			break;		      case 'l':			(*info->fprintf_func) (info->stream, "%s ",					       logical_cond_names[GET_COND (insn)]);			break;		      case 'L':			(*info->fprintf_func) (info->stream, "%s ",					       logical_cond_64_names[GET_COND (insn)]);			break;		      case 'u':			(*info->fprintf_func) (info->stream, "%s ",					       unit_cond_names[GET_COND (insn)]);			break;		      case 'U':			(*info->fprintf_func) (info->stream, "%s ",					       unit_cond_64_names[GET_COND (insn)]);			break;		      case 'y':		      case 'x':		      case 'b':			(*info->fprintf_func)			  (info->stream, "%s",			   shift_cond_names[GET_FIELD (insn, 16, 18)]);			/* If the next character in args is 'n', it will handle			   putting out the space.  */			if (s[1] != 'n')			  (*info->fprintf_func) (info->stream, " ");			break;		      case 'X':			(*info->fprintf_func) (info->stream, "%s ",					       shift_cond_64_names[GET_FIELD (insn, 16, 18)]);			break;		      case 'B':			(*info->fprintf_func)			  (info->stream, "%s",			   bb_cond_64_names[GET_FIELD (insn, 16, 16)]);			/* If the next character in args is 'n', it will handle			   putting out the space.  */			if (s[1] != 'n')			  (*info->fprintf_func) (info->stream, " ");			break;		      }		    break;		  }		case 'V':		  fput_const (extract_5_store (insn), info);		  break;		case 'r':		  fput_const (extract_5r_store (insn), info);		  break;		case 'R':		  fput_const (extract_5R_store (insn), info);		  break;		case 'U':		  fput_const (extract_10U_store (insn), info);		  break;		case 'B':		case 'Q':		  fput_const (extract_5Q_store (insn), info);		  break;		case 'i':		  fput_const (extract_11 (insn), info);		  break;		case 'j':		  fput_const (extract_14 (insn), info);		  break;		case 'k':		  fput_const (extract_21 (insn), info);		  break;		case '<':		case 'l':		  /* 16-bit long disp., PA2.0 wide only.  */		  fput_const (extract_16 (insn), info);		  break;		case 'n':		  if (insn & 0x2)		    (*info->fprintf_func) (info->stream, ",n ");		  else		    (*info->fprintf_func) (info->stream, " ");		  break;		case 'N':		  if ((insn & 0x20) && s[1])		    (*info->fprintf_func) (info->stream, ",n ");		  else if (insn & 0x20)		    (*info->fprintf_func) (info->stream, ",n");		  else if (s[1])		    (*info->fprintf_func) (info->stream, " ");		  break;		case 'w':		  (*info->print_address_func) (memaddr + 8 + extract_12 (insn),					       info);		  break;		case 'W':		  /* 17 bit PC-relative branch.  */		  (*info->print_address_func) ((memaddr + 8 						+ extract_17 (insn)),					       info);		  break;		case 'z':		  /* 17 bit displacement.  This is an offset from a register		     so it gets disasssembled as just a number, not any sort		     of address.  */		  fput_const (extract_17 (insn), info);		  break;		case 'Z':		  /* addil %r1 implicit output.  */		  (*info->fprintf_func) (info->stream, "%%r1");		  break;		case 'Y':		  /* be,l %sr0,%r31 implicit output.  */		  (*info->fprintf_func) (info->stream, "%%sr0,%%r31");		  break;		  		case '@':		  (*info->fprintf_func) (info->stream, "0");		  break;		case '.':		  (*info->fprintf_func) (info->stream, "%d",				    GET_FIELD (insn, 24, 25));		  break;		case '*':		  (*info->fprintf_func) (info->stream, "%d",				    GET_FIELD (insn, 22, 25));		  break;		case '!':		  (*info->fprintf_func) (info->stream, "%%sar");		  break;		case 'p':		  (*info->fprintf_func) (info->stream, "%d",				    31 - GET_FIELD (insn, 22, 26));		  break;		case '~':		  {		    int num;		    num = GET_FIELD (insn, 20, 20) << 5;		    num |= GET_FIELD (insn, 22, 26);		    (*info->fprintf_func) (info->stream, "%d", 63 - num);		    break;		  }		case 'P':		  (*info->fprintf_func) (info->stream, "%d",				    GET_FIELD (insn, 22, 26));		  break;		case 'q':		  {		    int num;		    num = GET_FIELD (insn, 20, 20) << 5;		    num |= GET_FIELD (insn, 22, 26);		    (*info->fprintf_func) (info->stream, "%d", num);		    break;		  }		case 'T':		  (*info->fprintf_func) (info->stream, "%d",				    32 - GET_FIELD (insn, 27, 31));		  break;		case '%':		  {		    int num;		    num = (GET_FIELD (insn, 23, 23) + 1) * 32;		    num -= GET_FIELD (insn, 27, 31);		    (*info->fprintf_func) (info->stream, "%d", num);		    break;		  }		case '|':		  {		    int num;		    num = (GET_FIELD (insn, 19, 19) + 1) * 32;		    num -= GET_FIELD (insn, 27, 31);		    (*info->fprintf_func) (info->stream, "%d", num);		    break;		  }		case '$':		  fput_const (GET_FIELD (insn, 20, 28), info);		  break;		case 'A':		  fput_const (GET_FIELD (insn, 6, 18), info);		  break;		case 'D':		  fput_const (GET_FIELD (insn, 6, 31), info);		  break;		case 'v':		  (*info->fprintf_func) (info->stream, ",%d", GET_FIELD (insn, 23, 25));		  break;		case 'O':		  fput_const ((GET_FIELD (insn, 6,20) << 5 |			       GET_FIELD (insn, 27, 31)), info);		  break;		case 'o':		  fput_const (GET_FIELD (insn, 6, 20), info);		  break;		case '2':		  fput_const ((GET_FIELD (insn, 6, 22) << 5 |			       GET_FIELD (insn, 27, 31)), info);		  break;		case '1':		  fput_const ((GET_FIELD (insn, 11, 20) << 5 |			       GET_FIELD (insn, 27, 31)), info);		  break;		case '0':		  fput_const ((GET_FIELD (insn, 16, 20) << 5 |			       GET_FIELD (insn, 27, 31)), info);		  break;		case 'u':		  (*info->fprintf_func) (info->stream, ",%d", GET_FIELD (insn, 23, 25));		  break;		case 'F':		  /* if no destination completer and not before a completer		     for fcmp, need a space here */		  if (s[1] == 'G' || s[1] == '?')		    fputs_filtered (float_format_names[GET_FIELD (insn, 19, 20)],				    info);		  else		    (*info->fprintf_func) (info->stream, "%s ",					   float_format_names[GET_FIELD							      (insn, 19, 20)]);		  break;		case 'G':		  (*info->fprintf_func) (info->stream, "%s ",				    float_format_names[GET_FIELD (insn,								  17, 18)]);		  break;		case 'H':		  if (GET_FIELD (insn, 26, 26) == 1)		    (*info->fprintf_func) (info->stream, "%s ",				    float_format_names[0]);		  else		    (*info->fprintf_func) (info->stream, "%s ",				    float_format_names[1]);		  break;		case 'I':		  /* if no destination completer and not before a completer		     for fcmp, need a space here */		  if (s[1] == '?')		    fputs_filtered (float_format_names[GET_FIELD (insn, 20, 20)],				    info);		  else		    (*info->fprintf_func) (info->stream, "%s ",					   float_format_names[GET_FIELD							      (insn, 20, 20)]);		  break;                case 'J':                  fput_const (extract_14 (insn), info);                  break;		case '#':		  {		    int sign = GET_FIELD (insn, 31, 31);		    int imm10 = GET_FIELD (insn, 18, 27);		    int disp;		    if (sign)		      disp = (-1 << 10) | imm10;		    else		      disp = imm10;		    disp <<= 3;		    fput_const (disp, info);		    break;		  }                case 'K':		case 'd':		  {		    int sign = GET_FIELD (insn, 31, 31);		    int imm11 = GET_FIELD (insn, 18, 28);		    int disp;		    if (sign)		      disp = (-1 << 11) | imm11;		    else		      disp = imm11;		    disp <<= 2;		    fput_const (disp, info);		    break;		  }		case '>':		case 'y':		  {		    /* 16-bit long disp., PA2.0 wide only.  */		    int disp = extract_16 (insn);		    disp &= ~3;		    fput_const (disp, info);		    break;		  }		case '&':		  {		    /* 16-bit long disp., PA2.0 wide only.  */		    int disp = extract_16 (insn);		    disp &= ~7;		    fput_const (disp, info);		    break;		  }		/* ?!? FIXME */		case '_':		case '{':		  fputs_filtered ("Disassembler botch.\n", info);		  break;		case 'm':		  {		    int y = GET_FIELD (insn, 16, 18);		    if (y != 1)		      fput_const ((y ^ 1) - 1, info);		  }		  break;		case 'h':		  {		    int cbit;		    cbit = GET_FIELD (insn, 16, 18);		    if (cbit > 0)		      (*info->fprintf_func) (info->stream, ",%d", cbit - 1);		    break;		  }		case '=':		  {		    int cond = GET_FIELD (insn, 27, 31);		    if (cond == 0)		      fputs_filtered (" ", info);		    else if (cond == 1)		      fputs_filtered ("acc ", info);		    else if (cond == 2)		      fputs_filtered ("rej ", info);		    else if (cond == 5)		      fputs_filtered ("acc8 ", info);		    else if (cond == 6)		      fputs_filtered ("rej8 ", info);		    else if (cond == 9)		      fputs_filtered ("acc6 ", info);		    else if (cond == 13)		      fputs_filtered ("acc4 ", info);		    else if (cond == 17)		      fputs_filtered ("acc2 ", info);		    break;		  }		case 'X':		  (*info->print_address_func) ((memaddr + 8 						+ extract_22 (insn)),					       info);		  break;		case 'L':		  fputs_filtered (",%r2", info);		  break;		default:		  (*info->fprintf_func) (info->stream, "%c", *s);		  break;		}	    }	  return sizeof(insn);	}    }  (*info->fprintf_func) (info->stream, "#%8x", insn);  return sizeof(insn);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?