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

📄 predicates.md

📁 linux下编程用 编译软件
💻 MD
📖 第 1 页 / 共 2 页
字号:
{  /* Only pre dec allowed.  */  if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC)    return 0;  if (mode == DImode && TARGET_SHMEDIA && GET_CODE (op) == SUBREG      && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8      && ! (high_life_started || reload_completed))    return 0;  return general_operand (op, mode);});; Returns 1 if OP is a MEM that can be source of a simple move operation.(define_predicate "unaligned_load_operand"  (match_code "mem"){  rtx inside;  if (GET_CODE (op) != MEM || GET_MODE (op) != mode)    return 0;  inside = XEXP (op, 0);  if (GET_CODE (inside) == POST_INC)    inside = XEXP (inside, 0);  if (GET_CODE (inside) == REG)    return 1;  return 0;});; TODO: Add a comment here.(define_predicate "greater_comparison_operator"  (match_code "gt,ge,gtu,geu"){  if (mode != VOIDmode && GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case GT:    case GE:    case GTU:    case GEU:      return 1;    default:      return 0;    }});; TODO: Add a comment here.(define_predicate "inqhi_operand"  (match_code "truncate"){  if (GET_CODE (op) != TRUNCATE || mode != GET_MODE (op))    return 0;  op = XEXP (op, 0);  /* Can't use true_regnum here because copy_cost wants to know about     SECONDARY_INPUT_RELOAD_CLASS.  */  return GET_CODE (op) == REG && FP_REGISTER_P (REGNO (op));});; TODO: Add a comment here.(define_special_predicate "int_gpr_dest"  (match_code "subreg,reg"){  enum machine_mode op_mode = GET_MODE (op);  if (GET_MODE_CLASS (op_mode) != MODE_INT      || GET_MODE_SIZE (op_mode) >= UNITS_PER_WORD)    return 0;  if (! reload_completed)    return 0;  return true_regnum (op) <= LAST_GENERAL_REG;});; TODO: Add a comment here.(define_predicate "less_comparison_operator"  (match_code "lt,le,ltu,leu"){  if (mode != VOIDmode && GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case LT:    case LE:    case LTU:    case LEU:      return 1;    default:      return 0;    }});; Returns 1 if OP is a valid source operand for a logical operation.(define_predicate "logical_operand"  (match_code "subreg,reg,const_int"){  if (TARGET_SHMEDIA      && mode != DImode && GET_CODE (op) == SUBREG      && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)    return 0;  if (arith_reg_operand (op, mode))    return 1;  if (TARGET_SHMEDIA)    {      if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I10 (INTVAL (op)))	return 1;      else	return 0;    }  else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_K08 (INTVAL (op)))    return 1;  return 0;});; TODO: Add a comment here.(define_predicate "logical_operator"  (match_code "and,ior,xor"){  if (mode != VOIDmode && GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case AND:    case IOR:    case XOR:      return 1;    default:      return 0;    }});; Like arith_reg_operand, but for register source operands of narrow;; logical SHMEDIA operations: forbid subregs of DImode / TImode regs.(define_predicate "logical_reg_operand"  (match_code "subreg,reg"){  if (TARGET_SHMEDIA      && GET_CODE (op) == SUBREG      && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4      && mode != DImode)    return 0;  return arith_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "mextr_bit_offset"  (match_code "const_int"){  HOST_WIDE_INT i;  if (GET_CODE (op) != CONST_INT)    return 0;  i = INTVAL (op);  return i >= 1 * 8 && i <= 7 * 8 && (i & 7) == 0;});; TODO: Add a comment here.(define_predicate "minuend_operand"  (match_code "subreg,reg,truncate,const_int"){  return op == constm1_rtx || extend_reg_or_0_operand (op, mode);});; TODO: Add a comment here.(define_predicate "noncommutative_float_operator"  (match_code "minus,div"){  if (GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case MINUS:    case DIV:      return 1;    default:      break;    }  return 0;});; TODO: Add a comment here.(define_predicate "sh_const_vec"  (match_code "const_vector"){  int i;  if (GET_CODE (op) != CONST_VECTOR      || (GET_MODE (op) != mode && mode != VOIDmode))    return 0;  i = XVECLEN (op, 0) - 1;  for (; i >= 0; i--)    if (GET_CODE (XVECEXP (op, 0, i)) != CONST_INT)      return 0;  return 1;});; Determine if OP is a constant vector matching MODE with only one;; element that is not a sign extension.  Two byte-sized elements;; count as one.(define_predicate "sh_1el_vec"  (match_code "const_vector"){  int unit_size;  int i, last, least, sign_ix;  rtx sign;  if (GET_CODE (op) != CONST_VECTOR      || (GET_MODE (op) != mode && mode != VOIDmode))    return 0;  /* Determine numbers of last and of least significant elements.  */  last = XVECLEN (op, 0) - 1;  least = TARGET_LITTLE_ENDIAN ? 0 : last;  if (GET_CODE (XVECEXP (op, 0, least)) != CONST_INT)    return 0;  sign_ix = least;  if (GET_MODE_UNIT_SIZE (mode) == 1)    sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1;  if (GET_CODE (XVECEXP (op, 0, sign_ix)) != CONST_INT)    return 0;  unit_size = GET_MODE_UNIT_SIZE (GET_MODE (op));  sign = (INTVAL (XVECEXP (op, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1)	  ? constm1_rtx : const0_rtx);  i = XVECLEN (op, 0) - 1;  do    if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign)      return 0;  while (--i);  return 1;});; Like register_operand, but take into account that SHMEDIA can use;; the constant zero like a general register.(define_predicate "sh_register_operand"  (match_code "reg,subreg,const_int"){  if (op == CONST0_RTX (mode) && TARGET_SHMEDIA)    return 1;  return register_operand (op, mode);});; TODO: Add a comment here.(define_predicate "sh_rep_vec"  (match_code "const_vector"){  int i;  rtx x, y;  if ((GET_CODE (op) != CONST_VECTOR && GET_CODE (op) != PARALLEL)      || (GET_MODE (op) != mode && mode != VOIDmode))    return 0;  i = XVECLEN (op, 0) - 2;  x = XVECEXP (op, 0, i + 1);  if (GET_MODE_UNIT_SIZE (mode) == 1)    {      y = XVECEXP (op, 0, i);      for (i -= 2; i >= 0; i -= 2)	if (! rtx_equal_p (XVECEXP (op, 0, i + 1), x)	    || ! rtx_equal_p (XVECEXP (op, 0, i), y))	  return 0;    }  else    for (; i >= 0; i--)      if (XVECEXP (op, 0, i) != x)	return 0;  return 1;});; TODO: Add a comment here.(define_predicate "shift_count_operand"  (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg,zero_extend,sign_extend"){  return (CONSTANT_P (op)	  ? (GET_CODE (op) == CONST_INT	     ? (unsigned) INTVAL (op) < GET_MODE_BITSIZE (mode)	     : nonmemory_operand (op, mode))	  : shift_count_reg_operand (op, mode));});; TODO: Add a comment here.(define_predicate "shift_count_reg_operand"  (match_code "subreg,reg,zero_extend,sign_extend"){  if ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND       || (GET_CODE (op) == SUBREG && SUBREG_BYTE (op) == 0))      && (mode == VOIDmode || mode == GET_MODE (op))      && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6      && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT)    {      mode = VOIDmode;      do	op = XEXP (op, 0);      while ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND	      || GET_CODE (op) == TRUNCATE)	     && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6	     && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT);    }  return arith_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "shift_operator"  (match_code "ashift,ashiftrt,lshiftrt"){  if (mode != VOIDmode && GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case ASHIFT:    case ASHIFTRT:    case LSHIFTRT:      return 1;    default:      return 0;    }});; TODO: Add a comment here.(define_predicate "symbol_ref_operand"  (match_code "symbol_ref"){  return (GET_CODE (op) == SYMBOL_REF);});; Same as target_reg_operand, except that label_refs and symbol_refs;; are accepted before reload.(define_special_predicate "target_operand"  (match_code "subreg,reg,label_ref,symbol_ref,const,unspec"){  if (mode != VOIDmode && mode != Pmode)    return 0;  if ((GET_MODE (op) == Pmode || GET_MODE (op) == VOIDmode)      && EXTRA_CONSTRAINT_Csy (op))    return ! reload_completed;  return target_reg_operand (op, mode);});; Accept pseudos and branch target registers.(define_special_predicate "target_reg_operand"  (match_code "subreg,reg"){  if (mode == VOIDmode     ? GET_MODE (op) != Pmode && GET_MODE (op) != PDImode     : mode != GET_MODE (op))    return 0;  if (GET_CODE (op) == SUBREG)    op = XEXP (op, 0);  if (GET_CODE (op) != REG)    return 0;  /* We must protect ourselves from matching pseudos that are virtual     register, because they will eventually be replaced with hardware     registers that aren't branch-target registers.  */  if (REGNO (op) > LAST_VIRTUAL_REGISTER      || TARGET_REGISTER_P (REGNO (op)))    return 1;  return 0;});; TODO: Add a comment here.(define_special_predicate "trunc_hi_operand"  (match_code "subreg,reg,truncate"){  enum machine_mode op_mode = GET_MODE (op);  if (op_mode != SImode && op_mode != DImode      && op_mode != V4HImode && op_mode != V2SImode)    return 0;  return extend_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "ua_address_operand"  (match_code "subreg,reg,plus"){  if (GET_CODE (op) == PLUS      && (GET_CODE (XEXP (op, 1)) != CONST_INT	  || ! CONST_OK_FOR_I06 (INTVAL (XEXP (op, 1)))))    return 0;  return address_operand (op, QImode);});; TODO: Add a comment here.(define_predicate "ua_offset"  (match_code "const_int"){  return GET_CODE (op) == CONST_INT && CONST_OK_FOR_I06 (INTVAL (op));});; TODO: Add a comment here.(define_predicate "unary_float_operator"  (match_code "abs,neg,sqrt"){  if (GET_MODE (op) != mode)    return 0;  switch (GET_CODE (op))    {    case ABS:    case NEG:    case SQRT:      return 1;    default:      break;    }  return 0;});; Return 1 if OP is a valid source operand for xor.(define_predicate "xor_operand"  (match_code "subreg,reg,const_int"){  if (GET_CODE (op) == CONST_INT)    return (TARGET_SHMEDIA	    ? (CONST_OK_FOR_I06 (INTVAL (op))	       || (no_new_pseudos && INTVAL (op) == 0xff))	    : CONST_OK_FOR_K08 (INTVAL (op)));  if (TARGET_SHMEDIA      && mode != DImode && GET_CODE (op) == SUBREG      && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)    return 0;  return arith_reg_operand (op, mode);})

⌨️ 快捷键说明

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