xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/rl78/constraints.md (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1;;  Machine Description for Renesas RL78 processors
2;;  Copyright (C) 2011-2020 Free Software Foundation, Inc.
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; Constraints in use:
22
23; core:
24; V X g i m n o p r s < >
25; 0..9
26; I..Q - integers
27;   Int8 = 0..255
28;   Int3 = 1..7
29;   J = -255..0
30;   K = 1
31;   L = -1
32;   M = 0
33;   N = 2
34;   O = -2
35;   P = 1..15
36
37; E..H - float constants
38
39; RL78-specific
40; a x b c d e h l w - 8-bit regs
41; A B D T S - 16-bit regs
42; R = all regular registers (A-L)
43; Y - any valid memory
44; Wxx - various memory addressing modes
45; Qxx - conditionals
46; U = usual memory references mov-able to/from AX
47; v = virtual registers
48; Zxx = specific virtual registers
49
50(define_constraint "Int8"
51  "Integer constant in the range 0 @dots{} 255."
52  (and (match_code "const_int")
53       (match_test "IN_RANGE (ival, 0, 255)")))
54
55(define_constraint "Int3"
56  "Integer constant in the range 1 @dots{} 7."
57  (and (match_code "const_int")
58       (match_test "IN_RANGE (ival, 1, 7)")))
59
60(define_constraint "Iv08"
61  "@internal
62   Integer constant equal to 8."
63  (and (match_code "const_int")
64       (match_test "IN_RANGE (ival, 8, 8)")))
65
66(define_constraint "Iv16"
67  "@internal
68   Integer constant equal to 16."
69  (and (match_code "const_int")
70       (match_test "IN_RANGE (ival, 16, 16)")))
71
72(define_constraint "Iv24"
73  "@internal
74   Integer constant equal to 24."
75  (and (match_code "const_int")
76       (match_test "IN_RANGE (ival, 24, 24)")))
77
78(define_constraint "Is09"
79  "@internal
80   Integer constant in the range 9 @dots{} 15 (for shifts)."
81  (and (match_code "const_int")
82       (match_test "IN_RANGE (ival, 9, 15)")))
83
84(define_constraint "Is17"
85  "@internal
86   Integer constant in the range 17 @dots{} 23 (for shifts)."
87  (and (match_code "const_int")
88       (match_test "IN_RANGE (ival, 17, 23)")))
89
90(define_constraint "Is25"
91  "@internal
92   Integer constant in the range 25 @dots{} 31 (for shifts)."
93  (and (match_code "const_int")
94       (match_test "IN_RANGE (ival, 25, 31)")))
95
96(define_constraint "ISsi"
97  "@internal
98   Integer constant with bit 31 set."
99  (and (match_code "const_int")
100       (match_test "(ival & 0x80000000) != 0")))
101
102(define_constraint "IShi"
103  "@internal
104   Integer constant with bit 15 set."
105  (and (match_code "const_int")
106       (match_test "(ival & 0x8000) != 0")))
107
108(define_constraint "ISqi"
109  "@internal
110   Integer constant with bit 7 set."
111  (and (match_code "const_int")
112       (match_test "(ival & 0x80) != 0")))
113
114(define_constraint "Ibqi"
115  "@internal
116   Integer constant with one bit in 0..7 set."
117  (and (match_code "const_int")
118       (match_test "(ival & 0xff) && (exact_log2 (ival & 0xff) >= 0)")))
119(define_constraint "IBqi"
120  "@internal
121   Integer constant with one bit in 0..7 clear."
122  (and (match_code "const_int")
123       (match_test "(~ival & 0xff) && (exact_log2 (~ival & 0xff) >= 0)")))
124
125(define_constraint "J"
126  "Integer constant in the range -255 @dots{} 0"
127  (and (match_code "const_int")
128       (match_test "IN_RANGE (ival, -255, 0)")))
129
130(define_constraint "K"
131  "Integer constant 1."
132  (and (match_code "const_int")
133       (match_test "IN_RANGE (ival, 1, 1)")))
134
135(define_constraint "L"
136  "Integer constant -1."
137  (and (match_code "const_int")
138       (match_test "IN_RANGE (ival, -1, -1)")))
139
140(define_constraint "M"
141  "Integer constant 0."
142  (and (match_code "const_int")
143       (match_test "IN_RANGE (ival, 0, 0)")))
144
145(define_constraint "N"
146  "Integer constant 2."
147  (and (match_code "const_int")
148       (match_test "IN_RANGE (ival, 2, 2)")))
149
150(define_constraint "O"
151  "Integer constant -2."
152  (and (match_code "const_int")
153       (match_test "IN_RANGE (ival, -2, -2)")))
154
155(define_constraint "P"
156  "Integer constant 1..15"
157  (and (match_code "const_int")
158       (match_test "IN_RANGE (ival, 1, 15)")))
159
160(define_register_constraint "R" "QI_REGS"
161 "@code{A} through @code{L} registers.")
162
163(define_register_constraint "a" "AREG"
164 "The @code{A} register.")
165
166(define_register_constraint "x" "XREG"
167 "The @code{X} register.")
168
169(define_register_constraint "b" "BREG"
170 "The @code{B} register.")
171
172(define_register_constraint "c" "CREG"
173 "The @code{C} register.")
174
175(define_register_constraint "d" "DREG"
176 "The @code{D} register.")
177
178(define_register_constraint "e" "EREG"
179 "The @code{E} register.")
180
181(define_register_constraint "h" "HREG"
182 "The @code{H} register.")
183
184(define_register_constraint "l" "LREG"
185 "The @code{L} register.")
186
187(define_register_constraint "w" "PSWREG"
188 "The @code{PSW} register.")
189
190(define_register_constraint "A" "AXREG"
191 "The @code{AX} register.")
192
193(define_register_constraint "B" "BCREG"
194 "The @code{BC} register.")
195
196(define_register_constraint "D" "DEREG"
197 "The @code{DE} register.")
198
199; because H + L = T, assuming A=1.
200(define_register_constraint "T" "HLREG"
201 "The @code{HL} register.")
202
203(define_register_constraint "S" "SPREG"
204 "The @code{SP} register.")
205
206(define_register_constraint "v" "V_REGS"
207 "The virtual registers.")
208
209(define_register_constraint "Z08W" "R8W_REGS"
210 "The R8 register, HImode.")
211
212(define_register_constraint "Z10W" "R10W_REGS"
213 "The R10 register, HImode.")
214
215(define_register_constraint "Zint" "INT_REGS"
216 "The interrupt registers.")
217
218; All the memory addressing schemes the RL78 supports
219; of the form W {register} {bytes of offset}
220;          or W {register} {register}
221; Additionally, the Cxx forms are the same as the Wxx forms, but without
222; the ES: override.
223
224; absolute address
225(define_memory_constraint "Cab"
226  "[addr]"
227  (and (match_code "mem")
228       (ior (match_test "CONSTANT_P (XEXP (op, 0))")
229	    (match_test "GET_CODE (XEXP (op, 0)) == PLUS && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF"))
230	    )
231  )
232(define_memory_constraint "Wab"
233  "es:[addr]"
234  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cab (rl78_es_base (op)))
235               || satisfies_constraint_Cab (op)")
236  )
237
238(define_memory_constraint "Cbc"
239  "word16[BC]"
240  (and (match_code "mem")
241       (ior
242	(and (match_code "reg" "0")
243	     (match_test "REGNO (XEXP (op, 0)) == BC_REG"))
244	(and (match_code "plus" "0")
245	     (and (and (match_code "reg" "00")
246		       (match_test "REGNO (XEXP (XEXP (op, 0), 0)) == BC_REG"))
247		       (match_test "uword_operand (XEXP (XEXP (op, 0), 1), VOIDmode)"))))
248       )
249  )
250(define_memory_constraint "Wbc"
251  "es:word16[BC]"
252  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cbc (rl78_es_base (op)))
253               || satisfies_constraint_Cbc (op)")
254  )
255
256(define_memory_constraint "Cde"
257  "[DE]"
258  (and (match_code "mem")
259       (and (match_code "reg" "0")
260	    (match_test "REGNO (XEXP (op, 0)) == DE_REG")))
261  )
262(define_memory_constraint "Wde"
263  "es:[DE]"
264  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cde (rl78_es_base (op)))
265               || satisfies_constraint_Cde (op)")
266  )
267
268(define_memory_constraint "Cca"
269  "[AX..HL] for calls"
270  (and (match_code "mem")
271       (and (match_code "reg" "0")
272	    (match_test "REGNO (XEXP (op, 0)) <= HL_REG")))
273  )
274(define_memory_constraint "Wca"
275  "es:[AX..HL] for calls"
276  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cca (rl78_es_base (op)))
277               || satisfies_constraint_Cca (op)")
278  )
279
280(define_memory_constraint "Ccv"
281  "[AX..HL,r8-r31] for calls"
282  (and (match_code "mem")
283       (and (match_code "reg" "0")
284	    (match_test "REGNO (XEXP (op, 0)) < 32")))
285  )
286(define_memory_constraint "Wcv"
287  "es:[AX..HL,r8-r31] for calls"
288  (match_test "(rl78_es_addr (op) && satisfies_constraint_Ccv (rl78_es_base (op)))
289               || satisfies_constraint_Ccv (op)")
290  )
291
292(define_memory_constraint "Cd2"
293  "word16[DE]"
294  (and (match_code "mem")
295       (ior
296	(and (match_code "reg" "0")
297	     (match_test "REGNO (XEXP (op, 0)) == DE_REG"))
298	(and (match_code "plus" "0")
299	     (and (and (match_code "reg" "00")
300		       (match_test "REGNO (XEXP (XEXP (op, 0), 0)) == DE_REG"))
301		       (match_test "uword_operand (XEXP (XEXP (op, 0), 1), VOIDmode)"))))
302       )
303  )
304(define_memory_constraint "Wd2"
305  "es:word16[DE]"
306  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cd2 (rl78_es_base (op)))
307               || satisfies_constraint_Cd2 (op)")
308  )
309
310(define_memory_constraint "Chl"
311  "[HL]"
312  (and (match_code "mem")
313       (and (match_code "reg" "0")
314	    (match_test "REGNO (XEXP (op, 0)) == HL_REG")))
315  )
316(define_memory_constraint "Whl"
317  "es:[HL]"
318  (match_test "(rl78_es_addr (op) && satisfies_constraint_Chl (rl78_es_base (op)))
319               || satisfies_constraint_Chl (op)")
320  )
321
322(define_memory_constraint "Ch1"
323  "byte8[HL]"
324  (and (match_code "mem")
325       (and (match_code "plus" "0")
326	    (and (and (match_code "reg" "00")
327		      (match_test "REGNO (XEXP (XEXP (op, 0), 0)) == HL_REG"))
328		      (match_test "ubyte_operand (XEXP (XEXP (op, 0), 1), VOIDmode)"))))
329  )
330(define_memory_constraint "Wh1"
331  "es:byte8[HL]"
332  (match_test "(rl78_es_addr (op) && satisfies_constraint_Ch1 (rl78_es_base (op)))
333               || satisfies_constraint_Ch1 (op)")
334  )
335
336(define_memory_constraint "Chb"
337  "[HL+B]"
338  (and (match_code "mem")
339       (match_test "rl78_hl_b_c_addr_p (XEXP (op, 0))"))
340  )
341(define_memory_constraint "Whb"
342  "es:[HL+B]"
343  (match_test "(rl78_es_addr (op) && satisfies_constraint_Chb (rl78_es_base (op)))
344               || satisfies_constraint_Chb (op)")
345  )
346
347(define_memory_constraint "Cs1"
348  "word8[SP]"
349  (and (match_code "mem")
350       (ior
351	(and (match_code "reg" "0")
352	     (match_test "REGNO (XEXP (op, 0)) == SP_REG"))
353	(and (match_code "plus" "0")
354	     (and (and (match_code "reg" "00")
355		       (match_test "REGNO (XEXP (XEXP (op, 0), 0)) == SP_REG"))
356		       (and (match_code "const_int" "01")
357		            (match_test "IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), 0, 256 - GET_MODE_SIZE (GET_MODE (op)))")))))
358       )
359  )
360
361(define_memory_constraint "Ws1"
362  "es:word8[SP]"
363  (match_test "(rl78_es_addr (op) && satisfies_constraint_Cs1 (rl78_es_base (op)))
364               || satisfies_constraint_Cs1 (op)")
365  )
366
367(define_constraint "Wfr"
368  "ES/CS far pointer"
369  (and (match_code "mem")
370       (match_test "rl78_far_p (op)"))
371  )
372
373(define_memory_constraint "Wsa"
374  "any SADDR memory access"
375  (and (match_code "mem")
376       (match_test "rl78_saddr_p (op)"))
377)
378
379(define_memory_constraint "Wsf"
380  "any SFR memory access"
381  (and (match_code "mem")
382       (match_test "rl78_sfr_p (op)"))
383)
384
385(define_memory_constraint "Y"
386  "any near legitimate memory access"
387  (and (match_code "mem")
388       (match_test "!rl78_far_p (op) && rl78_as_legitimate_address (VOIDmode, XEXP (op, 0), true, ADDR_SPACE_GENERIC)"))
389)
390
391(define_memory_constraint "U"
392  "memory references valid with mov to/from a/ax"
393  (and (match_code "mem")
394       (match_test "rl78_virt_insns_ok ()
395|| satisfies_constraint_Wab (op)
396|| satisfies_constraint_Wbc (op)
397|| satisfies_constraint_Wde (op)
398|| satisfies_constraint_Wd2 (op)
399|| satisfies_constraint_Whl (op)
400|| satisfies_constraint_Wh1 (op)
401|| satisfies_constraint_Whb (op)
402|| satisfies_constraint_Ws1 (op)
403|| satisfies_constraint_Wfr (op) ")))
404
405(define_memory_constraint "Qbi"
406  "built-in compare types"
407  (match_code "eq,ne,gtu,ltu,geu,leu"))
408
409(define_memory_constraint "Qsc"
410  "synthetic compares"
411  (match_code "gt,lt,ge,le"))
412
413(define_constraint "Qs8"
414  "Integer constant computed from (SUBREG (SYMREF))."
415  (and (match_code "subreg")
416       (match_test "GET_CODE (XEXP (op, 0)) == SYMBOL_REF"))
417)
418