Home | History | Annotate | Line # | Download | only in cr16
      1 ;; Predicates of machine description for CR16.
      2 ;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
      3 ;; Contributed by KPIT Cummins Infosystems Limited.
      4 ;;
      5 ;; This file is part of GCC.
      6 ;;
      7 ;; GCC is free software; you can redistribute it and/or modify it
      8 ;; under the terms of the GNU General Public License as published
      9 ;; by the Free Software Foundation; either version 3, or (at your
     10 ;; option) any later version.
     11 ;;
     12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
     13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15 ;; License for more details.
     16 ;;
     17 ;; You should have received a copy of the GNU General Public License
     18 ;; along with GCC; see the file COPYING3.  If not see
     19 ;; <http://www.gnu.org/licenses/>.  
     20 
     21 ;;  Predicates
     22 
     23 ;; Predicates for sbit/cbit instructions
     24 ;; bit operand used for the generation of bit insn generation
     25 (define_predicate "bit_operand"
     26   (match_code "mem")
     27 {
     28   return ((GET_CODE (op) == MEM && OK_FOR_Z (op)));
     29 })
     30 
     31 ;; Unsigned 4-bits constant int or double value.
     32 (define_predicate "u4bits_operand"
     33   (match_code "const_int,const_double")
     34 {
     35   if (GET_CODE (op) == CONST_DOUBLE)
     36     return cr16_const_double_ok (op);
     37     return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 4)) ? 1 : 0;
     38 })
     39 
     40 ;; Operand is a constant integer where
     41 ;; only one bit is set to 1.
     42 (define_predicate "one_bit_operand"
     43   (match_code "const_int")
     44 {
     45   unsigned int val;
     46 
     47   val = INTVAL (op);
     48   if (mode == QImode) 
     49     val &= 0xff;
     50   else if (mode == HImode)
     51     val &= 0xffff;
     52   else
     53     gcc_unreachable();
     54 
     55   if (val != 0)
     56     return (val & (val - 1)) == 0; /* true if only one bit is set.  */
     57   else
     58     return 0;
     59 })
     60 
     61 ;; Operand is a constant integer where
     62 ;; only one bit is set to 0.
     63 (define_predicate "rev_one_bit_operand"
     64   (match_code "const_int")
     65 {
     66   unsigned int val;
     67 
     68   val = ~INTVAL (op); /* Invert and use.  */
     69   if (mode == QImode) 
     70     val &= 0xff;
     71   else if (mode == HImode)
     72     val &= 0xffff;
     73   else
     74     gcc_unreachable();
     75 
     76   if (val != 0)
     77     return (val & (val - 1)) == 0; /* true if only one bit is set.  */
     78   else
     79     return 0;
     80 })
     81 
     82 ;; Predicates for shift instructions
     83 ;; Immediate operand predicate for count in shift operations.
     84 ;; Immediate shall be 3-bits in case operand to be operated on
     85 ;; is a qi mode operand.
     86 (define_predicate "shift_qi_imm_operand"
     87   (match_code "const_int")
     88 {
     89   return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 3)) ? 1 : 0;
     90 })
     91 
     92 ;; Immediate shall be 4-bits in case operand to be operated on
     93 ;; is a hi mode operand.
     94 (define_predicate "shift_hi_imm_operand"
     95   (match_code "const_int")
     96 {
     97   return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 4)) ? 1 : 0;
     98 })
     99 
    100 ;; Immediate shall be 3-bits in case operand to be operated on
    101 ;; is a si mode operand.
    102 (define_predicate "shift_si_imm_operand"
    103   (match_code "const_int")
    104 {
    105   return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 5)) ? 1 : 0;
    106 })
    107 
    108 ;; Predicates for jump/call instructions
    109 ;; Jump immediate cannot be more than 24-bits
    110 (define_predicate "jump_imm_operand"
    111   (match_code "const_int")
    112 {
    113   return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 24)) ? 1 : 0;
    114 })
    115 
    116 ;; Call immediate cannot be more than 24-bits
    117 (define_predicate "call_imm_operand"
    118   (match_operand 0 "immediate_operand")
    119 {
    120   if (GET_CODE (op) != CONST_INT) return 1;
    121     return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 24)) ? 1 : 0;
    122 })
    123 
    124 ;; Operand is register or 4-bit immediate operand
    125 (define_predicate "reg_or_u4bits_operand"
    126   (ior (match_operand 0 "u4bits_operand")
    127        (match_operand 0 "register_operand")))
    128 
    129 ;; Operand is a register or symbol reference
    130 (define_predicate "reg_or_sym_operand"
    131   (ior (match_code "symbol_ref")
    132        (match_operand 0 "register_operand")))
    133 
    134 ;; Operand is a non stack pointer register
    135 (define_predicate "nosp_reg_operand"
    136   (and (match_operand 0 "register_operand")
    137        (match_test "REGNO (op) != SP_REGNUM")))
    138 
    139 (define_predicate "hard_reg_operand"
    140   (and (match_operand 0 "register_operand")
    141        (match_test "REGNO (op) <= 15")))
    142 
    143 ;; Operand is a memory reference and
    144 ;; not a push operand.
    145 (define_predicate "store_operand"
    146   (and (match_operand 0 "memory_operand")
    147        (not (match_operand 0 "push_operand"))))
    148 
    149 ;; Helper predicate 
    150 (define_predicate "reg_or_int_operand"
    151   (ior (match_code "const_int")
    152        (match_operand 0 "register_operand")))
    153 
    154 ;;
    155 ;;
    156 ;; Atithmetic/logical predicates
    157 
    158 ;; QI Helper
    159 (define_predicate "arith_qi_operand"
    160    (match_code "const_int")
    161 {
    162         return (IN_RAN(INTVAL (op), 0, 15) && ((INTVAL (op) != 9) 
    163                 || (INTVAL (op) != 11))) ? 1 : 0 ; 
    164 })
    165 
    166 ;;QI Reg, subreg(reg) or const_int.
    167 (define_predicate "reg_qi_int_operand"
    168   (ior (match_operand 0 "arith_qi_operand")
    169        (match_operand 0 "register_operand")))
    170 
    171 ;; HI Helper
    172 (define_predicate "arith_hi_operand"
    173    (match_code "const_int")
    174 {
    175         return (IN_RAN(INTVAL (op), -32768, 32768) ) ? 1 : 0 ; 
    176 })
    177 
    178 ;;HI Reg, subreg(reg) or const_int.
    179 (define_predicate "reg_hi_int_operand"
    180   (ior (match_operand 0 "arith_hi_operand")
    181        (match_operand 0 "register_operand")))
    182 
    183 ;;SI Reg, subreg(reg) or const_int.
    184 (define_predicate "reg_si_int_operand"
    185   (ior (match_operand 0 "const_int_operand")
    186        (match_operand 0 "register_operand")))
    187 
    188 ;;
    189 ;; Shift predicates
    190 
    191 ;; QI Helper
    192 (define_predicate "shift_qi_operand"
    193    (match_code "const_int")
    194 {
    195         return (IN_RAN(INTVAL (op), 0, 7) ) ? 1 : 0; 
    196 })
    197 
    198 ;;QI Reg, subreg(reg) or const_int.
    199 (define_predicate "shift_reg_qi_int_operand"
    200   (ior (match_operand 0 "shift_qi_operand")
    201        (match_operand 0 "register_operand")))
    202 
    203 ;; HI Helper
    204 (define_predicate "shift_hi_operand"
    205    (match_code "const_int")
    206 {
    207         return (IN_RAN(INTVAL (op), 0, 15) ) ? 1 : 0 ; 
    208 })
    209 
    210 ;;HI Reg, subreg(reg) or const_int.
    211 (define_predicate "shift_reg_hi_int_operand"
    212   (ior (match_operand 0 "shift_hi_operand")
    213        (match_operand 0 "register_operand")))
    214 
    215 ;; SI Helper
    216 (define_predicate "shift_si_operand"
    217    (match_code "const_int")
    218 {
    219         return (IN_RAN(INTVAL (op), 0, 31) ) ? 1 : 0; 
    220 })
    221 
    222 ;;SI Reg, subreg(reg) or const_int.
    223 (define_predicate "shift_reg_si_int_operand"
    224   (ior (match_operand 0 "shift_si_operand")
    225        (match_operand 0 "register_operand")))
    226