Home | History | Annotate | Line # | Download | only in h8300
constraints.md revision 1.1.1.3
      1      1.1  mrg ;; Constraint definitions for Renesas H8/300.
      2  1.1.1.3  mrg ;; Copyright (C) 2011-2016 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.1.3  mrg ;;   - we would like 'D' to 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.1.2  mrg 	    (match_test "(reload_in_progress || reload_completed)
    175  1.1.1.2  mrg 			 ? REG_OK_FOR_BASE_STRICT_P (op)
    176  1.1.1.2  mrg 			 : REG_OK_FOR_BASE_P (op)"))
    177      1.1  mrg        (and (match_code "mem")
    178      1.1  mrg 	    (match_code "reg" "0")
    179  1.1.1.2  mrg 	    (match_test "(reload_in_progress || reload_completed)
    180  1.1.1.2  mrg 			 ? REG_OK_FOR_BASE_STRICT_P (XEXP (op, 0))
    181  1.1.1.2  mrg 			 : REG_OK_FOR_BASE_P (XEXP (op, 0))"))
    182      1.1  mrg        (and (match_code "mem")
    183      1.1  mrg 	    (match_code "symbol_ref" "0")
    184      1.1  mrg 	    (match_test "TARGET_H8300S"))
    185      1.1  mrg        (and (match_code "mem")
    186      1.1  mrg 	    (match_code "const" "0")
    187      1.1  mrg 	    (match_code "plus" "00")
    188      1.1  mrg 	    (match_code "symbol_ref" "000")
    189      1.1  mrg 	    (match_code "const_int" "001")
    190      1.1  mrg 	    (ior (match_test "TARGET_H8300S")
    191  1.1.1.2  mrg 		 (match_test "(SYMBOL_REF_FLAGS (XEXP (XEXP (XEXP (op, 0), 0), 0)) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0")))
    192      1.1  mrg        (and (match_code "mem")
    193      1.1  mrg 	    (match_test "h8300_eightbit_constant_address_p (XEXP (op, 0))"))
    194      1.1  mrg        (and (match_code "mem")
    195      1.1  mrg 	    (ior (match_test "TARGET_H8300S")
    196      1.1  mrg 		 (match_test "TARGET_H8300SX"))
    197      1.1  mrg 	    (match_code "const_int" "0"))))
    198      1.1  mrg 
    199      1.1  mrg (define_memory_constraint "WU"
    200      1.1  mrg   "@internal"
    201      1.1  mrg   (and (match_code "mem")
    202      1.1  mrg        (match_test "satisfies_constraint_U (op)")))
    203      1.1  mrg 
    204      1.1  mrg (define_constraint "Y0"
    205      1.1  mrg   "@internal"
    206      1.1  mrg   (and (match_code "const_int")
    207      1.1  mrg        (match_test "exact_log2 (~ival & 0xff) != -1")))
    208      1.1  mrg 
    209      1.1  mrg (define_constraint "Y2"
    210      1.1  mrg   "@internal"
    211      1.1  mrg   (and (match_code "const_int")
    212      1.1  mrg        (match_test "exact_log2 (ival & 0xff) != -1")))
    213      1.1  mrg 
    214      1.1  mrg (define_constraint "Z"
    215      1.1  mrg   "@internal"
    216      1.1  mrg   (and (match_test "TARGET_H8300SX")
    217      1.1  mrg        (match_code "mem")
    218      1.1  mrg        (match_test "CONSTANT_P (XEXP (op, 0))")))
    219