Mercurial > hg > CbC > CbC_gcc
diff gcc/config/v850/predicates.md @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
line wrap: on
line diff
--- a/gcc/config/v850/predicates.md Sun Aug 21 07:07:55 2011 +0900 +++ b/gcc/config/v850/predicates.md Fri Oct 27 22:46:09 2017 +0900 @@ -1,5 +1,5 @@ ;; Predicate definitions for NEC V850. -;; Copyright (C) 2005, 2007, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2005-2017 Free Software Foundation, Inc. ;; ;; This file is part of GCC. ;; @@ -498,4 +498,87 @@ return op == CONST0_RTX(mode); }) +(define_predicate "label_ref_operand" + (match_code "label_ref") +) + +(define_predicate "e3v5_shift_operand" + (match_code "const_int,reg") + { + if (CONST_INT_P (op)) + return IN_RANGE (INTVAL (op), 0, 31); + return true; + } +) + +(define_predicate "ior_operator" + (match_code "ior") +{ + return (GET_CODE (op) == IOR); +}) + +;; Return true if the floating point comparison operation +;; given produces a canonical answer. +(define_predicate "v850_float_z_comparison_operator" + (match_code "lt,le,eq,gt,ge") +{ + enum rtx_code code = GET_CODE (op); + + if (GET_RTX_CLASS (code) != RTX_COMPARE + && GET_RTX_CLASS (code) != RTX_COMM_COMPARE) + return 0; + + if (mode != GET_MODE (op) && mode != VOIDmode) + return 0; + + if ((GET_CODE (XEXP (op, 0)) != REG + || REGNO (XEXP (op, 0)) != CC_REGNUM) + || XEXP (op, 1) != const0_rtx) + return 0; + + if (GET_MODE (XEXP (op, 0)) == CC_FPU_LTmode) + return code == LT; + if (GET_MODE (XEXP (op, 0)) == CC_FPU_LEmode) + return code == LE; + if (GET_MODE (XEXP (op, 0)) == CC_FPU_EQmode) + return code == EQ; + if (GET_MODE (XEXP (op, 0)) == CC_FPU_GTmode) + return code == GT; + if (GET_MODE (XEXP (op, 0)) == CC_FPU_GEmode) + return code == GE; + + /* Note we do not accept CC_FPU_NEmode here. See + v850_float_nz_comparison for the reason why. */ + return 0; +}) + +;; Return true if the floating point comparison operation +;; given produces an inverted answer. +(define_predicate "v850_float_nz_comparison_operator" + (match_code "ne") +{ + enum rtx_code code = GET_CODE (op); + + /* The V850E2V3 does not have a floating point NZ comparison operator. + Instead it is implemented as an EQ comparison and this function ensures + that the branch_nz_normal and set_nz_insn patterns are used to examine + (and invert) the result of the floating point comparison. */ + + if (GET_RTX_CLASS (code) != RTX_COMPARE + && GET_RTX_CLASS (code) != RTX_COMM_COMPARE) + return 0; + + if (mode != GET_MODE (op) && mode != VOIDmode) + return 0; + + if ((GET_CODE (XEXP (op, 0)) != REG + || REGNO (XEXP (op, 0)) != CC_REGNUM) + || XEXP (op, 1) != const0_rtx) + return 0; + + if (GET_MODE (XEXP (op, 0)) == CC_FPU_NEmode) + return code == NE; + + return 0; +})