]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/ft32/constraints.md
FT32 target added. Approved by Jeff Law [law@redhat.com]
[thirdparty/gcc.git] / gcc / config / ft32 / constraints.md
1 ;; Constraint definitions for FT32
2 ;; Copyright (C) 2015 Free Software Foundation, Inc.
3 ;; Contributed by FTDI <support@ftdi.com>
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 ;; -------------------------------------------------------------------------
22 ;; Constraints
23 ;; -------------------------------------------------------------------------
24
25 (define_memory_constraint "A"
26 "An absolute address."
27 (and (match_code "mem")
28 (match_test "(!ft32_is_mem_pm(op))")
29 (ior (match_test "GET_CODE (XEXP (op, 0)) == SYMBOL_REF")
30 (match_test "GET_CODE (XEXP (op, 0)) == LABEL_REF")
31 (match_test "GET_CODE (XEXP (op, 0)) == CONST_INT")
32 (and (match_test "(GET_CODE (XEXP (op, 0)) == PLUS)")
33 (ior (match_test "GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF")
34 (match_test "GET_CODE (XEXP (XEXP (op, 0), 0)) == LABEL_REF")
35 (match_test "GET_CODE (XEXP (XEXP (op, 0), 0)) == CONST_INT"))
36 (ior (match_test "GET_CODE (XEXP (XEXP (op, 0), 1)) == SYMBOL_REF")
37 (match_test "GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF")
38 (match_test "GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT"))))))
39
40 (define_memory_constraint "B"
41 "An offset address."
42 (and (match_code "mem")
43 (match_test "(!ft32_is_mem_pm(op))")
44 (match_test "(GET_CODE (XEXP (op, 0)) == PLUS)")))
45
46 (define_memory_constraint "W"
47 "A register indirect memory operand."
48 (and (match_code "mem")
49 (match_test "!ft32_is_mem_pm(op)
50 && REG_P (XEXP (op, 0))
51 && REGNO_OK_FOR_BASE_P (REGNO (XEXP (op, 0)))")))
52
53 (define_memory_constraint "e"
54 "An offset address."
55 (and (match_code "mem")
56 (match_test "ft32_is_mem_pm(op) && (
57 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF) ||
58 (GET_CODE (XEXP (op, 0)) == LABEL_REF) ||
59 (GET_CODE (XEXP (op, 0)) == CONST_INT) ||
60 (GET_CODE (XEXP (op, 0)) == CONST))"
61 )))
62
63 (define_memory_constraint "f"
64 "An offset address."
65 (and (match_code "mem")
66 (match_test "ft32_is_mem_pm(op) && (
67 ((GET_CODE (XEXP (op, 0)) == PLUS)) ||
68 (GET_CODE (XEXP (op, 0)) == REG))"
69 )))
70
71 (define_constraint "O"
72 "The constant zero or one"
73 (and (match_code "const_int")
74 (match_test "((ival == 0) || (ival == 1))")))
75
76 (define_constraint "I"
77 "A 16-bit signed constant (-32768..32767)"
78 (and (match_code "const_int")
79 (match_test "ival >= -32768 && ival <= 32767")))
80
81 (define_constraint "w"
82 "A bitfield mask suitable for bext or bins"
83 (and (match_code "const_int")
84 (match_test "ft32_as_bitfield(ival) != -1")))
85
86 (define_constraint "x"
87 "An inverted bitfield mask suitable for bext or bins"
88 (and (match_code "const_int")
89 (match_test "ft32_as_bitfield(0xffffffff ^ ival) != -1")))
90
91 (define_constraint "L"
92 "A 16-bit unsigned constant, multiple of 4 (-65532..0)"
93 (and (match_code "const_int")
94 (match_test "-65532 <= ival && ival <= 0 && (ival & 3) == 0")))
95
96 (define_constraint "S"
97 "A 20-bit signed constant (-524288..524287)"
98 (ior
99 (and (match_code "const_int")
100 (match_test "ival >= -524288 && ival <= 524287"))
101 (match_test "GET_CODE (op) == LABEL_REF")
102 (match_test "GET_CODE (op) == SYMBOL_REF")
103 (match_test "GET_CODE (op) == CONST")))
104
105 (define_constraint "b"
106 "A constant for a bitfield width (1..16)"
107 (and (match_code "const_int")
108 (match_test "1 <= ival && ival <= 16")))
109
110 (define_constraint "KA"
111 "A 10-bit signed constant (-512..511)"
112 (and (match_code "const_int")
113 (match_test "-512 <= ival && ival <= 511")))