hppa-dis.c

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

C
1,190
字号
	  (*info->fprintf_func) (info->stream, "%s", opcode->name);	  if (!strchr ("cfCY?-+nHNZFIuv", opcode->args[0]))	    (*info->fprintf_func) (info->stream, " ");	  for (s = opcode->args; *s != '\0'; ++s)	    {	      switch (*s)		{		case 'x':		  fput_reg (GET_FIELD (insn, 11, 15), info);		  break;		case 'a':		case 'b':		  fput_reg (GET_FIELD (insn, 6, 10), info);		  break;		case '^':		  fput_creg (GET_FIELD (insn, 6, 10), info);		  break;		case 't':		  fput_reg (GET_FIELD (insn, 27, 31), info);		  break;		/* Handle floating point registers.  */		case 'f':		  switch (*++s)		    {		    case 't':		      fput_fp_reg (GET_FIELD (insn, 27, 31), info);		      break;		    case 'T':		      if (GET_FIELD (insn, 25, 25))			fput_fp_reg_r (GET_FIELD (insn, 27, 31), info);		      else			fput_fp_reg (GET_FIELD (insn, 27, 31), info);		      break;		    case 'a':		      if (GET_FIELD (insn, 25, 25))			fput_fp_reg_r (GET_FIELD (insn, 6, 10), info);		      else			fput_fp_reg (GET_FIELD (insn, 6, 10), info);		      break;		    /* 'fA' will not generate a space before the regsiter			name.  Normally that is fine.  Except that it			causes problems with xmpyu which has no FP format			completer.  */		    case 'X':		      fputs_filtered (" ", info);		    /* FALLTHRU */		    case 'A':		      if (GET_FIELD (insn, 24, 24))			fput_fp_reg_r (GET_FIELD (insn, 6, 10), info);		      else			fput_fp_reg (GET_FIELD (insn, 6, 10), info);		      		      break;		    case 'b':		      if (GET_FIELD (insn, 25, 25))			fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);		      else			fput_fp_reg (GET_FIELD (insn, 11, 15), info);		      break;		    case 'B':		      if (GET_FIELD (insn, 19, 19))			fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);		      else			fput_fp_reg (GET_FIELD (insn, 11, 15), info);		      break;		    case 'C':		      {			int reg = GET_FIELD (insn, 21, 22);			reg |= GET_FIELD (insn, 16, 18) << 2;			if (GET_FIELD (insn, 23, 23) != 0)			  fput_fp_reg_r (reg, info);			else			  fput_fp_reg (reg, info);			break;		      }		    case 'i':		      {			int reg = GET_FIELD (insn, 6, 10);			reg |= (GET_FIELD (insn, 26, 26) << 4);			fput_fp_reg (reg, info);			break;		      }		    case 'j':		      {			int reg = GET_FIELD (insn, 11, 15);			reg |= (GET_FIELD (insn, 26, 26) << 4);			fput_fp_reg (reg, info);			break;		      }		    case 'k':		      {			int reg = GET_FIELD (insn, 27, 31);			reg |= (GET_FIELD (insn, 26, 26) << 4);			fput_fp_reg (reg, info);			break;		      }		    case 'l':		      {			int reg = GET_FIELD (insn, 21, 25);			reg |= (GET_FIELD (insn, 26, 26) << 4);			fput_fp_reg (reg, info);			break;		      }		    case 'm':		      {			int reg = GET_FIELD (insn, 16, 20);			reg |= (GET_FIELD (insn, 26, 26) << 4);			fput_fp_reg (reg, info);			break;		      }		    /* 'fe' will not generate a space before the register			name.  Normally that is fine.  Except that it			causes problems with fstw fe,y(b) which has no FP			format completer.  */		    case 'E':		      fputs_filtered (" ", info);		    /* FALLTHRU */		    case 'e':		      if (GET_FIELD (insn, 30, 30))			fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);		      else			fput_fp_reg (GET_FIELD (insn, 11, 15), info);		      break;		    case 'x':		      fput_fp_reg (GET_FIELD (insn, 11, 15), info);		      break;		    }		  break;		case '5':		  fput_const (extract_5_load (insn), info);		  break;		case 's':		  (*info->fprintf_func) (info->stream,					 "sr%d", GET_FIELD (insn, 16, 17));		  break;		case 'S':		  (*info->fprintf_func) (info->stream, "sr%d", extract_3 (insn));		  break;		/* Handle completers.  */		case 'c':		  switch (*++s)		    {		    case 'x':		      (*info->fprintf_func) (info->stream, "%s ",					     index_compl_names[GET_COMPL (insn)]);		      break;		    case 'm':		      (*info->fprintf_func) (info->stream, "%s ",					     short_ldst_compl_names[GET_COMPL (insn)]);		      break;		    case 's':		      (*info->fprintf_func) (info->stream, "%s ",					     short_bytes_compl_names[GET_COMPL (insn)]);		      break;		    case 'c':		    case 'C':		      switch (GET_FIELD (insn, 20, 21))			{			case 1:			  (*info->fprintf_func) (info->stream, ",bc ");			  break;			case 2:			  (*info->fprintf_func) (info->stream, ",sl ");			  break;			default:			  (*info->fprintf_func) (info->stream, " ");			}		      break;		    case 'd':		      switch (GET_FIELD (insn, 20, 21))			{			case 1:			  (*info->fprintf_func) (info->stream, ",co ");			  break;			default:			  (*info->fprintf_func) (info->stream, " ");			}		      break;		    case 'o':		      (*info->fprintf_func) (info->stream, ",o");		      break;		    case 'g':		      (*info->fprintf_func) (info->stream, ",gate");		      break;		    case 'p':		      (*info->fprintf_func) (info->stream, ",l,push");		      break;		    case 'P':		      (*info->fprintf_func) (info->stream, ",pop");		      break;		    case 'l':		    case 'L':		      (*info->fprintf_func) (info->stream, ",l");		      break;		    case 'w':		      (*info->fprintf_func) (info->stream, "%s ",					     read_write_names[GET_FIELD (insn, 25, 25)]);		      break;		    case 'W':		      (*info->fprintf_func) (info->stream, ",w");		      break;		    case 'r':		      if (GET_FIELD (insn, 23, 26) == 5)			(*info->fprintf_func) (info->stream, ",r");		      break;		    case 'Z':		      if (GET_FIELD (insn, 26, 26))			(*info->fprintf_func) (info->stream, ",m ");		      else			(*info->fprintf_func) (info->stream, " ");		      break;		    case 'i':		      if (GET_FIELD (insn, 25, 25))			(*info->fprintf_func) (info->stream, ",i");		      break;		    case 'z':		      if (!GET_FIELD (insn, 21, 21))			(*info->fprintf_func) (info->stream, ",z");		      break;		    case 'a':		      (*info->fprintf_func)			(info->stream, "%s", add_compl_names[GET_FIELD							    (insn, 20, 21)]);		      break;		    case 'Y':		      (*info->fprintf_func)			(info->stream, ",dc%s", add_compl_names[GET_FIELD							       (insn, 20, 21)]);		      break;		    case 'y':		      (*info->fprintf_func)			(info->stream, ",c%s", add_compl_names[GET_FIELD							      (insn, 20, 21)]);		      break;		    case 'v':		      if (GET_FIELD (insn, 20, 20))			(*info->fprintf_func) (info->stream, ",tsv");		      break;		    case 't':		      (*info->fprintf_func) (info->stream, ",tc");		      if (GET_FIELD (insn, 20, 20))			(*info->fprintf_func) (info->stream, ",tsv");		      break;		    case 'B':		      (*info->fprintf_func) (info->stream, ",db");		      if (GET_FIELD (insn, 20, 20))			(*info->fprintf_func) (info->stream, ",tsv");		      break;		    case 'b':		      (*info->fprintf_func) (info->stream, ",b");		      if (GET_FIELD (insn, 20, 20))			(*info->fprintf_func) (info->stream, ",tsv");		      break;		    case 'T':		      if (GET_FIELD (insn, 25, 25))			(*info->fprintf_func) (info->stream, ",tc");		      break;		    case 'S':		      /* EXTRD/W has a following condition.  */		      if (*(s + 1) == '?')			(*info->fprintf_func)			  (info->stream, "%s", signed_unsigned_names[GET_FIELD								    (insn, 21, 21)]);		      else			(*info->fprintf_func)			  (info->stream, "%s ", signed_unsigned_names[GET_FIELD								     (insn, 21, 21)]);		      break;		    case 'h':		      (*info->fprintf_func)			  (info->stream, "%s", mix_half_names[GET_FIELD							     (insn, 17, 17)]);		      break;		    case 'H':		      (*info->fprintf_func)			  (info->stream, "%s", saturation_names[GET_FIELD							       (insn, 24, 25)]);		      break;		    case '*':		      (*info->fprintf_func)			  (info->stream, ",%d%d%d%d ",			   GET_FIELD (insn, 17, 18), GET_FIELD (insn, 20, 21),			   GET_FIELD (insn, 22, 23), GET_FIELD (insn, 24, 25));		      break;		    case 'q':		      {			int m, a;			m = GET_FIELD (insn, 28, 28);			a = GET_FIELD (insn, 29, 29);			if (m && !a)			  fputs_filtered (",ma ", info);			else if (m && a)			  fputs_filtered (",mb ", info);			else			  fputs_filtered (" ", info);			break;		      }		    case 'J':		      {			int opc = GET_FIELD (insn, 0, 5);			if (opc == 0x16 || opc == 0x1e)			  {			    if (GET_FIELD (insn, 29, 29) == 0)			      fputs_filtered (",ma ", info);			    else			      fputs_filtered (",mb ", info);			  }			else			  fputs_filtered (" ", info);			break;		      }		    case 'e':		      {			int opc = GET_FIELD (insn, 0, 5);			if (opc == 0x13 || opc == 0x1b)			  {			    if (GET_FIELD (insn, 18, 18) == 1)			      fputs_filtered (",mb ", info);			    else			      fputs_filtered (",ma ", info);			  }			else if (opc == 0x17 || opc == 0x1f)			  {			    if (GET_FIELD (insn, 31, 31) == 1)			      fputs_filtered (",ma ", info);			    else			      fputs_filtered (",mb ", info);			  }			else			  fputs_filtered (" ", info);			break;		      }		    }		  break;		/* Handle conditions.  */		case '?':		  {		    s++;		    switch (*s)		      {		      case 'f':			(*info->fprintf_func) (info->stream, "%s ",					       float_comp_names[GET_FIELD							       (insn, 27, 31)]);			break;		      /* these four conditions are for the set of instructions			   which distinguish true/false conditions by opcode			   rather than by the 'f' bit (sigh): comb, comib,			   addb, addib */		      case 't':			fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)],					info);			break;		      case 'n':			fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)					+ GET_FIELD (insn, 4, 4) * 8], info);			break;		      case 'N':			fputs_filtered (compare_cond_64_names[GET_FIELD (insn, 16, 18)					+ GET_FIELD (insn, 2, 2) * 8], info);			break;		      case 'Q':			fputs_filtered (cmpib_cond_64_names[GET_FIELD (insn, 16, 18)],					info);			break;		      case '@':			fputs_filtered (add_cond_names[GET_FIELD (insn, 16, 18)					+ GET_FIELD (insn, 4, 4) * 8], info);			break;		      case 's':			(*info->fprintf_func) (info->stream, "%s ",

⌨️ 快捷键说明

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