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

📄 alpha.c

📁 linux下的gcc编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
  if (SYMBOL_REF_FLAG (op) && decl_in_text_section (current_function_decl))    return 1;  return 0;}/* Return 1 if OP is a SYMBOL_REF for which we can make a call via bsr.  */intdirect_call_operand (op, mode)     rtx op;     enum machine_mode mode;{  /* Must be defined in this file.  */  if (! current_file_function_operand (op, mode))    return 0;  /* If profiling is implemented via linker tricks, we can't jump     to the nogp alternate entry point.  */  /* ??? TARGET_PROFILING_NEEDS_GP isn't really the right test,     but is approximately correct for the OSF ABIs.  Don't know     what to do for VMS, NT, or UMK.  */  if (! TARGET_PROFILING_NEEDS_GP      && ! current_function_profile)    return 0;  return 1;}/* Return true if OP is a LABEL_REF, or SYMBOL_REF or CONST referencing   a (non-tls) variable known to be defined in this file.  */intlocal_symbolic_operand (op, mode)     rtx op;     enum machine_mode mode;{  const char *str;  if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))    return 0;  if (GET_CODE (op) == LABEL_REF)    return 1;  if (GET_CODE (op) == CONST      && GET_CODE (XEXP (op, 0)) == PLUS      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)    op = XEXP (XEXP (op, 0), 0);  if (GET_CODE (op) != SYMBOL_REF)    return 0;  /* Easy pickings.  */  if (CONSTANT_POOL_ADDRESS_P (op) || STRING_POOL_ADDRESS_P (op))    return 1;  /* ??? SYMBOL_REF_FLAG is set for local function symbols, but we     run into problems with the rtl inliner in that the symbol was     once external, but is local after inlining, which results in     unrecognizable insns.  */  str = XSTR (op, 0);  /* If @[LS], then alpha_encode_section_info sez it's local.  */  if (str[0] == '@' && (str[1] == 'L' || str[1] == 'S'))    return 1;  /* If *$, then ASM_GENERATE_INTERNAL_LABEL sez it's local.  */  if (str[0] == '*' && str[1] == '$')    return 1;  return 0;}/* Return true if OP is a SYMBOL_REF or CONST referencing a variable   known to be defined in this file in the small data area.  */intsmall_symbolic_operand (op, mode)     rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  const char *str;  if (! TARGET_SMALL_DATA)    return 0;  if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))    return 0;  if (GET_CODE (op) == CONST      && GET_CODE (XEXP (op, 0)) == PLUS      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)    op = XEXP (XEXP (op, 0), 0);  if (GET_CODE (op) != SYMBOL_REF)    return 0;  if (CONSTANT_POOL_ADDRESS_P (op))    return GET_MODE_SIZE (get_pool_mode (op)) <= (unsigned) g_switch_value;  else    {      str = XSTR (op, 0);      return str[0] == '@' && str[1] == 'S';    }}/* Return true if OP is a SYMBOL_REF or CONST referencing a variable   not known (or known not) to be defined in this file.  */intglobal_symbolic_operand (op, mode)     rtx op;     enum machine_mode mode;{  const char *str;  if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))    return 0;  if (GET_CODE (op) == CONST      && GET_CODE (XEXP (op, 0)) == PLUS      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)    op = XEXP (XEXP (op, 0), 0);  if (GET_CODE (op) != SYMBOL_REF)    return 0;  if (local_symbolic_operand (op, mode))    return 0;  /* Also verify that it's not a TLS symbol.  */  str = XSTR (op, 0);  return str[0] != '%' && str[0] != '@';}/* Return 1 if OP is a valid operand for the MEM of a CALL insn.  */intcall_operand (op, mode)     rtx op;     enum machine_mode mode;{  if (mode != Pmode)    return 0;  if (GET_CODE (op) == REG)    {      if (TARGET_ABI_OSF)	{	  /* Disallow virtual registers to cope with pathalogical test cases	     such as compile/930117-1.c in which the virtual reg decomposes	     to the frame pointer.  Which is a hard reg that is not $27.  */	  return (REGNO (op) == 27 || REGNO (op) > LAST_VIRTUAL_REGISTER);	}      else	return 1;    }  if (TARGET_ABI_UNICOSMK)    return 0;  if (GET_CODE (op) == SYMBOL_REF)    return 1;  return 0;}/* Returns 1 if OP is a symbolic operand, i.e. a symbol_ref or a label_ref,   possibly with an offset.  */intsymbolic_operand (op, mode)      register rtx op;      enum machine_mode mode;{  if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))    return 0;  if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)    return 1;  if (GET_CODE (op) == CONST      && GET_CODE (XEXP (op,0)) == PLUS      && GET_CODE (XEXP (XEXP (op,0), 0)) == SYMBOL_REF      && GET_CODE (XEXP (XEXP (op,0), 1)) == CONST_INT)    return 1;  return 0;}/* Return true if OP is valid for a particular TLS relocation.  */static inttls_symbolic_operand_1 (op, mode, size, unspec)     rtx op;     enum machine_mode mode;     int size, unspec;{  const char *str;  int letter;  if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))    return 0;  if (GET_CODE (op) != CONST)    return 0;  op = XEXP (op, 0);  if (GET_CODE (op) != UNSPEC || XINT (op, 1) != unspec)    return 0;  op = XVECEXP (op, 0, 0);  if (GET_CODE (op) != SYMBOL_REF)    return 0;  str = XSTR (op, 0);  if (str[0] == '%')    {      if (size != 64)	return 0;    }  else if (str[0] == '@')    {      if (alpha_tls_size > size)	return 0;    }  else    return 0;  if (unspec == UNSPEC_DTPREL)    return str[1] == 'D';  else if (str[1] == 'I')    return size == 64;  else    return str[1] == 'T';}/* Return true if OP is valid for 16-bit DTP relative relocations.  */intdtp16_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 16, UNSPEC_DTPREL);}/* Return true if OP is valid for 32-bit DTP relative relocations.  */intdtp32_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 32, UNSPEC_DTPREL);}/* Return true if OP is valid for 64-bit DTP relative relocations.  */intgotdtp_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 64, UNSPEC_DTPREL);}/* Return true if OP is valid for 16-bit TP relative relocations.  */inttp16_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 16, UNSPEC_TPREL);}/* Return true if OP is valid for 32-bit TP relative relocations.  */inttp32_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 32, UNSPEC_TPREL);}/* Return true if OP is valid for 64-bit TP relative relocations.  */intgottp_symbolic_operand (op, mode)      rtx op;      enum machine_mode mode;{  return tls_symbolic_operand_1 (op, mode, 64, UNSPEC_TPREL);}/* Return 1 if OP is a valid Alpha comparison operator.  Here we know which   comparisons are valid in which insn.  */intalpha_comparison_operator (op, mode)     register rtx op;     enum machine_mode mode;{  enum rtx_code code = GET_CODE (op);  if (mode != GET_MODE (op) && mode != VOIDmode)    return 0;  return (code == EQ || code == LE || code == LT	  || code == LEU || code == LTU);}/* Return 1 if OP is a valid Alpha comparison operator against zero.    Here we know which comparisons are valid in which insn.  */intalpha_zero_comparison_operator (op, mode)     register rtx op;     enum machine_mode mode;{  enum rtx_code code = GET_CODE (op);  if (mode != GET_MODE (op) && mode != VOIDmode)    return 0;  return (code == EQ || code == NE || code == LE || code == LT	  || code == LEU || code == LTU);}/* Return 1 if OP is a valid Alpha swapped comparison operator.  */intalpha_swapped_comparison_operator (op, mode)     register rtx op;     enum machine_mode mode;{  enum rtx_code code = GET_CODE (op);  if ((mode != GET_MODE (op) && mode != VOIDmode)      || GET_RTX_CLASS (code) != '<')    return 0;  code = swap_condition (code);  return (code == EQ || code == LE || code == LT	  || code == LEU || code == LTU);}/* Return 1 if OP is a signed comparison operation.  */intsigned_comparison_operator (op, mode)     register rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  enum rtx_code code = GET_CODE (op);  if (mode != GET_MODE (op) && mode != VOIDmode)    return 0;  return (code == EQ || code == NE	  || code == LE || code == LT	  || code == GE || code == GT);}/* Return 1 if OP is a valid Alpha floating point comparison operator.   Here we know which comparisons are valid in which insn.  */intalpha_fp_comparison_operator (op, mode)     register rtx op;     enum machine_mode mode;{  enum rtx_code code = GET_CODE (op);  if (mode != GET_MODE (op) && mode != VOIDmode)    return 0;  return (code == EQ || code == LE || code == LT || code == UNORDERED);}/* Return 1 if this is a divide or modulus operator.  */intdivmod_operator (op, mode)     register rtx op;     enum machine_mode mode ATTRIBUTE_UNUSED;{  switch (GET_CODE (op))    {    case DIV:  case MOD:  case UDIV:  case UMOD:      return 1;    default:      break;    }  return 0;}/* Return 1 if this memory address is a known aligned register plus   a constant.  It must be a valid address.  This means that we can do   this as an aligned reference plus some offset.   Take into account what reload will do.  */intaligned_memory_operand (op, mode)     register rtx op;     enum machine_mode mode;{  rtx base;  if (reload_in_progress)    {      rtx tmp = op;      if (GET_CODE (tmp) == SUBREG)	tmp = SUBREG_REG (tmp);      if (GET_CODE (tmp) == REG	  && REGNO (tmp) >= FIRST_PSEUDO_REGISTER)	{	  op = reg_equiv_memory_loc[REGNO (tmp)];	  if (op == 0)	    return 0;	}    }  if (GET_CODE (op) != MEM      || GET_MODE (op) != mode)    return 0;  op = XEXP (op, 0);  /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)     sorts of constructs.  Dig for the real base register.  */  if (reload_in_progress      && GET_CODE (op) == PLUS      && GET_CODE (XEXP (op, 0)) == PLUS)    base = XEXP (XEXP (op, 0), 0);  else    {      if (! memory_address_p (mode, op))	return 0;      base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op);    }  return (GET_CODE (base) == REG && REGNO_POINTER_ALIGN (REGNO (base)) >= 32);}/* Similar, but return 1 if OP is a MEM which is not alignable.  */intunaligned_memory_operand (op, mode)     register rtx op;     enum machine_mode mode;{  rtx base;  if (reload_in_progress)    {      rtx tmp = op;      if (GET_CODE (tmp) == SUBREG)	tmp = SUBREG_REG (tmp);      if (GET_CODE (tmp) == REG	  && REGNO (tmp) >= FIRST_PSEUDO_REGISTER)	{	  op = reg_equiv_memory_loc[REGNO (tmp)];	  if (op == 0)	    return 0;	}    }  if (GET_CODE (op) != MEM      || GET_MODE (op) != mode)    return 0;  op = XEXP (op, 0);  /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)     sorts of constructs.  Dig for the real base register.  */  if (reload_in_progress      && GET_CODE (op) == PLUS      && GET_CODE (XEXP (op, 0)) == PLUS)    base = XEXP (XEXP (op, 0), 0);  else    {      if (! memory_address_p (mode, op))	return 0;      base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op);    }  return (GET_CODE (base) == REG && REGNO_POINTER_ALIGN (REGNO (base)) < 32);}/* Return 1 if OP is either a register or an unaligned memory location.  */

⌨️ 快捷键说明

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