Home | History | Annotate | Line # | Download | only in m32r
predicates.md revision 1.9
      1  1.1  mrg ;; Predicate definitions for Renesas M32R.
      2  1.9  mrg ;; Copyright (C) 2005-2018 Free Software Foundation, Inc.
      3  1.1  mrg ;;
      4  1.1  mrg ;; This file is part of GCC.
      5  1.1  mrg ;;
      6  1.1  mrg ;; GCC is free software; you can redistribute it and/or modify
      7  1.1  mrg ;; it under the terms of the GNU General Public License as published by
      8  1.1  mrg ;; the Free Software Foundation; either version 3, or (at your option)
      9  1.1  mrg ;; any later version.
     10  1.1  mrg ;;
     11  1.1  mrg ;; GCC is distributed in the hope that it will be useful,
     12  1.1  mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  1.1  mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  1.1  mrg ;; GNU General Public License for more details.
     15  1.1  mrg ;;
     16  1.1  mrg ;; You should have received a copy of the GNU General Public License
     17  1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg ;; <http://www.gnu.org/licenses/>.
     19  1.1  mrg 
     20  1.1  mrg ;; Return true if OP is a register or the constant 0.
     21  1.1  mrg 
     22  1.1  mrg (define_predicate "reg_or_zero_operand"
     23  1.1  mrg   (match_code "reg,subreg,const_int")
     24  1.1  mrg {
     25  1.1  mrg   if (REG_P (op) || GET_CODE (op) == SUBREG)
     26  1.1  mrg     return register_operand (op, mode);
     27  1.1  mrg 
     28  1.1  mrg   if (!CONST_INT_P (op))
     29  1.1  mrg     return 0;
     30  1.1  mrg 
     31  1.1  mrg   return INTVAL (op) == 0;
     32  1.1  mrg })
     33  1.1  mrg 
     34  1.1  mrg ;; Return nonzero if the operand is suitable for use in a conditional
     35  1.1  mrg ;; move sequence.
     36  1.1  mrg 
     37  1.1  mrg (define_predicate "conditional_move_operand"
     38  1.1  mrg   (match_code "reg,subreg,const_int")
     39  1.1  mrg {
     40  1.1  mrg   /* Only defined for simple integers so far...  */
     41  1.1  mrg   if (mode != SImode && mode != HImode && mode != QImode)
     42  1.1  mrg     return FALSE;
     43  1.1  mrg 
     44  1.1  mrg   /* At the moment we can handle moving registers and loading constants.  */
     45  1.1  mrg   /* To be added: Addition/subtraction/bitops/multiplication of registers.  */
     46  1.1  mrg 
     47  1.1  mrg   switch (GET_CODE (op))
     48  1.1  mrg     {
     49  1.1  mrg     case REG:
     50  1.1  mrg       return 1;
     51  1.1  mrg 
     52  1.1  mrg     case CONST_INT:
     53  1.1  mrg       return satisfies_constraint_I (op);
     54  1.1  mrg 
     55  1.1  mrg     default:
     56  1.1  mrg #if 0
     57  1.1  mrg       fprintf (stderr, "Test for cond move op of type: %s\n",
     58  1.1  mrg 	       GET_RTX_NAME (GET_CODE (op)));
     59  1.1  mrg #endif
     60  1.1  mrg       return 0;
     61  1.1  mrg     }
     62  1.1  mrg })
     63  1.1  mrg 
     64  1.1  mrg ;; Return true if the code is a test of the carry bit.
     65  1.1  mrg 
     66  1.1  mrg (define_predicate "carry_compare_operand"
     67  1.1  mrg   (match_code "eq,ne")
     68  1.1  mrg {
     69  1.1  mrg   rtx x;
     70  1.1  mrg 
     71  1.1  mrg   if (GET_MODE (op) != CCmode && GET_MODE (op) != VOIDmode)
     72  1.1  mrg     return FALSE;
     73  1.1  mrg 
     74  1.1  mrg   if (GET_CODE (op) != NE && GET_CODE (op) != EQ)
     75  1.1  mrg     return FALSE;
     76  1.1  mrg 
     77  1.1  mrg   x = XEXP (op, 0);
     78  1.1  mrg   if (!REG_P (x) || REGNO (x) != CARRY_REGNUM)
     79  1.1  mrg     return FALSE;
     80  1.1  mrg 
     81  1.1  mrg   x = XEXP (op, 1);
     82  1.1  mrg   if (!CONST_INT_P (x) || INTVAL (x) != 0)
     83  1.1  mrg     return FALSE;
     84  1.1  mrg 
     85  1.1  mrg   return TRUE;
     86  1.1  mrg })
     87  1.1  mrg 
     88  1.1  mrg ;; Return 1 if OP is an EQ or NE comparison operator.
     89  1.1  mrg 
     90  1.1  mrg (define_predicate "eqne_comparison_operator"
     91  1.1  mrg   (match_code "eq,ne")
     92  1.1  mrg {
     93  1.1  mrg   enum rtx_code code = GET_CODE (op);
     94  1.1  mrg 
     95  1.1  mrg   return (code == EQ || code == NE);
     96  1.1  mrg })
     97  1.1  mrg 
     98  1.1  mrg ;; Return 1 if OP is a signed comparison operator.
     99  1.1  mrg 
    100  1.1  mrg (define_predicate "signed_comparison_operator"
    101  1.1  mrg   (match_code "eq,ne,lt,le,gt,ge")
    102  1.1  mrg {
    103  1.1  mrg   enum rtx_code code = GET_CODE (op);
    104  1.1  mrg 
    105  1.1  mrg   return (COMPARISON_P (op)
    106  1.1  mrg   	  && (code == EQ || code == NE
    107  1.1  mrg 	      || code == LT || code == LE || code == GT || code == GE));
    108  1.1  mrg })
    109  1.1  mrg 
    110  1.1  mrg ;; Return true if OP is an acceptable argument for a move destination.
    111  1.1  mrg 
    112  1.1  mrg (define_predicate "move_dest_operand"
    113  1.1  mrg   (match_code "reg,subreg,mem")
    114  1.1  mrg {
    115  1.1  mrg   switch (GET_CODE (op))
    116  1.1  mrg     {
    117  1.1  mrg     case REG :
    118  1.1  mrg       return register_operand (op, mode);
    119  1.1  mrg     case SUBREG :
    120  1.1  mrg       /* (subreg (mem ...) ...) can occur here if the inner part was once a
    121  1.1  mrg 	 pseudo-reg and is now a stack slot.  */
    122  1.1  mrg       if (MEM_P (SUBREG_REG (op)))
    123  1.1  mrg 	return address_operand (XEXP (SUBREG_REG (op), 0), mode);
    124  1.1  mrg       else
    125  1.1  mrg 	return register_operand (op, mode);
    126  1.1  mrg     case MEM :
    127  1.1  mrg       if (GET_CODE (XEXP (op, 0)) == POST_INC)
    128  1.1  mrg 	return 0;		/* stores can't do post inc */
    129  1.1  mrg       return address_operand (XEXP (op, 0), mode);
    130  1.1  mrg     default :
    131  1.1  mrg       return 0;
    132  1.1  mrg     }
    133  1.1  mrg })
    134  1.1  mrg 
    135  1.1  mrg ;; Return true if OP is an acceptable argument for a single word move
    136  1.1  mrg ;; source.
    137  1.1  mrg 
    138  1.1  mrg (define_predicate "move_src_operand"
    139  1.1  mrg   (match_code "reg,subreg,mem,const_int,const_double,label_ref,const,symbol_ref")
    140  1.1  mrg {
    141  1.1  mrg   switch (GET_CODE (op))
    142  1.1  mrg     {
    143  1.1  mrg     case LABEL_REF :
    144  1.1  mrg     case SYMBOL_REF :
    145  1.1  mrg     case CONST :
    146  1.1  mrg       return addr24_operand (op, mode);
    147  1.1  mrg     case CONST_INT :
    148  1.1  mrg       /* ??? We allow more cse opportunities if we only allow constants
    149  1.1  mrg 	 loadable with one insn, and split the rest into two.  The instances
    150  1.1  mrg 	 where this would help should be rare and the current way is
    151  1.1  mrg 	 simpler.  */
    152  1.1  mrg       if (HOST_BITS_PER_WIDE_INT > 32)
    153  1.1  mrg 	{
    154  1.1  mrg 	  HOST_WIDE_INT rest = INTVAL (op) >> 31;
    155  1.1  mrg 	  return (rest == 0 || rest == -1);
    156  1.1  mrg 	}
    157  1.1  mrg       else
    158  1.1  mrg 	return 1;
    159  1.1  mrg     case CONST_DOUBLE :
    160  1.1  mrg       if (mode == SFmode)
    161  1.1  mrg 	return 1;
    162  1.1  mrg       else if (mode == SImode)
    163  1.1  mrg 	{
    164  1.1  mrg 	  /* Large unsigned constants are represented as const_double's.  */
    165  1.1  mrg 	  unsigned HOST_WIDE_INT low, high;
    166  1.1  mrg 
    167  1.1  mrg 	  low = CONST_DOUBLE_LOW (op);
    168  1.1  mrg 	  high = CONST_DOUBLE_HIGH (op);
    169  1.1  mrg 	  return high == 0 && low <= (unsigned) 0xffffffff;
    170  1.1  mrg 	}
    171  1.1  mrg       else
    172  1.1  mrg 	return 0;
    173  1.1  mrg     case REG :
    174  1.1  mrg       return register_operand (op, mode);
    175  1.1  mrg     case SUBREG :
    176  1.1  mrg       /* (subreg (mem ...) ...) can occur here if the inner part was once a
    177  1.1  mrg 	 pseudo-reg and is now a stack slot.  */
    178  1.1  mrg       if (MEM_P (SUBREG_REG (op)))
    179  1.1  mrg 	return address_operand (XEXP (SUBREG_REG (op), 0), mode);
    180  1.1  mrg       else
    181  1.1  mrg 	return register_operand (op, mode);
    182  1.1  mrg     case MEM :
    183  1.1  mrg       if (GET_CODE (XEXP (op, 0)) == PRE_INC
    184  1.1  mrg 	  || GET_CODE (XEXP (op, 0)) == PRE_DEC)
    185  1.1  mrg 	return 0;		/* loads can't do pre-{inc,dec} */
    186  1.1  mrg       return address_operand (XEXP (op, 0), mode);
    187  1.1  mrg     default :
    188  1.1  mrg       return 0;
    189  1.1  mrg     }
    190  1.1  mrg })
    191  1.1  mrg 
    192  1.1  mrg ;; Return true if OP is an acceptable argument for a double word move
    193  1.1  mrg ;; source.
    194  1.1  mrg 
    195  1.1  mrg (define_predicate "move_double_src_operand"
    196  1.1  mrg   (match_code "reg,subreg,mem,const_int,const_double")
    197  1.1  mrg {
    198  1.1  mrg   switch (GET_CODE (op))
    199  1.1  mrg     {
    200  1.1  mrg     case CONST_INT :
    201  1.1  mrg     case CONST_DOUBLE :
    202  1.1  mrg       return 1;
    203  1.1  mrg     case REG :
    204  1.1  mrg       return register_operand (op, mode);
    205  1.1  mrg     case SUBREG :
    206  1.1  mrg       /* (subreg (mem ...) ...) can occur here if the inner part was once a
    207  1.1  mrg 	 pseudo-reg and is now a stack slot.  */
    208  1.1  mrg       if (MEM_P (SUBREG_REG (op)))
    209  1.1  mrg 	return move_double_src_operand (SUBREG_REG (op), mode);
    210  1.1  mrg       else
    211  1.1  mrg 	return register_operand (op, mode);
    212  1.1  mrg     case MEM :
    213  1.1  mrg       /* Disallow auto inc/dec for now.  */
    214  1.1  mrg       if (GET_CODE (XEXP (op, 0)) == PRE_DEC
    215  1.1  mrg 	  || GET_CODE (XEXP (op, 0)) == PRE_INC)
    216  1.1  mrg 	return 0;
    217  1.1  mrg       return address_operand (XEXP (op, 0), mode);
    218  1.1  mrg     default :
    219  1.1  mrg       return 0;
    220  1.1  mrg     }
    221  1.1  mrg })
    222  1.1  mrg 
    223  1.1  mrg ;; Return true if OP is a const_int requiring two instructions to
    224  1.1  mrg ;; load.
    225  1.1  mrg 
    226  1.1  mrg (define_predicate "two_insn_const_operand"
    227  1.1  mrg   (match_code "const_int")
    228  1.1  mrg {
    229  1.1  mrg   if (!CONST_INT_P (op))
    230  1.1  mrg     return 0;
    231  1.1  mrg   if (satisfies_constraint_J (op)
    232  1.1  mrg       || satisfies_constraint_M (op)
    233  1.1  mrg       || satisfies_constraint_L (op))
    234  1.1  mrg     return 0;
    235  1.1  mrg   return 1;
    236  1.1  mrg })
    237  1.1  mrg 
    238  1.1  mrg ;; Returns 1 if OP is a symbol reference.
    239  1.1  mrg 
    240  1.1  mrg (define_predicate "symbolic_operand"
    241  1.1  mrg   (match_code "symbol_ref,label_ref,const")
    242  1.1  mrg {
    243  1.1  mrg   switch (GET_CODE (op))
    244  1.1  mrg     {
    245  1.1  mrg     case SYMBOL_REF:
    246  1.1  mrg     case LABEL_REF:
    247  1.1  mrg     case CONST :
    248  1.1  mrg       return 1;
    249  1.1  mrg 
    250  1.1  mrg     default:
    251  1.1  mrg       return 0;
    252  1.1  mrg     }
    253  1.1  mrg })
    254  1.1  mrg 
    255  1.1  mrg ;; Return true if OP is a signed 8-bit immediate value.
    256  1.1  mrg 
    257  1.1  mrg (define_predicate "int8_operand"
    258  1.1  mrg   (match_code "const_int")
    259  1.1  mrg {
    260  1.1  mrg   if (!CONST_INT_P (op))
    261  1.1  mrg     return 0;
    262  1.1  mrg   return satisfies_constraint_I (op);
    263  1.1  mrg })
    264  1.1  mrg 
    265  1.1  mrg ;; Return true if OP is an unsigned 16-bit immediate value.
    266  1.1  mrg 
    267  1.1  mrg (define_predicate "uint16_operand"
    268  1.1  mrg   (match_code "const_int")
    269  1.1  mrg {
    270  1.1  mrg   if (!CONST_INT_P (op))
    271  1.1  mrg     return 0;
    272  1.1  mrg   return satisfies_constraint_K (op);
    273  1.1  mrg })
    274  1.1  mrg 
    275  1.1  mrg ;; Return true if OP is a register or signed 16-bit value.
    276  1.1  mrg 
    277  1.1  mrg (define_predicate "reg_or_int16_operand"
    278  1.1  mrg   (match_code "reg,subreg,const_int")
    279  1.1  mrg {
    280  1.1  mrg   if (REG_P (op) || GET_CODE (op) == SUBREG)
    281  1.1  mrg     return register_operand (op, mode);
    282  1.1  mrg   if (!CONST_INT_P (op))
    283  1.1  mrg     return 0;
    284  1.1  mrg   return satisfies_constraint_J (op);
    285  1.1  mrg })
    286  1.1  mrg 
    287  1.1  mrg ;; Return true if OP is a register or an unsigned 16-bit value.
    288  1.1  mrg 
    289  1.1  mrg (define_predicate "reg_or_uint16_operand"
    290  1.1  mrg   (match_code "reg,subreg,const_int")
    291  1.1  mrg {
    292  1.1  mrg   if (REG_P (op) || GET_CODE (op) == SUBREG)
    293  1.1  mrg     return register_operand (op, mode);
    294  1.1  mrg   if (!CONST_INT_P (op))
    295  1.1  mrg     return 0;
    296  1.1  mrg   return satisfies_constraint_K (op);
    297  1.1  mrg })
    298  1.1  mrg 
    299  1.1  mrg ;; Return true if OP is a register or signed 16-bit value for
    300  1.1  mrg ;; compares.
    301  1.1  mrg 
    302  1.1  mrg (define_predicate "reg_or_cmp_int16_operand"
    303  1.1  mrg   (match_code "reg,subreg,const_int")
    304  1.1  mrg {
    305  1.1  mrg   if (REG_P (op) || GET_CODE (op) == SUBREG)
    306  1.1  mrg     return register_operand (op, mode);
    307  1.1  mrg   if (!CONST_INT_P (op))
    308  1.1  mrg     return 0;
    309  1.1  mrg   return satisfies_constraint_P (op);
    310  1.1  mrg })
    311  1.1  mrg 
    312  1.1  mrg ;; Return true if OP is a register or an integer value that can be
    313  1.1  mrg ;; used is SEQ/SNE.  We can use either XOR of the value or ADD of the
    314  1.1  mrg ;; negative of the value for the constant.  Don't allow 0, because
    315  1.1  mrg ;; that is special cased.
    316  1.1  mrg 
    317  1.1  mrg (define_predicate "reg_or_eq_int16_operand"
    318  1.1  mrg   (match_code "reg,subreg,const_int")
    319  1.1  mrg {
    320  1.1  mrg   HOST_WIDE_INT value;
    321  1.1  mrg 
    322  1.1  mrg   if (REG_P (op) || GET_CODE (op) == SUBREG)
    323  1.1  mrg     return register_operand (op, mode);
    324  1.1  mrg 
    325  1.1  mrg   if (!CONST_INT_P (op))
    326  1.1  mrg     return 0;
    327  1.1  mrg 
    328  1.1  mrg   value = INTVAL (op);
    329  1.1  mrg   return (value != 0) && (UINT16_P (value) || CMP_INT16_P (-value));
    330  1.1  mrg })
    331  1.1  mrg 
    332  1.1  mrg ;; Return true if OP is a signed 16-bit immediate value useful in
    333  1.1  mrg ;; comparisons.
    334  1.1  mrg 
    335  1.1  mrg (define_predicate "cmp_int16_operand"
    336  1.1  mrg   (match_code "const_int")
    337  1.1  mrg {
    338  1.1  mrg   if (!CONST_INT_P (op))
    339  1.1  mrg     return 0;
    340  1.1  mrg   return satisfies_constraint_P (op);
    341  1.1  mrg })
    342  1.1  mrg 
    343  1.1  mrg ;; Acceptable arguments to the call insn.
    344  1.1  mrg 
    345  1.1  mrg (define_predicate "call_address_operand"
    346  1.1  mrg   (match_code "symbol_ref,label_ref,const")
    347  1.1  mrg {
    348  1.1  mrg   return symbolic_operand (op, mode);
    349  1.1  mrg 
    350  1.1  mrg /* Constants and values in registers are not OK, because
    351  1.1  mrg    the m32r BL instruction can only support PC relative branching.  */
    352  1.1  mrg })
    353  1.1  mrg 
    354  1.1  mrg ;; Return true if OP is an acceptable input argument for a zero/sign
    355  1.1  mrg ;; extend operation.
    356  1.1  mrg 
    357  1.1  mrg (define_predicate "extend_operand"
    358  1.1  mrg   (match_code "reg,subreg,mem")
    359  1.1  mrg {
    360  1.1  mrg   rtx addr;
    361  1.1  mrg 
    362  1.1  mrg   switch (GET_CODE (op))
    363  1.1  mrg     {
    364  1.1  mrg     case REG :
    365  1.1  mrg     case SUBREG :
    366  1.1  mrg       return register_operand (op, mode);
    367  1.1  mrg 
    368  1.1  mrg     case MEM :
    369  1.1  mrg       addr = XEXP (op, 0);
    370  1.1  mrg       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
    371  1.1  mrg 	return 0;		/* loads can't do pre inc/pre dec */
    372  1.1  mrg 
    373  1.1  mrg       return address_operand (addr, mode);
    374  1.1  mrg 
    375  1.1  mrg     default :
    376  1.1  mrg       return 0;
    377  1.1  mrg     }
    378  1.1  mrg })
    379  1.1  mrg 
    380  1.1  mrg ;; Return nonzero if the operand is an insn that is a small
    381  1.1  mrg ;; insn. Allow const_int 0 as well, which is a placeholder for NOP
    382  1.1  mrg ;; slots.
    383  1.1  mrg 
    384  1.1  mrg (define_predicate "small_insn_p"
    385  1.1  mrg   (match_code "insn,call_insn,jump_insn")
    386  1.1  mrg {
    387  1.1  mrg   if (CONST_INT_P (op) && INTVAL (op) == 0)
    388  1.1  mrg     return 1;
    389  1.1  mrg 
    390  1.1  mrg   if (! INSN_P (op))
    391  1.1  mrg     return 0;
    392  1.1  mrg 
    393  1.5  mrg   return get_attr_length (as_a <rtx_insn *> (op)) == 2;
    394  1.1  mrg })
    395  1.1  mrg 
    396  1.1  mrg ;; Return true if op is an integer constant, less than or equal to
    397  1.1  mrg ;; MAX_MOVE_BYTES.
    398  1.1  mrg 
    399  1.1  mrg (define_predicate "m32r_block_immediate_operand"
    400  1.1  mrg   (match_code "const_int")
    401  1.1  mrg {
    402  1.1  mrg   if (!CONST_INT_P (op)
    403  1.1  mrg       || INTVAL (op) > MAX_MOVE_BYTES
    404  1.1  mrg       || INTVAL (op) <= 0)
    405  1.1  mrg     return 0;
    406  1.1  mrg 
    407  1.1  mrg   return 1;
    408  1.1  mrg })
    409  1.1  mrg 
    410  1.1  mrg ;; Return nonzero if the operand is an insn that is a large insn.
    411  1.1  mrg 
    412  1.1  mrg (define_predicate "large_insn_p"
    413  1.1  mrg   (match_code "insn,call_insn,jump_insn")
    414  1.1  mrg {
    415  1.1  mrg   if (! INSN_P (op))
    416  1.1  mrg     return 0;
    417  1.1  mrg 
    418  1.5  mrg   return get_attr_length (as_a <rtx_insn *> (op)) != 2;
    419  1.1  mrg })
    420  1.1  mrg 
    421  1.1  mrg ;; Returns 1 if OP is an acceptable operand for seth/add3.
    422  1.1  mrg 
    423  1.1  mrg (define_predicate "seth_add3_operand"
    424  1.1  mrg   (match_code "symbol_ref,label_ref,const")
    425  1.1  mrg {
    426  1.1  mrg   if (flag_pic)
    427  1.1  mrg     return 0;
    428  1.1  mrg 
    429  1.1  mrg   if (GET_CODE (op) == SYMBOL_REF
    430  1.1  mrg       || GET_CODE (op) == LABEL_REF)
    431  1.1  mrg     return 1;
    432  1.1  mrg 
    433  1.1  mrg   if (GET_CODE (op) == CONST
    434  1.1  mrg       && GET_CODE (XEXP (op, 0)) == PLUS
    435  1.1  mrg       && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
    436  1.1  mrg       && satisfies_constraint_J (XEXP (XEXP (op, 0), 1)))
    437  1.1  mrg     return 1;
    438  1.1  mrg 
    439  1.1  mrg   return 0;
    440  1.1  mrg })
    441