comparison gcc/config/v850/predicates.md @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children f6334be47118
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
1 ;; Predicate definitions for NEC V850.
2 ;; Copyright (C) 2005, 2007 Free Software Foundation, Inc.
3 ;;
4 ;; This file is part of GCC.
5 ;;
6 ;; GCC is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 3, or (at your option)
9 ;; any later version.
10 ;;
11 ;; GCC is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;; GNU General Public License for more details.
15 ;;
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3. If not see
18 ;; <http://www.gnu.org/licenses/>.
19
20 ;; Return true if OP is either a register or 0.
21
22 (define_predicate "reg_or_0_operand"
23 (match_code "reg,subreg,const_int,const_double")
24 {
25 if (GET_CODE (op) == CONST_INT)
26 return INTVAL (op) == 0;
27
28 else if (GET_CODE (op) == CONST_DOUBLE)
29 return CONST_DOUBLE_OK_FOR_G (op);
30
31 else
32 return register_operand (op, mode);
33 })
34
35 ;; Return true if OP is either a register or a signed five bit
36 ;; integer.
37
38 (define_predicate "reg_or_int5_operand"
39 (match_code "reg,subreg,const_int")
40 {
41 if (GET_CODE (op) == CONST_INT)
42 return CONST_OK_FOR_J (INTVAL (op));
43
44 else
45 return register_operand (op, mode);
46 })
47
48 ;; Return true if OP is either a register or a signed nine bit
49 ;; integer.
50
51 (define_predicate "reg_or_int9_operand"
52 (match_code "reg,subreg,const_int")
53 {
54 if (GET_CODE (op) == CONST_INT)
55 return CONST_OK_FOR_O (INTVAL (op));
56
57 return register_operand (op, mode);
58 })
59
60 ;; Return true if OP is either a register or a const integer.
61
62 (define_predicate "reg_or_const_operand"
63 (match_code "reg,const_int")
64 {
65 if (GET_CODE (op) == CONST_INT)
66 return TRUE;
67
68 return register_operand (op, mode);
69 })
70
71 ;; Return true if OP is a valid call operand.
72
73 (define_predicate "call_address_operand"
74 (match_code "reg,symbol_ref")
75 {
76 /* Only registers are valid call operands if TARGET_LONG_CALLS. */
77 if (TARGET_LONG_CALLS)
78 return GET_CODE (op) == REG;
79 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == REG);
80 })
81
82 ;; TODO: Add a comment here.
83
84 (define_predicate "movsi_source_operand"
85 (match_code "label_ref,symbol_ref,const_int,const_double,const,high,mem,reg,subreg")
86 {
87 /* Some constants, as well as symbolic operands
88 must be done with HIGH & LO_SUM patterns. */
89 if (CONSTANT_P (op)
90 && GET_CODE (op) != HIGH
91 && !(GET_CODE (op) == CONST_INT
92 && (CONST_OK_FOR_J (INTVAL (op))
93 || CONST_OK_FOR_K (INTVAL (op))
94 || CONST_OK_FOR_L (INTVAL (op)))))
95 return special_symbolref_operand (op, mode);
96 else
97 return general_operand (op, mode);
98 })
99
100 ;; TODO: Add a comment here.
101
102 (define_predicate "special_symbolref_operand"
103 (match_code "symbol_ref")
104 {
105 if (GET_CODE (op) == CONST
106 && GET_CODE (XEXP (op, 0)) == PLUS
107 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
108 && CONST_OK_FOR_K (INTVAL (XEXP (XEXP (op, 0), 1))))
109 op = XEXP (XEXP (op, 0), 0);
110
111 if (GET_CODE (op) == SYMBOL_REF)
112 return (SYMBOL_REF_FLAGS (op)
113 & (SYMBOL_FLAG_ZDA | SYMBOL_FLAG_TDA | SYMBOL_FLAG_SDA)) != 0;
114
115 return FALSE;
116 })
117
118 ;; TODO: Add a comment here.
119
120 (define_predicate "power_of_two_operand"
121 (match_code "const_int")
122 {
123 if (GET_CODE (op) != CONST_INT)
124 return 0;
125
126 if (exact_log2 (INTVAL (op)) == -1)
127 return 0;
128 return 1;
129 })
130
131 ;; Return nonzero if the given RTX is suitable for collapsing into a
132 ;; jump to a function prologue.
133
134 (define_predicate "pattern_is_ok_for_prologue"
135 (match_code "parallel")
136 {
137 int count = XVECLEN (op, 0);
138 int i;
139 rtx vector_element;
140
141 /* If there are no registers to save then the function prologue
142 is not suitable. */
143 if (count <= 2)
144 return 0;
145
146 /* The pattern matching has already established that we are adjusting the
147 stack and pushing at least one register. We must now check that the
148 remaining entries in the vector to make sure that they are also register
149 pushes, except for the last entry which should be a CLOBBER of r10.
150
151 The test below performs the C equivalent of this machine description
152 pattern match:
153
154 (set (mem:SI (plus:SI (reg:SI 3)
155 (match_operand:SI 2 "immediate_operand" "i")))
156 (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
157
158 */
159
160 for (i = 2; i < count - (TARGET_LONG_CALLS ? 2: 1); i++)
161 {
162 rtx dest;
163 rtx src;
164 rtx plus;
165
166 vector_element = XVECEXP (op, 0, i);
167
168 if (GET_CODE (vector_element) != SET)
169 return 0;
170
171 dest = SET_DEST (vector_element);
172 src = SET_SRC (vector_element);
173
174 if (GET_CODE (dest) != MEM
175 || GET_MODE (dest) != SImode
176 || GET_CODE (src) != REG
177 || GET_MODE (src) != SImode
178 || ! register_is_ok_for_epilogue (src, SImode))
179 return 0;
180
181 plus = XEXP (dest, 0);
182
183 if ( GET_CODE (plus) != PLUS
184 || GET_CODE (XEXP (plus, 0)) != REG
185 || GET_MODE (XEXP (plus, 0)) != SImode
186 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
187 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
188 return 0;
189
190 /* If the register is being pushed somewhere other than the stack
191 space just acquired by the first operand then abandon this quest.
192 Note: the test is <= because both values are negative. */
193 if (INTVAL (XEXP (plus, 1))
194 <= INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
195 {
196 return 0;
197 }
198 }
199
200 /* Make sure that the last entries in the vector are clobbers. */
201 for (; i < count; i++)
202 {
203 vector_element = XVECEXP (op, 0, i);
204
205 if (GET_CODE (vector_element) != CLOBBER
206 || GET_CODE (XEXP (vector_element, 0)) != REG
207 || !(REGNO (XEXP (vector_element, 0)) == 10
208 || (TARGET_LONG_CALLS ? (REGNO (XEXP (vector_element, 0)) == 11) : 0 )))
209 return 0;
210 }
211
212 return 1;
213 })
214
215 ;; Return nonzero if the given RTX is suitable for collapsing into
216 ;; jump to a function epilogue.
217
218 (define_predicate "pattern_is_ok_for_epilogue"
219 (match_code "parallel")
220 {
221 int count = XVECLEN (op, 0);
222 int i;
223
224 /* If there are no registers to restore then the function epilogue
225 is not suitable. */
226 if (count <= 2)
227 return 0;
228
229 /* The pattern matching has already established that we are performing a
230 function epilogue and that we are popping at least one register. We must
231 now check the remaining entries in the vector to make sure that they are
232 also register pops. There is no good reason why there should ever be
233 anything else in this vector, but being paranoid always helps...
234
235 The test below performs the C equivalent of this machine description
236 pattern match:
237
238 (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
239 (mem:SI (plus:SI (reg:SI 3) (match_operand:SI n "immediate_operand" "i"))))
240 */
241
242 for (i = 3; i < count; i++)
243 {
244 rtx vector_element = XVECEXP (op, 0, i);
245 rtx dest;
246 rtx src;
247 rtx plus;
248
249 if (GET_CODE (vector_element) != SET)
250 return 0;
251
252 dest = SET_DEST (vector_element);
253 src = SET_SRC (vector_element);
254
255 if (GET_CODE (dest) != REG
256 || GET_MODE (dest) != SImode
257 || ! register_is_ok_for_epilogue (dest, SImode)
258 || GET_CODE (src) != MEM
259 || GET_MODE (src) != SImode)
260 return 0;
261
262 plus = XEXP (src, 0);
263
264 if (GET_CODE (plus) != PLUS
265 || GET_CODE (XEXP (plus, 0)) != REG
266 || GET_MODE (XEXP (plus, 0)) != SImode
267 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
268 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
269 return 0;
270 }
271
272 return 1;
273 })
274
275 ;; Return true if the given RTX is a register which can be restored by
276 ;; a function epilogue.
277
278 (define_predicate "register_is_ok_for_epilogue"
279 (match_code "reg")
280 {
281 /* The save/restore routines can only cope with registers 20 - 31. */
282 return ((GET_CODE (op) == REG)
283 && (((REGNO (op) >= 20) && REGNO (op) <= 31)));
284 })
285
286 ;; Return nonzero if the given RTX is suitable for collapsing into a
287 ;; DISPOSE instruction.
288
289 (define_predicate "pattern_is_ok_for_dispose"
290 (match_code "parallel")
291 {
292 int count = XVECLEN (op, 0);
293 int i;
294
295 /* If there are no registers to restore then
296 the dispose instruction is not suitable. */
297 if (count <= 2)
298 return 0;
299
300 /* The pattern matching has already established that we are performing a
301 function epilogue and that we are popping at least one register. We must
302 now check the remaining entries in the vector to make sure that they are
303 also register pops. There is no good reason why there should ever be
304 anything else in this vector, but being paranoid always helps...
305
306 The test below performs the C equivalent of this machine description
307 pattern match:
308
309 (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
310 (mem:SI (plus:SI (reg:SI 3)
311 (match_operand:SI n "immediate_operand" "i"))))
312 */
313
314 for (i = 3; i < count; i++)
315 {
316 rtx vector_element = XVECEXP (op, 0, i);
317 rtx dest;
318 rtx src;
319 rtx plus;
320
321 if (GET_CODE (vector_element) != SET)
322 return 0;
323
324 dest = SET_DEST (vector_element);
325 src = SET_SRC (vector_element);
326
327 if ( GET_CODE (dest) != REG
328 || GET_MODE (dest) != SImode
329 || ! register_is_ok_for_epilogue (dest, SImode)
330 || GET_CODE (src) != MEM
331 || GET_MODE (src) != SImode)
332 return 0;
333
334 plus = XEXP (src, 0);
335
336 if ( GET_CODE (plus) != PLUS
337 || GET_CODE (XEXP (plus, 0)) != REG
338 || GET_MODE (XEXP (plus, 0)) != SImode
339 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
340 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
341 return 0;
342 }
343
344 return 1;
345 })
346
347 ;; Return nonzero if the given RTX is suitable for collapsing into a
348 ;; PREPARE instruction.
349
350 (define_predicate "pattern_is_ok_for_prepare"
351 (match_code "parallel")
352 {
353 int count = XVECLEN (op, 0);
354 int i;
355
356 /* If there are no registers to restore then the prepare instruction
357 is not suitable. */
358 if (count <= 1)
359 return 0;
360
361 /* The pattern matching has already established that we are adjusting the
362 stack and pushing at least one register. We must now check that the
363 remaining entries in the vector to make sure that they are also register
364 pushes.
365
366 The test below performs the C equivalent of this machine description
367 pattern match:
368
369 (set (mem:SI (plus:SI (reg:SI 3)
370 (match_operand:SI 2 "immediate_operand" "i")))
371 (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
372
373 */
374
375 for (i = 2; i < count; i++)
376 {
377 rtx vector_element = XVECEXP (op, 0, i);
378 rtx dest;
379 rtx src;
380 rtx plus;
381
382 if (GET_CODE (vector_element) != SET)
383 return 0;
384
385 dest = SET_DEST (vector_element);
386 src = SET_SRC (vector_element);
387
388 if ( GET_CODE (dest) != MEM
389 || GET_MODE (dest) != SImode
390 || GET_CODE (src) != REG
391 || GET_MODE (src) != SImode
392 || ! register_is_ok_for_epilogue (src, SImode)
393 )
394 return 0;
395
396 plus = XEXP (dest, 0);
397
398 if ( GET_CODE (plus) != PLUS
399 || GET_CODE (XEXP (plus, 0)) != REG
400 || GET_MODE (XEXP (plus, 0)) != SImode
401 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
402 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
403 return 0;
404
405 /* If the register is being pushed somewhere other than the stack
406 space just acquired by the first operand then abandon this quest.
407 Note: the test is <= because both values are negative. */
408 if (INTVAL (XEXP (plus, 1))
409 <= INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
410 return 0;
411 }
412
413 return 1;
414 })
415
416 ;; TODO: Add a comment here.
417
418 (define_predicate "not_power_of_two_operand"
419 (match_code "const_int")
420 {
421 unsigned int mask;
422
423 if (mode == QImode)
424 mask = 0xff;
425 else if (mode == HImode)
426 mask = 0xffff;
427 else if (mode == SImode)
428 mask = 0xffffffff;
429 else
430 return 0;
431
432 if (GET_CODE (op) != CONST_INT)
433 return 0;
434
435 if (exact_log2 (~INTVAL (op) & mask) == -1)
436 return 0;
437 return 1;
438 })