⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ns32k.c

📁 gcc编译工具没有什么特别
💻 C
📖 第 1 页 / 共 3 页
字号:
  else    {      if (flag_pic          && GET_CODE (x) == CONST          && symbolic_reference_mentioned_p (x))        {	  fprintf(stderr, "illegal constant for pic-mode: \n");	  print_rtl(stderr, x);          fprintf(stderr, "\nGET_CODE (x) == %d, CONST == %d, symbolic_reference_mentioned_p (x) == %d\n",		  GET_CODE (x), CONST, symbolic_reference_mentioned_p(x));	  abort ();	}      else if (flag_pic               && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF))	{	  output_addr_const (file, x);	  fprintf (file, "(sb)");	}      else        {#ifdef NO_IMMEDIATE_PREFIX_IF_SYMBOLIC          if (GET_CODE (x) == CONST_INT)#endif	    PUT_IMMEDIATE_PREFIX (file);          output_addr_const (file, x);	}    }}/* PRINT_OPERAND_ADDRESS is defined to call this function,   which is easier to debug than putting all the code in   a macro definition in ns32k.h .  *//* Completely rewritten to get this to work with Gas for PC532 Mach.   This function didn't work and I just wasn't able (nor very willing) to   figure out how it worked.   90-11-25 Tatu Yl|nen <ylo@cs.hut.fi> */voidprint_operand_address (file, addr)     register FILE *file;     register rtx addr;{  static char scales[] = { 'b', 'w', 'd', 0, 'q', };  rtx offset, base, indexexp, tmp;  int scale;  extern int flag_pic;  if (GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == POST_DEC)    {      fprintf (file, "tos");      return;    }  offset = NULL;  base = NULL;  indexexp = NULL;  while (addr != NULL)    {      if (GET_CODE (addr) == PLUS)	{	  if (GET_CODE (XEXP (addr, 0)) == PLUS)	    {	      tmp = XEXP (addr, 1);	      addr = XEXP (addr, 0);	    }	  else	    {	      tmp = XEXP (addr,0);	      addr = XEXP (addr,1);	    }	}      else	{	  tmp = addr;	  addr = NULL;	}      switch (GET_CODE (tmp))	{	case PLUS:	  abort ();	case MEM:	  if (base)	    {	      indexexp = base;	      base = tmp;	    }	  else	    base = tmp;	  break;	case REG:	  if (REGNO (tmp) < F0_REGNUM)	    if (base)	      {		indexexp = tmp;	      }	    else	      base = tmp;	  else	    if (base)	      {		indexexp = base;		base = tmp;	      }	    else	      base = tmp;	  break;	case MULT:	  indexexp = tmp;	  break;	case SYMBOL_REF:	  if (flag_pic && ! CONSTANT_POOL_ADDRESS_P (tmp)	      && ! SYMBOL_REF_FLAG (tmp))	    {	      if (base)		{		  if (indexexp)		    abort ();		  indexexp = base;		}	      base = tmp;	      break;	    }	case CONST:	  if (flag_pic && GET_CODE (tmp) == CONST)	    {	      rtx sym, off, tmp1;	      tmp1 = XEXP (tmp,0);	      if (GET_CODE (tmp1)  != PLUS)		abort ();	      sym = XEXP (tmp1,0);	      if (GET_CODE (sym) != SYMBOL_REF)	        {	          off = sym;		  sym = XEXP (tmp1,1);		}	      else	        off = XEXP (tmp1,1);	      if (GET_CODE (sym) == SYMBOL_REF)		{		  if (GET_CODE (off) != CONST_INT)		    abort ();		  if (CONSTANT_POOL_ADDRESS_P (sym)		      || SYMBOL_REF_FLAG (sym))		    {		      SYMBOL_REF_FLAG (tmp) = 1;		    }		  else		    {		      if (base)			{			  if (indexexp)			    abort ();			  indexexp = base;			}		      if (offset != 0)			abort ();		      base = sym;		      offset = off;		      break;		    }		}	    }	case CONST_INT:	case LABEL_REF:	  if (offset)	    offset = gen_rtx (PLUS, SImode, tmp, offset);	  else	    offset = tmp;	  break;	default:	  abort ();	}    }  if (! offset)    offset = const0_rtx;  if (base#ifndef INDEX_RATHER_THAN_BASE      && (flag_pic || TARGET_HIMEM)      && GET_CODE (base) != SYMBOL_REF       && GET_CODE (offset) != CONST_INT#else  /* This is a re-implementation of the SEQUENT_ADDRESS_BUG fix.  */#endif      && !indexexp && GET_CODE (base) == REG      && REG_OK_FOR_INDEX_P (base))    {      indexexp = base;      base = NULL;    }  /* now, offset, base and indexexp are set */#ifndef BASE_REG_NEEDED  if (! base)    {#if defined (PC_RELATIVE) || defined (NO_ABSOLUTE_PREFIX_IF_SYMBOLIC)      if (GET_CODE (offset) == CONST_INT)#endif	PUT_ABSOLUTE_PREFIX (file);    }#endif  output_addr_const (file, offset);  if (base) /* base can be (REG ...) or (MEM ...) */    switch (GET_CODE (base))      {	/* now we must output base.  Possible alternatives are:	   (rN)       (REG ...)	   (sp)	      (REG ...)	   (fp)       (REG ...)	   (pc)       (REG ...)  used for SYMBOL_REF and LABEL_REF, output	   (disp(fp)) (MEM ...)       just before possible [rX:y]	   (disp(sp)) (MEM ...)	   (disp(sb)) (MEM ...)	   */      case REG:	fprintf (file, "(%s)", ns32k_out_reg_names[REGNO (base)]);	break;      case SYMBOL_REF:	if (! flag_pic)	  abort ();        fprintf (file, "(");	output_addr_const (file, base);	fprintf (file, "(sb))");        break;      case MEM:	addr = XEXP(base,0);	base = NULL;	offset = NULL;	while (addr != NULL)	  {	    if (GET_CODE (addr) == PLUS)	      {		if (GET_CODE (XEXP (addr, 0)) == PLUS)		  {		    tmp = XEXP (addr, 1);		    addr = XEXP (addr, 0);		  }		else		  {		    tmp = XEXP (addr, 0);		    addr = XEXP (addr, 1);		  }	      }	    else	      {		tmp = addr;		addr = NULL;	      }	    switch (GET_CODE (tmp))	      {	      case REG:		base = tmp;		break;	      case CONST:	      case CONST_INT:	      case SYMBOL_REF:	      case LABEL_REF:		if (offset)		  offset = gen_rtx (PLUS, SImode, tmp, offset);		else		  offset = tmp;		break;	      default:		abort ();	      }	  }	if (! offset)	  offset = const0_rtx;	fprintf (file, "(");	output_addr_const (file, offset);	if (base)	  fprintf (file, "(%s)", ns32k_out_reg_names[REGNO (base)]);	else if (TARGET_SB)	  fprintf (file, "(sb)");	else	  abort ();	fprintf (file, ")");	break;      default:	abort ();      }#ifdef PC_RELATIVE  else if (GET_CODE (offset) != CONST_INT)    fprintf (file, "(pc)");#ifdef BASE_REG_NEEDED  else if (TARGET_SB)    fprintf (file, "(sb)");  else    abort ();#endif#endif /* PC_RELATIVE */  /* now print index if we have one */  if (indexexp)    {      if (GET_CODE (indexexp) == MULT)	{	  scale = INTVAL (XEXP (indexexp, 1)) >> 1;	  indexexp = XEXP (indexexp, 0);	}      else	scale = 0;      if (GET_CODE (indexexp) != REG || REGNO (indexexp) >= F0_REGNUM)	abort ();#ifdef UTEK_ASM      fprintf (file, "[%c`%s]",	       scales[scale],	       ns32k_out_reg_names[REGNO (indexexp)]);#else      fprintf (file, "[%s:%c]",	       ns32k_out_reg_names[REGNO (indexexp)],	       scales[scale]);#endif    }}/* National 32032 shifting is so bad that we can get   better performance in many common cases by using other   techniques.  */char *output_shift_insn (operands)     rtx *operands;{  if (GET_CODE (operands[2]) == CONST_INT      && INTVAL (operands[2]) > 0      && INTVAL (operands[2]) <= 3)    if (GET_CODE (operands[0]) == REG)      {	if (GET_CODE (operands[1]) == REG)	  {	    if (REGNO (operands[0]) == REGNO (operands[1]))	      {		if (operands[2] == const1_rtx)		  return "addd %0,%0";		else if (INTVAL (operands[2]) == 2)		  return "addd %0,%0\n\taddd %0,%0";	      }	    if (operands[2] == const1_rtx)	      return "movd %1,%0\n\taddd %0,%0";	    	    operands[1] = gen_indexed_expr (const0_rtx, operands[1], operands[2]);	    return "addr %a1,%0";	  }	if (operands[2] == const1_rtx)	  return "movd %1,%0\n\taddd %0,%0";      }    else if (GET_CODE (operands[1]) == REG)      {	operands[1] = gen_indexed_expr (const0_rtx, operands[1], operands[2]);	return "addr %a1,%0";      }    else if (INTVAL (operands[2]) == 1	     && GET_CODE (operands[1]) == MEM	     && rtx_equal_p (operands [0], operands[1]))      {	rtx temp = XEXP (operands[1], 0);		if (GET_CODE (temp) == REG	    || (GET_CODE (temp) == PLUS		&& GET_CODE (XEXP (temp, 0)) == REG		&& GET_CODE (XEXP (temp, 1)) == CONST_INT))	  return "addd %0,%0";      }    else return "ashd %2,%0";  return "ashd %2,%0";}char *output_move_dconst (n, s)	int n;	char *s;{  static char r[32];  if (n > -9 && n < 8)    strcpy (r, "movqd ");  else if (n > 0 && n < 256)    strcpy (r, "movzbd ");  else if (n > 0 && n < 65536)    strcpy (r, "movzwd ");  else if (n < 0 && n > -129)    strcpy (r, "movxbd ");  else if (n < 0 && n > -32769)    strcpy (r, "movxwd ");  else    strcpy (r, "movd ");  strcat (r, s);  return r;}

⌨️ 快捷键说明

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