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

📄 s390.c

📁 linux下的gcc编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
      switch (GET_CODE (code))        {	case GTU:	return CC0 | CC1;  /* borrow */	case LEU:	return CC2 | CC3;  /* no borrow */	default:	  abort ();        }      break;    case CCUmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC1 | CC2 | CC3;        case LTU:	return CC1;        case GTU:	return CC2;        case LEU:	return CC0 | CC1;        case GEU:	return CC0 | CC2;	default:	  abort ();        }      break;    case CCURmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC2 | CC1 | CC3;        case LTU:	return CC2;        case GTU:	return CC1;        case LEU:	return CC0 | CC2;        case GEU:	return CC0 | CC1;	default:	  abort ();        }      break;    case CCAPmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC1 | CC2 | CC3;        case LT:	return CC1 | CC3;        case GT:	return CC2;        case LE:	return CC0 | CC1 | CC3;        case GE:	return CC0 | CC2;	default:	  abort ();        }      break;    case CCANmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC1 | CC2 | CC3;        case LT:	return CC1;        case GT:	return CC2 | CC3;        case LE:	return CC0 | CC1;        case GE:	return CC0 | CC2 | CC3;	default:	  abort ();        }      break;    case CCSmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC1 | CC2 | CC3;        case LT:	return CC1;        case GT:	return CC2;        case LE:	return CC0 | CC1;        case GE:	return CC0 | CC2;	case UNORDERED:	return CC3;	case ORDERED:	return CC0 | CC1 | CC2;	case UNEQ:	return CC0 | CC3;        case UNLT:	return CC1 | CC3;        case UNGT:	return CC2 | CC3;        case UNLE:	return CC0 | CC1 | CC3;        case UNGE:	return CC0 | CC2 | CC3;	case LTGT:	return CC1 | CC2;	default:	  abort ();        }      break;    case CCSRmode:      switch (GET_CODE (code))        {        case EQ:	return CC0;        case NE:	return CC2 | CC1 | CC3;        case LT:	return CC2;        case GT:	return CC1;        case LE:	return CC0 | CC2;        case GE:	return CC0 | CC1;	case UNORDERED:	return CC3;	case ORDERED:	return CC0 | CC2 | CC1;	case UNEQ:	return CC0 | CC3;        case UNLT:	return CC2 | CC3;        case UNGT:	return CC1 | CC3;        case UNLE:	return CC0 | CC2 | CC3;        case UNGE:	return CC0 | CC1 | CC3;	case LTGT:	return CC2 | CC1;	default:	  abort ();        }      break;    default:      abort ();    }}/* If INV is false, return assembler mnemonic string to implement    a branch specified by CODE.  If INV is true, return mnemonic    for the corresponding inverted branch.  */static const char *s390_branch_condition_mnemonic (code, inv)     rtx code;     int inv;{  static const char *const mnemonic[16] =    {      NULL, "o", "h", "nle",      "l", "nhe", "lh", "ne",      "e", "nlh", "he", "nl",      "le", "nh", "no", NULL    };  int mask = s390_branch_condition_mask (code);  if (inv)    mask ^= 15;  if (mask < 1 || mask > 14)    abort ();  return mnemonic[mask];}/* If OP is an integer constant of mode MODE with exactly one   HImode subpart unequal to DEF, return the number of that    subpart.  As a special case, all HImode subparts of OP are   equal to DEF, return zero.  Otherwise, return -1.  */ints390_single_hi (op, mode, def)     rtx op;     enum machine_mode mode;     int def;{  if (GET_CODE (op) == CONST_INT)    {      unsigned HOST_WIDE_INT value = 0;      int n_parts = GET_MODE_SIZE (mode) / 2;      int i, part = -1;      for (i = 0; i < n_parts; i++)        {          if (i == 0)            value = (unsigned HOST_WIDE_INT) INTVAL (op);          else            value >>= 16;          if ((value & 0xffff) != (unsigned)(def & 0xffff))            {              if (part != -1)                return -1;              else                part = i;            }        }      return part == -1 ? 0 : (n_parts - 1 - part);    }  else if (GET_CODE (op) == CONST_DOUBLE           && GET_MODE (op) == VOIDmode)    {      unsigned HOST_WIDE_INT value = 0;      int n_parts = GET_MODE_SIZE (mode) / 2;      int i, part = -1;      for (i = 0; i < n_parts; i++)        {          if (i == 0)            value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);          else if (i == HOST_BITS_PER_WIDE_INT / 16)            value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op);          else            value >>= 16;          if ((value & 0xffff) != (unsigned)(def & 0xffff))            {              if (part != -1)                return -1;              else                part = i;            }        }      return part == -1 ? 0 : (n_parts - 1 - part);    }  return -1;      }/* Extract the HImode part number PART from integer    constant OP of mode MODE.  */ints390_extract_hi (op, mode, part)    rtx op;    enum machine_mode mode;    int part;{  int n_parts = GET_MODE_SIZE (mode) / 2;  if (part < 0 || part >= n_parts)    abort();  else    part = n_parts - 1 - part;  if (GET_CODE (op) == CONST_INT)    {      unsigned HOST_WIDE_INT value = (unsigned HOST_WIDE_INT) INTVAL (op);      return ((value >> (16 * part)) & 0xffff);    }  else if (GET_CODE (op) == CONST_DOUBLE           && GET_MODE (op) == VOIDmode)    {      unsigned HOST_WIDE_INT value;      if (part < HOST_BITS_PER_WIDE_INT / 16)        value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);      else        value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op),        part -= HOST_BITS_PER_WIDE_INT / 16;      return ((value >> (16 * part)) & 0xffff);     }  abort ();}/* If OP is an integer constant of mode MODE with exactly one   QImode subpart unequal to DEF, return the number of that    subpart.  As a special case, all QImode subparts of OP are   equal to DEF, return zero.  Otherwise, return -1.  */ints390_single_qi (op, mode, def)     rtx op;     enum machine_mode mode;     int def;{  if (GET_CODE (op) == CONST_INT)    {      unsigned HOST_WIDE_INT value = 0;      int n_parts = GET_MODE_SIZE (mode);      int i, part = -1;      for (i = 0; i < n_parts; i++)        {          if (i == 0)            value = (unsigned HOST_WIDE_INT) INTVAL (op);          else            value >>= 8;          if ((value & 0xff) != (unsigned)(def & 0xff))            {              if (part != -1)                return -1;              else                part = i;            }        }      return part == -1 ? 0 : (n_parts - 1 - part);    }  else if (GET_CODE (op) == CONST_DOUBLE           && GET_MODE (op) == VOIDmode)    {      unsigned HOST_WIDE_INT value = 0;      int n_parts = GET_MODE_SIZE (mode);      int i, part = -1;      for (i = 0; i < n_parts; i++)        {          if (i == 0)            value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);          else if (i == HOST_BITS_PER_WIDE_INT / 8)            value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op);          else            value >>= 8;          if ((value & 0xff) != (unsigned)(def & 0xff))            {              if (part != -1)                return -1;              else                part = i;            }        }      return part == -1 ? 0 : (n_parts - 1 - part);    }  return -1;      }/* Extract the QImode part number PART from integer    constant OP of mode MODE.  */ints390_extract_qi (op, mode, part)    rtx op;    enum machine_mode mode;    int part;{  int n_parts = GET_MODE_SIZE (mode);  if (part < 0 || part >= n_parts)    abort();  else    part = n_parts - 1 - part;  if (GET_CODE (op) == CONST_INT)    {      unsigned HOST_WIDE_INT value = (unsigned HOST_WIDE_INT) INTVAL (op);      return ((value >> (8 * part)) & 0xff);    }  else if (GET_CODE (op) == CONST_DOUBLE           && GET_MODE (op) == VOIDmode)    {      unsigned HOST_WIDE_INT value;      if (part < HOST_BITS_PER_WIDE_INT / 8)        value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);      else        value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op),        part -= HOST_BITS_PER_WIDE_INT / 8;      return ((value >> (8 * part)) & 0xff);     }  abort ();}/* Check whether we can (and want to) split a double-word    move in mode MODE from SRC to DST into two single-word    moves, moving the subword FIRST_SUBWORD first.  */bools390_split_ok_p (dst, src, mode, first_subword)     rtx dst;     rtx src;     enum machine_mode mode;     int first_subword;{  /* Floating point registers cannot be split.  */  if (FP_REG_P (src) || FP_REG_P (dst))    return false;  /* We don't need to split if operands are directly accessable.  */  if (s_operand (src, mode) || s_operand (dst, mode))    return false;  /* Non-offsettable memory references cannot be split.  */  if ((GET_CODE (src) == MEM && !offsettable_memref_p (src))      || (GET_CODE (dst) == MEM && !offsettable_memref_p (dst)))    return false;  /* Moving the first subword must not clobber a register     needed to move the second subword.  */  if (register_operand (dst, mode))    {      rtx subreg = operand_subword (dst, first_subword, 0, mode);      if (reg_overlap_mentioned_p (subreg, src))        return false;    }  return true;}/* Change optimizations to be performed, depending on the    optimization level.   LEVEL is the optimization level specified; 2 if `-O2' is   specified, 1 if `-O' is specified, and 0 if neither is specified.   SIZE is nonzero if `-Os' is specified and zero otherwise.  */voidoptimization_options (level, size)     int level ATTRIBUTE_UNUSED;     int size ATTRIBUTE_UNUSED;{  /* ??? There are apparently still problems with -fcaller-saves.  */  flag_caller_saves = 0;  /* By default, always emit DWARF-2 unwind info.  This allows debugging     without maintaining a stack frame back-chain.  */  flag_asynchronous_unwind_tables = 1;}voidoverride_options (){  /* Acquire a unique set number for our register saves and restores.  */  s390_sr_alias_set = new_alias_set ();  /* Set up function hooks.  */  init_machine_status = s390_init_machine_status;}/* Map for smallest class containing reg regno.  */const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] ={ GENERAL_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,  ADDR_REGS,    ADDR_REGS, ADDR_REGS, ADDR_REGS,  ADDR_REGS,    ADDR_REGS, ADDR_REGS, ADDR_REGS,  ADDR_REGS,    ADDR_REGS, ADDR_REGS, ADDR_REGS,  FP_REGS,      FP_REGS,   FP_REGS,   FP_REGS,  FP_REGS,      FP_REGS,   FP_REGS,   FP_REGS,  FP_REGS,      FP_REGS,   FP_REGS,   FP_REGS,  FP_REGS,      FP_REGS,   FP_REGS,   FP_REGS,  ADDR_REGS,    NO_REGS,   ADDR_REGS };/* Return true if OP a (const_int 0) operand.   OP is the current operation.   MODE is the current operation mode.  */ intconst0_operand (op, mode)     register rtx op;     enum machine_mode mode;{  return op == CONST0_RTX (mode);}/* Return true if OP is constant.   OP is the current operation.   MODE is the current operation mode.  */intconsttable_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  return CONSTANT_P (op);}/* Return true if the mode of operand OP matches MODE.   If MODE is set to VOIDmode, set it to the mode of OP.  */ static intcheck_mode (op, mode)     register rtx op;     enum machine_mode *mode;{  if (*mode == VOIDmode)      *mode = GET_MODE (op);  else  {    if (GET_MODE (op) != VOIDmode && GET_MODE (op) != *mode)       return 0;  }  return 1;}/* Return true if OP a valid operand for the LARL instruction.   OP is the current operation.   MODE is the current operation mode.  */intlarl_operand (op, mode)     register rtx op;     enum machine_mode mode;{  if (! check_mode (op, &mode))    return 0;  /* Allow labels and local symbols.  */  if (GET_CODE (op) == LABEL_REF)    return 1;

⌨️ 快捷键说明

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