OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [config/] [alpha/] [predicates.md] - Blame information for rev 338

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 282 jeremybenn
;; Predicate definitions for DEC Alpha.
2
;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010
3
;; Free Software Foundation, Inc.
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
;; .
20
 
21
;; Return 1 if OP is the zero constant for MODE.
22
(define_predicate "const0_operand"
23
  (and (match_code "const_int,const_double,const_vector")
24
       (match_test "op == CONST0_RTX (mode)")))
25
 
26
;; Returns true if OP is either the constant zero or a register.
27
(define_predicate "reg_or_0_operand"
28
  (ior (match_operand 0 "register_operand")
29
       (match_operand 0 "const0_operand")))
30
 
31
;; Return 1 if OP is a constant in the range of 0-63 (for a shift) or
32
;; any register.
33
(define_predicate "reg_or_6bit_operand"
34
  (if_then_else (match_code "const_int")
35
    (match_test "INTVAL (op) >= 0 && INTVAL (op) < 64")
36
    (match_operand 0 "register_operand")))
37
 
38
;; Return 1 if OP is an 8-bit constant.
39
(define_predicate "cint8_operand"
40
  (and (match_code "const_int")
41
       (match_test "INTVAL (op) >= 0 && INTVAL (op) < 256")))
42
 
43
;; Return 1 if OP is an 8-bit constant or any register.
44
(define_predicate "reg_or_8bit_operand"
45
  (if_then_else (match_code "const_int")
46
    (match_test "INTVAL (op) >= 0 && INTVAL (op) < 256")
47
    (match_operand 0 "register_operand")))
48
 
49
;; Return 1 if OP is a constant or any register.
50
(define_predicate "reg_or_cint_operand"
51
  (ior (match_operand 0 "register_operand")
52
       (match_operand 0 "const_int_operand")))
53
 
54
;; Return 1 if the operand is a valid second operand to an add insn.
55
(define_predicate "add_operand"
56
  (if_then_else (match_code "const_int")
57
    (match_test "satisfies_constraint_K (op) || satisfies_constraint_L (op)")
58
    (match_operand 0 "register_operand")))
59
 
60
;; Return 1 if the operand is a valid second operand to a
61
;; sign-extending add insn.
62
(define_predicate "sext_add_operand"
63
  (if_then_else (match_code "const_int")
64
    (match_test "satisfies_constraint_I (op) || satisfies_constraint_O (op)")
65
    (match_operand 0 "register_operand")))
66
 
67
;; Return 1 if the operand is a non-symbolic constant operand that
68
;; does not satisfy add_operand.
69
(define_predicate "non_add_const_operand"
70
  (and (match_code "const_int,const_double,const_vector")
71
       (not (match_operand 0 "add_operand"))))
72
 
73
;; Return 1 if the operand is a non-symbolic, nonzero constant operand.
74
(define_predicate "non_zero_const_operand"
75
  (and (match_code "const_int,const_double,const_vector")
76
       (match_test "op != CONST0_RTX (mode)")))
77
 
78
;; Return 1 if OP is the constant 4 or 8.
79
(define_predicate "const48_operand"
80
  (and (match_code "const_int")
81
       (match_test "INTVAL (op) == 4 || INTVAL (op) == 8")))
82
 
83
;; Return 1 if OP is a valid first operand to an AND insn.
84
(define_predicate "and_operand"
85
  (if_then_else (match_code "const_int")
86
    (match_test "(unsigned HOST_WIDE_INT) INTVAL (op) < 0x100
87
                 || (unsigned HOST_WIDE_INT) ~ INTVAL (op) < 0x100
88
                 || zap_mask (INTVAL (op))")
89
    (if_then_else (match_code "const_double")
90
      (match_test "GET_MODE (op) == VOIDmode
91
                   && zap_mask (CONST_DOUBLE_LOW (op))
92
                   && zap_mask (CONST_DOUBLE_HIGH (op))")
93
      (match_operand 0 "register_operand"))))
94
 
95
;; Return 1 if OP is a valid first operand to an IOR or XOR insn.
96
(define_predicate "or_operand"
97
  (if_then_else (match_code "const_int")
98
    (match_test "(unsigned HOST_WIDE_INT) INTVAL (op) < 0x100
99
                 || (unsigned HOST_WIDE_INT) ~ INTVAL (op) < 0x100")
100
    (match_operand 0 "register_operand")))
101
 
102
;; Return 1 if OP is a constant that is the width, in bits, of an integral
103
;; mode not larger than DImode.
104
(define_predicate "mode_width_operand"
105
  (match_code "const_int")
106
{
107
  HOST_WIDE_INT i = INTVAL (op);
108
  return i == 8 || i == 16 || i == 32 || i == 64;
109
})
110
 
111
;; Return 1 if OP is a constant that is a mask of ones of width of an
112
;; integral machine mode not larger than DImode.
113
(define_predicate "mode_mask_operand"
114
  (match_code "const_int,const_double")
115
{
116
  if (CONST_INT_P (op))
117
    {
118
      HOST_WIDE_INT value = INTVAL (op);
119
 
120
      if (value == 0xff)
121
        return 1;
122
      if (value == 0xffff)
123
        return 1;
124
      if (value == 0xffffffff)
125
        return 1;
126
      if (value == -1)
127
        return 1;
128
    }
129
  else if (HOST_BITS_PER_WIDE_INT == 32 && GET_CODE (op) == CONST_DOUBLE)
130
    {
131
      if (CONST_DOUBLE_LOW (op) == 0xffffffff && CONST_DOUBLE_HIGH (op) == 0)
132
        return 1;
133
    }
134
  return 0;
135
})
136
 
137
;; Return 1 if OP is a multiple of 8 less than 64.
138
(define_predicate "mul8_operand"
139
  (match_code "const_int")
140
{
141
  unsigned HOST_WIDE_INT i = INTVAL (op);
142
  return i < 64 && i % 8 == 0;
143
})
144
 
145
;; Return 1 if OP is a hard floating-point register.
146
(define_predicate "hard_fp_register_operand"
147
  (match_operand 0 "register_operand")
148
{
149
  if (GET_CODE (op) == SUBREG)
150
    op = SUBREG_REG (op);
151
  return REGNO_REG_CLASS (REGNO (op)) == FLOAT_REGS;
152
})
153
 
154
;; Return 1 if OP is a hard general register.
155
(define_predicate "hard_int_register_operand"
156
  (match_operand 0 "register_operand")
157
{
158
  if (GET_CODE (op) == SUBREG)
159
    op = SUBREG_REG (op);
160
  return REGNO_REG_CLASS (REGNO (op)) == GENERAL_REGS;
161
})
162
 
163
;; Return 1 if OP is something that can be reloaded into a register;
164
;; if it is a MEM, it need not be valid.
165
(define_predicate "some_operand"
166
  (ior (match_code "reg,mem,const_int,const_double,const_vector,
167
                    label_ref,symbol_ref,const,high")
168
       (and (match_code "subreg")
169
            (match_test "some_operand (SUBREG_REG (op), VOIDmode)"))))
170
 
171
;; Likewise, but don't accept constants.
172
(define_predicate "some_ni_operand"
173
  (ior (match_code "reg,mem")
174
       (and (match_code "subreg")
175
            (match_test "some_ni_operand (SUBREG_REG (op), VOIDmode)"))))
176
 
177
;; Return 1 if OP is a valid operand for the source of a move insn.
178
(define_predicate "input_operand"
179
  (match_code "label_ref,symbol_ref,const,high,reg,subreg,mem,
180
               const_double,const_vector,const_int")
181
{
182
  switch (GET_CODE (op))
183
    {
184
    case LABEL_REF:
185
    case SYMBOL_REF:
186
    case CONST:
187
      if (TARGET_EXPLICIT_RELOCS)
188
        {
189
          /* We don't split symbolic operands into something unintelligable
190
             until after reload, but we do not wish non-small, non-global
191
             symbolic operands to be reconstructed from their high/lo_sum
192
             form.  */
193
          return (small_symbolic_operand (op, mode)
194
                  || global_symbolic_operand (op, mode)
195
                  || gotdtp_symbolic_operand (op, mode)
196
                  || gottp_symbolic_operand (op, mode));
197
        }
198
 
199
      /* This handles both the Windows/NT and OSF cases.  */
200
      return mode == ptr_mode || mode == DImode;
201
 
202
    case HIGH:
203
      return (TARGET_EXPLICIT_RELOCS
204
              && local_symbolic_operand (XEXP (op, 0), mode));
205
 
206
    case REG:
207
      return 1;
208
 
209
    case SUBREG:
210
      if (register_operand (op, mode))
211
        return 1;
212
      /* ... fall through ...  */
213
    case MEM:
214
      return ((TARGET_BWX || (mode != HImode && mode != QImode))
215
              && general_operand (op, mode));
216
 
217
    case CONST_DOUBLE:
218
      return op == CONST0_RTX (mode);
219
 
220
    case CONST_VECTOR:
221
      if (reload_in_progress || reload_completed)
222
        return alpha_legitimate_constant_p (op);
223
      return op == CONST0_RTX (mode);
224
 
225
    case CONST_INT:
226
      if (mode == QImode || mode == HImode)
227
        return true;
228
      if (reload_in_progress || reload_completed)
229
        return alpha_legitimate_constant_p (op);
230
      return add_operand (op, mode);
231
 
232
    default:
233
      gcc_unreachable ();
234
    }
235
  return 0;
236
})
237
 
238
;; Return 1 if OP is a SYMBOL_REF for a function known to be in this
239
;; file, and in the same section as the current function.
240
 
241
(define_predicate "samegp_function_operand"
242
  (match_code "symbol_ref")
243
{
244
  /* Easy test for recursion.  */
245
  if (op == XEXP (DECL_RTL (current_function_decl), 0))
246
    return true;
247
 
248
  /* Functions that are not local can be overridden, and thus may
249
     not share the same gp.  */
250
  if (! SYMBOL_REF_LOCAL_P (op))
251
    return false;
252
 
253
  /* If -msmall-data is in effect, assume that there is only one GP
254
     for the module, and so any local symbol has this property.  We
255
     need explicit relocations to be able to enforce this for symbols
256
     not defined in this unit of translation, however.  */
257
  if (TARGET_EXPLICIT_RELOCS && TARGET_SMALL_DATA)
258
    return true;
259
 
260
  /* Functions that are not external are defined in this UoT,
261
     and thus must share the same gp.  */
262
  return ! SYMBOL_REF_EXTERNAL_P (op);
263
})
264
 
265
;; Return 1 if OP is a SYMBOL_REF for which we can make a call via bsr.
266
(define_predicate "direct_call_operand"
267
  (match_operand 0 "samegp_function_operand")
268
{
269
  tree op_decl, cfun_sec, op_sec;
270
 
271
  /* If profiling is implemented via linker tricks, we can't jump
272
     to the nogp alternate entry point.  Note that crtl->profile
273
     would not be correct, since that doesn't indicate if the target
274
     function uses profiling.  */
275
  /* ??? TARGET_PROFILING_NEEDS_GP isn't really the right test,
276
     but is approximately correct for the OSF ABIs.  Don't know
277
     what to do for VMS, NT, or UMK.  */
278
  if (!TARGET_PROFILING_NEEDS_GP && profile_flag)
279
    return false;
280
 
281
  /* Must be a function.  In some cases folks create thunks in static
282
     data structures and then make calls to them.  If we allow the
283
     direct call, we'll get an error from the linker about !samegp reloc
284
     against a symbol without a .prologue directive.  */
285
  if (!SYMBOL_REF_FUNCTION_P (op))
286
    return false;
287
 
288
  /* Must be "near" so that the branch is assumed to reach.  With
289
     -msmall-text, this is assumed true of all local symbols.  Since
290
     we've already checked samegp, locality is already assured.  */
291
  if (TARGET_SMALL_TEXT)
292
    return true;
293
 
294
  /* Otherwise, a decl is "near" if it is defined in the same section.  */
295
  if (flag_function_sections)
296
    return false;
297
 
298
  op_decl = SYMBOL_REF_DECL (op);
299
  if (DECL_ONE_ONLY (current_function_decl)
300
      || (op_decl && DECL_ONE_ONLY (op_decl)))
301
    return false;
302
 
303
  cfun_sec = DECL_SECTION_NAME (current_function_decl);
304
  op_sec = op_decl ? DECL_SECTION_NAME (op_decl) : NULL;
305
  return ((!cfun_sec && !op_sec)
306
          || (cfun_sec && op_sec
307
              && strcmp (TREE_STRING_POINTER (cfun_sec),
308
                         TREE_STRING_POINTER (op_sec)) == 0));
309
})
310
 
311
;; Return 1 if OP is a valid operand for the MEM of a CALL insn.
312
;;
313
;; For TARGET_ABI_OSF, we want to restrict to R27 or a pseudo.
314
;; For TARGET_ABI_UNICOSMK, we want to restrict to registers.
315
 
316
(define_predicate "call_operand"
317
  (if_then_else (match_code "reg")
318
    (match_test "!TARGET_ABI_OSF
319
                 || REGNO (op) == 27 || REGNO (op) > LAST_VIRTUAL_REGISTER")
320
    (and (match_test "!TARGET_ABI_UNICOSMK")
321
         (match_code "symbol_ref"))))
322
 
323
;; Return true if OP is a LABEL_REF, or SYMBOL_REF or CONST referencing
324
;; a (non-tls) variable known to be defined in this file.
325
(define_predicate "local_symbolic_operand"
326
  (match_code "label_ref,const,symbol_ref")
327
{
328
  if (GET_CODE (op) == CONST
329
      && GET_CODE (XEXP (op, 0)) == PLUS
330
      && CONST_INT_P (XEXP (XEXP (op, 0), 1)))
331
    op = XEXP (XEXP (op, 0), 0);
332
 
333
  if (GET_CODE (op) == LABEL_REF)
334
    return 1;
335
 
336
  if (GET_CODE (op) != SYMBOL_REF)
337
    return 0;
338
 
339
  return (SYMBOL_REF_LOCAL_P (op)
340
          && !SYMBOL_REF_WEAK (op)
341
          && !SYMBOL_REF_TLS_MODEL (op));
342
})
343
 
344
;; Return true if OP is a SYMBOL_REF or CONST referencing a variable
345
;; known to be defined in this file in the small data area.
346
(define_predicate "small_symbolic_operand"
347
  (match_code "const,symbol_ref")
348
{
349
  if (! TARGET_SMALL_DATA)
350
    return 0;
351
 
352
  if (GET_CODE (op) == CONST
353
      && GET_CODE (XEXP (op, 0)) == PLUS
354
      && CONST_INT_P (XEXP (XEXP (op, 0), 1)))
355
    op = XEXP (XEXP (op, 0), 0);
356
 
357
  if (GET_CODE (op) != SYMBOL_REF)
358
    return 0;
359
 
360
  /* ??? There's no encode_section_info equivalent for the rtl
361
     constant pool, so SYMBOL_FLAG_SMALL never gets set.  */
362
  if (CONSTANT_POOL_ADDRESS_P (op))
363
    return GET_MODE_SIZE (get_pool_mode (op)) <= g_switch_value;
364
 
365
  return (SYMBOL_REF_LOCAL_P (op)
366
          && SYMBOL_REF_SMALL_P (op)
367
          && !SYMBOL_REF_WEAK (op)
368
          && !SYMBOL_REF_TLS_MODEL (op));
369
})
370
 
371
;; Return true if OP is a SYMBOL_REF or CONST referencing a variable
372
;; not known (or known not) to be defined in this file.
373
(define_predicate "global_symbolic_operand"
374
  (match_code "const,symbol_ref")
375
{
376
  if (GET_CODE (op) == CONST
377
      && GET_CODE (XEXP (op, 0)) == PLUS
378
      && CONST_INT_P (XEXP (XEXP (op, 0), 1)))
379
    op = XEXP (XEXP (op, 0), 0);
380
 
381
  if (GET_CODE (op) != SYMBOL_REF)
382
    return 0;
383
 
384
  return ((!SYMBOL_REF_LOCAL_P (op) || SYMBOL_REF_WEAK (op))
385
          && !SYMBOL_REF_TLS_MODEL (op));
386
})
387
 
388
;; Returns 1 if OP is a symbolic operand, i.e. a symbol_ref or a label_ref,
389
;; possibly with an offset.
390
(define_predicate "symbolic_operand"
391
  (ior (match_code "symbol_ref,label_ref")
392
       (and (match_code "const")
393
            (match_test "GET_CODE (XEXP (op,0)) == PLUS
394
                         && (GET_CODE (XEXP (XEXP (op,0), 0)) == SYMBOL_REF
395
                             || GET_CODE (XEXP (XEXP (op,0), 0)) == LABEL_REF)
396
                         && CONST_INT_P (XEXP (XEXP (op,0), 1))"))))
397
 
398
;; Return true if OP is valid for 16-bit DTP relative relocations.
399
(define_predicate "dtp16_symbolic_operand"
400
  (and (match_code "const")
401
       (match_test "tls_symbolic_operand_1 (op, 16, UNSPEC_DTPREL)")))
402
 
403
;; Return true if OP is valid for 32-bit DTP relative relocations.
404
(define_predicate "dtp32_symbolic_operand"
405
  (and (match_code "const")
406
       (match_test "tls_symbolic_operand_1 (op, 32, UNSPEC_DTPREL)")))
407
 
408
;; Return true if OP is valid for 64-bit DTP relative relocations.
409
(define_predicate "gotdtp_symbolic_operand"
410
  (and (match_code "const")
411
       (match_test "tls_symbolic_operand_1 (op, 64, UNSPEC_DTPREL)")))
412
 
413
;; Return true if OP is valid for 16-bit TP relative relocations.
414
(define_predicate "tp16_symbolic_operand"
415
  (and (match_code "const")
416
       (match_test "tls_symbolic_operand_1 (op, 16, UNSPEC_TPREL)")))
417
 
418
;; Return true if OP is valid for 32-bit TP relative relocations.
419
(define_predicate "tp32_symbolic_operand"
420
  (and (match_code "const")
421
       (match_test "tls_symbolic_operand_1 (op, 32, UNSPEC_TPREL)")))
422
 
423
;; Return true if OP is valid for 64-bit TP relative relocations.
424
(define_predicate "gottp_symbolic_operand"
425
  (and (match_code "const")
426
       (match_test "tls_symbolic_operand_1 (op, 64, UNSPEC_TPREL)")))
427
 
428
;; Return 1 if this memory address is a known aligned register plus
429
;; a constant.  It must be a valid address.  This means that we can do
430
;; this as an aligned reference plus some offset.
431
;;
432
;; Take into account what reload will do.  Oh god this is awful.
433
;; The horrible comma-operator construct below is to prevent genrecog
434
;; from thinking that this predicate accepts REG and SUBREG.  We don't
435
;; use recog during reload, so pretending these codes are accepted
436
;; pessimizes things a tad.
437
 
438
(define_special_predicate "aligned_memory_operand"
439
  (ior (match_test "op = resolve_reload_operand (op), 0")
440
       (match_code "mem"))
441
{
442
  rtx base;
443
  int offset;
444
 
445
  if (MEM_ALIGN (op) >= 32)
446
    return 1;
447
 
448
  op = XEXP (op, 0);
449
 
450
  /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
451
     sorts of constructs.  Dig for the real base register.  */
452
  if (reload_in_progress
453
      && GET_CODE (op) == PLUS
454
      && GET_CODE (XEXP (op, 0)) == PLUS)
455
    {
456
      base = XEXP (XEXP (op, 0), 0);
457
      offset = INTVAL (XEXP (op, 1));
458
    }
459
  else
460
    {
461
      if (! memory_address_p (mode, op))
462
        return 0;
463
      if (GET_CODE (op) == PLUS)
464
        {
465
          base = XEXP (op, 0);
466
          offset = INTVAL (XEXP (op, 1));
467
        }
468
      else
469
        {
470
          base = op;
471
          offset = 0;
472
        }
473
    }
474
 
475
  if (offset % GET_MODE_SIZE (mode))
476
    return 0;
477
 
478
  return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) >= 32);
479
})
480
 
481
;; Similar, but return 1 if OP is a MEM which is not alignable.
482
 
483
(define_special_predicate "unaligned_memory_operand"
484
  (ior (match_test "op = resolve_reload_operand (op), 0")
485
       (match_code "mem"))
486
{
487
  rtx base;
488
  int offset;
489
 
490
  if (MEM_ALIGN (op) >= 32)
491
    return 0;
492
 
493
  op = XEXP (op, 0);
494
 
495
  /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
496
     sorts of constructs.  Dig for the real base register.  */
497
  if (reload_in_progress
498
      && GET_CODE (op) == PLUS
499
      && GET_CODE (XEXP (op, 0)) == PLUS)
500
    {
501
      base = XEXP (XEXP (op, 0), 0);
502
      offset = INTVAL (XEXP (op, 1));
503
    }
504
  else
505
    {
506
      if (! memory_address_p (mode, op))
507
        return 0;
508
      if (GET_CODE (op) == PLUS)
509
        {
510
          base = XEXP (op, 0);
511
          offset = INTVAL (XEXP (op, 1));
512
        }
513
      else
514
        {
515
          base = op;
516
          offset = 0;
517
        }
518
    }
519
 
520
  if (offset % GET_MODE_SIZE (mode))
521
    return 1;
522
 
523
  return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) < 32);
524
})
525
 
526
;; Return 1 if OP is any memory location.  During reload a pseudo matches.
527
(define_special_predicate "any_memory_operand"
528
  (match_code "mem,reg,subreg")
529
{
530
  if (GET_CODE (op) == SUBREG)
531
    op = SUBREG_REG (op);
532
 
533
  if (MEM_P (op))
534
    return true;
535
  if (reload_in_progress && REG_P (op))
536
    {
537
      unsigned regno = REGNO (op);
538
      if (HARD_REGISTER_NUM_P (regno))
539
        return false;
540
      else
541
        return reg_renumber[regno] < 0;
542
    }
543
 
544
  return false;
545
})
546
 
547
;; Return 1 is OP is a memory location that is not a reference
548
;; (using an AND) to an unaligned location.  Take into account
549
;; what reload will do.
550
(define_special_predicate "normal_memory_operand"
551
  (ior (match_test "op = resolve_reload_operand (op), 0")
552
       (and (match_code "mem")
553
            (match_test "GET_CODE (XEXP (op, 0)) != AND"))))
554
 
555
;; Returns 1 if OP is not an eliminable register.
556
;;
557
;; This exists to cure a pathological failure in the s8addq (et al) patterns,
558
;;
559
;;      long foo () { long t; bar(); return (long) &t * 26107; }
560
;;
561
;; which run afoul of a hack in reload to cure a (presumably) similar
562
;; problem with lea-type instructions on other targets.  But there is
563
;; one of us and many of them, so work around the problem by selectively
564
;; preventing combine from making the optimization.
565
 
566
(define_predicate "reg_not_elim_operand"
567
  (match_operand 0 "register_operand")
568
{
569
  if (GET_CODE (op) == SUBREG)
570
    op = SUBREG_REG (op);
571
  return op != frame_pointer_rtx && op != arg_pointer_rtx;
572
})
573
 
574
;; Accept a register, but not a subreg of any kind.  This allows us to
575
;; avoid pathological cases in reload wrt data movement common in
576
;; int->fp conversion.  */
577
(define_predicate "reg_no_subreg_operand"
578
  (and (match_code "reg")
579
       (match_operand 0 "register_operand")))
580
 
581
;; Return 1 if OP is a valid Alpha comparison operator for "cbranch"
582
;; instructions.
583
(define_predicate "alpha_cbranch_operator"
584
  (ior (match_operand 0 "ordered_comparison_operator")
585
       (match_code "ordered,unordered")))
586
 
587
;; Return 1 if OP is a valid Alpha comparison operator for "cmp" style
588
;; instructions.
589
(define_predicate "alpha_comparison_operator"
590
  (match_code "eq,le,lt,leu,ltu"))
591
 
592
;; Similarly, but with swapped operands.
593
(define_predicate "alpha_swapped_comparison_operator"
594
  (match_code "eq,ge,gt,gtu"))
595
 
596
;; Return 1 if OP is a valid Alpha comparison operator against zero
597
;; for "bcc" style instructions.
598
(define_predicate "alpha_zero_comparison_operator"
599
  (match_code "eq,ne,le,lt,leu,ltu"))
600
 
601
;; Return 1 if OP is a signed comparison operation.
602
(define_predicate "signed_comparison_operator"
603
  (match_code "eq,ne,le,lt,ge,gt"))
604
 
605
;; Return 1 if OP is a valid Alpha floating point comparison operator.
606
(define_predicate "alpha_fp_comparison_operator"
607
  (match_code "eq,le,lt,unordered"))
608
 
609
;; Return 1 if this is a divide or modulus operator.
610
(define_predicate "divmod_operator"
611
  (match_code "div,mod,udiv,umod"))
612
 
613
;; Return 1 if this is a float->int conversion operator.
614
(define_predicate "fix_operator"
615
  (match_code "fix,unsigned_fix"))
616
 
617
;; Recognize an addition operation that includes a constant.  Used to
618
;; convince reload to canonize (plus (plus reg c1) c2) during register
619
;; elimination.
620
 
621
(define_predicate "addition_operation"
622
  (and (match_code "plus")
623
       (match_test "register_operand (XEXP (op, 0), mode)
624
                    && satisfies_constraint_K (XEXP (op, 1))")))
625
 
626
;; For TARGET_EXPLICIT_RELOCS, we don't obfuscate a SYMBOL_REF to a
627
;; small symbolic operand until after reload.  At which point we need
628
;; to replace (mem (symbol_ref)) with (mem (lo_sum $29 symbol_ref))
629
;; so that sched2 has the proper dependency information.  */
630
(define_predicate "some_small_symbolic_operand"
631
  (match_code "set,parallel,prefetch,unspec,unspec_volatile")
632
{
633
  /* Avoid search unless necessary.  */
634
  if (!TARGET_EXPLICIT_RELOCS || !reload_completed)
635
    return false;
636
  return for_each_rtx (&op, some_small_symbolic_operand_int, NULL);
637
})

powered by: WebSVN 2.1.0

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