Home | History | Annotate | Line # | Download | only in h8300
constraints.md revision 1.1.1.1
      1  1.1  mrg ;; Constraint definitions for Renesas H8/300.
      2  1.1  mrg ;; Copyright (C) 2011-2013 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 ;; Register constraints.
     21  1.1  mrg (define_register_constraint "a" "MAC_REGS"
     22  1.1  mrg   "@internal")
     23  1.1  mrg 
     24  1.1  mrg (define_register_constraint "c" "COUNTER_REGS"
     25  1.1  mrg   "@internal")
     26  1.1  mrg 
     27  1.1  mrg ;; Some patterns need to use er6 as a scratch register.  This is
     28  1.1  mrg ;; difficult to arrange since er6 is the frame pointer and usually can't
     29  1.1  mrg ;; be spilled.
     30  1.1  mrg 
     31  1.1  mrg ;; Such patterns should define two alternatives, one which allows only
     32  1.1  mrg ;; er6 and one which allows any general register.  The former
     33  1.1  mrg ;; alternative should have a 'd' constraint while the latter should be
     34  1.1  mrg ;; disparaged and use 'D'.
     35  1.1  mrg 
     36  1.1  mrg ;; Normally, 'd' maps to DESTINATION_REGS and 'D' maps to GENERAL_REGS.
     37  1.1  mrg ;; However, there are cases where they should be NO_REGS:
     38  1.1  mrg 
     39  1.1  mrg ;;   - 'd' should be NO_REGS when reloading a function that uses the
     40  1.1  mrg ;;     frame pointer.  In this case, DESTINATION_REGS won't contain any
     41  1.1  mrg ;;     spillable registers, so the first alternative can't be used.
     42  1.1  mrg 
     43  1.1  mrg ;;   - -fno-omit-frame-pointer means that the frame pointer will
     44  1.1  mrg ;;     always be in use.  It's therefore better to map 'd' to NO_REGS
     45  1.1  mrg ;;     before reload so that register allocator will pick the second
     46  1.1  mrg ;;     alternative.
     47  1.1  mrg 
     48  1.1  mrg ;;   - we would like 'D' to be be NO_REGS when the frame pointer isn't
     49  1.1  mrg ;;     live, but we the frame pointer may turn out to be needed after
     50  1.1  mrg ;;     we start reload, and then we may have already decided we don't
     51  1.1  mrg ;;     have a choice, so we can't do that.  Forcing the register
     52  1.1  mrg ;;     allocator to use er6 if possible might produce better code for
     53  1.1  mrg ;;     small functions: it's more efficient to save and restore er6 in
     54  1.1  mrg ;;     the prologue & epilogue than to do it in a define_split.
     55  1.1  mrg ;;     Hopefully disparaging 'D' will have a similar effect, without
     56  1.1  mrg ;;     forcing a reload failure if the frame pointer is found to be
     57  1.1  mrg ;;     needed too late.
     58  1.1  mrg 
     59  1.1  mrg (define_register_constraint "d"
     60  1.1  mrg   "(!flag_omit_frame_pointer && !reload_completed
     61  1.1  mrg     ? NO_REGS
     62  1.1  mrg     : (frame_pointer_needed && reload_in_progress
     63  1.1  mrg        ? NO_REGS
     64  1.1  mrg        : DESTINATION_REGS))"
     65  1.1  mrg   "@internal")
     66  1.1  mrg 
     67  1.1  mrg (define_register_constraint "D" "GENERAL_REGS"
     68  1.1  mrg   "@internal")
     69  1.1  mrg 
     70  1.1  mrg (define_register_constraint "f" "SOURCE_REGS"
     71  1.1  mrg   "@internal")
     72  1.1  mrg 
     73  1.1  mrg ;; Integer constraints.
     74  1.1  mrg (define_constraint "I"
     75  1.1  mrg   "Integer zero."
     76  1.1  mrg   (and (match_code "const_int")
     77  1.1  mrg        (match_test "ival == 0")))
     78  1.1  mrg 
     79  1.1  mrg (define_constraint "J"
     80  1.1  mrg   "An integer with its low byte clear."
     81  1.1  mrg   (and (match_code "const_int")
     82  1.1  mrg        (match_test "(ival & 0xff) == 0")))
     83  1.1  mrg 
     84  1.1  mrg (define_constraint "L"
     85  1.1  mrg   "1, 2 or 4 on the H8300H or S; 1 or 2 otherwise."
     86  1.1  mrg   (and (match_code "const_int")
     87  1.1  mrg        (if_then_else (match_test "TARGET_H8300H || TARGET_H8300S")
     88  1.1  mrg 		     (match_test "ival == 1 || ival == 2 || ival == 4")
     89  1.1  mrg 		     (match_test "ival == 1 || ival == 2"))))
     90  1.1  mrg 
     91  1.1  mrg (define_constraint "M"
     92  1.1  mrg   "Integer 1 or 2."
     93  1.1  mrg   (and (match_code "const_int")
     94  1.1  mrg        (match_test "ival == 1 || ival == 2")))
     95  1.1  mrg 
     96  1.1  mrg (define_constraint "N"
     97  1.1  mrg   "-1, -2, or -4 on the H8300H or S; -1 or -2 otherwise."
     98  1.1  mrg   (and (match_code "const_int")
     99  1.1  mrg        (if_then_else (match_test "TARGET_H8300H || TARGET_H8300S")
    100  1.1  mrg 		     (match_test "ival == -1 || ival == -2 || ival == -4")
    101  1.1  mrg 		     (match_test "ival == -1 || ival == -2"))))
    102  1.1  mrg 
    103  1.1  mrg (define_constraint "O"
    104  1.1  mrg   "Integer -1 or -2."
    105  1.1  mrg   (and (match_code "const_int")
    106  1.1  mrg        (match_test "ival == -1 || ival == -2")))
    107  1.1  mrg 
    108  1.1  mrg (define_constraint "P1>X"
    109  1.1  mrg   "A positive, non-zero integer that fits in 1 bits."
    110  1.1  mrg   (and (match_code "const_int")
    111  1.1  mrg        (match_test "TARGET_H8300SX")
    112  1.1  mrg        (match_test "IN_RANGE (ival, 1, (1 << 1) - 1)")))
    113  1.1  mrg 
    114  1.1  mrg (define_constraint "P3>X"
    115  1.1  mrg   "A positive, non-zero integer that fits in 3 bits."
    116  1.1  mrg   (and (match_code "const_int")
    117  1.1  mrg        (match_test "TARGET_H8300SX")
    118  1.1  mrg        (match_test "IN_RANGE (ival, 1, (1 << 3) - 1)")))
    119  1.1  mrg 
    120  1.1  mrg (define_constraint "P4>X"
    121  1.1  mrg   "A positive, non-zero integer that fits in 4 bits."
    122  1.1  mrg   (and (match_code "const_int")
    123  1.1  mrg        (match_test "TARGET_H8300SX")
    124  1.1  mrg        (match_test "IN_RANGE (ival, 1, (1 << 4) - 1)")))
    125  1.1  mrg 
    126  1.1  mrg (define_constraint "P5>X"
    127  1.1  mrg   "A positive, non-zero integer that fits in 5 bits."
    128  1.1  mrg   (and (match_code "const_int")
    129  1.1  mrg        (match_test "TARGET_H8300SX")
    130  1.1  mrg        (match_test "IN_RANGE (ival, 1, (1 << 5) - 1)")))
    131  1.1  mrg 
    132  1.1  mrg (define_constraint "P8>X"
    133  1.1  mrg   "A positive, non-zero integer that fits in 8 bits."
    134  1.1  mrg   (and (match_code "const_int")
    135  1.1  mrg        (match_test "TARGET_H8300SX")
    136  1.1  mrg        (match_test "IN_RANGE (ival, 1, (1 << 8) - 1)")))
    137  1.1  mrg 
    138  1.1  mrg (define_constraint "P3<X"
    139  1.1  mrg   "A negative, non-zero integer that fits in 3 bits."
    140  1.1  mrg   (and (match_code "const_int")
    141  1.1  mrg        (match_test "TARGET_H8300SX")
    142  1.1  mrg        (match_test "IN_RANGE (ival, (-(1 << 3)) + 1, -1)")))
    143  1.1  mrg 
    144  1.1  mrg ;; Floating-point constraints.
    145  1.1  mrg (define_constraint "G"
    146  1.1  mrg   "Single-float zero."
    147  1.1  mrg   (and (match_code "const_double")
    148  1.1  mrg        (match_test "op == CONST0_RTX (SFmode)")))
    149  1.1  mrg 
    150  1.1  mrg ;; Extra constraints.
    151  1.1  mrg (define_constraint "Q"
    152  1.1  mrg   "@internal"
    153  1.1  mrg   (and (match_test "TARGET_H8300SX")
    154  1.1  mrg        (match_operand 0 "memory_operand")))
    155  1.1  mrg 
    156  1.1  mrg (define_constraint "R"
    157  1.1  mrg   "@internal"
    158  1.1  mrg   (and (match_code "const_int")
    159  1.1  mrg        (match_test "!h8300_shift_needs_scratch_p (ival, QImode)")))
    160  1.1  mrg 
    161  1.1  mrg (define_constraint "S"
    162  1.1  mrg   "@internal"
    163  1.1  mrg   (and (match_code "const_int")
    164  1.1  mrg        (match_test "!h8300_shift_needs_scratch_p (ival, HImode)")))
    165  1.1  mrg 
    166  1.1  mrg (define_constraint "T"
    167  1.1  mrg   "@internal"
    168  1.1  mrg   (and (match_code "const_int")
    169  1.1  mrg        (match_test "!h8300_shift_needs_scratch_p (ival, SImode)")))
    170  1.1  mrg 
    171  1.1  mrg (define_constraint "U"
    172  1.1  mrg   "An operand valid for a bset destination."
    173  1.1  mrg   (ior (and (match_code "reg")
    174  1.1  mrg 	    (match_test "REG_OK_FOR_BASE_P (op)"))
    175  1.1  mrg        (and (match_code "mem")
    176  1.1  mrg 	    (match_code "reg" "0")
    177  1.1  mrg 	    (match_test "REG_OK_FOR_BASE_P (XEXP (op, 0))"))
    178  1.1  mrg        (and (match_code "mem")
    179  1.1  mrg 	    (match_code "symbol_ref" "0")
    180  1.1  mrg 	    (match_test "TARGET_H8300S"))
    181  1.1  mrg        (and (match_code "mem")
    182  1.1  mrg 	    (match_code "const" "0")
    183  1.1  mrg 	    (match_code "plus" "00")
    184  1.1  mrg 	    (match_code "symbol_ref" "000")
    185  1.1  mrg 	    (match_code "const_int" "001")
    186  1.1  mrg 	    (ior (match_test "TARGET_H8300S")
    187  1.1  mrg 		 (match_test "SYMBOL_REF_FLAG (XEXP (XEXP (XEXP (op, 0), 0), 0))")))
    188  1.1  mrg        (and (match_code "mem")
    189  1.1  mrg 	    (match_test "h8300_eightbit_constant_address_p (XEXP (op, 0))"))
    190  1.1  mrg        (and (match_code "mem")
    191  1.1  mrg 	    (ior (match_test "TARGET_H8300S")
    192  1.1  mrg 		 (match_test "TARGET_H8300SX"))
    193  1.1  mrg 	    (match_code "const_int" "0"))))
    194  1.1  mrg 
    195  1.1  mrg (define_memory_constraint "WU"
    196  1.1  mrg   "@internal"
    197  1.1  mrg   (and (match_code "mem")
    198  1.1  mrg        (match_test "satisfies_constraint_U (op)")))
    199  1.1  mrg 
    200  1.1  mrg (define_constraint "Y0"
    201  1.1  mrg   "@internal"
    202  1.1  mrg   (and (match_code "const_int")
    203  1.1  mrg        (match_test "exact_log2 (~ival & 0xff) != -1")))
    204  1.1  mrg 
    205  1.1  mrg (define_constraint "Y2"
    206  1.1  mrg   "@internal"
    207  1.1  mrg   (and (match_code "const_int")
    208  1.1  mrg        (match_test "exact_log2 (ival & 0xff) != -1")))
    209  1.1  mrg 
    210  1.1  mrg (define_constraint "Z"
    211  1.1  mrg   "@internal"
    212  1.1  mrg   (and (match_test "TARGET_H8300SX")
    213  1.1  mrg        (match_code "mem")
    214  1.1  mrg        (match_test "CONSTANT_P (XEXP (op, 0))")))
    215