]>
Commit | Line | Data |
---|---|---|
f6a83b4a | 1 | ;; Machine Description for TI MSP43* processors |
a5544970 | 2 | ;; Copyright (C) 2013-2019 Free Software Foundation, Inc. |
f6a83b4a DD |
3 | ;; Contributed by Red Hat. |
4 | ||
5 | ;; This file is part of GCC. | |
6 | ||
7 | ;; GCC is free software; you can redistribute it and/or modify | |
8 | ;; it under the terms of the GNU General Public License as published by | |
9 | ;; the Free Software Foundation; either version 3, or (at your option) | |
10 | ;; any later version. | |
11 | ||
12 | ;; GCC is distributed in the hope that it will be useful, | |
13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | ;; GNU General Public 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 | (define_register_constraint "R12" "R12_REGS" | |
22 | "Register R12.") | |
23 | ||
24 | (define_register_constraint "R13" "R13_REGS" | |
25 | "Register R13.") | |
26 | ||
27 | (define_constraint "K" | |
28 | "Integer constant 1." | |
29 | (and (match_code "const_int") | |
30 | (match_test "IN_RANGE (ival, 1, 1)"))) | |
31 | ||
32 | (define_constraint "L" | |
33 | "Integer constant -1^20..1^19." | |
34 | (and (match_code "const_int") | |
3ea7f8e5 | 35 | (match_test "IN_RANGE (ival, HOST_WIDE_INT_M1U << 20, 1 << 19)"))) |
f6a83b4a DD |
36 | |
37 | (define_constraint "M" | |
38 | "Integer constant 1-4." | |
39 | (and (match_code "const_int") | |
40 | (match_test "IN_RANGE (ival, 1, 4)"))) | |
41 | ||
3f02735b DD |
42 | (define_constraint "N" |
43 | "Integer constant 0-255." | |
44 | (and (match_code "const_int") | |
45 | (match_test "IN_RANGE (ival, 0, 255)"))) | |
46 | ||
47 | (define_constraint "O" | |
48 | "Integer constant 256-65535." | |
49 | (and (match_code "const_int") | |
50 | (match_test "IN_RANGE (ival, 256, 65535)"))) | |
51 | ||
f6a83b4a DD |
52 | ;; We do not allow arbitrary constants, eg symbols or labels, |
53 | ;; because their address may be above the 16-bit address limit | |
54 | ;; supported by the offset used in the MOVA instruction. | |
55 | (define_constraint "Ya" | |
56 | "Memory reference, any type, but restricted range of constants" | |
57 | (and (match_code "mem") | |
58 | (ior (match_code "reg" "0") | |
59 | (and (match_code "plus" "0") | |
60 | (match_code "reg" "00") | |
61 | (match_test ("CONST_INT_P (XEXP (XEXP (op, 0), 1))"))) | |
62 | (match_test "CONSTANT_P (XEXP (op, 0))") | |
28987d8b | 63 | (match_code "post_inc" "0") |
f6a83b4a DD |
64 | ))) |
65 | ||
66 | (define_constraint "Yl" | |
67 | "Memory reference, labels only." | |
68 | (and (match_code "mem") | |
69 | (match_code "label_ref" "0"))) | |
70 | ||
71 | ||
5cbc4e2a | 72 | ;; These are memory references that are safe to use without the X suffix, |
8682b1a5 JL |
73 | ;; because we know/assume they need not index across the 64K boundary. |
74 | ;; Note that for a PSImode memory operand, we always need to use the X suffix, | |
75 | ;; regardless of what this constraint decides. | |
f6a83b4a | 76 | (define_constraint "Ys" |
8682b1a5 | 77 | "Memory reference, indexed or indirect register addressing modes." |
f6a83b4a DD |
78 | (and (match_code "mem") |
79 | (ior | |
80 | (and (match_code "plus" "0") | |
81 | (and (match_code "reg" "00") | |
82 | (match_test ("CONST_INT_P (XEXP (XEXP (op, 0), 1))")) | |
3ea7f8e5 | 83 | (match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), HOST_WIDE_INT_M1U << 15, (1 << 15)-1)")))) |
f6a83b4a | 84 | (match_code "reg" "0") |
d8e4dc54 | 85 | (match_code "post_inc" "0") |
f6a83b4a | 86 | ))) |
fb28dac0 DD |
87 | |
88 | (define_constraint "Yc" | |
d4f283a1 | 89 | "Memory reference, for CALL - we can't use SP." |
fb28dac0 DD |
90 | (and (match_code "mem") |
91 | (match_code "mem" "0") | |
92 | (not (ior | |
93 | (and (match_code "plus" "00") | |
94 | (and (match_code "reg" "000") | |
95 | (match_test ("REGNO (XEXP (XEXP (op, 0), 0)) != SP_REGNO")))) | |
96 | (and (match_code "reg" "0") | |
97 | (match_test ("REGNO (XEXP (XEXP (op, 0), 0)) != SP_REGNO"))) | |
98 | )))) | |
99 | ||
8682b1a5 JL |
100 | (define_constraint "Yx" |
101 | "Memory reference, in lower memory below address 0x10000." | |
102 | (and (match_code "mem") | |
103 | (match_test "msp430_op_not_in_high_mem (op)"))) |