📄 predicates.md
字号:
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 + -