OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.2.2/] [gcc/] [config/] [pa/] [predicates.md] - Blame information for rev 455

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
;; Predicate definitions for HP PA-RISC.
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
;; .
19
 
20
;; Return nonzero only if OP is a register of mode MODE, or
21
;; CONST0_RTX.
22
 
23
(define_predicate "reg_or_0_operand"
24
  (match_code "subreg,reg,const_int,const_double")
25
{
26
  return (op == CONST0_RTX (mode) || register_operand (op, mode));
27
})
28
 
29
;; Return nonzero if OP is suitable for use in a call to a named
30
;; function.
31
;;
32
;; For 2.5 try to eliminate either call_operand_address or
33
;; function_label_operand, they perform very similar functions.
34
 
35
(define_predicate "call_operand_address"
36
  (match_code "label_ref,symbol_ref,const_int,const_double,const,high")
37
{
38
  return (GET_MODE (op) == word_mode
39
          && CONSTANT_P (op) && ! TARGET_PORTABLE_RUNTIME);
40
})
41
 
42
;; Return 1 iff OP is an indexed memory operand.
43
 
44
(define_predicate "indexed_memory_operand"
45
  (match_code "subreg,mem")
46
{
47
  if (GET_MODE (op) != mode)
48
    return 0;
49
 
50
  /* Before reload, a (SUBREG (MEM...)) forces reloading into a register.  */
51
  if (reload_completed && GET_CODE (op) == SUBREG)
52
    op = SUBREG_REG (op);
53
 
54
  if (GET_CODE (op) != MEM || symbolic_memory_operand (op, mode))
55
    return 0;
56
 
57
  op = XEXP (op, 0);
58
 
59
  return (memory_address_p (mode, op) && IS_INDEX_ADDR_P (op));
60
})
61
 
62
;; Return 1 iff OP is a symbolic operand.
63
;; Note: an inline copy of this code is present in pa_secondary_reload.
64
 
65
(define_predicate "symbolic_operand"
66
  (match_code "symbol_ref,label_ref,const")
67
{
68
  switch (GET_CODE (op))
69
    {
70
    case SYMBOL_REF:
71
      return !SYMBOL_REF_TLS_MODEL (op);
72
    case LABEL_REF:
73
      return 1;
74
    case CONST:
75
      op = XEXP (op, 0);
76
      return (((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
77
                && !SYMBOL_REF_TLS_MODEL (XEXP (op, 0)))
78
               || GET_CODE (XEXP (op, 0)) == LABEL_REF)
79
              && GET_CODE (XEXP (op, 1)) == CONST_INT);
80
    default:
81
      return 0;
82
    }
83
})
84
 
85
;; Return truth value of statement that OP is a symbolic memory
86
;; operand of mode MODE.
87
 
88
(define_predicate "symbolic_memory_operand"
89
  (match_code "subreg,mem")
90
{
91
  if (GET_CODE (op) == SUBREG)
92
    op = SUBREG_REG (op);
93
  if (GET_CODE (op) != MEM)
94
    return 0;
95
  op = XEXP (op, 0);
96
  return ((GET_CODE (op) == SYMBOL_REF && !SYMBOL_REF_TLS_MODEL (op))
97
         || GET_CODE (op) == CONST || GET_CODE (op) == HIGH
98
         || GET_CODE (op) == LABEL_REF);
99
})
100
 
101
;; Return true if OP is a symbolic operand for the TLS Global Dynamic model.
102
(define_predicate "tgd_symbolic_operand"
103
  (and (match_code "symbol_ref")
104
       (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_GLOBAL_DYNAMIC")))
105
 
106
;; Return true if OP is a symbolic operand for the TLS Local Dynamic model.
107
(define_predicate "tld_symbolic_operand"
108
  (and (match_code "symbol_ref")
109
       (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_LOCAL_DYNAMIC")))
110
 
111
;; Return true if OP is a symbolic operand for the TLS Initial Exec model.
112
(define_predicate "tie_symbolic_operand"
113
  (and (match_code "symbol_ref")
114
       (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_INITIAL_EXEC")))
115
 
116
;; Return true if OP is a symbolic operand for the TLS Local Exec model.
117
(define_predicate "tle_symbolic_operand"
118
  (and (match_code "symbol_ref")
119
       (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_LOCAL_EXEC")))
120
 
121
 
122
;; Return 1 if the operand is a register operand or a non-symbolic
123
;; memory operand after reload.  This predicate is used for branch
124
;; patterns that internally handle register reloading.  We need to
125
;; accept non-symbolic memory operands after reload to ensure that the
126
;; pattern is still valid if reload didn't find a hard register for
127
;; the operand.
128
 
129
(define_predicate "reg_before_reload_operand"
130
  (match_code "reg,mem")
131
{
132
  /* Don't accept a SUBREG since it will need a reload.  */
133
  if (GET_CODE (op) == SUBREG)
134
    return 0;
135
 
136
  if (register_operand (op, mode))
137
    return 1;
138
 
139
  if (reload_completed
140
      && memory_operand (op, mode)
141
      && !symbolic_memory_operand (op, mode))
142
    return 1;
143
 
144
  return 0;
145
})
146
 
147
;; Return 1 if the operand is either a register, zero, or a memory
148
;; operand that is not symbolic.
149
 
150
(define_predicate "reg_or_0_or_nonsymb_mem_operand"
151
  (match_code "subreg,reg,mem,const_int,const_double")
152
{
153
  if (register_operand (op, mode))
154
    return 1;
155
 
156
  if (op == CONST0_RTX (mode))
157
    return 1;
158
 
159
  if (GET_CODE (op) == SUBREG)
160
    op = SUBREG_REG (op);
161
 
162
  if (GET_CODE (op) != MEM)
163
    return 0;
164
 
165
  /* Until problems with management of the REG_POINTER flag are resolved,
166
     we need to delay creating move insns with unscaled indexed addresses
167
     until CSE is not expected.  */
168
  if (!TARGET_NO_SPACE_REGS
169
      && !cse_not_expected
170
      && GET_CODE (XEXP (op, 0)) == PLUS
171
      && REG_P (XEXP (XEXP (op, 0), 0))
172
      && REG_P (XEXP (XEXP (op, 0), 1)))
173
    return 0;
174
 
175
  return (!symbolic_memory_operand (op, mode)
176
          && memory_address_p (mode, XEXP (op, 0)));
177
})
178
 
179
;; Accept anything that can be used as a destination operand for a
180
;; move instruction.  We don't accept indexed memory operands since
181
;; they are supported only for floating point stores.
182
 
183
(define_predicate "move_dest_operand"
184
  (match_code "subreg,reg,mem")
185
{
186
  if (register_operand (op, mode))
187
    return 1;
188
 
189
  if (GET_MODE (op) != mode)
190
    return 0;
191
 
192
  if (GET_CODE (op) == SUBREG)
193
    op = SUBREG_REG (op);
194
 
195
  if (GET_CODE (op) != MEM || symbolic_memory_operand (op, mode))
196
    return 0;
197
 
198
  op = XEXP (op, 0);
199
 
200
  return (memory_address_p (mode, op)
201
          && !IS_INDEX_ADDR_P (op)
202
          && !IS_LO_SUM_DLT_ADDR_P (op));
203
})
204
 
205
;; Accept anything that can be used as a source operand for a move
206
;; instruction.
207
 
208
(define_predicate "move_src_operand"
209
  (match_code "subreg,reg,const_int,const_double,mem")
210
{
211
  if (register_operand (op, mode))
212
    return 1;
213
 
214
  if (op == CONST0_RTX (mode))
215
    return 1;
216
 
217
  if (GET_CODE (op) == CONST_INT)
218
    return cint_ok_for_move (INTVAL (op));
219
 
220
  if (GET_MODE (op) != mode)
221
    return 0;
222
 
223
  if (GET_CODE (op) == SUBREG)
224
    op = SUBREG_REG (op);
225
 
226
  if (GET_CODE (op) != MEM)
227
    return 0;
228
 
229
  /* Until problems with management of the REG_POINTER flag are resolved,
230
     we need to delay creating move insns with unscaled indexed addresses
231
     until CSE is not expected.  */
232
  if (!TARGET_NO_SPACE_REGS
233
      && !cse_not_expected
234
      && GET_CODE (XEXP (op, 0)) == PLUS
235
      && REG_P (XEXP (XEXP (op, 0), 0))
236
      && REG_P (XEXP (XEXP (op, 0), 1)))
237
    return 0;
238
 
239
  return memory_address_p (mode, XEXP (op, 0));
240
})
241
 
242
;; Accept anything that can be used as the source operand for a
243
;; prefetch instruction with a cache-control completer.
244
 
245
(define_predicate "prefetch_cc_operand"
246
  (match_code "mem")
247
{
248
  if (GET_CODE (op) != MEM)
249
    return 0;
250
 
251
  op = XEXP (op, 0);
252
 
253
  /* We must reject virtual registers as we don't allow REG+D.  */
254
  if (op == virtual_incoming_args_rtx
255
      || op == virtual_stack_vars_rtx
256
      || op == virtual_stack_dynamic_rtx
257
      || op == virtual_outgoing_args_rtx
258
      || op == virtual_cfa_rtx)
259
    return 0;
260
 
261
  if (!REG_P (op) && !IS_INDEX_ADDR_P (op))
262
    return 0;
263
 
264
  /* Until problems with management of the REG_POINTER flag are resolved,
265
     we need to delay creating prefetch insns with unscaled indexed addresses
266
     until CSE is not expected.  */
267
  if (!TARGET_NO_SPACE_REGS
268
      && !cse_not_expected
269
      && GET_CODE (op) == PLUS
270
      && REG_P (XEXP (op, 0)))
271
    return 0;
272
 
273
  return memory_address_p (mode, op);
274
})
275
 
276
;; Accept anything that can be used as the source operand for a
277
;; prefetch instruction with no cache-control completer.
278
 
279
(define_predicate "prefetch_nocc_operand"
280
  (match_code "mem")
281
{
282
  if (GET_CODE (op) != MEM)
283
    return 0;
284
 
285
  op = XEXP (op, 0);
286
 
287
  /* Until problems with management of the REG_POINTER flag are resolved,
288
     we need to delay creating prefetch insns with unscaled indexed addresses
289
     until CSE is not expected.  */
290
  if (!TARGET_NO_SPACE_REGS
291
      && !cse_not_expected
292
      && GET_CODE (op) == PLUS
293
      && REG_P (XEXP (op, 0))
294
      && REG_P (XEXP (op, 1)))
295
    return 0;
296
 
297
  return memory_address_p (mode, op);
298
})
299
 
300
;; Accept REG and any CONST_INT that can be moved in one instruction
301
;; into a general register.
302
 
303
(define_predicate "reg_or_cint_move_operand"
304
  (match_code "subreg,reg,const_int")
305
{
306
  if (register_operand (op, mode))
307
    return 1;
308
 
309
  return (GET_CODE (op) == CONST_INT && cint_ok_for_move (INTVAL (op)));
310
})
311
 
312
;; TODO: Add a comment here.
313
 
314
(define_predicate "pic_label_operand"
315
  (match_code "label_ref,const")
316
{
317
  if (!flag_pic)
318
    return 0;
319
 
320
  switch (GET_CODE (op))
321
    {
322
    case LABEL_REF:
323
      return 1;
324
    case CONST:
325
      op = XEXP (op, 0);
326
      return (GET_CODE (XEXP (op, 0)) == LABEL_REF
327
              && GET_CODE (XEXP (op, 1)) == CONST_INT);
328
    default:
329
      return 0;
330
    }
331
})
332
 
333
;; TODO: Add a comment here.
334
 
335
(define_predicate "fp_reg_operand"
336
  (match_code "reg")
337
{
338
  return reg_renumber && FP_REG_P (op);
339
})
340
 
341
;; Return truth value of whether OP can be used as an operand in a
342
;; three operand arithmetic insn that accepts registers of mode MODE
343
;; or 14-bit signed integers.
344
 
345
(define_predicate "arith_operand"
346
  (match_code "subreg,reg,const_int")
347
{
348
  return (register_operand (op, mode)
349
          || (GET_CODE (op) == CONST_INT && INT_14_BITS (op)));
350
})
351
 
352
;; Return truth value of whether OP can be used as an operand in a
353
;; three operand arithmetic insn that accepts registers of mode MODE
354
;; or 11-bit signed integers.
355
 
356
(define_predicate "arith11_operand"
357
  (match_code "subreg,reg,const_int")
358
{
359
  return (register_operand (op, mode)
360
          || (GET_CODE (op) == CONST_INT && INT_11_BITS (op)));
361
})
362
 
363
;; A constant integer suitable for use in a PRE_MODIFY memory
364
;; reference.
365
 
366
(define_predicate "pre_cint_operand"
367
  (match_code "const_int")
368
{
369
  return (GET_CODE (op) == CONST_INT
370
          && INTVAL (op) >= -0x2000 && INTVAL (op) < 0x10);
371
})
372
 
373
;; A constant integer suitable for use in a POST_MODIFY memory
374
;; reference.
375
 
376
(define_predicate "post_cint_operand"
377
  (match_code "const_int")
378
{
379
  return (GET_CODE (op) == CONST_INT
380
          && INTVAL (op) < 0x2000 && INTVAL (op) >= -0x10);
381
})
382
 
383
;; TODO: Add a comment here.
384
 
385
(define_predicate "arith_double_operand"
386
  (match_code "subreg,reg,const_double")
387
{
388
  return (register_operand (op, mode)
389
          || (GET_CODE (op) == CONST_DOUBLE
390
              && GET_MODE (op) == mode
391
              && VAL_14_BITS_P (CONST_DOUBLE_LOW (op))
392
              && ((CONST_DOUBLE_HIGH (op) >= 0)
393
                  == ((CONST_DOUBLE_LOW (op) & 0x1000) == 0))));
394
})
395
 
396
;; Return truth value of whether OP is an integer which fits the range
397
;; constraining immediate operands in three-address insns, or is an
398
;; integer register.
399
 
400
(define_predicate "ireg_or_int5_operand"
401
  (match_code "const_int,reg")
402
{
403
  return ((GET_CODE (op) == CONST_INT && INT_5_BITS (op))
404
          || (GET_CODE (op) == REG && REGNO (op) > 0 && REGNO (op) < 32));
405
})
406
 
407
;; Return truth value of whether OP is an integer which fits the range
408
;; constraining immediate operands in three-address insns.
409
 
410
(define_predicate "int5_operand"
411
  (match_code "const_int")
412
{
413
  return (GET_CODE (op) == CONST_INT && INT_5_BITS (op));
414
})
415
 
416
;; Return truth value of whether OP is an integer which fits the range
417
;; constraining immediate operands in three-address insns.
418
 
419
(define_predicate "uint5_operand"
420
  (match_code "const_int")
421
{
422
  return (GET_CODE (op) == CONST_INT && INT_U5_BITS (op));
423
})
424
 
425
;; Return truth value of whether OP is an integer which fits the range
426
;; constraining immediate operands in three-address insns.
427
 
428
(define_predicate "int11_operand"
429
  (match_code "const_int")
430
{
431
  return (GET_CODE (op) == CONST_INT && INT_11_BITS (op));
432
})
433
 
434
;; Return truth value of whether OP is an integer which fits the range
435
;; constraining immediate operands in three-address insns.
436
 
437
(define_predicate "uint32_operand"
438
  (match_code "const_int,const_double")
439
{
440
#if HOST_BITS_PER_WIDE_INT > 32
441
  /* All allowed constants will fit a CONST_INT.  */
442
  return (GET_CODE (op) == CONST_INT
443
          && (INTVAL (op) >= 0 && INTVAL (op) < (HOST_WIDE_INT) 1 << 32));
444
#else
445
  return (GET_CODE (op) == CONST_INT
446
          || (GET_CODE (op) == CONST_DOUBLE
447
              && CONST_DOUBLE_HIGH (op) == 0));
448
#endif
449
})
450
 
451
;; Return truth value of whether OP is an integer which fits the range
452
;; constraining immediate operands in three-address insns.
453
 
454
(define_predicate "arith5_operand"
455
  (match_code "subreg,reg,const_int")
456
{
457
  return register_operand (op, mode) || int5_operand (op, mode);
458
})
459
 
460
;; True iff depi or extru can be used to compute (reg & OP).
461
 
462
(define_predicate "and_operand"
463
  (match_code "subreg,reg,const_int")
464
{
465
  return (register_operand (op, mode)
466
          || (GET_CODE (op) == CONST_INT && and_mask_p (INTVAL (op))));
467
})
468
 
469
;; True iff depi can be used to compute (reg | OP).
470
 
471
(define_predicate "ior_operand"
472
  (match_code "const_int")
473
{
474
  return (GET_CODE (op) == CONST_INT && ior_mask_p (INTVAL (op)));
475
})
476
 
477
;; True iff OP is a CONST_INT of the forms 0...0xxxx or
478
;; 0...01...1xxxx. Such values can be the left hand side x in (x <<
479
;; r), using the zvdepi instruction.
480
 
481
(define_predicate "lhs_lshift_cint_operand"
482
  (match_code "const_int")
483
{
484
  unsigned HOST_WIDE_INT x;
485
  if (GET_CODE (op) != CONST_INT)
486
    return 0;
487
  x = INTVAL (op) >> 4;
488
  return (x & (x + 1)) == 0;
489
})
490
 
491
;; TODO: Add a comment here.
492
 
493
(define_predicate "lhs_lshift_operand"
494
  (match_code "subreg,reg,const_int")
495
{
496
  return register_operand (op, mode) || lhs_lshift_cint_operand (op, mode);
497
})
498
 
499
;; TODO: Add a comment here.
500
 
501
(define_predicate "arith32_operand"
502
  (match_code "subreg,reg,const_int")
503
{
504
  return register_operand (op, mode) || GET_CODE (op) == CONST_INT;
505
})
506
 
507
;; TODO: Add a comment here.
508
 
509
(define_predicate "pc_or_label_operand"
510
  (match_code "pc,label_ref")
511
{
512
  return (GET_CODE (op) == PC || GET_CODE (op) == LABEL_REF);
513
})
514
 
515
;; TODO: Add a comment here.
516
 
517
(define_predicate "plus_xor_ior_operator"
518
  (match_code "plus,xor,ior")
519
{
520
  return (GET_CODE (op) == PLUS || GET_CODE (op) == XOR
521
          || GET_CODE (op) == IOR);
522
})
523
 
524
;; Return 1 if OP is a CONST_INT with the value 2, 4, or 8.  These are
525
;; the valid constant for shadd instructions.
526
 
527
(define_predicate "shadd_operand"
528
  (match_code "const_int")
529
{
530
  return (GET_CODE (op) == CONST_INT && shadd_constant_p (INTVAL (op)));
531
})
532
 
533
;; TODO: Add a comment here.
534
 
535
(define_predicate "div_operand"
536
  (match_code "reg,const_int")
537
{
538
  return (mode == SImode
539
          && ((GET_CODE (op) == REG && REGNO (op) == 25)
540
              || (GET_CODE (op) == CONST_INT && INTVAL (op) > 0
541
                  && INTVAL (op) < 16 && magic_milli[INTVAL (op)])));
542
})
543
 
544
;; Return nonzero if OP is an integer register, else return zero.
545
 
546
(define_predicate "ireg_operand"
547
  (match_code "reg")
548
{
549
  return (GET_CODE (op) == REG && REGNO (op) > 0 && REGNO (op) < 32);
550
})
551
 
552
;; Return 1 if this is a comparison operator.  This allows the use of
553
;; MATCH_OPERATOR to recognize all the branch insns.
554
 
555
(define_predicate "cmpib_comparison_operator"
556
  (match_code "eq,ne,lt,le,leu,gt,gtu,ge")
557
{
558
  return ((mode == VOIDmode || GET_MODE (op) == mode)
559
          && (GET_CODE (op) == EQ
560
              || GET_CODE (op) == NE
561
              || GET_CODE (op) == GT
562
              || GET_CODE (op) == GTU
563
              || GET_CODE (op) == GE
564
              || GET_CODE (op) == LT
565
              || GET_CODE (op) == LE
566
              || GET_CODE (op) == LEU));
567
})
568
 
569
;; Return 1 if OP is an operator suitable for use in a movb
570
;; instruction.
571
 
572
(define_predicate "movb_comparison_operator"
573
  (match_code "eq,ne,lt,ge")
574
{
575
  return (GET_CODE (op) == EQ || GET_CODE (op) == NE
576
          || GET_CODE (op) == LT || GET_CODE (op) == GE);
577
})

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.