Home | History | Annotate | Line # | Download | only in avr
      1 ;; Constraint definitions for ATMEL AVR micro controllers.
      2 ;; Copyright (C) 2006-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 ;; Register constraints
     21 
     22 (define_register_constraint "t" "R0_REG"
     23   "Temporary register r0")
     24 
     25 (define_register_constraint "b" "BASE_POINTER_REGS"
     26   "Base pointer registers (r28--r31)")
     27 
     28 (define_register_constraint "e" "POINTER_REGS"
     29   "Pointer registers (r26--r31)")
     30 
     31 (define_register_constraint "w" "ADDW_REGS"
     32   "Registers from r24 to r31.  These registers
     33    can be used in @samp{adiw} command.")
     34 
     35 (define_register_constraint "d" "LD_REGS"
     36   "Registers from r16 to r31.")
     37 
     38 (define_register_constraint "l" "NO_LD_REGS"
     39   "Registers from r0 to r15.")
     40 
     41 (define_register_constraint "a" "SIMPLE_LD_REGS"
     42   "Registers from r16 to r23.")
     43 
     44 (define_register_constraint "x" "POINTER_X_REGS"
     45   "Register pair X (r27:r26).")
     46 
     47 (define_register_constraint "y" "POINTER_Y_REGS"
     48   "Register pair Y (r29:r28).")
     49 
     50 (define_register_constraint "z" "POINTER_Z_REGS"
     51   "Register pair Z (r31:r30).")
     52 
     53 (define_register_constraint "q" "STACK_REG"
     54   "Stack pointer register (SPH:SPL).")
     55 
     56 (define_constraint "I"
     57   "Integer constant in the range 0 @dots{} 63."
     58   (and (match_code "const_int")
     59        (match_test "ival >= 0 && ival <= 63")))
     60 
     61 (define_constraint "J"
     62   "Integer constant in the range -63 @dots{} 0."
     63   (and (match_code "const_int")
     64        (match_test "ival <= 0 && ival >= -63")))
     65 
     66 (define_constraint "K"
     67   "Integer constant 2."
     68   (and (match_code "const_int")
     69        (match_test "ival == 2")))
     70 
     71 (define_constraint "L"
     72   "Zero."
     73   (and (match_code "const_int")
     74        (match_test "ival == 0")))
     75 
     76 (define_constraint "M"
     77   "Integer constant in the range 0 @dots{} 0xff."
     78   (and (match_code "const_int")
     79        (match_test "ival >= 0 && ival <= 0xff")))
     80 
     81 (define_constraint "N"
     82   "Constant integer @minus{}1."
     83   (and (match_code "const_int")
     84        (match_test "ival == -1")))
     85 
     86 (define_constraint "O"
     87   "Constant integer 8, 16, or 24."
     88   (and (match_code "const_int")
     89        (match_test "ival == 8 || ival == 16 || ival == 24")))
     90 
     91 (define_constraint "P"
     92   "Constant integer 1."
     93   (and (match_code "const_int")
     94        (match_test "ival == 1")))
     95 
     96 (define_constraint "G"
     97   "Constant float 0."
     98   (and (match_code "const_double")
     99        (match_test "op == CONST0_RTX (SFmode)")))
    100 
    101 (define_memory_constraint "Q"
    102   "A memory address based on Y or Z pointer with displacement."
    103   (and (match_code "mem")
    104        (match_test "extra_constraint_Q (op)")))
    105 
    106 (define_constraint "Cm2"
    107   "Constant integer @minus{}2."
    108   (and (match_code "const_int")
    109        (match_test "ival == -2")))
    110 
    111 (define_constraint "C03"
    112   "Constant integer 3."
    113   (and (match_code "const_int")
    114        (match_test "ival == 3")))
    115 
    116 (define_constraint "C04"
    117   "Constant integer 4."
    118   (and (match_code "const_int")
    119        (match_test "ival == 4")))
    120 
    121 (define_constraint "C05"
    122   "Constant integer 5."
    123   (and (match_code "const_int")
    124        (match_test "ival == 5")))
    125 
    126 (define_constraint "C06"
    127   "Constant integer 6."
    128   (and (match_code "const_int")
    129        (match_test "ival == 6")))
    130 
    131 (define_constraint "C07"
    132   "Constant integer 7."
    133   (and (match_code "const_int")
    134        (match_test "ival == 7")))
    135 
    136 (define_constraint "Ca1"
    137   "Constant 1-byte integer that allows AND by means of CLT + BLD."
    138   (and (match_code "const_int")
    139        (match_test "avr_popcount_each_byte (op, 1, 1<<7)")))
    140 
    141 (define_constraint "Ca2"
    142   "Constant 2-byte integer that allows AND without clobber register."
    143   (and (match_code "const_int")
    144        (match_test "avr_popcount_each_byte (op, 2, (1<<0) | (1<<7) | (1<<8))")))
    145 
    146 (define_constraint "Ca3"
    147   "Constant 3-byte integer that allows AND without clobber register."
    148   (and (match_code "const_int")
    149        (match_test "avr_popcount_each_byte (op, 3, (1<<0) | (1<<7) | (1<<8))")))
    150 
    151 (define_constraint "Ca4"
    152   "Constant 4-byte integer that allows AND without clobber register."
    153   (and (match_code "const_int")
    154        (match_test "avr_popcount_each_byte (op, 4, (1<<0) | (1<<7) | (1<<8))")))
    155 
    156 (define_constraint "Co1"
    157   "Constant 1-byte integer that allows AND by means of SET + BLD."
    158   (and (match_code "const_int")
    159        (match_test "avr_popcount_each_byte (op, 1, 1<<1)")))
    160 
    161 (define_constraint "Co2"
    162   "Constant 2-byte integer that allows OR without clobber register."
    163   (and (match_code "const_int")
    164        (match_test "avr_popcount_each_byte (op, 2, (1<<0) | (1<<1) | (1<<8))")))
    165 
    166 (define_constraint "Co3"
    167   "Constant 3-byte integer that allows OR without clobber register."
    168   (and (match_code "const_int")
    169        (match_test "avr_popcount_each_byte (op, 3, (1<<0) | (1<<1) | (1<<8))")))
    170 
    171 (define_constraint "Co4"
    172   "Constant 4-byte integer that allows OR without clobber register."
    173   (and (match_code "const_int")
    174        (match_test "avr_popcount_each_byte (op, 4, (1<<0) | (1<<1) | (1<<8))")))
    175 
    176 (define_constraint "Cx2"
    177   "Constant 2-byte integer that allows XOR without clobber register."
    178   (and (match_code "const_int")
    179        (match_test "avr_popcount_each_byte (op, 2, (1<<0) | (1<<8))")))
    180 
    181 (define_constraint "Cx3"
    182   "Constant 3-byte integer that allows XOR without clobber register."
    183   (and (match_code "const_int")
    184        (match_test "avr_popcount_each_byte (op, 3, (1<<0) | (1<<8))")))
    185 
    186 (define_constraint "Cx4"
    187   "Constant 4-byte integer that allows XOR without clobber register."
    188   (and (match_code "const_int")
    189        (match_test "avr_popcount_each_byte (op, 4, (1<<0) | (1<<8))")))
    190 
    191 (define_constraint "Csp"
    192   "Integer constant in the range -11 @dots{} 6."
    193   (and (match_code "const_int")
    194        (match_test "IN_RANGE (ival, -11, 6)")))
    195 
    196 (define_constraint "Cxf"
    197   "32-bit integer constant where at least one nibble is 0xf."
    198   (and (match_code "const_int")
    199        (match_test "avr_has_nibble_0xf (op)")))
    200 
    201 (define_constraint "C0f"
    202   "32-bit integer constant where no nibble equals 0xf."
    203   (and (match_code "const_int")
    204        (match_test "!avr_has_nibble_0xf (op)")))
    205 
    206 (define_constraint "Cn8"
    207   "A negative constant integer in the range @minus{}255 @dots{} @minus{}1."
    208   (and (match_code "const_int")
    209        (match_test "IN_RANGE (ival, -255, -1)")))
    210 
    211 ;; CONST_FIXED is no element of 'n' so cook our own.
    212 ;; "i" or "s" would match but because the insn uses iterators that cover
    213 ;; INT_MODE, "i" or "s" is not always possible.
    214 
    215 (define_constraint "Ynn"
    216   "Fixed-point constant known at compile time."
    217   (match_code "const_fixed"))
    218 
    219 (define_constraint "Y00"
    220   "Fixed-point or integer constant with bit representation 0x0"
    221   (and (match_code "const_fixed,const_int")
    222        (match_test "op == CONST0_RTX (GET_MODE (op))")))
    223 
    224 (define_constraint "Y01"
    225   "Fixed-point or integer constant with bit representation 0x1"
    226   (ior (and (match_code "const_fixed")
    227 	    (match_test "INTVAL (avr_to_int_mode (op)) == 1"))
    228        (match_test "satisfies_constraint_P (op)")))
    229 
    230 (define_constraint "Ym1"
    231   "Fixed-point or integer constant with bit representation -0x1"
    232   (ior (and (match_code "const_fixed")
    233 	    (match_test "INTVAL (avr_to_int_mode (op)) == -1"))
    234        (match_test "satisfies_constraint_N (op)")))
    235 
    236 (define_constraint "Y02"
    237   "Fixed-point or integer constant with bit representation 0x2"
    238   (ior (and (match_code "const_fixed")
    239 	    (match_test "INTVAL (avr_to_int_mode (op)) == 2"))
    240        (match_test "satisfies_constraint_K (op)")))
    241 
    242 (define_constraint "Ym2"
    243   "Fixed-point or integer constant with bit representation -0x2"
    244   (ior (and (match_code "const_fixed")
    245 	    (match_test "INTVAL (avr_to_int_mode (op)) == -2"))
    246        (match_test "satisfies_constraint_Cm2 (op)")))
    247 
    248 ;; Constraint that's the empty set.  Useful with mode and code iterators.
    249 (define_constraint "Yxx"
    250   "A constraints that is always false"
    251   (match_test "false"))
    252 
    253 (define_constraint "Yx2"
    254   "Fixed-point or integer constant not in the range @minus{}2 @dots{} 2"
    255   (and (ior (match_code "const_int")
    256             (match_code "const_fixed"))
    257        (match_test "!IN_RANGE (INTVAL (avr_to_int_mode (op)), -2, 2)")))
    258 
    259 ;; Similar to "IJ" used with ADIW/SBIW, but for CONST_FIXED.
    260 
    261 (define_constraint "YIJ"
    262   "Fixed-point constant from @minus{}0x003f to 0x003f."
    263   (and (match_code "const_fixed")
    264        (match_test "IN_RANGE (INTVAL (avr_to_int_mode (op)), -63, 63)")))
    265