Mercurial > hg > CbC > CbC_gcc
diff gcc/config/rs6000/predicates.md @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/config/rs6000/predicates.md Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/config/rs6000/predicates.md Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ ;; Predicate definitions for POWER and PowerPC. -;; Copyright (C) 2005-2017 Free Software Foundation, Inc. +;; Copyright (C) 2005-2018 Free Software Foundation, Inc. ;; ;; This file is part of GCC. ;; @@ -406,13 +406,11 @@ return FP_REGNO_P (r); }) -;; Return true if this is a register that can has D-form addressing (GPR and -;; traditional FPR registers for scalars). ISA 3.0 (power9) adds D-form -;; addressing for scalars in Altivec registers. -;; -;; If this is a pseudo only allow for GPR fusion in power8. If we have the -;; power9 fusion allow the floating point types. -(define_predicate "toc_fusion_or_p9_reg_operand" +;; Return true if this is a register that can has D-form addressing (GPR, +;; traditional FPR registers, and Altivec registers for scalars). Unlike +;; power8 fusion, this fusion does not depend on putting the ADDIS instruction +;; into the GPR register being loaded. +(define_predicate "p9_fusion_reg_operand" (match_code "reg,subreg") { HOST_WIDE_INT r; @@ -611,9 +609,7 @@ return 0; /* Consider all constants with -msoft-float to be easy. */ - if ((TARGET_SOFT_FLOAT - || (TARGET_HARD_FLOAT && (TARGET_SINGLE_FLOAT && ! TARGET_DOUBLE_FLOAT))) - && mode != DImode) + if (TARGET_SOFT_FLOAT && mode != DImode) return 1; /* 0.0D is not all zero bits. */ @@ -690,11 +686,6 @@ (define_predicate "easy_vector_constant" (match_code "const_vector") { - /* As the paired vectors are actually FPRs it seems that there is - no easy way to load a CONST_VECTOR without using memory. */ - if (TARGET_PAIRED_FLOAT) - return false; - /* Because IEEE 128-bit floating point is considered a vector type in order to pass it in VSX registers, it might use this function instead of easy_fp_constant. */ @@ -1220,85 +1211,6 @@ (and (match_operand 0 "branch_comparison_operator") (match_code "eq,lt,gt,ltu,gtu,unordered"))) -;; Return 1 if OP is a load multiple operation, known to be a PARALLEL. -(define_predicate "load_multiple_operation" - (match_code "parallel") -{ - int count = XVECLEN (op, 0); - unsigned int dest_regno; - rtx src_addr; - 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); - - for (i = 1; i < count; i++) - { - rtx elt = XVECEXP (op, 0, i); - - 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 - || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS - || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr) - || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT - || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4) - return 0; - } - - return 1; -}) - -;; Return 1 if OP is a store multiple operation, known to be a PARALLEL. -;; The second vector element is a CLOBBER. -(define_predicate "store_multiple_operation" - (match_code "parallel") -{ - int count = XVECLEN (op, 0) - 1; - unsigned int src_regno; - rtx dest_addr; - 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); - - 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" @@ -1374,13 +1286,12 @@ rtx elt; int count = XVECLEN (op, 0); - if (count != 59) + if (count != 58) 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; @@ -1751,35 +1662,6 @@ return GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_TOCREL; }) -;; Match the TOC memory operand that can be fused with an addis instruction. -;; This is used in matching a potential fused address before register -;; allocation. -(define_predicate "toc_fusion_mem_raw" - (match_code "mem") -{ - if (!TARGET_TOC_FUSION_INT || !can_create_pseudo_p ()) - return false; - - return small_toc_ref (XEXP (op, 0), Pmode); -}) - -;; Match the memory operand that has been fused with an addis instruction and -;; wrapped inside of an (unspec [...] UNSPEC_FUSION_ADDIS) wrapper. -(define_predicate "toc_fusion_mem_wrapped" - (match_code "mem") -{ - rtx addr; - - if (!TARGET_TOC_FUSION_INT) - return false; - - if (!MEM_P (op)) - return false; - - addr = XEXP (op, 0); - return (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_FUSION_ADDIS); -}) - ;; Match the first insn (addis) in fusing the combination of addis and loads to ;; GPR registers on power8. (define_predicate "fusion_gpr_addis" @@ -1920,7 +1802,7 @@ DFmode in 32-bit if -msoft-float since it splits into two separate instructions. */ case E_DFmode: - if ((!TARGET_POWERPC64 && !TARGET_DF_FPR) || !TARGET_P9_FUSION) + if ((!TARGET_POWERPC64 && !TARGET_HARD_FLOAT) || !TARGET_P9_FUSION) return 0; break; @@ -1980,7 +1862,7 @@ into two separate instructions. Do allow fusion if we have hardware floating point. */ case E_DFmode: - if (!TARGET_POWERPC64 && !TARGET_DF_FPR) + if (!TARGET_POWERPC64 && !TARGET_HARD_FLOAT) return 0; break;