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

📄 predicates.md

📁 linux下编程用 编译软件
💻 MD
📖 第 1 页 / 共 3 页
字号:
  for (i = 1; i < count; i++)    {      rtx elt = XVECEXP (op, 0, i + 1);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_SRC (elt)) != REG	  || GET_MODE (SET_SRC (elt)) != SImode	  || REGNO (SET_SRC (elt)) != src_regno + i	  || GET_CODE (SET_DEST (elt)) != MEM	  || GET_MODE (SET_DEST (elt)) != SImode	  || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS	  || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)	  || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT	  || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)	return 0;    }  return 1;});; Return 1 if OP is valid for a save_world call in prologue, known to be;; a PARLLEL.(define_predicate "save_world_operation"  (match_code "parallel"){  int index;  int i;  rtx elt;  int count = XVECLEN (op, 0);  if (count != 55)    return 0;  index = 0;  if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER      || GET_CODE (XVECEXP (op, 0, index++)) != USE)    return 0;  for (i=1; i <= 18; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_DEST (elt)) != MEM	  || ! memory_operand (SET_DEST (elt), DFmode)	  || GET_CODE (SET_SRC (elt)) != REG	  || GET_MODE (SET_SRC (elt)) != DFmode)	return 0;    }  for (i=1; i <= 12; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_DEST (elt)) != MEM	  || GET_CODE (SET_SRC (elt)) != REG	  || GET_MODE (SET_SRC (elt)) != V4SImode)	return 0;    }  for (i=1; i <= 19; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_DEST (elt)) != MEM	  || ! memory_operand (SET_DEST (elt), Pmode)	  || GET_CODE (SET_SRC (elt)) != REG	  || GET_MODE (SET_SRC (elt)) != Pmode)	return 0;    }  elt = XVECEXP (op, 0, index++);  if (GET_CODE (elt) != SET      || GET_CODE (SET_DEST (elt)) != MEM      || ! memory_operand (SET_DEST (elt), Pmode)      || GET_CODE (SET_SRC (elt)) != REG      || REGNO (SET_SRC (elt)) != CR2_REGNO      || GET_MODE (SET_SRC (elt)) != Pmode)    return 0;  if (GET_CODE (XVECEXP (op, 0, index++)) != USE      || GET_CODE (XVECEXP (op, 0, index++)) != USE      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER)    return 0;  return 1;});; Return 1 if OP is valid for a restore_world call in epilogue, known to be;; a PARLLEL.(define_predicate "restore_world_operation"  (match_code "parallel"){  int index;  int i;  rtx elt;  int count = XVECLEN (op, 0);  if (count != 59)    return 0;  index = 0;  if (GET_CODE (XVECEXP (op, 0, index++)) != RETURN      || GET_CODE (XVECEXP (op, 0, index++)) != USE      || GET_CODE (XVECEXP (op, 0, index++)) != USE      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER)    return 0;  elt = XVECEXP (op, 0, index++);  if (GET_CODE (elt) != SET      || GET_CODE (SET_SRC (elt)) != MEM      || ! memory_operand (SET_SRC (elt), Pmode)      || GET_CODE (SET_DEST (elt)) != REG      || REGNO (SET_DEST (elt)) != CR2_REGNO      || GET_MODE (SET_DEST (elt)) != Pmode)    return 0;  for (i=1; i <= 19; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_SRC (elt)) != MEM	  || ! memory_operand (SET_SRC (elt), Pmode)	  || GET_CODE (SET_DEST (elt)) != REG	  || GET_MODE (SET_DEST (elt)) != Pmode)	return 0;    }  for (i=1; i <= 12; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_SRC (elt)) != MEM	  || GET_CODE (SET_DEST (elt)) != REG	  || GET_MODE (SET_DEST (elt)) != V4SImode)	return 0;    }  for (i=1; i <= 18; i++)    {      elt = XVECEXP (op, 0, index++);      if (GET_CODE (elt) != SET	  || GET_CODE (SET_SRC (elt)) != MEM	  || ! memory_operand (SET_SRC (elt), DFmode)	  || GET_CODE (SET_DEST (elt)) != REG	  || GET_MODE (SET_DEST (elt)) != DFmode)	return 0;    }  if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER      || GET_CODE (XVECEXP (op, 0, index++)) != USE)    return 0;  return 1;});; Return 1 if OP is valid for a vrsave call, known to be a PARALLEL.(define_predicate "vrsave_operation"  (match_code "parallel"){  int count = XVECLEN (op, 0);  unsigned int dest_regno, src_regno;  int i;  if (count <= 1      || GET_CODE (XVECEXP (op, 0, 0)) != SET      || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE      || XINT (SET_SRC (XVECEXP (op, 0, 0)), 1) != UNSPECV_SET_VRSAVE)    return 0;  dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));  src_regno  = REGNO (XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 1));  if (dest_regno != VRSAVE_REGNO || src_regno != VRSAVE_REGNO)    return 0;  for (i = 1; i < count; i++)    {      rtx elt = XVECEXP (op, 0, i);      if (GET_CODE (elt) != CLOBBER	  && GET_CODE (elt) != SET)	return 0;    }  return 1;});; Return 1 if OP is valid for mfcr insn, known to be a PARALLEL.(define_predicate "mfcr_operation"  (match_code "parallel"){  int count = XVECLEN (op, 0);  int i;  /* Perform a quick check so we don't blow up below.  */  if (count < 1      || GET_CODE (XVECEXP (op, 0, 0)) != SET      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC      || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)    return 0;  for (i = 0; i < count; i++)    {      rtx exp = XVECEXP (op, 0, i);      rtx unspec;      int maskval;      rtx src_reg;      src_reg = XVECEXP (SET_SRC (exp), 0, 0);      if (GET_CODE (src_reg) != REG	  || GET_MODE (src_reg) != CCmode	  || ! CR_REGNO_P (REGNO (src_reg)))	return 0;      if (GET_CODE (exp) != SET	  || GET_CODE (SET_DEST (exp)) != REG	  || GET_MODE (SET_DEST (exp)) != SImode	  || ! INT_REGNO_P (REGNO (SET_DEST (exp))))	return 0;      unspec = SET_SRC (exp);      maskval = 1 << (MAX_CR_REGNO - REGNO (src_reg));      if (GET_CODE (unspec) != UNSPEC	  || XINT (unspec, 1) != UNSPEC_MOVESI_FROM_CR	  || XVECLEN (unspec, 0) != 2	  || XVECEXP (unspec, 0, 0) != src_reg	  || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT	  || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)	return 0;    }  return 1;});; Return 1 if OP is valid for mtcrf insn, known to be a PARALLEL.(define_predicate "mtcrf_operation"  (match_code "parallel"){  int count = XVECLEN (op, 0);  int i;  rtx src_reg;  /* Perform a quick check so we don't blow up below.  */  if (count < 1      || GET_CODE (XVECEXP (op, 0, 0)) != SET      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC      || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)    return 0;  src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);  if (GET_CODE (src_reg) != REG      || GET_MODE (src_reg) != SImode      || ! INT_REGNO_P (REGNO (src_reg)))    return 0;  for (i = 0; i < count; i++)    {      rtx exp = XVECEXP (op, 0, i);      rtx unspec;      int maskval;      if (GET_CODE (exp) != SET	  || GET_CODE (SET_DEST (exp)) != REG	  || GET_MODE (SET_DEST (exp)) != CCmode	  || ! CR_REGNO_P (REGNO (SET_DEST (exp))))	return 0;      unspec = SET_SRC (exp);      maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));      if (GET_CODE (unspec) != UNSPEC	  || XINT (unspec, 1) != UNSPEC_MOVESI_TO_CR	  || XVECLEN (unspec, 0) != 2	  || XVECEXP (unspec, 0, 0) != src_reg	  || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT	  || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)	return 0;    }  return 1;});; Return 1 if OP is valid for lmw insn, known to be a PARALLEL.(define_predicate "lmw_operation"  (match_code "parallel"){  int count = XVECLEN (op, 0);  unsigned int dest_regno;  rtx src_addr;  unsigned int base_regno;  HOST_WIDE_INT offset;  int i;  /* Perform a quick check so we don't blow up below.  */  if (count <= 1      || GET_CODE (XVECEXP (op, 0, 0)) != SET      || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)    return 0;  dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));  src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);  if (dest_regno > 31      || count != 32 - (int) dest_regno)    return 0;  if (legitimate_indirect_address_p (src_addr, 0))    {      offset = 0;      base_regno = REGNO (src_addr);      if (base_regno == 0)	return 0;    }  else if (rs6000_legitimate_offset_address_p (SImode, src_addr, 0))    {      offset = INTVAL (XEXP (src_addr, 1));      base_regno = REGNO (XEXP (src_addr, 0));    }  else    return 0;  for (i = 0; i < count; i++)    {      rtx elt = XVECEXP (op, 0, i);      rtx newaddr;      rtx addr_reg;      HOST_WIDE_INT newoffset;      if (GET_CODE (elt) != SET	  || GET_CODE (SET_DEST (elt)) != REG	  || GET_MODE (SET_DEST (elt)) != SImode	  || REGNO (SET_DEST (elt)) != dest_regno + i	  || GET_CODE (SET_SRC (elt)) != MEM	  || GET_MODE (SET_SRC (elt)) != SImode)	return 0;      newaddr = XEXP (SET_SRC (elt), 0);      if (legitimate_indirect_address_p (newaddr, 0))	{	  newoffset = 0;	  addr_reg = newaddr;	}      else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))	{	  addr_reg = XEXP (newaddr, 0);	  newoffset = INTVAL (XEXP (newaddr, 1));	}      else	return 0;      if (REGNO (addr_reg) != base_regno	  || newoffset != offset + 4 * i)	return 0;    }  return 1;});; Return 1 if OP is valid for stmw insn, known to be a PARALLEL.(define_predicate "stmw_operation"  (match_code "parallel"){  int count = XVECLEN (op, 0);  unsigned int src_regno;  rtx dest_addr;  unsigned int base_regno;  HOST_WIDE_INT offset;  int i;  /* Perform a quick check so we don't blow up below.  */  if (count <= 1      || GET_CODE (XVECEXP (op, 0, 0)) != SET      || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)    return 0;  src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));  dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);  if (src_regno > 31      || count != 32 - (int) src_regno)    return 0;  if (legitimate_indirect_address_p (dest_addr, 0))    {      offset = 0;      base_regno = REGNO (dest_addr);      if (base_regno == 0)	return 0;    }  else if (rs6000_legitimate_offset_address_p (SImode, dest_addr, 0))    {      offset = INTVAL (XEXP (dest_addr, 1));      base_regno = REGNO (XEXP (dest_addr, 0));    }  else    return 0;  for (i = 0; i < count; i++)    {      rtx elt = XVECEXP (op, 0, i);      rtx newaddr;      rtx addr_reg;      HOST_WIDE_INT newoffset;      if (GET_CODE (elt) != SET	  || GET_CODE (SET_SRC (elt)) != REG	  || GET_MODE (SET_SRC (elt)) != SImode	  || REGNO (SET_SRC (elt)) != src_regno + i	  || GET_CODE (SET_DEST (elt)) != MEM	  || GET_MODE (SET_DEST (elt)) != SImode)	return 0;      newaddr = XEXP (SET_DEST (elt), 0);      if (legitimate_indirect_address_p (newaddr, 0))	{	  newoffset = 0;	  addr_reg = newaddr;	}      else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))	{	  addr_reg = XEXP (newaddr, 0);	  newoffset = INTVAL (XEXP (newaddr, 1));	}      else	return 0;      if (REGNO (addr_reg) != base_regno	  || newoffset != offset + 4 * i)	return 0;    }  return 1;})

⌨️ 快捷键说明

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