dsp16xx.c

来自「gcc3.2.1源代码」· C语言 代码 · 共 2,611 行 · 第 1/5 页

C
2,611
字号
	case YH_REG:	  return (!reload_in_progress ? NO_REGS : class);	case YH_OR_ACCUM_HIGH_REGS:	  return ACCUM_HIGH_REGS;	case X_OR_YH_REGS: 	case YL_REG:	  return (!reload_in_progress ? NO_REGS : class);	case YL_OR_ACCUM_LOW_REGS: 	  return ACCUM_LOW_REGS;	case X_OR_YL_REGS:	case X_OR_Y_REGS: case Y_REG:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_OR_Y_REGS: 	  return ACCUM_REGS;	case PH_REG:	case X_OR_PH_REGS: case PL_REG: 	  return (!reload_in_progress ? NO_REGS : class);	case PL_OR_ACCUM_LOW_REGS: 	  return ACCUM_LOW_REGS;	case X_OR_PL_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case YL_OR_PL_OR_ACCUM_LOW_REGS:  	  return ACCUM_LOW_REGS;	case P_REG:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_OR_P_REGS: 	  return ACCUM_REGS;	case YL_OR_P_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_LOW_OR_YL_OR_P_REGS:  	  return ACCUM_LOW_REGS;	case Y_OR_P_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_Y_OR_P_REGS: 	  return ACCUM_REGS;	case NO_FRAME_Y_ADDR_REGS:	case Y_ADDR_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_LOW_OR_Y_ADDR_REGS: 	  return ACCUM_LOW_REGS;	case ACCUM_OR_Y_ADDR_REGS: 	  return ACCUM_REGS;	case X_OR_Y_ADDR_REGS:	case Y_OR_Y_ADDR_REGS: 	case P_OR_Y_ADDR_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case NON_HIGH_YBASE_ELIGIBLE_REGS:  	  return ACCUM_LOW_REGS;	case YBASE_ELIGIBLE_REGS:	  return ACCUM_REGS;	case J_REG:	case J_OR_DAU_16_BIT_REGS:	case BMU_REGS: 	  return (!reload_in_progress ? NO_REGS : class);	case YBASE_VIRT_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return class;	  else	    return (!reload_in_progress ? NO_REGS : class);	case ACCUM_LOW_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return class;	  else	    return ACCUM_LOW_REGS;	case ACCUM_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return class;	  else	    return ACCUM_REGS;	case X_OR_YBASE_REGS:	case Y_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return YBASE_VIRT_REGS;	  else	    return (!reload_in_progress ? NO_REGS : class);	case ACCUM_LOW_YL_PL_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_LOW_OR_YBASE_REGS;	  else	    return ACCUM_LOW_REGS;	case P_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return YBASE_VIRT_REGS;	  else	    return (!reload_in_progress ? NO_REGS : class);	case ACCUM_Y_P_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_OR_YBASE_REGS;	  else	    return ACCUM_REGS;	case Y_ADDR_OR_YBASE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return YBASE_VIRT_REGS;	  else	    return (!reload_in_progress ? NO_REGS : class);	case YBASE_OR_NOHIGH_YBASE_ELIGIBLE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_LOW_OR_YBASE_REGS;	  else	    return ACCUM_LOW_REGS;	case YBASE_OR_YBASE_ELIGIBLE_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_OR_YBASE_REGS;	  else	    return ACCUM_REGS;	case NO_HIGH_ALL_REGS:	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_LOW_OR_YBASE_REGS;	  else	    return ACCUM_LOW_REGS;	case ALL_REGS: 	  if (IS_YBASE_ELIGIBLE_REG (REGNO (x)))	    return ACCUM_OR_YBASE_REGS;	  else	    return ACCUM_REGS;	case NOHIGH_NON_ADDR_REGS:	    return ACCUM_LOW_REGS;	case NON_ADDR_REGS:	case SLOW_MEM_LOAD_REGS:	    return ACCUM_REGS;	case NOHIGH_NON_YBASE_REGS:	    return ACCUM_LOW_REGS;	case NO_ACCUM_NON_YBASE_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case NON_YBASE_REGS:	    return ACCUM_REGS;	default:	  return class;	}    }  /* If x (the input) is a ybase register, restrict the class of registers     we can copy the register into.  */  if (REG_P (x) && !TARGET_RESERVE_YBASE      && IS_YBASE_REGISTER_WINDOW (REGNO(x)))    {      switch ((int) class)	{	case NO_REGS:	case A0H_REG: case A0L_REG: case A0_REG: case A1H_REG:	case ACCUM_HIGH_REGS: case A1L_REG: case ACCUM_LOW_REGS: 	case A1_REG: case ACCUM_REGS: case X_REG: 	case X_OR_ACCUM_LOW_REGS: case X_OR_ACCUM_REGS:	case YH_REG: case YH_OR_ACCUM_HIGH_REGS:	case X_OR_YH_REGS: case YL_REG:	case YL_OR_ACCUM_LOW_REGS: case X_OR_YL_REGS:	case X_OR_Y_REGS: case Y_REG:	case ACCUM_OR_Y_REGS: case PH_REG:	case X_OR_PH_REGS: case PL_REG: 	case PL_OR_ACCUM_LOW_REGS: case X_OR_PL_REGS:	case YL_OR_PL_OR_ACCUM_LOW_REGS: case P_REG:	case ACCUM_OR_P_REGS: case YL_OR_P_REGS:	case ACCUM_LOW_OR_YL_OR_P_REGS: case Y_OR_P_REGS:	case ACCUM_Y_OR_P_REGS: case NO_FRAME_Y_ADDR_REGS:	case Y_ADDR_REGS: case ACCUM_LOW_OR_Y_ADDR_REGS:	case ACCUM_OR_Y_ADDR_REGS: case X_OR_Y_ADDR_REGS:	case Y_OR_Y_ADDR_REGS: case P_OR_Y_ADDR_REGS:	case NON_HIGH_YBASE_ELIGIBLE_REGS: case YBASE_ELIGIBLE_REGS:	default:	  return class;	case J_REG:	  return (!reload_in_progress ? NO_REGS : class);	case J_OR_DAU_16_BIT_REGS:	  return ACCUM_HIGH_REGS;	case BMU_REGS: 	case YBASE_VIRT_REGS:	  return (!reload_in_progress ? NO_REGS : class);	case ACCUM_LOW_OR_YBASE_REGS:	  return ACCUM_LOW_REGS;	case ACCUM_OR_YBASE_REGS:	  return ACCUM_REGS;	case X_OR_YBASE_REGS:	  return X_REG;	case Y_OR_YBASE_REGS:	  return Y_REG;	case ACCUM_LOW_YL_PL_OR_YBASE_REGS:	  return YL_OR_PL_OR_ACCUM_LOW_REGS; 	case P_OR_YBASE_REGS:	  return P_REG;	case ACCUM_Y_P_OR_YBASE_REGS:	  return ACCUM_Y_OR_P_REGS;	case Y_ADDR_OR_YBASE_REGS:	  return Y_ADDR_REGS;	case YBASE_OR_NOHIGH_YBASE_ELIGIBLE_REGS:	  return NON_HIGH_YBASE_ELIGIBLE_REGS;	case YBASE_OR_YBASE_ELIGIBLE_REGS:	  return YBASE_ELIGIBLE_REGS;	case NO_HIGH_ALL_REGS:	  return NON_HIGH_YBASE_ELIGIBLE_REGS;	case ALL_REGS: 	  return YBASE_ELIGIBLE_REGS;	case NOHIGH_NON_ADDR_REGS:	  return ACCUM_LOW_OR_YL_OR_P_REGS;	case NON_ADDR_REGS:	  return ACCUM_Y_OR_P_REGS;	case SLOW_MEM_LOAD_REGS:	  return ACCUM_OR_Y_ADDR_REGS;	case NOHIGH_NON_YBASE_REGS:    	  return NON_HIGH_YBASE_ELIGIBLE_REGS;    	case NO_ACCUM_NON_YBASE_REGS:	  return Y_ADDR_REGS;    	case NON_YBASE_REGS:	  return YBASE_ELIGIBLE_REGS;	}    }  if (GET_CODE (x) == PLUS)    {      if (GET_MODE (x) == QImode	  && REG_P (XEXP (x,0))	  && (XEXP (x,0) == frame_pointer_rtx	      || XEXP (x,0) == stack_pointer_rtx)	  && (GET_CODE (XEXP (x,1)) == CONST_INT))	{	  if (class == ACCUM_HIGH_REGS)	    return class;	  /* If the accumulators are not part of the class	     being reloaded into, return NO_REGS.  */#if 0	  if (!reg_class_subset_p (ACCUM_REGS, class))	    return (!reload_in_progress ? NO_REGS : class);#endif	  if (reg_class_subset_p (ACCUM_HIGH_REGS, class))	    return ACCUM_HIGH_REGS;	  /* We will use accumulator 'a1l' for reloading a	     PLUS.  We can only use one accumulator because	     'reload_inqi' only allows one alternative to be	     used.  */	  else if (class == ACCUM_LOW_REGS)	    return A1L_REG;	  else if (class == A0L_REG)	    return NO_REGS;	  else	    return class;	}      if (class == NON_YBASE_REGS || class == YBASE_ELIGIBLE_REGS)	return Y_ADDR_REGS;      else	return class;    }  else if (GET_CODE (x) == MEM)    {      /* We can't copy from a memory location into a	 ybase register.  */      if (reg_class_subset_p(YBASE_VIRT_REGS, class))	{	  switch ((int) class)	    {	    case YBASE_VIRT_REGS:	      return (!reload_in_progress ? NO_REGS : class);	    case ACCUM_LOW_OR_YBASE_REGS:	      return ACCUM_LOW_REGS;	    case ACCUM_OR_YBASE_REGS:	      return ACCUM_REGS;	    case X_OR_YBASE_REGS:	      return X_REG;	    case Y_OR_YBASE_REGS:	      return Y_REG;	    case ACCUM_LOW_YL_PL_OR_YBASE_REGS:	      return YL_OR_PL_OR_ACCUM_LOW_REGS;	    case P_OR_YBASE_REGS:	      return P_REG;	    case ACCUM_Y_P_OR_YBASE_REGS:	      return ACCUM_Y_OR_P_REGS;	    case Y_ADDR_OR_YBASE_REGS:	      return Y_ADDR_REGS;	    case YBASE_OR_NOHIGH_YBASE_ELIGIBLE_REGS:	      return NON_HIGH_YBASE_ELIGIBLE_REGS;	  	    case YBASE_OR_YBASE_ELIGIBLE_REGS:	      return YBASE_ELIGIBLE_REGS;	    case NO_HIGH_ALL_REGS:	      return NOHIGH_NON_YBASE_REGS;	    case ALL_REGS:	      return NON_YBASE_REGS;	    default:	      return class;	    }	}      else	return class;    }  else    return class;}	/* Return the register class of a scratch register needed to copy IN into   or out of a register in CLASS in MODE.  If it can be done directly,   NO_REGS is returned.  */enum reg_classsecondary_reload_class (class, mode, in)     enum reg_class class;     enum machine_mode mode;     rtx in;{  int regno = -1;  if (GET_CODE (in) == REG || GET_CODE (in) == SUBREG)    regno = true_regnum (in);  /* If we are reloading a plus into a high accumulator register,     we need a scratch low accumulator, because the low half gets     clobbered.  */  if (class == ACCUM_HIGH_REGS       || class == A1H_REG      || class == A0H_REG)    {      if (GET_CODE (in) == PLUS && mode == QImode)	return ACCUM_LOW_REGS;    }  if (class == ACCUM_HIGH_REGS       || class == ACCUM_LOW_REGS      || class == A1L_REG      || class == A0L_REG      || class == A1H_REG      || class == A0H_REG)    {      if (GET_CODE (in) == PLUS && mode == QImode)	{	  rtx addr0 = XEXP (in, 0);	  rtx addr1 = XEXP (in, 1);	  	  /* If we are reloading a plus (reg:QI) (reg:QI)	     we need an additional register.  */ 	  if (REG_P (addr0) && REG_P (addr1))	    return NO_REGS;	}    }  /* We can place anything into ACCUM_REGS and can put ACCUM_REGS     into anything.  */  if ((class == ACCUM_REGS || class == ACCUM_HIGH_REGS ||       class == ACCUM_LOW_REGS || class == A0H_REG || class == A0L_REG ||       class == A1H_REG || class == A1_REG) ||       (regno >= REG_A0 && regno < REG_A1L + 1))    return NO_REGS;  if (class == ACCUM_OR_YBASE_REGS && REG_P(in)      && IS_YBASE_ELIGIBLE_REG(regno))    {      return NO_REGS;    }  /* We can copy the ybase registers into:     r0-r3, a0-a1, y, p, & x or the union of     any of these.  */  if (!TARGET_RESERVE_YBASE && IS_YBASE_REGISTER_WINDOW(regno))    {      switch ((int) class)	{	case (int) X_REG:	case (int) X_OR_ACCUM_LOW_REGS:	case (int) X_OR_ACCUM_REGS:	case (int) YH_REG:	case (int) YH_OR_ACCUM_HIGH_REGS:	case (int) X_OR_YH_REGS:	case (int) YL_REG:	case (int) YL_OR_ACCUM_LOW_REGS:	case (int) X_OR_Y_REGS:	case (int) X_OR_YL_REGS:	case (int) Y_REG:	case (int) ACCUM_OR_Y_REGS:	case (int) PH_REG:	case (int) X_OR_PH_REGS:	case (int) PL_REG:	case (int) PL_OR_ACCUM_LOW_REGS:	case (int) X_OR_PL_REGS:	case (int) YL_OR_PL_OR_ACCUM_LOW_REGS:	case (int) P_REG:	case (int) ACCUM_OR_P_REGS:	case (int) YL_OR_P_REGS:	case (int) ACCUM_LOW_OR_YL_OR_P_REGS:	case (int) Y_OR_P_REGS:	case (int) ACCUM_Y_OR_P_REGS:	case (int) Y_ADDR_REGS:	case (int) ACCUM_LOW_OR_Y_ADDR_REGS:	case (int) ACCUM_OR_Y_ADDR_REGS:	case (int) X_OR_Y_ADDR_REGS:	case (int) Y_OR_Y_ADDR_REGS:	case (int) P_OR_Y_ADDR_REGS:	case (int) YBASE_ELIGIBLE_REGS:	  return NO_REGS;	default:	  return ACCUM_HIGH_REGS;	}    }  /* We can copy r0-r3, a0-a1, y, & p     directly to the ybase registers. In addition     we can use any of the ybase virtual registers     as the secondary reload registers when copying     between any of these registers.  */  if (!TARGET_RESERVE_YBASE && regno != -1)    {      switch (regno)	{	case REG_A0:	case REG_A0L:	case REG_A1:	case REG_A1L:	case REG_X:	case REG_Y:	case REG_YL:	case REG_PROD:	case REG_PRODL:	case REG_R0:	case REG_R1:	case REG_R2:	case REG_R3:	  if (class == YBASE_VIRT_REGS)	    return NO_REGS;	  else	    {	      switch ((int) class)		{		case (int) X_REG:		case (int) X_OR_ACCUM_LOW_REGS:		case (int) X_OR_ACCUM_REGS:		case (int) YH_REG:		case (int) YH_OR_ACCUM_HIGH_REGS:		case (int) X_OR_YH_REGS:		case (int) YL_REG:		case (int) YL_OR_ACCUM_LOW_REGS:		case (int) X_OR_Y_REGS:		case (int) X_OR_YL_REGS:		case (int) Y_REG:		case (int) ACCUM_OR_Y_REGS:		case (int) PH_REG:		case (int) X_OR_PH_REGS:		case (int) PL_REG:		case (int) PL_OR_ACCUM_LOW_REGS:		case (int) X_OR_PL_REGS:		case (int) YL_OR_PL_OR_ACCUM_LOW_REGS:		case (int) P_REG:		case (int) ACCUM_OR_P_REGS:		case (int) YL_OR_P_REGS:		case (int) ACCUM_LOW_OR_YL_OR_P_REGS:

⌨️ 快捷键说明

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