Home | History | Annotate | Line # | Download | only in v850
      1 ;; Predicate definitions for NEC V850.
      2 ;; Copyright (C) 2005-2022 Free Software Foundation, Inc.
      3 ;;
      4 ;; This file is part of GCC.
      5 ;;
      6 ;; GCC is free software; you can redistribute it and/or modify
      7 ;; it under the terms of the GNU General Public License as published by
      8 ;; the Free Software Foundation; either version 3, or (at your option)
      9 ;; any later version.
     10 ;;
     11 ;; GCC is distributed in the hope that it will be useful,
     12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 ;; GNU General Public License for more details.
     15 ;;
     16 ;; You should have received a copy of the GNU General Public License
     17 ;; along with GCC; see the file COPYING3.  If not see
     18 ;; <http://www.gnu.org/licenses/>.
     19 
     20 ;; Return true if OP is either a register or 0.
     21 
     22 (define_predicate "reg_or_0_operand"
     23   (match_code "reg,subreg,const_int,const_double")
     24 {
     25   if (GET_CODE (op) == CONST_INT)
     26     return INTVAL (op) == 0;
     27 
     28   else if (GET_CODE (op) == CONST_DOUBLE)
     29     return satisfies_constraint_G (op);
     30 
     31   else
     32     return register_operand (op, mode);
     33 })
     34 
     35 ;; Return true if OP is either a register or a signed five bit
     36 ;; integer.
     37 
     38 (define_predicate "reg_or_int5_operand"
     39   (match_code "reg,subreg,const_int")
     40 {
     41   if (GET_CODE (op) == CONST_INT)
     42     return CONST_OK_FOR_J (INTVAL (op));
     43 
     44   else
     45     return register_operand (op, mode);
     46 })
     47 
     48 ;; Return true if OP is either a register or a signed nine bit
     49 ;; integer.
     50 
     51 (define_predicate "reg_or_int9_operand"
     52   (match_code "reg,subreg,const_int")
     53 {
     54   if (GET_CODE (op) == CONST_INT)
     55     return CONST_OK_FOR_O (INTVAL (op));
     56 
     57   return register_operand (op, mode);
     58 })
     59 
     60 ;; Return true if OP is either a register or a const integer.
     61 
     62 (define_predicate "reg_or_const_operand"
     63   (match_code "reg,const_int")
     64 {
     65   if (GET_CODE (op) == CONST_INT)
     66     return TRUE;
     67 
     68   return register_operand (op, mode);
     69 })
     70 
     71 ;; Return true if OP is a even number register.
     72 
     73 (define_predicate "even_reg_operand"
     74   (match_code "reg")
     75 {
     76   return (GET_CODE (op) == REG
     77 	  && (REGNO (op) >= FIRST_PSEUDO_REGISTER
     78 	      || ((REGNO (op) > 0) && (REGNO (op) < 32)
     79 		   && ((REGNO (op) & 1)==0))));
     80 })
     81 
     82 ;; Return true if OP is a valid call operand.
     83 
     84 (define_predicate "call_address_operand"
     85   (match_code "reg,symbol_ref")
     86 {
     87   /* Only registers are valid call operands if TARGET_LONG_CALLS.  */
     88   if (TARGET_LONG_CALLS)
     89     return GET_CODE (op) == REG;
     90   return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == REG);
     91 })
     92 
     93 ;; Return true if OP is a valid source operand for SImode move.
     94 
     95 (define_predicate "movsi_source_operand"
     96   (match_code "label_ref,symbol_ref,const_int,const_double,const,high,mem,reg,subreg")
     97 {
     98   /* Some constants, as well as symbolic operands
     99      must be done with HIGH & LO_SUM patterns.  */
    100   if (CONSTANT_P (op)
    101       && GET_CODE (op) != HIGH
    102       && !(GET_CODE (op) == CONST_INT
    103            && (CONST_OK_FOR_J (INTVAL (op))
    104                || CONST_OK_FOR_K (INTVAL (op))
    105                || CONST_OK_FOR_L (INTVAL (op)))))
    106     return special_symbolref_operand (op, mode);
    107   else
    108     return general_operand (op, mode);
    109 })
    110 
    111 ;; Return true if OP is a valid operand for 23 bit displacement
    112 ;; operations.
    113 
    114 (define_predicate "disp23_operand"
    115   (match_code "const_int")
    116 {
    117   if (GET_CODE (op) == CONST_INT
    118       && ((unsigned)(INTVAL (op)) >= 0x8000)
    119       && ((unsigned)(INTVAL (op)) < 0x400000))
    120     return 1;
    121   else
    122     return 0;
    123 })
    124 
    125 ;; Return true if OP is a symbol ref with 16-bit signed value.
    126 
    127 (define_predicate "special_symbolref_operand"
    128   (match_code "symbol_ref")
    129 {
    130   if (GET_CODE (op) == CONST
    131       && GET_CODE (XEXP (op, 0)) == PLUS
    132       && satisfies_constraint_K (XEXP (XEXP (op, 0), 1)))
    133     op = XEXP (XEXP (op, 0), 0);
    134 
    135   if (GET_CODE (op) == SYMBOL_REF)
    136     return (SYMBOL_REF_FLAGS (op)
    137 	    & (SYMBOL_FLAG_ZDA | SYMBOL_FLAG_TDA | SYMBOL_FLAG_SDA)) != 0;
    138 
    139   return FALSE;
    140 })
    141 
    142 ;; Return true if OP is a valid operand for bit related operations
    143 ;; containing only single 1 in its binary representation.
    144 
    145 (define_predicate "power_of_two_operand"
    146   (match_code "const_int")
    147 {
    148   if (GET_CODE (op) != CONST_INT)
    149     return 0;
    150 
    151   if (exact_log2 (INTVAL (op)) == -1)
    152     return 0;
    153   return 1;
    154 })
    155 
    156 ;; Return nonzero if the given RTX is suitable for collapsing into a
    157 ;; jump to a function prologue.
    158 
    159 (define_predicate "pattern_is_ok_for_prologue"
    160   (match_code "parallel")
    161 {
    162   int count = XVECLEN (op, 0);
    163   int i;
    164   rtx vector_element;
    165 
    166   /* If there are no registers to save then the function prologue
    167      is not suitable.  */
    168   if (count <= (TARGET_LONG_CALLS ? 3 : 2))
    169     return 0;
    170 
    171   /* The pattern matching has already established that we are adjusting the
    172      stack and pushing at least one register.  We must now check that the
    173      remaining entries in the vector to make sure that they are also register
    174      pushes, except for the last entry which should be a CLOBBER of r10.
    175 
    176      The test below performs the C equivalent of this machine description
    177      pattern match:
    178 
    179      (set (mem:SI (plus:SI (reg:SI 3)
    180       (match_operand:SI 2 "immediate_operand" "i")))
    181       (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
    182 
    183      */
    184 
    185   for (i = 2; i < count - (TARGET_LONG_CALLS ? 2: 1); i++)
    186     {
    187       rtx dest;
    188       rtx src;
    189       rtx plus;
    190 
    191       vector_element = XVECEXP (op, 0, i);
    192 
    193       if (GET_CODE (vector_element) != SET)
    194 	return 0;
    195 
    196       dest = SET_DEST (vector_element);
    197       src = SET_SRC (vector_element);
    198 
    199       if (GET_CODE (dest) != MEM
    200 	  || GET_MODE (dest) != SImode
    201 	  || GET_CODE (src) != REG
    202 	  || GET_MODE (src) != SImode
    203 	  || ! register_is_ok_for_epilogue (src, SImode))
    204 	return 0;
    205 
    206       plus = XEXP (dest, 0);
    207 
    208       if ( GET_CODE (plus) != PLUS
    209 	  || GET_CODE (XEXP (plus, 0)) != REG
    210 	  || GET_MODE (XEXP (plus, 0)) != SImode
    211 	  || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
    212 	  || GET_CODE (XEXP (plus, 1)) != CONST_INT)
    213 	return 0;
    214 
    215       /* If the register is being pushed somewhere other than the stack
    216 	 space just acquired by the first operand then abandon this quest.
    217 	 Note: the test is <= because both values are negative.	 */
    218       if (INTVAL (XEXP (plus, 1))
    219 	  <= INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
    220 	{
    221 	  return 0;
    222 	}
    223     }
    224 
    225   /* Make sure that the last entries in the vector are clobbers.  */
    226   vector_element = XVECEXP (op, 0, i++);
    227 
    228   if (GET_CODE (vector_element) != CLOBBER
    229       || GET_CODE (XEXP (vector_element, 0)) != REG
    230       || REGNO (XEXP (vector_element, 0)) != 10)
    231     return 0;
    232 
    233   if (TARGET_LONG_CALLS)
    234     {
    235       vector_element = XVECEXP (op, 0, i++);
    236 
    237       if (GET_CODE (vector_element) != CLOBBER
    238 	  || GET_CODE (XEXP (vector_element, 0)) != REG
    239 	  || REGNO (XEXP (vector_element, 0)) != 11)
    240 	return 0;
    241     }
    242 
    243   return i == count;
    244 })
    245 
    246 ;; Return nonzero if the given RTX is suitable for collapsing into
    247 ;; jump to a function epilogue.
    248 
    249 (define_predicate "pattern_is_ok_for_epilogue"
    250   (match_code "parallel")
    251 {
    252   int count = XVECLEN (op, 0);
    253   int i;
    254 
    255   /* If there are no registers to restore then the function epilogue
    256      is not suitable.  */
    257   if (count <= 2)
    258     return 0;
    259 
    260   /* The pattern matching has already established that we are performing a
    261      function epilogue and that we are popping at least one register.  We must
    262      now check the remaining entries in the vector to make sure that they are
    263      also register pops.  There is no good reason why there should ever be
    264      anything else in this vector, but being paranoid always helps...
    265 
    266      The test below performs the C equivalent of this machine description
    267      pattern match:
    268 
    269         (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
    270 	  (mem:SI (plus:SI (reg:SI 3) (match_operand:SI n "immediate_operand" "i"))))
    271      */
    272 
    273   for (i = 2; i < count; i++)
    274     {
    275       rtx vector_element = XVECEXP (op, 0, i);
    276       rtx dest;
    277       rtx src;
    278       rtx plus;
    279 
    280       if (GET_CODE (vector_element) != SET)
    281 	return 0;
    282 
    283       dest = SET_DEST (vector_element);
    284       src = SET_SRC (vector_element);
    285 
    286       if (GET_CODE (dest) != REG
    287 	  || GET_MODE (dest) != SImode
    288 	  || ! register_is_ok_for_epilogue (dest, SImode)
    289 	  || GET_CODE (src) != MEM
    290 	  || GET_MODE (src) != SImode)
    291 	return 0;
    292 
    293       plus = XEXP (src, 0);
    294 
    295       if (GET_CODE (plus) != PLUS
    296 	  || GET_CODE (XEXP (plus, 0)) != REG
    297 	  || GET_MODE (XEXP (plus, 0)) != SImode
    298 	  || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
    299 	  || GET_CODE (XEXP (plus, 1)) != CONST_INT)
    300 	return 0;
    301     }
    302 
    303   return 1;
    304 })
    305 
    306 ;; Return true if the given RTX is a register which can be restored by
    307 ;; a function epilogue.
    308 
    309 (define_predicate "register_is_ok_for_epilogue"
    310   (match_code "reg")
    311 {
    312   /* The save/restore routines can only cope with registers 20 - 31.  */
    313   return ((GET_CODE (op) == REG)
    314           && (((REGNO (op) >= 20) && REGNO (op) <= 31)));
    315 })
    316 
    317 ;; Return nonzero if the given RTX is suitable for collapsing into a
    318 ;; DISPOSE instruction.
    319 
    320 (define_predicate "pattern_is_ok_for_dispose"
    321   (match_code "parallel")
    322 {
    323   int count = XVECLEN (op, 0);
    324   int i;
    325 
    326   /* If there are no registers to restore then
    327      the dispose instruction is not suitable.  */
    328   if (count <= 2)
    329     return 0;
    330 
    331   /* The pattern matching has already established that we are performing a
    332      function epilogue and that we are popping at least one register.  We must
    333      now check the remaining entries in the vector to make sure that they are
    334      also register pops.  There is no good reason why there should ever be
    335      anything else in this vector, but being paranoid always helps...
    336 
    337      The test below performs the C equivalent of this machine description
    338      pattern match:
    339 
    340         (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
    341 	  (mem:SI (plus:SI (reg:SI 3)
    342 	    (match_operand:SI n "immediate_operand" "i"))))
    343      */
    344 
    345   for (i = 3; i < count; i++)
    346     {
    347       rtx vector_element = XVECEXP (op, 0, i);
    348       rtx dest;
    349       rtx src;
    350       rtx plus;
    351 
    352       if (GET_CODE (vector_element) != SET)
    353 	return 0;
    354 
    355       dest = SET_DEST (vector_element);
    356       src  = SET_SRC (vector_element);
    357 
    358       if (   GET_CODE (dest) != REG
    359 	  || GET_MODE (dest) != SImode
    360 	  || ! register_is_ok_for_epilogue (dest, SImode)
    361 	  || GET_CODE (src) != MEM
    362 	  || GET_MODE (src) != SImode)
    363 	return 0;
    364 
    365       plus = XEXP (src, 0);
    366 
    367       if (   GET_CODE (plus) != PLUS
    368 	  || GET_CODE (XEXP (plus, 0)) != REG
    369 	  || GET_MODE (XEXP (plus, 0)) != SImode
    370 	  || REGNO    (XEXP (plus, 0)) != STACK_POINTER_REGNUM
    371 	  || GET_CODE (XEXP (plus, 1)) != CONST_INT)
    372 	return 0;
    373     }
    374 
    375   return 1;
    376 })
    377 
    378 ;; Return nonzero if the given RTX is suitable for collapsing into a
    379 ;; PREPARE instruction.
    380 
    381 (define_predicate "pattern_is_ok_for_prepare"
    382   (match_code "parallel")
    383 {
    384   int count = XVECLEN (op, 0);
    385   int i;
    386 
    387   /* If there are no registers to restore then the prepare instruction
    388      is not suitable.  */
    389   if (count <= 1)
    390     return 0;
    391 
    392   /* The pattern matching has already established that we are adjusting the
    393      stack and pushing at least one register.  We must now check that the
    394      remaining entries in the vector to make sure that they are also register
    395      pushes.
    396 
    397      The test below performs the C equivalent of this machine description
    398      pattern match:
    399 
    400      (set (mem:SI (plus:SI (reg:SI 3)
    401        (match_operand:SI 2 "immediate_operand" "i")))
    402          (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
    403 
    404      */
    405 
    406   for (i = 1; i < count; i++)
    407     {
    408       rtx vector_element = XVECEXP (op, 0, i);
    409       rtx dest;
    410       rtx src;
    411       rtx plus;
    412 
    413       if (GET_CODE (vector_element) == CLOBBER)
    414 	continue;
    415 
    416       if (GET_CODE (vector_element) != SET)
    417 	return 0;
    418 
    419       dest = SET_DEST (vector_element);
    420       src  = SET_SRC (vector_element);
    421 
    422       if (   GET_CODE (dest) != MEM
    423 	  || GET_MODE (dest) != SImode
    424 	  || GET_CODE (src) != REG
    425 	  || GET_MODE (src) != SImode
    426 	  || ! register_is_ok_for_epilogue (src, SImode)
    427 	     )
    428 	return 0;
    429 
    430       plus = XEXP (dest, 0);
    431 
    432       if (   GET_CODE (plus) != PLUS
    433 	  || GET_CODE (XEXP (plus, 0)) != REG
    434 	  || GET_MODE (XEXP (plus, 0)) != SImode
    435 	  || REGNO    (XEXP (plus, 0)) != STACK_POINTER_REGNUM
    436 	  || GET_CODE (XEXP (plus, 1)) != CONST_INT)
    437 	return 0;
    438 
    439       /* If the register is being pushed somewhere other than the stack
    440 	 space just acquired by the first operand then abandon this quest.
    441 	 Note: the test is <= because both values are negative.	 */
    442       if (INTVAL (XEXP (plus, 1))
    443 	  < INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
    444 	return 0;
    445     }
    446 
    447   return 1;
    448 })
    449 
    450 ;; Return true if OP is a valid operand for bit related operations
    451 ;; containing only single 0 in its binary representation.
    452 
    453 (define_predicate "not_power_of_two_operand"
    454   (match_code "const_int")
    455 {
    456   unsigned int mask;
    457 
    458   if (mode == QImode)
    459     mask = 0xff;
    460   else if (mode == HImode)
    461     mask = 0xffff;
    462   else if (mode == SImode)
    463     mask = 0xffffffff;
    464   else
    465     return 0;
    466 
    467   if (GET_CODE (op) != CONST_INT)
    468     return 0;
    469 
    470   if (exact_log2 (~INTVAL (op) & mask) == -1)
    471     return 0;
    472   return 1;
    473 })
    474 
    475 ;; Return true if OP is a float value operand with value as 1.
    476 
    477 (define_predicate "const_float_1_operand"
    478   (match_code "const_double")
    479 {
    480   if (GET_CODE (op) != CONST_DOUBLE
    481       || mode != GET_MODE (op)
    482       || (mode != DFmode && mode != SFmode))
    483     return 0;
    484 
    485   return op == CONST1_RTX(mode);
    486 })
    487 
    488 (define_predicate "label_ref_operand"
    489   (match_code "label_ref")
    490 )
    491 
    492 
    493 (define_predicate "e3v5_shift_operand"
    494   (match_code "const_int,reg")
    495   {
    496     if (CONST_INT_P (op))
    497       return IN_RANGE (INTVAL (op), 0, 31);
    498     return true;
    499   }
    500 )
    501 
    502 (define_predicate "ior_operator"
    503   (match_code "ior")
    504 {
    505   return (GET_CODE (op) == IOR);
    506 })
    507 
    508 ;; Return true if the floating point comparison operation
    509 ;; given produces a canonical answer.
    510 (define_predicate "v850_float_z_comparison_operator"
    511   (match_code "lt,le,eq,gt,ge")
    512 {
    513   enum rtx_code code = GET_CODE (op);
    514 
    515   if (GET_RTX_CLASS (code) != RTX_COMPARE
    516       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
    517     return 0;
    518 
    519   if (mode != GET_MODE (op) && mode != VOIDmode)
    520     return 0;
    521 
    522   if ((GET_CODE (XEXP (op, 0)) != REG
    523        || REGNO (XEXP (op, 0)) != CC_REGNUM)
    524       || XEXP (op, 1) != const0_rtx)
    525     return 0;
    526 
    527   if (GET_MODE (XEXP (op, 0)) == CC_FPU_LTmode)
    528     return code == LT;
    529   if (GET_MODE (XEXP (op, 0)) == CC_FPU_LEmode)
    530     return code == LE;
    531   if (GET_MODE (XEXP (op, 0)) == CC_FPU_EQmode)
    532     return code == EQ;
    533   if (GET_MODE (XEXP (op, 0)) == CC_FPU_GTmode)
    534     return code == GT;
    535   if (GET_MODE (XEXP (op, 0)) == CC_FPU_GEmode)
    536     return code == GE;
    537 
    538   /* Note we do not accept CC_FPU_NEmode here.  See
    539      v850_float_nz_comparison for the reason why.  */
    540   return 0;
    541 })
    542 
    543 ;; Return true if the floating point comparison operation
    544 ;; given produces an inverted answer.
    545 (define_predicate "v850_float_nz_comparison_operator"
    546   (match_code "ne")
    547 {
    548   enum rtx_code code = GET_CODE (op);
    549 
    550   /* The V850E2V3 does not have a floating point NZ comparison operator.
    551      Instead it is implemented as an EQ comparison and this function ensures
    552      that the branch_nz_normal and set_nz_insn patterns are used to examine
    553      (and invert) the result of the floating point comparison.  */
    554 
    555   if (GET_RTX_CLASS (code) != RTX_COMPARE
    556       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
    557     return 0;
    558 
    559   if (mode != GET_MODE (op) && mode != VOIDmode)
    560     return 0;
    561 
    562   if ((GET_CODE (XEXP (op, 0)) != REG
    563        || REGNO (XEXP (op, 0)) != CC_REGNUM)
    564       || XEXP (op, 1) != const0_rtx)
    565     return 0;
    566 
    567   if (GET_MODE (XEXP (op, 0)) == CC_FPU_NEmode)
    568     return code == NE;
    569 
    570   return 0;
    571 })
    572