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

📄 sparc.c

📁 linux下的gcc编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
   or const0_rtx.  */intreg_or_0_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (register_operand (op, mode))    return 1;  if (op == const0_rtx)    return 1;  if (GET_MODE (op) == VOIDmode && GET_CODE (op) == CONST_DOUBLE      && CONST_DOUBLE_HIGH (op) == 0      && CONST_DOUBLE_LOW (op) == 0)    return 1;  if (fp_zero_operand (op, mode))    return 1;  return 0;}/* Return nonzero only if OP is const1_rtx.  */intconst1_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  return op == const1_rtx;}/* Nonzero if OP is a floating point value with value 0.0.  */intfp_zero_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (GET_MODE_CLASS (GET_MODE (op)) != MODE_FLOAT)    return 0;  return op == CONST0_RTX (mode);}/* Nonzero if OP is a register operand in floating point register.  */intfp_register_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (! register_operand (op, mode))    return 0;  if (GET_CODE (op) == SUBREG)    op = SUBREG_REG (op);  return GET_CODE (op) == REG && SPARC_FP_REG_P (REGNO (op));}/* Nonzero if OP is a floating point constant which can   be loaded into an integer register using a single   sethi instruction.  */intfp_sethi_p (op)     rtx op;{  if (GET_CODE (op) == CONST_DOUBLE)    {      REAL_VALUE_TYPE r;      long i;      REAL_VALUE_FROM_CONST_DOUBLE (r, op);      if (REAL_VALUES_EQUAL (r, dconst0) &&	  ! REAL_VALUE_MINUS_ZERO (r))	return 0;      REAL_VALUE_TO_TARGET_SINGLE (r, i);      if (SPARC_SETHI_P (i))	return 1;    }  return 0;}/* Nonzero if OP is a floating point constant which can   be loaded into an integer register using a single   mov instruction.  */intfp_mov_p (op)     rtx op;{  if (GET_CODE (op) == CONST_DOUBLE)    {      REAL_VALUE_TYPE r;      long i;      REAL_VALUE_FROM_CONST_DOUBLE (r, op);      if (REAL_VALUES_EQUAL (r, dconst0) &&	  ! REAL_VALUE_MINUS_ZERO (r))	return 0;      REAL_VALUE_TO_TARGET_SINGLE (r, i);      if (SPARC_SIMM13_P (i))	return 1;    }  return 0;}/* Nonzero if OP is a floating point constant which can   be loaded into an integer register using a high/losum   instruction sequence.  */intfp_high_losum_p (op)     rtx op;{  /* The constraints calling this should only be in     SFmode move insns, so any constant which cannot     be moved using a single insn will do.  */  if (GET_CODE (op) == CONST_DOUBLE)    {      REAL_VALUE_TYPE r;      long i;      REAL_VALUE_FROM_CONST_DOUBLE (r, op);      if (REAL_VALUES_EQUAL (r, dconst0) &&	  ! REAL_VALUE_MINUS_ZERO (r))	return 0;      REAL_VALUE_TO_TARGET_SINGLE (r, i);      if (! SPARC_SETHI_P (i)          && ! SPARC_SIMM13_P (i))	return 1;    }  return 0;}/* Nonzero if OP is an integer register.  */intintreg_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  return (register_operand (op, SImode)	  || (TARGET_ARCH64 && register_operand (op, DImode)));}/* Nonzero if OP is a floating point condition code register.  */intfcc_reg_operand (op, mode)     rtx op;     enum machine_mode mode;{  /* This can happen when recog is called from combine.  Op may be a MEM.     Fail instead of calling abort in this case.  */  if (GET_CODE (op) != REG)    return 0;  if (mode != VOIDmode && mode != GET_MODE (op))    return 0;  if (mode == VOIDmode      && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))    return 0;#if 0	/* ??? ==> 1 when %fcc0-3 are pseudos first.  See gen_compare_reg().  */  if (reg_renumber == 0)    return REGNO (op) >= FIRST_PSEUDO_REGISTER;  return REGNO_OK_FOR_CCFP_P (REGNO (op));#else  return (unsigned) REGNO (op) - SPARC_FIRST_V9_FCC_REG < 4;#endif}/* Nonzero if OP is a floating point condition code fcc0 register.  */intfcc0_reg_operand (op, mode)     rtx op;     enum machine_mode mode;{  /* This can happen when recog is called from combine.  Op may be a MEM.     Fail instead of calling abort in this case.  */  if (GET_CODE (op) != REG)    return 0;  if (mode != VOIDmode && mode != GET_MODE (op))    return 0;  if (mode == VOIDmode      && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))    return 0;  return REGNO (op) == SPARC_FCC_REG;}/* Nonzero if OP is an integer or floating point condition code register.  */inticc_or_fcc_reg_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (GET_CODE (op) == REG && REGNO (op) == SPARC_ICC_REG)    {      if (mode != VOIDmode && mode != GET_MODE (op))	return 0;      if (mode == VOIDmode	  && GET_MODE (op) != CCmode && GET_MODE (op) != CCXmode)	return 0;      return 1;    }  return fcc_reg_operand (op, mode);}/* Nonzero if OP can appear as the dest of a RESTORE insn.  */intrestore_operand (op, mode)     rtx op;     enum machine_mode mode;{  return (GET_CODE (op) == REG && GET_MODE (op) == mode	  && (REGNO (op) < 8 || (REGNO (op) >= 24 && REGNO (op) < 32)));}/* Call insn on SPARC can take a PC-relative constant address, or any regular   memory address.  */intcall_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (GET_CODE (op) != MEM)    abort ();  op = XEXP (op, 0);  return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));}intcall_operand_address (op, mode)     rtx op;     enum machine_mode mode;{  return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));}/* Returns 1 if OP is either a symbol reference or a sum of a symbol   reference and a constant.  */intsymbolic_operand (op, mode)     register rtx op;     enum machine_mode mode;{  enum machine_mode omode = GET_MODE (op);  if (omode != mode && omode != VOIDmode && mode != VOIDmode)    return 0;  switch (GET_CODE (op))    {    case SYMBOL_REF:    case LABEL_REF:      return 1;    case CONST:      op = XEXP (op, 0);      return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF	       || GET_CODE (XEXP (op, 0)) == LABEL_REF)	      && GET_CODE (XEXP (op, 1)) == CONST_INT);    default:      return 0;    }}/* Return truth value of statement that OP is a symbolic memory   operand of mode MODE.  */intsymbolic_memory_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  if (GET_CODE (op) == SUBREG)    op = SUBREG_REG (op);  if (GET_CODE (op) != MEM)    return 0;  op = XEXP (op, 0);  return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST	  || GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);}/* Return truth value of statement that OP is a LABEL_REF of mode MODE.  */intlabel_ref_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (GET_CODE (op) != LABEL_REF)    return 0;  if (GET_MODE (op) != mode)    return 0;  return 1;}/* Return 1 if the operand is an argument used in generating pic references   in either the medium/low or medium/anywhere code models of sparc64.  */intsp64_medium_pic_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  /* Check for (const (minus (symbol_ref:GOT)                             (const (minus (label) (pc))))).  */  if (GET_CODE (op) != CONST)    return 0;  op = XEXP (op, 0);  if (GET_CODE (op) != MINUS)    return 0;  if (GET_CODE (XEXP (op, 0)) != SYMBOL_REF)    return 0;  /* ??? Ensure symbol is GOT.  */  if (GET_CODE (XEXP (op, 1)) != CONST)    return 0;  if (GET_CODE (XEXP (XEXP (op, 1), 0)) != MINUS)    return 0;  return 1;}/* Return 1 if the operand is a data segment reference.  This includes   the readonly data segment, or in other words anything but the text segment.   This is needed in the medium/anywhere code model on v9.  These values   are accessed with EMBMEDANY_BASE_REG.  */intdata_segment_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  switch (GET_CODE (op))    {    case SYMBOL_REF :      return ! SYMBOL_REF_FLAG (op);    case PLUS :      /* Assume canonical format of symbol + constant.	 Fall through.  */    case CONST :      return data_segment_operand (XEXP (op, 0), VOIDmode);    default :      return 0;    }}/* Return 1 if the operand is a text segment reference.   This is needed in the medium/anywhere code model on v9.  */inttext_segment_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  switch (GET_CODE (op))    {    case LABEL_REF :      return 1;    case SYMBOL_REF :      return SYMBOL_REF_FLAG (op);    case PLUS :      /* Assume canonical format of symbol + constant.	 Fall through.  */    case CONST :      return text_segment_operand (XEXP (op, 0), VOIDmode);    default :      return 0;    }}/* Return 1 if the operand is either a register or a memory operand that is   not symbolic.  */intreg_or_nonsymb_mem_operand (op, mode)    register rtx op;    enum machine_mode mode;{  if (register_operand (op, mode))    return 1;  if (memory_operand (op, mode) && ! symbolic_memory_operand (op, mode))    return 1;  return 0;}intsplittable_symbolic_memory_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  if (GET_CODE (op) != MEM)    return 0;  if (! symbolic_operand (XEXP (op, 0), Pmode))    return 0;  return 1;}intsplittable_immediate_memory_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  if (GET_CODE (op) != MEM)    return 0;  if (! immediate_operand (XEXP (op, 0), Pmode))    return 0;  return 1;}/* Return truth value of whether OP is EQ or NE.  */inteq_or_neq (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  return (GET_CODE (op) == EQ || GET_CODE (op) == NE);}/* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,   or LTU for non-floating-point.  We handle those specially.  */intnormal_comp_operator (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  enum rtx_code code = GET_CODE (op);  if (GET_RTX_CLASS (code) != '<')    return 0;  if (GET_MODE (XEXP (op, 0)) == CCFPmode      || GET_MODE (XEXP (op, 0)) == CCFPEmode)    return 1;  return (code != NE && code != EQ && code != GEU && code != LTU);}/* Return 1 if this is a comparison operator.  This allows the use of   MATCH_OPERATOR to recognize all the branch insns.  */intnoov_compare_op (op, mode)    register rtx op;    enum machine_mode mode ATTRIBUTE_UNUSED;{  enum rtx_code code = GET_CODE (op);  if (GET_RTX_CLASS (code) != '<')    return 0;  if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode      || GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)    /* These are the only branches which work with CC_NOOVmode.  */

⌨️ 快捷键说明

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