1;; Predicate definitions for POWER and PowerPC.
2;; Copyright (C) 2005-2022 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 1 for anything except PARALLEL.
21(define_predicate "any_operand"
22  (match_code "const_int,const_double,const_wide_int,const,symbol_ref,label_ref,subreg,reg,mem"))
23
24;; Return 1 for any PARALLEL.
25(define_predicate "any_parallel_operand"
26  (match_code "parallel"))
27
28;; Return 1 if op is COUNT register.
29(define_predicate "count_register_operand"
30  (and (match_code "reg")
31       (match_test "REGNO (op) == CTR_REGNO
32                        || REGNO (op) > LAST_VIRTUAL_REGISTER")))
33
34;; Return 1 if op is a SUBREG that is used to look at a SFmode value as
35;; and integer or vice versa.
36;;
37;; In the normal case where SFmode is in a floating point/vector register, it
38;; is stored as a DFmode and has a different format.  If we don't transform the
39;; value, things that use logical operations on the values will get the wrong
40;; value.
41;;
42;; If we don't have 64-bit and direct move, this conversion will be done by
43;; store and load, instead of by fiddling with the bits within the register.
44(define_predicate "sf_subreg_operand"
45  (match_code "subreg")
46{
47  rtx inner_reg = SUBREG_REG (op);
48  machine_mode inner_mode = GET_MODE (inner_reg);
49
50  if (TARGET_ALLOW_SF_SUBREG || !REG_P (inner_reg))
51    return 0;
52
53  if ((mode == SFmode && GET_MODE_CLASS (inner_mode) == MODE_INT)
54       || (GET_MODE_CLASS (mode) == MODE_INT && inner_mode == SFmode))
55    {
56      if (INT_REGNO_P (REGNO (inner_reg)))
57          return 0;
58
59      return 1;
60    }
61  return 0;
62})
63
64;; Return 1 if op is an Altivec register.
65(define_predicate "altivec_register_operand"
66  (match_operand 0 "register_operand")
67{
68  if (SUBREG_P (op))
69    {
70      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
71          return 0;
72
73      op = SUBREG_REG (op);
74    }
75
76  if (!REG_P (op))
77    return 0;
78
79  if (!HARD_REGISTER_P (op))
80    return 1;
81
82  return ALTIVEC_REGNO_P (REGNO (op));
83})
84
85;; Return 1 if op is a VSX register.
86(define_predicate "vsx_register_operand"
87  (match_operand 0 "register_operand")
88{
89  if (SUBREG_P (op))
90    {
91      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
92          return 0;
93
94      op = SUBREG_REG (op);
95    }
96
97  if (!REG_P (op))
98    return 0;
99
100  if (!HARD_REGISTER_P (op))
101    return 1;
102
103  return VSX_REGNO_P (REGNO (op));
104})
105
106;; Like vsx_register_operand, but allow SF SUBREGS
107(define_predicate "vsx_reg_sfsubreg_ok"
108  (match_operand 0 "register_operand")
109{
110  if (SUBREG_P (op))
111    op = SUBREG_REG (op);
112
113  if (!REG_P (op))
114    return 0;
115
116  if (!HARD_REGISTER_P (op))
117    return 1;
118
119  return VSX_REGNO_P (REGNO (op));
120})
121
122;; Return 1 if op is a vector register that operates on floating point vectors
123;; (either altivec or VSX).
124(define_predicate "vfloat_operand"
125  (match_operand 0 "register_operand")
126{
127  if (SUBREG_P (op))
128    {
129      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
130          return 0;
131
132      op = SUBREG_REG (op);
133    }
134
135  if (!REG_P (op))
136    return 0;
137
138  if (!HARD_REGISTER_P (op))
139    return 1;
140
141  return VFLOAT_REGNO_P (REGNO (op));
142})
143
144;; Return 1 if op is a vector register that operates on integer vectors
145;; (only altivec, VSX doesn't support integer vectors)
146(define_predicate "vint_operand"
147  (match_operand 0 "register_operand")
148{
149  if (SUBREG_P (op))
150    {
151      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
152          return 0;
153
154      op = SUBREG_REG (op);
155    }
156
157  if (!REG_P (op))
158    return 0;
159
160  if (!HARD_REGISTER_P (op))
161    return 1;
162
163  return VINT_REGNO_P (REGNO (op));
164})
165
166;; Return 1 if op is a vector register to do logical operations on (and, or,
167;; xor, etc.)
168(define_predicate "vlogical_operand"
169  (match_operand 0 "register_operand")
170{
171  if (SUBREG_P (op))
172    {
173      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
174          return 0;
175
176      op = SUBREG_REG (op);
177    }
178
179
180  if (!REG_P (op))
181    return 0;
182
183  if (!HARD_REGISTER_P (op))
184    return 1;
185
186  return VLOGICAL_REGNO_P (REGNO (op));
187})
188
189;; Return 1 if op is the carry register.
190(define_predicate "ca_operand"
191  (match_operand 0 "register_operand")
192{
193  if (SUBREG_P (op))
194    op = SUBREG_REG (op);
195
196  if (!REG_P (op))
197    return 0;
198
199  return CA_REGNO_P (REGNO (op));
200})
201
202;; Return 1 if operand is constant zero (scalars and vectors).
203(define_predicate "zero_constant"
204  (and (match_code "const_int,const_double,const_wide_int,const_vector")
205       (match_test "op == CONST0_RTX (mode)")))
206
207;; Return 1 if operand is constant -1 (scalars and vectors).
208(define_predicate "all_ones_constant"
209  (and (match_code "const_int,const_double,const_wide_int,const_vector")
210       (match_test "op == CONSTM1_RTX (mode) && !FLOAT_MODE_P (mode)")))
211
212;; Return 1 if op is a signed 5-bit constant integer.
213(define_predicate "s5bit_cint_operand"
214  (and (match_code "const_int")
215       (match_test "INTVAL (op) >= -16 && INTVAL (op) <= 15")))
216
217;; Return 1 if op is an unsigned 1-bit constant integer.
218(define_predicate "u1bit_cint_operand"
219  (and (match_code "const_int")
220       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 1")))
221
222;; Return 1 if op is a unsigned 3-bit constant integer.
223(define_predicate "u3bit_cint_operand"
224  (and (match_code "const_int")
225       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7")))
226
227;; Return 1 if op is a unsigned 5-bit constant integer.
228(define_predicate "u5bit_cint_operand"
229  (and (match_code "const_int")
230       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 31")))
231
232;; Return 1 if op is a unsigned 6-bit constant integer.
233(define_predicate "u6bit_cint_operand"
234  (and (match_code "const_int")
235       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 63")))
236
237;; Return 1 if op is an unsigned 7-bit constant integer.
238(define_predicate "u7bit_cint_operand"
239  (and (match_code "const_int")
240       (match_test "IN_RANGE (INTVAL (op), 0, 127)")))
241
242;; Return 1 if op is a unsigned 8-bit constant integer.
243(define_predicate "u8bit_cint_operand"
244  (and (match_code "const_int")
245       (match_test "IN_RANGE (INTVAL (op), 0, 255)")))
246
247;; Return 1 if op is a signed 8-bit constant integer.
248;; Integer multiplication complete more quickly
249(define_predicate "s8bit_cint_operand"
250  (and (match_code "const_int")
251       (match_test "INTVAL (op) >= -128 && INTVAL (op) <= 127")))
252
253;; Return 1 if op is a unsigned 10-bit constant integer.
254(define_predicate "u10bit_cint_operand"
255  (and (match_code "const_int")
256       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 1023")))
257
258;; Return 1 if op is a constant integer that can fit in a D field.
259(define_predicate "short_cint_operand"
260  (and (match_code "const_int")
261       (match_test "satisfies_constraint_I (op)")))
262
263;; Return 1 if op is a constant integer that can fit in an unsigned D field.
264(define_predicate "u_short_cint_operand"
265  (and (match_code "const_int")
266       (match_test "satisfies_constraint_K (op)")))
267
268;; Return 1 if op is a constant integer that is a signed 16-bit constant
269;; shifted left 16 bits
270(define_predicate "upper16_cint_operand"
271  (and (match_code "const_int")
272       (match_test "satisfies_constraint_L (op)")))
273
274;; Return 1 if op is a constant integer that cannot fit in a signed D field.
275(define_predicate "non_short_cint_operand"
276  (and (match_code "const_int")
277       (match_test "(unsigned HOST_WIDE_INT)
278                        (INTVAL (op) + 0x8000) >= 0x10000")))
279
280;; Return 1 if op is a 32-bit constant signed integer
281(define_predicate "s32bit_cint_operand"
282  (and (match_code "const_int")
283       (match_test "(0x80000000 + UINTVAL (op)) >> 32 == 0")))
284
285;; Return 1 if op is a constant 32-bit unsigned
286(define_predicate "c32bit_cint_operand"
287  (and (match_code "const_int")
288       (match_test "((UINTVAL (op) >> 32) == 0)")))
289
290;; Return 1 if op is a positive constant integer that is an exact power of 2.
291(define_predicate "exact_log2_cint_operand"
292  (and (match_code "const_int")
293       (match_test "INTVAL (op) > 0 && exact_log2 (INTVAL (op)) >= 0")))
294
295;; Match op = 0 or op = 1.
296(define_predicate "const_0_to_1_operand"
297  (and (match_code "const_int")
298       (match_test "IN_RANGE (INTVAL (op), 0, 1)")))
299
300;; Match op = -1, op = 0, or op = 1.
301(define_predicate "const_m1_to_1_operand"
302  (and (match_code "const_int")
303       (match_test "IN_RANGE (INTVAL (op), -1, 1)")))
304
305;; Match op = 0..3.
306(define_predicate "const_0_to_3_operand"
307  (and (match_code "const_int")
308       (match_test "IN_RANGE (INTVAL (op), 0, 3)")))
309
310;; Match op = 2 or op = 3.
311(define_predicate "const_2_to_3_operand"
312  (and (match_code "const_int")
313       (match_test "IN_RANGE (INTVAL (op), 2, 3)")))
314
315;; Match op = 0..7.
316(define_predicate "const_0_to_7_operand"
317  (and (match_code "const_int")
318       (match_test "IN_RANGE (INTVAL (op), 0, 7)")))
319
320;; Match op = 0..11
321(define_predicate "const_0_to_12_operand"
322  (and (match_code "const_int")
323       (match_test "IN_RANGE (INTVAL (op), 0, 12)")))
324
325;; Match op = 0..15
326(define_predicate "const_0_to_15_operand"
327  (and (match_code "const_int")
328       (match_test "IN_RANGE (INTVAL (op), 0, 15)")))
329
330;; Return 1 if op is a 34-bit constant integer.
331(define_predicate "cint34_operand"
332  (match_code "const_int")
333{
334  if (!TARGET_PREFIXED)
335    return 0;
336
337  return SIGNED_INTEGER_34BIT_P (INTVAL (op));
338})
339
340;; Return 1 if op is a register that is not special.
341;; Disallow (SUBREG:SF (REG:SI)) and (SUBREG:SI (REG:SF)) on VSX systems where
342;; you need to be careful in moving a SFmode to SImode and vice versa due to
343;; the fact that SFmode is represented as DFmode in the VSX registers.
344(define_predicate "gpc_reg_operand"
345  (match_operand 0 "register_operand")
346{
347  if (SUBREG_P (op))
348    {
349      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
350          return 0;
351
352      op = SUBREG_REG (op);
353    }
354
355  if (!REG_P (op))
356    return 0;
357
358  if (!HARD_REGISTER_P (op))
359    return 1;
360
361  if (TARGET_ALTIVEC && ALTIVEC_REGNO_P (REGNO (op)))
362    return 1;
363
364  if (TARGET_VSX && VSX_REGNO_P (REGNO (op)))
365    return 1;
366
367  return INT_REGNO_P (REGNO (op)) || FP_REGNO_P (REGNO (op));
368})
369
370;; Return 1 if op is a general purpose register.  Unlike gpc_reg_operand, don't
371;; allow floating point or vector registers.  Since vector registers are not
372;; allowed, we don't have to reject SFmode/SImode subregs.
373(define_predicate "int_reg_operand"
374  (match_operand 0 "register_operand")
375{
376  if (SUBREG_P (op))
377    {
378      if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode))
379          return 0;
380
381      op = SUBREG_REG (op);
382    }
383
384  if (!REG_P (op))
385    return 0;
386
387  if (!HARD_REGISTER_P (op))
388    return 1;
389
390  return INT_REGNO_P (REGNO (op));
391})
392
393;; Like int_reg_operand, but don't return true for pseudo registers
394;; We don't have to check for SF SUBREGS because pseudo registers
395;; are not allowed, and SF SUBREGs are ok within GPR registers.
396(define_predicate "int_reg_operand_not_pseudo"
397  (match_operand 0 "register_operand")
398{
399  if (SUBREG_P (op))
400    op = SUBREG_REG (op);
401
402  if (!REG_P (op))
403    return 0;
404
405  if (!HARD_REGISTER_P (op))
406    return 0;
407
408  return INT_REGNO_P (REGNO (op));
409})
410
411;; Like int_reg_operand, but only return true for base registers
412(define_predicate "base_reg_operand"
413  (match_operand 0 "int_reg_operand")
414{
415  if (SUBREG_P (op))
416    op = SUBREG_REG (op);
417
418  if (!REG_P (op))
419    return 0;
420
421  return (REGNO (op) != FIRST_GPR_REGNO);
422})
423
424
425;; Return true if this is a traditional floating point register
426(define_predicate "fpr_reg_operand"
427  (match_code "reg,subreg")
428{
429  HOST_WIDE_INT r;
430
431  if (SUBREG_P (op))
432    op = SUBREG_REG (op);
433
434  if (!REG_P (op))
435    return 0;
436
437  r = REGNO (op);
438  if (!HARD_REGISTER_NUM_P (r))
439    return 1;
440
441  return FP_REGNO_P (r);
442})
443
444;; Return 1 if op is a general purpose register that is an even register
445;; which suitable for a load/store quad operation
446;; Subregs are not allowed here because when they are combine can
447;; create (subreg:PTI (reg:TI pseudo)) which will cause reload to
448;; think the innermost reg needs reloading, in TImode instead of
449;; PTImode.  So reload will choose a reg in TImode which has no
450;; requirement that the reg be even.
451(define_predicate "quad_int_reg_operand"
452  (match_code "reg")
453{
454  HOST_WIDE_INT r;
455
456  if (!TARGET_QUAD_MEMORY && !TARGET_QUAD_MEMORY_ATOMIC)
457    return 0;
458
459  r = REGNO (op);
460  if (!HARD_REGISTER_NUM_P (r))
461    return 1;
462
463  return (INT_REGNO_P (r) && ((r & 1) == 0));
464})
465
466;; Return 1 if op is a register that is a condition register field.
467(define_predicate "cc_reg_operand"
468  (match_operand 0 "register_operand")
469{
470  if (SUBREG_P (op))
471    op = SUBREG_REG (op);
472
473  if (!REG_P (op))
474    return 0;
475
476  if (REGNO (op) > LAST_VIRTUAL_REGISTER)
477    return 1;
478
479  return CR_REGNO_P (REGNO (op));
480})
481
482;; Return 1 if op is a register that is a condition register field not cr0.
483(define_predicate "cc_reg_not_cr0_operand"
484  (match_operand 0 "register_operand")
485{
486  if (SUBREG_P (op))
487    op = SUBREG_REG (op);
488
489  if (!REG_P (op))
490    return 0;
491
492  if (REGNO (op) > LAST_VIRTUAL_REGISTER)
493    return 1;
494
495  return CR_REGNO_NOT_CR0_P (REGNO (op));
496})
497
498;; Return 1 if op is a constant integer valid for D field
499;; or non-special register.
500(define_predicate "reg_or_short_operand"
501  (if_then_else (match_code "const_int")
502    (match_operand 0 "short_cint_operand")
503    (match_operand 0 "gpc_reg_operand")))
504
505;; Return 1 if op is a constant integer valid for DS field
506;; or non-special register.
507(define_predicate "reg_or_aligned_short_operand"
508  (if_then_else (match_code "const_int")
509    (and (match_operand 0 "short_cint_operand")
510           (match_test "!(INTVAL (op) & 3)"))
511    (match_operand 0 "gpc_reg_operand")))
512
513;; Return 1 if op is a constant integer whose high-order 16 bits are zero
514;; or non-special register.
515(define_predicate "reg_or_u_short_operand"
516  (if_then_else (match_code "const_int")
517    (match_operand 0 "u_short_cint_operand")
518    (match_operand 0 "gpc_reg_operand")))
519
520;; Return 1 if op is any constant integer or a non-special register.
521(define_predicate "reg_or_cint_operand"
522  (ior (match_code "const_int")
523       (match_operand 0 "gpc_reg_operand")))
524
525;; Return 1 if op is constant zero or a non-special register.
526(define_predicate "reg_or_zero_operand"
527  (ior (match_operand 0 "zero_constant")
528       (match_operand 0 "gpc_reg_operand")))
529
530;; Return 1 if op is a constant integer valid for addition with addis, addi.
531(define_predicate "add_cint_operand"
532  (and (match_code "const_int")
533       (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)
534                           + (mode == SImode ? 0x80000000 : 0x80008000))
535                        < (unsigned HOST_WIDE_INT) 0x100000000ll")))
536
537;; Return 1 if op is a constant integer valid for addition
538;; or non-special register.
539(define_predicate "reg_or_add_cint_operand"
540  (if_then_else (match_code "const_int")
541    (match_operand 0 "add_cint_operand")
542    (match_operand 0 "gpc_reg_operand")))
543
544;; Return 1 if op is a constant integer valid for subtraction
545;; or non-special register.
546(define_predicate "reg_or_sub_cint_operand"
547  (if_then_else (match_code "const_int")
548    (match_test "(unsigned HOST_WIDE_INT)
549                       (- UINTVAL (op) + (mode == SImode ? 0x80000000 : 0x80008000))
550                     < (unsigned HOST_WIDE_INT) 0x100000000ll")
551    (match_operand 0 "gpc_reg_operand")))
552
553;; Return 1 if op is any 32-bit unsigned constant integer
554;; or non-special register.
555(define_predicate "reg_or_logical_cint_operand"
556  (if_then_else (match_code "const_int")
557    (match_test "(GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
558                      && INTVAL (op) >= 0)
559                     || ((INTVAL (op) & GET_MODE_MASK (mode)
560                          & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0)")
561    (match_operand 0 "gpc_reg_operand")))
562
563;; Like reg_or_logical_cint_operand, but allow vsx registers
564(define_predicate "vsx_reg_or_cint_operand"
565  (ior (match_operand 0 "vsx_register_operand")
566       (match_operand 0 "reg_or_logical_cint_operand")))
567
568;; Return 1 if operand is a CONST_DOUBLE that can be set in a register
569;; with no more than one instruction per word.
570(define_predicate "easy_fp_constant"
571  (match_code "const_double")
572{
573  gcc_assert (GET_MODE (op) == mode && SCALAR_FLOAT_MODE_P (mode));
574
575  /* Consider all constants with -msoft-float to be easy when regs are
576     32-bit and thus can be loaded with a maximum of 2 insns.  For
577     64-bit avoid long dependent insn sequences.  */
578  if (TARGET_SOFT_FLOAT)
579    {
580      if (!TARGET_POWERPC64)
581        return 1;
582
583      int size = GET_MODE_SIZE (mode);
584      if (size < 8)
585        return 1;
586
587      int load_from_mem_insns = 2;
588      if (size > 8)
589        load_from_mem_insns++;
590      if (TARGET_CMODEL != CMODEL_SMALL)
591        load_from_mem_insns++;
592      if (num_insns_constant (op, mode) <= load_from_mem_insns)
593        return 1;
594    }
595
596  /* 0.0D is not all zero bits.  */
597  if (DECIMAL_FLOAT_MODE_P (mode))
598    return 0;
599
600  /* The constant 0.0 is easy under VSX.  */
601  if (TARGET_VSX && op == CONST0_RTX (mode))
602    return 1;
603
604  /* Constants that can be generated with ISA 3.1 instructions are easy.  */
605  vec_const_128bit_type vsx_const;
606  if (TARGET_POWER10 && vec_const_128bit_to_bytes (op, mode, &vsx_const))
607    {
608      if (constant_generates_lxvkq (&vsx_const))
609          return true;
610
611      if (constant_generates_xxspltiw (&vsx_const))
612          return true;
613
614      if (constant_generates_xxspltidp (&vsx_const))
615          return true;
616    }
617
618  /* Otherwise consider floating point constants hard, so that the
619     constant gets pushed to memory during the early RTL phases.  This
620     has the advantage that double precision constants that can be
621     represented in single precision without a loss of precision will
622     use single precision loads.  */
623   return 0;
624})
625
626;; Return 1 if the operand is a 64-bit floating point scalar constant or a
627;; vector constant that can be loaded to a VSX register with one prefixed
628;; instruction, such as XXSPLTIDP or XXSPLTIW.
629;;
630;; In addition regular constants, we also recognize constants formed with the
631;; VEC_DUPLICATE insn from scalar constants.
632;;
633;; We don't handle scalar integer constants here because the assumption is the
634;; normal integer constants will be loaded into GPR registers.  For the
635;; constants that need to be loaded into vector registers, the instructions
636;; don't work well with TImode variables assigned a constant.  This is because
637;; the 64-bit scalar constants are splatted into both halves of the register.
638
639(define_predicate "vsx_prefixed_constant"
640  (match_code "const_double,const_vector,vec_duplicate")
641{
642  /* If we can generate the constant with a few Altivec instructions, don't
643      generate a prefixed instruction.  */
644  if (CONST_VECTOR_P (op) && easy_altivec_constant (op, mode))
645    return false;
646
647  /* Do we have prefixed instructions and are VSX registers available?  Is the
648     constant recognized?  */
649  if (!TARGET_PREFIXED || !TARGET_VSX)
650    return false;
651
652  vec_const_128bit_type vsx_const;
653  if (!vec_const_128bit_to_bytes (op, mode, &vsx_const))
654    return false;
655
656  if (constant_generates_xxspltiw (&vsx_const))
657    return true;
658
659  if (constant_generates_xxspltidp (&vsx_const))
660    return true;
661
662  return false;
663})
664
665;; Return 1 if the operand is a special IEEE 128-bit value that can be loaded
666;; via the LXVKQ instruction.
667
668(define_predicate "easy_vector_constant_ieee128"
669  (match_code "const_vector,const_double")
670{
671  vec_const_128bit_type vsx_const;
672
673  /* Can we generate the LXVKQ instruction?  */
674  if (!TARGET_IEEE128_CONSTANT || !TARGET_FLOAT128_HW || !TARGET_POWER10
675      || !TARGET_VSX)
676    return false;
677
678  return (vec_const_128bit_to_bytes (op, mode, &vsx_const)
679            && constant_generates_lxvkq (&vsx_const) != 0);
680})
681
682;; Return 1 if the operand is a constant that can loaded with a XXSPLTIB
683;; instruction and then a VUPKHSB, VECSB2W or VECSB2D instruction.
684
685(define_predicate "xxspltib_constant_split"
686  (match_code "const_vector,vec_duplicate,const_int")
687{
688  int value = 256;
689  int num_insns = -1;
690
691  if (!xxspltib_constant_p (op, mode, &num_insns, &value))
692    return false;
693
694  return num_insns > 1;
695})
696
697
698;; Return 1 if the operand is constant that can loaded directly with a XXSPLTIB
699;; instruction.
700
701(define_predicate "xxspltib_constant_nosplit"
702  (match_code "const_vector,vec_duplicate,const_int")
703{
704  int value = 256;
705  int num_insns = -1;
706
707  if (!xxspltib_constant_p (op, mode, &num_insns, &value))
708    return false;
709
710  return num_insns == 1;
711})
712
713;; Return 1 if the operand is a CONST_VECTOR and can be loaded into a
714;; vector register without using memory.
715(define_predicate "easy_vector_constant"
716  (match_code "const_vector")
717{
718  if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
719    {
720      int value = 256;
721      int num_insns = -1;
722
723      if (zero_constant (op, mode) || all_ones_constant (op, mode))
724          return true;
725
726      /* Constants that can be generated with ISA 3.1 instructions are
727         easy.  */
728      vec_const_128bit_type vsx_const;
729      if (TARGET_POWER10 && vec_const_128bit_to_bytes (op, mode, &vsx_const))
730          {
731            if (constant_generates_lxvkq (&vsx_const))
732              return true;
733
734            if (constant_generates_xxspltiw (&vsx_const))
735              return true;
736
737            if (constant_generates_xxspltidp (&vsx_const))
738              return true;
739          }
740
741      if (TARGET_P9_VECTOR
742          && xxspltib_constant_p (op, mode, &num_insns, &value))
743          return true;
744
745      return easy_altivec_constant (op, mode);
746    }
747
748  return false;
749})
750
751;; Same as easy_vector_constant but only for EASY_VECTOR_15_ADD_SELF.
752(define_predicate "easy_vector_constant_add_self"
753  (and (match_code "const_vector")
754       (and (match_test "TARGET_ALTIVEC")
755              (match_test "easy_altivec_constant (op, mode)")))
756{
757  HOST_WIDE_INT val;
758  int elt;
759  if (mode == V2DImode || mode == V2DFmode)
760    return 0;
761  elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0;
762  val = const_vector_elt_as_int (op, elt);
763  val = ((val & 0xff) ^ 0x80) - 0x80;
764  return EASY_VECTOR_15_ADD_SELF (val);
765})
766
767;; Same as easy_vector_constant but only for EASY_VECTOR_MSB.
768(define_predicate "easy_vector_constant_msb"
769  (and (match_code "const_vector")
770       (and (match_test "TARGET_ALTIVEC")
771              (match_test "easy_altivec_constant (op, mode)")
772              (match_test "vspltis_shifted (op) == 0")))
773{
774  HOST_WIDE_INT val;
775  int elt, sz = easy_altivec_constant (op, mode);
776  machine_mode inner = GET_MODE_INNER (mode);
777  int isz = GET_MODE_SIZE (inner);
778  if (mode == V2DImode || mode == V2DFmode)
779    return 0;
780  elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0;
781  if (isz < sz)
782    {
783      if (const_vector_elt_as_int (op, elt) != 0)
784          return 0;
785      elt += (BYTES_BIG_ENDIAN ? -1 : 1) * (sz - isz) / isz;
786    }
787  else if (isz > sz)
788    inner = smallest_int_mode_for_size (sz * BITS_PER_UNIT);
789  val = const_vector_elt_as_int (op, elt);
790  return EASY_VECTOR_MSB (val, inner);
791})
792
793;; Return true if this is an easy altivec constant that we form
794;; by using VSLDOI.
795(define_predicate "easy_vector_constant_vsldoi"
796  (and (match_code "const_vector")
797       (and (match_test "TARGET_ALTIVEC")
798              (and (match_test "easy_altivec_constant (op, mode)")
799                     (match_test "vspltis_shifted (op) != 0")))))
800
801;; Return true if this is a vector constant and each byte in
802;; it is the same.
803(define_predicate "const_vector_each_byte_same"
804  (match_code "const_vector")
805{
806  rtx elt;
807  if (!const_vec_duplicate_p (op, &elt))
808    return false;
809
810  machine_mode emode = GET_MODE_INNER (mode);
811  unsigned HOST_WIDE_INT eval;
812  if (CONST_INT_P (elt))
813    eval = INTVAL (elt);
814  else if (CONST_DOUBLE_AS_FLOAT_P (elt))
815    {
816      gcc_assert (emode == SFmode || emode == DFmode);
817      long l[2];
818      real_to_target (l, CONST_DOUBLE_REAL_VALUE (elt), emode);
819      /* real_to_target puts 32-bit pieces in each long.  */
820      eval = zext_hwi (l[0], 32);
821      eval |= zext_hwi (l[1], 32) << 32;
822    }
823  else
824    return false;
825
826  unsigned int esize = GET_MODE_SIZE (emode);
827  unsigned char byte0 = eval & 0xff;
828  for (unsigned int i = 1; i < esize; i++)
829    {
830      eval >>= BITS_PER_UNIT;
831      if (byte0 != (eval & 0xff))
832          return false;
833    }
834
835  return true;
836})
837
838;; Return 1 if operand is a vector int register or is either a vector constant
839;; of all 0 bits of a vector constant of all 1 bits.
840(define_predicate "vector_int_reg_or_same_bit"
841  (match_code "reg,subreg,const_vector")
842{
843  if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT)
844    return 0;
845
846  else if (REG_P (op) || SUBREG_P (op))
847    return vint_operand (op, mode);
848
849  else
850    return op == CONST0_RTX (mode) || op == CONSTM1_RTX (mode);
851})
852
853;; Return 1 if operand is 0.0.
854(define_predicate "zero_fp_constant"
855  (and (match_code "const_double")
856       (match_test "SCALAR_FLOAT_MODE_P (mode)
857                        && op == CONST0_RTX (mode)")))
858
859;; Return 1 if the operand is in volatile memory.  Note that during the
860;; RTL generation phase, memory_operand does not return TRUE for volatile
861;; memory references.  So this function allows us to recognize volatile
862;; references where it's safe.
863(define_predicate "volatile_mem_operand"
864  (and (match_code "mem")
865       (match_test "MEM_VOLATILE_P (op)")
866       (if_then_else (match_test "reload_completed")
867           (match_operand 0 "memory_operand")
868           (match_test "memory_address_p (mode, XEXP (op, 0))"))))
869
870;; Return 1 if the operand is a volatile or non-volatile memory operand.
871(define_predicate "any_memory_operand"
872  (ior (match_operand 0 "memory_operand")
873       (match_operand 0 "volatile_mem_operand")))
874
875;; Return 1 if the operand is an offsettable memory operand.
876(define_predicate "offsettable_mem_operand"
877  (and (match_operand 0 "any_memory_operand")
878       (match_test "offsettable_nonstrict_memref_p (op)")))
879
880;; Return 1 if the operand is a simple offsettable memory operand
881;; that does not include pre-increment, post-increment, etc.
882(define_predicate "simple_offsettable_mem_operand"
883  (match_operand 0 "offsettable_mem_operand")
884{
885  rtx addr = XEXP (op, 0);
886
887  if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
888    return 0;
889
890  if (!CONSTANT_P (XEXP (addr, 1)))
891    return 0;
892
893  return base_reg_operand (XEXP (addr, 0), Pmode);
894})
895
896;; Return 1 if the operand is suitable for load/store quad memory.
897;; This predicate only checks for non-atomic loads/stores (not lqarx/stqcx).
898(define_predicate "quad_memory_operand"
899  (match_code "mem")
900{
901  if (!TARGET_QUAD_MEMORY && !TARGET_SYNC_TI)
902    return false;
903
904  if (GET_MODE_SIZE (mode) != 16 || !MEM_P (op) || MEM_ALIGN (op) < 128)
905    return false;
906
907  return quad_address_p (XEXP (op, 0), mode, false);
908})
909
910;; Return 1 if the operand is suitable for load/store to vector registers with
911;; d-form addressing (register+offset), which was added in ISA 3.0.
912;; Unlike quad_memory_operand, we do not have to check for alignment.
913(define_predicate "vsx_quad_dform_memory_operand"
914  (match_code "mem")
915{
916  if (!TARGET_P9_VECTOR)
917    return false;
918
919  return quad_address_p (XEXP (op, 0), mode, false);
920})
921
922;; Return 1 if the operand is an indexed or indirect memory operand.
923(define_predicate "indexed_or_indirect_operand"
924  (match_code "mem")
925{
926  op = XEXP (op, 0);
927  if (VECTOR_MEM_ALTIVEC_P (mode)
928      && GET_CODE (op) == AND
929      && CONST_INT_P (XEXP (op, 1))
930      && INTVAL (XEXP (op, 1)) == -16)
931    op = XEXP (op, 0);
932
933  return indexed_or_indirect_address (op, mode);
934})
935
936;; Like indexed_or_indirect_operand, but also allow a GPR register if direct
937;; moves are supported.
938(define_predicate "reg_or_indexed_operand"
939  (match_code "mem,reg,subreg")
940{
941  if (MEM_P (op))
942    return indexed_or_indirect_operand (op, mode);
943  else if (TARGET_DIRECT_MOVE)
944    return register_operand (op, mode);
945  return
946    0;
947})
948
949;; Return 1 if the operand is an indexed or indirect memory operand with an
950;; AND -16 in it, used to recognize when we need to switch to Altivec loads
951;; to realign loops instead of VSX (altivec silently ignores the bottom bits,
952;; while VSX uses the full address and traps)
953(define_predicate "altivec_indexed_or_indirect_operand"
954  (match_code "mem")
955{
956  op = XEXP (op, 0);
957  if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
958      && GET_CODE (op) == AND
959      && CONST_INT_P (XEXP (op, 1))
960      && INTVAL (XEXP (op, 1)) == -16)
961    return indexed_or_indirect_address (XEXP (op, 0), mode);
962
963  return 0;
964})
965
966;; Return 1 if the operand is an indexed or indirect address.
967(define_special_predicate "indexed_or_indirect_address"
968  (and (match_test "REG_P (op)
969                        || (GET_CODE (op) == PLUS
970                              /* Omit testing REG_P (XEXP (op, 0)).  */
971                              && REG_P (XEXP (op, 1)))")
972       (match_operand 0 "address_operand")))
973
974;; Return 1 if the operand is an index-form address.
975(define_special_predicate "indexed_address"
976  (match_test "(GET_CODE (op) == PLUS
977                    && REG_P (XEXP (op, 0))
978                    && REG_P (XEXP (op, 1)))"))
979
980;; Return 1 if the operand is a MEM with an update-form address. This may
981;; also include update-indexed form.
982(define_special_predicate "update_address_mem"
983  (match_test "(MEM_P (op)
984                    && (GET_CODE (XEXP (op, 0)) == PRE_INC
985                        || GET_CODE (XEXP (op, 0)) == PRE_DEC
986                        || GET_CODE (XEXP (op, 0)) == PRE_MODIFY))"))
987
988;; Anything that matches memory_operand but does not update the address.
989(define_predicate "non_update_memory_operand"
990  (match_code "mem")
991{
992  if (update_address_mem (op, mode))
993    return 0;
994  return memory_operand (op, mode);
995})
996
997;; Return 1 if the operand is a MEM with an indexed-form address.
998(define_special_predicate "indexed_address_mem"
999  (match_test "(MEM_P (op)
1000                    && (indexed_address (XEXP (op, 0), mode)
1001                        || (GET_CODE (XEXP (op, 0)) == PRE_MODIFY
1002                              && indexed_address (XEXP (XEXP (op, 0), 1), mode))))"))
1003
1004;; Return 1 if the operand is either a non-special register or can be used
1005;; as the operand of a `mode' add insn.
1006(define_predicate "add_operand"
1007  (if_then_else (match_code "const_int")
1008    (match_test "satisfies_constraint_I (op)
1009                     || satisfies_constraint_L (op)
1010                     || satisfies_constraint_eI (op)")
1011    (match_operand 0 "gpc_reg_operand")))
1012
1013;; Return 1 if the operand is either a non-special register, or 0, or -1.
1014(define_predicate "adde_operand"
1015  (if_then_else (match_code "const_int")
1016    (match_test "INTVAL (op) == 0 || INTVAL (op) == -1")
1017    (match_operand 0 "gpc_reg_operand")))
1018
1019;; Return 1 if OP is a constant but not a valid add_operand.
1020(define_predicate "non_add_cint_operand"
1021  (and (match_code "const_int")
1022       (not (match_operand 0 "add_operand"))))
1023
1024;; Return 1 if the operand is a constant that can be used as the operand
1025;; of an AND, OR or XOR.
1026(define_predicate "logical_const_operand"
1027  (match_code "const_int")
1028{
1029  HOST_WIDE_INT opl;
1030
1031  opl = INTVAL (op) & GET_MODE_MASK (mode);
1032
1033  return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0
1034            || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0);
1035})
1036
1037;; Return 1 if the operand is a non-special register or a constant that
1038;; can be used as the operand of an AND, OR or XOR.
1039(define_predicate "logical_operand"
1040  (ior (match_operand 0 "gpc_reg_operand")
1041       (match_operand 0 "logical_const_operand")))
1042
1043;; Return 1 if op is a constant that is not a logical operand, but could
1044;; be split into one.
1045(define_predicate "non_logical_cint_operand"
1046  (and (match_code "const_int,const_wide_int")
1047       (and (not (match_operand 0 "logical_operand"))
1048              (match_operand 0 "reg_or_logical_cint_operand"))))
1049
1050;; Return 1 if the operand is either a non-special register or a
1051;; constant that can be used as the operand of a logical AND.
1052(define_predicate "and_operand"
1053  (ior (and (match_code "const_int")
1054              (match_test "rs6000_is_valid_and_mask (op, mode)"))
1055       (if_then_else (match_test "fixed_regs[CR0_REGNO]")
1056           (match_operand 0 "gpc_reg_operand")
1057           (match_operand 0 "logical_operand"))))
1058
1059;; Return 1 if the operand is either a logical operand or a short cint operand.
1060(define_predicate "scc_eq_operand"
1061  (ior (match_operand 0 "logical_operand")
1062       (match_operand 0 "short_cint_operand")))
1063
1064;; Return 1 if the operand is a general non-special register or memory operand.
1065(define_predicate "reg_or_mem_operand"
1066  (ior (match_operand 0 "gpc_reg_operand")
1067       (match_operand 0 "any_memory_operand")
1068       (and (match_code "mem")
1069              (match_test "macho_lo_sum_memory_operand (op, mode)"))))
1070
1071;; Return 1 if the operand is CONST_DOUBLE 0, register or memory operand.
1072(define_predicate "zero_reg_mem_operand"
1073  (ior (and (match_test "TARGET_VSX")
1074              (match_operand 0 "zero_fp_constant"))
1075       (match_operand 0 "reg_or_mem_operand")))
1076
1077;; Return 1 if the operand is a CONST_INT and it is the element for 64-bit
1078;; data types inside of a vector that scalar instructions operate on
1079(define_predicate "vsx_scalar_64bit"
1080  (match_code "const_int")
1081{
1082  return (INTVAL (op) == VECTOR_ELEMENT_SCALAR_64BIT);
1083})
1084
1085;; Return 1 if the operand is a general register or memory operand without
1086;; pre_inc or pre_dec or pre_modify, which produces invalid form of PowerPC
1087;; lwa instruction.
1088(define_predicate "lwa_operand"
1089  (match_code "reg,subreg,mem")
1090{
1091  rtx inner, addr, offset;
1092
1093  inner = op;
1094  if (reload_completed && SUBREG_P (inner))
1095    inner = SUBREG_REG (inner);
1096
1097  if (gpc_reg_operand (inner, mode))
1098    return true;
1099  if (!any_memory_operand (inner, mode))
1100    return false;
1101
1102  addr = XEXP (inner, 0);
1103
1104  /* The LWA instruction uses the DS-form instruction format which requires
1105     that the bottom two bits of the offset must be 0.  The prefixed PLWA does
1106     not have this restriction.  While the actual load from memory is 32-bits,
1107     we pass in DImode here to test for using a DS instruction.  */
1108  if (address_is_prefixed (addr, DImode, NON_PREFIXED_DS))
1109    return true;
1110
1111  if (GET_CODE (addr) == PRE_INC
1112      || GET_CODE (addr) == PRE_DEC
1113      || (GET_CODE (addr) == PRE_MODIFY
1114            && !legitimate_indexed_address_p (XEXP (addr, 1), 0)))
1115    return false;
1116  if (GET_CODE (addr) == LO_SUM
1117      && REG_P (XEXP (addr, 0))
1118      && GET_CODE (XEXP (addr, 1)) == CONST)
1119    addr = XEXP (XEXP (addr, 1), 0);
1120  if (GET_CODE (addr) != PLUS)
1121    return true;
1122  offset = XEXP (addr, 1);
1123  if (!CONST_INT_P (offset))
1124    return true;
1125  return INTVAL (offset) % 4 == 0;
1126})
1127
1128;; Return 1 if the operand, used inside a MEM, is a SYMBOL_REF.
1129(define_predicate "symbol_ref_operand"
1130  (and (match_code "symbol_ref")
1131       (match_test "(mode == VOIDmode || GET_MODE (op) == mode)
1132                        && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))")))
1133
1134;; Return 1 if op is an operand that can be loaded via the GOT.
1135;; or non-special register field no cr0
1136(define_predicate "got_operand"
1137  (match_code "symbol_ref,const,label_ref"))
1138
1139;; Return 1 if op is a simple reference that can be loaded via the GOT,
1140;; excluding labels involving addition.
1141(define_predicate "got_no_const_operand"
1142  (match_code "symbol_ref,label_ref"))
1143
1144;; Return 1 if op is a SYMBOL_REF for a TLS symbol.
1145(define_predicate "rs6000_tls_symbol_ref"
1146  (and (match_code "symbol_ref")
1147       (match_test "RS6000_SYMBOL_REF_TLS_P (op)")))
1148
1149;; Return 1 for the CONST_INT or UNSPEC second CALL operand.
1150;; Prevents unwanted substitution of the unspec got_reg arg.
1151(define_predicate "unspec_tls"
1152  (match_code "const_int,unspec")
1153{
1154  if (CONST_INT_P (op))
1155    return 1;
1156  if (XINT (op, 1) == UNSPEC_TLSGD)
1157    return REG_P (XVECEXP (op, 0, 1)) || XVECEXP (op, 0, 1) == const0_rtx;
1158  if (XINT (op, 1) == UNSPEC_TLSLD)
1159    return REG_P (XVECEXP (op, 0, 0)) || XVECEXP (op, 0, 0) == const0_rtx;
1160  return 0;
1161})
1162
1163;; Return 1 if the operand, used inside a MEM, is a valid first argument
1164;; to CALL.  This is a SYMBOL_REF, a pseudo-register, LR or CTR.
1165(define_predicate "call_operand"
1166  (if_then_else (match_code "reg")
1167     (match_test "REGNO (op) == LR_REGNO
1168                      || REGNO (op) == CTR_REGNO
1169                      || !HARD_REGISTER_P (op)")
1170     (match_code "symbol_ref")))
1171
1172;; Return 1 if the operand, used inside a MEM, is a valid first argument
1173;; to an indirect CALL.  This is LR, CTR, or a PLTSEQ unspec using CTR.
1174(define_predicate "indirect_call_operand"
1175  (match_code "reg,unspec")
1176{
1177  if (REG_P (op))
1178    return (REGNO (op) == LR_REGNO
1179              || REGNO (op) == CTR_REGNO);
1180  if (GET_CODE (op) == UNSPEC)
1181    {
1182      if (XINT (op, 1) != UNSPEC_PLTSEQ)
1183          return false;
1184      op = XVECEXP (op, 0, 0);
1185      return REG_P (op) && REGNO (op) == CTR_REGNO;
1186    }
1187  return false;
1188})
1189
1190;; Return 1 if the operand is a SYMBOL_REF for a function known to be in
1191;; this file.
1192(define_predicate "current_file_function_operand"
1193  (and (match_code "symbol_ref")
1194       (match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
1195                        && (SYMBOL_REF_LOCAL_P (op)
1196                              || (op == XEXP (DECL_RTL (current_function_decl), 0)
1197                                  && !decl_replaceable_p (current_function_decl,
1198                                                                opt_for_fn (current_function_decl,
1199                                                                                flag_semantic_interposition))))
1200                        && !((DEFAULT_ABI == ABI_AIX
1201                                || DEFAULT_ABI == ABI_ELFv2)
1202                               && (SYMBOL_REF_EXTERNAL_P (op)
1203                                   || SYMBOL_REF_WEAK (op)))
1204                        && !(DEFAULT_ABI == ABI_ELFv2
1205                               && SYMBOL_REF_DECL (op) != NULL
1206                               && TREE_CODE (SYMBOL_REF_DECL (op)) == FUNCTION_DECL
1207                               && (rs6000_fndecl_pcrel_p (SYMBOL_REF_DECL (op))
1208                                   != rs6000_pcrel_p ()))")))
1209
1210;; Return 1 if this operand is a valid input for a move insn.
1211(define_predicate "input_operand"
1212  (match_code "symbol_ref,const,reg,subreg,mem,
1213                 const_double,const_wide_int,const_vector,const_int")
1214{
1215  /* Memory is always valid.  */
1216  if (any_memory_operand (op, mode))
1217    return 1;
1218
1219  /* For floating-point, easy constants are valid.  */
1220  if (SCALAR_FLOAT_MODE_P (mode)
1221      && easy_fp_constant (op, mode))
1222    return 1;
1223
1224  /* Allow any integer constant.  */
1225  if (SCALAR_INT_MODE_P (mode) && CONST_SCALAR_INT_P (op))
1226    return 1;
1227
1228  /* Allow easy vector constants.  */
1229  if (GET_CODE (op) == CONST_VECTOR
1230      && easy_vector_constant (op, mode))
1231    return 1;
1232
1233  /* For floating-point or multi-word mode, the only remaining valid type
1234     is a register.  */
1235  if (SCALAR_FLOAT_MODE_P (mode)
1236      || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
1237    return register_operand (op, mode);
1238
1239  /* We don't allow moving the carry bit around.  */
1240  if (ca_operand (op, mode))
1241    return 0;
1242
1243  /* The only cases left are integral modes one word or smaller (we
1244     do not get called for MODE_CC values).  These can be in any
1245     register.  */
1246  if (register_operand (op, mode))
1247    return 1;
1248
1249  /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
1250     to be valid.  */
1251  if (DEFAULT_ABI == ABI_V4
1252      && (SYMBOL_REF_P (op) || GET_CODE (op) == CONST)
1253      && small_data_operand (op, Pmode))
1254    return 1;
1255
1256  return 0;
1257})
1258
1259;; Return 1 if this operand is a valid input for a vsx_splat insn.
1260(define_predicate "splat_input_operand"
1261  (match_code "reg,subreg,mem")
1262{
1263  machine_mode vmode;
1264
1265  if (mode == DFmode)
1266    vmode = V2DFmode;
1267  else if (mode == DImode)
1268    vmode = V2DImode;
1269  else if (mode == SImode && TARGET_P9_VECTOR)
1270    vmode = V4SImode;
1271  else if (mode == SFmode && TARGET_P9_VECTOR)
1272    vmode = V4SFmode;
1273  else
1274    return false;
1275
1276  if (MEM_P (op))
1277    {
1278      rtx addr = XEXP (op, 0);
1279
1280      if (! volatile_ok && MEM_VOLATILE_P (op))
1281          return 0;
1282
1283      if (lra_in_progress || reload_completed)
1284          return indexed_or_indirect_address (addr, vmode);
1285      else
1286          return memory_address_addr_space_p (vmode, addr, MEM_ADDR_SPACE (op));
1287    }
1288  return gpc_reg_operand (op, mode);
1289})
1290
1291;; Return 1 if this operand is valid for a MMA assemble accumulator insn.
1292(define_special_predicate "mma_assemble_input_operand"
1293  (match_test "(mode == V16QImode
1294                    && (vsx_register_operand (op, mode)
1295                        || (MEM_P (op)
1296                              && (indexed_or_indirect_address (XEXP (op, 0), mode)
1297                                  || quad_address_p (XEXP (op, 0), mode, false)))))"))
1298
1299;; Return 1 if this operand is valid for an MMA disassemble insn.
1300(define_predicate "mma_disassemble_output_operand"
1301  (match_code "reg,subreg,mem")
1302{
1303  if (MEM_P (op))
1304    {
1305      rtx  addr = XEXP (op, 0);
1306      return indexed_or_indirect_address (addr, mode)
1307               || quad_address_p (addr, mode, false);
1308    }
1309
1310  if (SUBREG_P (op))
1311    op = SUBREG_REG (op);
1312
1313  return vsx_register_operand (op, mode);
1314})
1315
1316;; Return true if operand is an operator used in rotate-and-mask instructions.
1317(define_predicate "rotate_mask_operator"
1318  (match_code "rotate,ashift,lshiftrt"))
1319
1320;; Return true if operand is boolean operator.
1321(define_predicate "boolean_operator"
1322  (match_code "and,ior,xor"))
1323
1324;; Return true if operand is OR-form of boolean operator.
1325(define_predicate "boolean_or_operator"
1326  (match_code "ior,xor"))
1327
1328;; Return true if operand is an equality operator.
1329(define_special_predicate "equality_operator"
1330  (match_code "eq,ne"))
1331
1332;; Return 1 if OP is a comparison operation that is valid for a branch
1333;; instruction.  We check the opcode against the mode of the CC value.
1334;; validate_condition_mode is an assertion.
1335(define_predicate "branch_comparison_operator"
1336   (and (match_operand 0 "comparison_operator")
1337          (match_test "GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC")
1338          (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode")
1339            (if_then_else (match_test "flag_finite_math_only")
1340              (match_code "lt,le,gt,ge,eq,ne,unordered,ordered")
1341              (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered"))
1342            (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne"))
1343          (match_test "validate_condition_mode (GET_CODE (op),
1344                                                        GET_MODE (XEXP (op, 0))),
1345                         1")))
1346
1347;; Return 1 if OP is a comparison that needs an extra instruction to do (a
1348;; crlogical or an extra branch).
1349(define_predicate "extra_insn_branch_comparison_operator"
1350   (and (match_operand 0 "comparison_operator")
1351          (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode")
1352          (match_code "ltgt,le,ge,unlt,ungt,uneq")
1353          (match_test "validate_condition_mode (GET_CODE (op),
1354                                                        GET_MODE (XEXP (op, 0))),
1355                         1")))
1356
1357;; Return 1 if OP is an unsigned comparison operator.
1358(define_predicate "unsigned_comparison_operator"
1359  (match_code "ltu,gtu,leu,geu"))
1360
1361;; Return 1 if OP is a signed comparison operator.
1362(define_predicate "signed_comparison_operator"
1363  (match_code "lt,gt,le,ge"))
1364
1365;; Return 1 if OP is a signed comparison or an equality operator.
1366(define_predicate "signed_or_equality_comparison_operator"
1367  (ior (match_operand 0 "equality_operator")
1368       (match_operand 0 "signed_comparison_operator")))
1369
1370;; Return 1 if OP is an unsigned comparison or an equality operator.
1371(define_predicate "unsigned_or_equality_comparison_operator"
1372  (ior (match_operand 0 "equality_operator")
1373       (match_operand 0 "unsigned_comparison_operator")))
1374
1375;; Return 1 if OP is a comparison operation that is valid for an SCC insn --
1376;; it must be a positive comparison.
1377(define_predicate "scc_comparison_operator"
1378  (and (match_operand 0 "branch_comparison_operator")
1379       (match_code "eq,lt,gt,ltu,gtu,unordered")))
1380
1381;; Return 1 if OP is a comparison operation whose inverse would be valid for
1382;; an SCC insn.
1383(define_predicate "scc_rev_comparison_operator"
1384  (and (match_operand 0 "branch_comparison_operator")
1385       (match_code "ne,le,ge,leu,geu,ordered")))
1386
1387;; Return 1 if OP is a comparison operator suitable for floating point
1388;; vector/scalar comparisons that generate a -1/0 mask.
1389(define_predicate "fpmask_comparison_operator"
1390  (match_code "eq,gt,ge"))
1391
1392;; Return 1 if OP is a comparison operator suitable for vector/scalar
1393;; comparisons that generate a 0/-1 mask (i.e. the inverse of
1394;; fpmask_comparison_operator).
1395(define_predicate "invert_fpmask_comparison_operator"
1396  (match_code "ne,unlt,unle"))
1397
1398;; Return 1 if OP is a comparison operation suitable for integer vector/scalar
1399;; comparisons that generate a -1/0 mask.
1400(define_predicate "vecint_comparison_operator"
1401  (match_code "eq,gt,gtu"))
1402
1403;; Return 1 if OP is a comparison operation that is valid for a branch
1404;; insn, which is true if the corresponding bit in the CC register is set.
1405(define_predicate "branch_positive_comparison_operator"
1406  (and (match_operand 0 "branch_comparison_operator")
1407       (match_code "eq,lt,gt,ltu,gtu,unordered")))
1408
1409;; Return 1 if OP is valid for a save_world call in prologue, known to be
1410;; a PARLLEL.
1411(define_predicate "save_world_operation"
1412  (match_code "parallel")
1413{
1414  int index;
1415  int i;
1416  rtx elt;
1417  int count = XVECLEN (op, 0);
1418
1419  if (count != 54)
1420    return 0;
1421
1422  index = 0;
1423  if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
1424      || GET_CODE (XVECEXP (op, 0, index++)) != USE)
1425    return 0;
1426
1427  for (i=1; i <= 18; i++)
1428    {
1429      elt = XVECEXP (op, 0, index++);
1430      if (GET_CODE (elt) != SET
1431            || !MEM_P (SET_DEST (elt))
1432            || !memory_operand (SET_DEST (elt), DFmode)
1433            || !REG_P (SET_SRC (elt))
1434            || GET_MODE (SET_SRC (elt)) != DFmode)
1435          return 0;
1436    }
1437
1438  for (i=1; i <= 12; i++)
1439    {
1440      elt = XVECEXP (op, 0, index++);
1441      if (GET_CODE (elt) != SET
1442            || !MEM_P (SET_DEST (elt))
1443            || !REG_P (SET_SRC (elt))
1444            || GET_MODE (SET_SRC (elt)) != V4SImode)
1445          return 0;
1446    }
1447
1448  for (i=1; i <= 19; i++)
1449    {
1450      elt = XVECEXP (op, 0, index++);
1451      if (GET_CODE (elt) != SET
1452            || !MEM_P (SET_DEST (elt))
1453            || !memory_operand (SET_DEST (elt), Pmode)
1454            || !REG_P (SET_SRC (elt))
1455            || GET_MODE (SET_SRC (elt)) != Pmode)
1456          return 0;
1457    }
1458
1459  elt = XVECEXP (op, 0, index++);
1460  if (GET_CODE (elt) != SET
1461      || !MEM_P (SET_DEST (elt))
1462      || !memory_operand (SET_DEST (elt), Pmode)
1463      || !REG_P (SET_SRC (elt))
1464      || REGNO (SET_SRC (elt)) != CR2_REGNO
1465      || GET_MODE (SET_SRC (elt)) != Pmode)
1466    return 0;
1467
1468  if (GET_CODE (XVECEXP (op, 0, index++)) != SET
1469      || GET_CODE (XVECEXP (op, 0, index++)) != SET)
1470    return 0;
1471  return 1;
1472})
1473
1474;; Return 1 if OP is valid for a restore_world call in epilogue, known to be
1475;; a PARLLEL.
1476(define_predicate "restore_world_operation"
1477  (match_code "parallel")
1478{
1479  int index;
1480  int i;
1481  rtx elt;
1482  int count = XVECLEN (op, 0);
1483
1484  if (count != 58)
1485    return 0;
1486
1487  index = 0;
1488  if (GET_CODE (XVECEXP (op, 0, index++)) != RETURN
1489      || GET_CODE (XVECEXP (op, 0, index++)) != USE
1490      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER)
1491    return 0;
1492
1493  elt = XVECEXP (op, 0, index++);
1494  if (GET_CODE (elt) != SET
1495      || !MEM_P (SET_SRC (elt))
1496      || !memory_operand (SET_SRC (elt), Pmode)
1497      || !REG_P (SET_DEST (elt))
1498      || REGNO (SET_DEST (elt)) != CR2_REGNO
1499      || GET_MODE (SET_DEST (elt)) != Pmode)
1500    return 0;
1501
1502  for (i=1; i <= 19; i++)
1503    {
1504      elt = XVECEXP (op, 0, index++);
1505      if (GET_CODE (elt) != SET
1506            || !MEM_P (SET_SRC (elt))
1507            || !memory_operand (SET_SRC (elt), Pmode)
1508            || !REG_P (SET_DEST (elt))
1509            || GET_MODE (SET_DEST (elt)) != Pmode)
1510          return 0;
1511    }
1512
1513  for (i=1; i <= 12; i++)
1514    {
1515      elt = XVECEXP (op, 0, index++);
1516      if (GET_CODE (elt) != SET
1517            || !MEM_P (SET_SRC (elt))
1518            || !REG_P (SET_DEST (elt))
1519            || GET_MODE (SET_DEST (elt)) != V4SImode)
1520          return 0;
1521    }
1522
1523  for (i=1; i <= 18; i++)
1524    {
1525      elt = XVECEXP (op, 0, index++);
1526      if (GET_CODE (elt) != SET
1527            || !MEM_P (SET_SRC (elt))
1528            || !memory_operand (SET_SRC (elt), DFmode)
1529            || !REG_P (SET_DEST (elt))
1530            || GET_MODE (SET_DEST (elt)) != DFmode)
1531          return 0;
1532    }
1533
1534  if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
1535      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
1536      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
1537      || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
1538      || GET_CODE (XVECEXP (op, 0, index++)) != USE)
1539    return 0;
1540  return 1;
1541})
1542
1543;; Return 1 if OP is valid for a vrsave call, known to be a PARALLEL.
1544(define_predicate "vrsave_operation"
1545  (match_code "parallel")
1546{
1547  int count = XVECLEN (op, 0);
1548  unsigned int dest_regno, src_regno;
1549  int i;
1550
1551  if (count <= 1
1552      || GET_CODE (XVECEXP (op, 0, 0)) != SET
1553      || !REG_P (SET_DEST (XVECEXP (op, 0, 0)))
1554      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE
1555      || XINT (SET_SRC (XVECEXP (op, 0, 0)), 1) != UNSPECV_SET_VRSAVE)
1556    return 0;
1557
1558  dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
1559  src_regno  = REGNO (XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 1));
1560
1561  if (dest_regno != VRSAVE_REGNO || src_regno != VRSAVE_REGNO)
1562    return 0;
1563
1564  for (i = 1; i < count; i++)
1565    {
1566      rtx elt = XVECEXP (op, 0, i);
1567
1568      if (GET_CODE (elt) != CLOBBER
1569            && GET_CODE (elt) != SET)
1570          return 0;
1571    }
1572
1573  return 1;
1574})
1575
1576;; Return 1 if OP is valid for mfcr insn, known to be a PARALLEL.
1577(define_predicate "mfcr_operation"
1578  (match_code "parallel")
1579{
1580  int count = XVECLEN (op, 0);
1581  int i;
1582
1583  /* Perform a quick check so we don't blow up below.  */
1584  if (count < 1
1585      || GET_CODE (XVECEXP (op, 0, 0)) != SET
1586      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
1587      || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
1588    return 0;
1589
1590  for (i = 0; i < count; i++)
1591    {
1592      rtx exp = XVECEXP (op, 0, i);
1593      rtx unspec;
1594      int maskval;
1595      rtx src_reg;
1596
1597      src_reg = XVECEXP (SET_SRC (exp), 0, 0);
1598
1599      if (!REG_P (src_reg)
1600            || GET_MODE (src_reg) != CCmode
1601            || ! CR_REGNO_P (REGNO (src_reg)))
1602          return 0;
1603
1604      if (GET_CODE (exp) != SET
1605            || !REG_P (SET_DEST (exp))
1606            || GET_MODE (SET_DEST (exp)) != SImode
1607            || ! INT_REGNO_P (REGNO (SET_DEST (exp))))
1608          return 0;
1609      unspec = SET_SRC (exp);
1610      maskval = 1 << (MAX_CR_REGNO - REGNO (src_reg));
1611
1612      if (GET_CODE (unspec) != UNSPEC
1613            || XINT (unspec, 1) != UNSPEC_MOVESI_FROM_CR
1614            || XVECLEN (unspec, 0) != 2
1615            || XVECEXP (unspec, 0, 0) != src_reg
1616            || !CONST_INT_P (XVECEXP (unspec, 0, 1))
1617            || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
1618          return 0;
1619    }
1620  return 1;
1621})
1622
1623;; Return 1 if OP is valid for mtcrf insn, known to be a PARALLEL.
1624(define_predicate "mtcrf_operation"
1625  (match_code "parallel")
1626{
1627  int count = XVECLEN (op, 0);
1628  int i;
1629  rtx src_reg;
1630
1631  /* Perform a quick check so we don't blow up below.  */
1632  if (count < 1
1633      || GET_CODE (XVECEXP (op, 0, 0)) != SET
1634      || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
1635      || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
1636    return 0;
1637  src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
1638
1639  if (!REG_P (src_reg)
1640      || GET_MODE (src_reg) != SImode
1641      || ! INT_REGNO_P (REGNO (src_reg)))
1642    return 0;
1643
1644  for (i = 0; i < count; i++)
1645    {
1646      rtx exp = XVECEXP (op, 0, i);
1647      rtx unspec;
1648      int maskval;
1649
1650      if (GET_CODE (exp) != SET
1651            || !REG_P (SET_DEST (exp))
1652            || GET_MODE (SET_DEST (exp)) != CCmode
1653            || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
1654          return 0;
1655      unspec = SET_SRC (exp);
1656      maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
1657
1658      if (GET_CODE (unspec) != UNSPEC
1659            || XINT (unspec, 1) != UNSPEC_MOVESI_TO_CR
1660            || XVECLEN (unspec, 0) != 2
1661            || XVECEXP (unspec, 0, 0) != src_reg
1662            || !CONST_INT_P (XVECEXP (unspec, 0, 1))
1663            || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
1664          return 0;
1665    }
1666  return 1;
1667})
1668
1669;; Return 1 if OP is valid for crsave insn, known to be a PARALLEL.
1670(define_predicate "crsave_operation"
1671  (match_code "parallel")
1672{
1673  int count = XVECLEN (op, 0);
1674  int i;
1675
1676  for (i = 1; i < count; i++)
1677    {
1678      rtx exp = XVECEXP (op, 0, i);
1679
1680      if (GET_CODE (exp) != USE
1681            || !REG_P (XEXP (exp, 0))
1682            || GET_MODE (XEXP (exp, 0)) != CCmode
1683            || ! CR_REGNO_P (REGNO (XEXP (exp, 0))))
1684          return 0;
1685    }
1686  return 1;
1687})
1688
1689;; Return 1 if OP is valid for lmw insn, known to be a PARALLEL.
1690(define_predicate "lmw_operation"
1691  (match_code "parallel")
1692{
1693  int count = XVECLEN (op, 0);
1694  unsigned int dest_regno;
1695  rtx src_addr;
1696  unsigned int base_regno;
1697  HOST_WIDE_INT offset;
1698  int i;
1699
1700  /* Perform a quick check so we don't blow up below.  */
1701  if (count <= 1
1702      || GET_CODE (XVECEXP (op, 0, 0)) != SET
1703      || !REG_P (SET_DEST (XVECEXP (op, 0, 0)))
1704      || !MEM_P (SET_SRC (XVECEXP (op, 0, 0))))
1705    return 0;
1706
1707  dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
1708  src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
1709
1710  if (dest_regno > 31
1711      || count != 32 - (int) dest_regno)
1712    return 0;
1713
1714  if (legitimate_indirect_address_p (src_addr, 0))
1715    {
1716      offset = 0;
1717      base_regno = REGNO (src_addr);
1718      if (base_regno == 0)
1719          return 0;
1720    }
1721  else if (rs6000_legitimate_offset_address_p (SImode, src_addr, false, false))
1722    {
1723      offset = INTVAL (XEXP (src_addr, 1));
1724      base_regno = REGNO (XEXP (src_addr, 0));
1725    }
1726  else
1727    return 0;
1728
1729  for (i = 0; i < count; i++)
1730    {
1731      rtx elt = XVECEXP (op, 0, i);
1732      rtx newaddr;
1733      rtx addr_reg;
1734      HOST_WIDE_INT newoffset;
1735
1736      if (GET_CODE (elt) != SET
1737            || !REG_P (SET_DEST (elt))
1738            || GET_MODE (SET_DEST (elt)) != SImode
1739            || REGNO (SET_DEST (elt)) != dest_regno + i
1740            || !MEM_P (SET_SRC (elt))
1741            || GET_MODE (SET_SRC (elt)) != SImode)
1742          return 0;
1743      newaddr = XEXP (SET_SRC (elt), 0);
1744      if (legitimate_indirect_address_p (newaddr, 0))
1745          {
1746            newoffset = 0;
1747            addr_reg = newaddr;
1748          }
1749      else if (rs6000_legitimate_offset_address_p (SImode, newaddr, false, false))
1750          {
1751            addr_reg = XEXP (newaddr, 0);
1752            newoffset = INTVAL (XEXP (newaddr, 1));
1753          }
1754      else
1755          return 0;
1756      if (REGNO (addr_reg) != base_regno
1757            || newoffset != offset + 4 * i)
1758          return 0;
1759    }
1760
1761  return 1;
1762})
1763
1764;; Return 1 if OP is valid for stmw insn, known to be a PARALLEL.
1765(define_predicate "stmw_operation"
1766  (match_code "parallel")
1767{
1768  int count = XVECLEN (op, 0);
1769  unsigned int src_regno;
1770  rtx dest_addr;
1771  unsigned int base_regno;
1772  HOST_WIDE_INT offset;
1773  int i;
1774
1775  /* Perform a quick check so we don't blow up below.  */
1776  if (count <= 1
1777      || GET_CODE (XVECEXP (op, 0, 0)) != SET
1778      || !MEM_P (SET_DEST (XVECEXP (op, 0, 0)))
1779      || !REG_P (SET_SRC (XVECEXP (op, 0, 0))))
1780    return 0;
1781
1782  src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
1783  dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
1784
1785  if (src_regno > 31
1786      || count != 32 - (int) src_regno)
1787    return 0;
1788
1789  if (legitimate_indirect_address_p (dest_addr, 0))
1790    {
1791      offset = 0;
1792      base_regno = REGNO (dest_addr);
1793      if (base_regno == 0)
1794          return 0;
1795    }
1796  else if (rs6000_legitimate_offset_address_p (SImode, dest_addr, false, false))
1797    {
1798      offset = INTVAL (XEXP (dest_addr, 1));
1799      base_regno = REGNO (XEXP (dest_addr, 0));
1800    }
1801  else
1802    return 0;
1803
1804  for (i = 0; i < count; i++)
1805    {
1806      rtx elt = XVECEXP (op, 0, i);
1807      rtx newaddr;
1808      rtx addr_reg;
1809      HOST_WIDE_INT newoffset;
1810
1811      if (GET_CODE (elt) != SET
1812            || !REG_P (SET_SRC (elt))
1813            || GET_MODE (SET_SRC (elt)) != SImode
1814            || REGNO (SET_SRC (elt)) != src_regno + i
1815            || !MEM_P (SET_DEST (elt))
1816            || GET_MODE (SET_DEST (elt)) != SImode)
1817          return 0;
1818      newaddr = XEXP (SET_DEST (elt), 0);
1819      if (legitimate_indirect_address_p (newaddr, 0))
1820          {
1821            newoffset = 0;
1822            addr_reg = newaddr;
1823          }
1824      else if (rs6000_legitimate_offset_address_p (SImode, newaddr, false, false))
1825          {
1826            addr_reg = XEXP (newaddr, 0);
1827            newoffset = INTVAL (XEXP (newaddr, 1));
1828          }
1829      else
1830          return 0;
1831      if (REGNO (addr_reg) != base_regno
1832            || newoffset != offset + 4 * i)
1833          return 0;
1834    }
1835
1836  return 1;
1837})
1838
1839;; Return 1 if OP is a stack tie operand.
1840(define_predicate "tie_operand"
1841  (match_code "parallel")
1842{
1843  return (GET_CODE (XVECEXP (op, 0, 0)) == SET
1844            && MEM_P (XEXP (XVECEXP (op, 0, 0), 0))
1845            && GET_MODE (XEXP (XVECEXP (op, 0, 0), 0)) == BLKmode
1846            && XEXP (XVECEXP (op, 0, 0), 1) == const0_rtx);
1847})
1848
1849;; Match a small code model toc reference (or medium and large
1850;; model toc references before reload).
1851(define_predicate "small_toc_ref"
1852  (match_code "unspec,plus")
1853{
1854  if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), mode))
1855    op = XEXP (op, 0);
1856
1857  return GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_TOCREL;
1858})
1859
1860
1861;; Match the first insn (addis) in fusing the combination of addis and loads to
1862;; GPR registers on power8.
1863(define_predicate "fusion_gpr_addis"
1864  (match_code "const_int,high,plus")
1865{
1866  HOST_WIDE_INT value;
1867  rtx int_const;
1868
1869  if (GET_CODE (op) == HIGH)
1870    return 1;
1871
1872  if (CONST_INT_P (op))
1873    int_const = op;
1874
1875  else if (GET_CODE (op) == PLUS
1876             && base_reg_operand (XEXP (op, 0), Pmode)
1877             && CONST_INT_P (XEXP (op, 1)))
1878    int_const = XEXP (op, 1);
1879
1880  else
1881    return 0;
1882
1883  value = INTVAL (int_const);
1884  if ((value & (HOST_WIDE_INT)0xffff) != 0)
1885    return 0;
1886
1887  if ((value & (HOST_WIDE_INT)0xffff0000) == 0)
1888    return 0;
1889
1890  /* Power8 only does the fusion if the top 12 bits of the addis value are all
1891     1's or 0's.  */
1892  return (IN_RANGE (value >> 16, -16, 15));
1893})
1894
1895;; Match the second insn (lbz, lhz, lwz, ld) in fusing the combination of addis
1896;; and loads to GPR registers on power8.
1897(define_predicate "fusion_gpr_mem_load"
1898  (match_code "mem,sign_extend,zero_extend")
1899{
1900  rtx addr, base, offset;
1901
1902  /* Handle sign/zero extend.  */
1903  if (GET_CODE (op) == ZERO_EXTEND
1904      || (TARGET_P8_FUSION_SIGN && GET_CODE (op) == SIGN_EXTEND))
1905    {
1906      op = XEXP (op, 0);
1907      mode = GET_MODE (op);
1908    }
1909
1910  if (!MEM_P (op))
1911    return 0;
1912
1913  switch (mode)
1914    {
1915    case E_QImode:
1916    case E_HImode:
1917    case E_SImode:
1918      break;
1919
1920    case E_DImode:
1921      if (!TARGET_POWERPC64)
1922          return 0;
1923      break;
1924
1925    /* Do not allow SF/DFmode in GPR fusion.  While the loads do occur, they
1926       are not common.  */
1927    default:
1928      return 0;
1929    }
1930
1931  addr = XEXP (op, 0);
1932  if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
1933    return 0;
1934
1935  base = XEXP (addr, 0);
1936  if (!base_reg_operand (base, GET_MODE (base)))
1937    return 0;
1938
1939  offset = XEXP (addr, 1);
1940
1941  if (GET_CODE (addr) == PLUS)
1942    return satisfies_constraint_I (offset);
1943
1944  else if (GET_CODE (addr) == LO_SUM)
1945    {
1946      if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64))
1947          return small_toc_ref (offset, GET_MODE (offset));
1948
1949      else if (TARGET_ELF && !TARGET_POWERPC64)
1950          return CONSTANT_P (offset);
1951    }
1952
1953  return 0;
1954})
1955
1956;; Match a GPR load (lbz, lhz, lwz, ld) that uses a combined address in the
1957;; memory field with both the addis and the memory offset.  Sign extension
1958;; is not handled here, since lha and lwa are not fused.
1959(define_predicate "fusion_addis_mem_combo_load"
1960  (match_code "mem,zero_extend")
1961{
1962  rtx addr, base, offset;
1963
1964  /* Handle zero extend.  */
1965  if (GET_CODE (op) == ZERO_EXTEND)
1966    {
1967      op = XEXP (op, 0);
1968      mode = GET_MODE (op);
1969    }
1970
1971  if (!MEM_P (op))
1972    return 0;
1973
1974  switch (mode)
1975    {
1976    case E_QImode:
1977    case E_HImode:
1978    case E_SImode:
1979      break;
1980
1981    /* Do not fuse 64-bit DImode in 32-bit since it splits into two
1982       separate instructions.  */
1983    case E_DImode:
1984      if (!TARGET_POWERPC64)
1985          return 0;
1986      break;
1987
1988    /* Do not allow SF/DFmode in GPR fusion.  While the loads do occur, they
1989       are not common.  */
1990    default:
1991      return 0;
1992    }
1993
1994  addr = XEXP (op, 0);
1995  if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
1996    return 0;
1997
1998  base = XEXP (addr, 0);
1999  if (!fusion_gpr_addis (base, GET_MODE (base)))
2000    return 0;
2001
2002  offset = XEXP (addr, 1);
2003  if (GET_CODE (addr) == PLUS)
2004    return satisfies_constraint_I (offset);
2005
2006  else if (GET_CODE (addr) == LO_SUM)
2007    {
2008      if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64))
2009          return small_toc_ref (offset, GET_MODE (offset));
2010
2011      else if (TARGET_ELF && !TARGET_POWERPC64)
2012          return CONSTANT_P (offset);
2013    }
2014
2015  return 0;
2016})
2017
2018
2019;; Return true if the operand is a PC-relative address of a local symbol or a
2020;; label that can be used directly in a memory operation.
2021(define_predicate "pcrel_local_address"
2022  (match_code "label_ref,symbol_ref,const")
2023{
2024  enum insn_form iform = address_to_insn_form (op, mode, NON_PREFIXED_DEFAULT);
2025  return iform == INSN_FORM_PCREL_LOCAL;
2026})
2027
2028;; Return true if the operand is a PC-relative external symbol whose address
2029;; can be loaded into a register.
2030(define_predicate "pcrel_external_address"
2031  (match_code "symbol_ref,const")
2032{
2033  enum insn_form iform = address_to_insn_form (op, mode, NON_PREFIXED_DEFAULT);
2034  return iform == INSN_FORM_PCREL_EXTERNAL;
2035})
2036
2037;; Return true if the address is PC-relative and the symbol is either local or
2038;; external.
2039(define_predicate "pcrel_local_or_external_address"
2040  (ior (match_operand 0 "pcrel_local_address")
2041       (match_operand 0 "pcrel_external_address")))
2042
2043;; Return true if the operand is a memory address that uses a prefixed address.
2044(define_predicate "prefixed_memory"
2045  (match_code "mem")
2046{
2047  return address_is_prefixed (XEXP (op, 0), mode, NON_PREFIXED_DEFAULT);
2048})
2049
2050;; Return true if the operand is a valid memory operand with a D-form
2051;; address that could be merged with the load of a PC-relative external address
2052;; with the PCREL_OPT optimization.  We don't check here whether or not the
2053;; offset needs to be used in a DS-FORM (bottom 2 bits 0) or DQ-FORM (bottom 4
2054;; bits 0) instruction.
2055(define_predicate "d_form_memory"
2056  (match_code "mem")
2057{
2058  if (!memory_operand (op, mode))
2059    return false;
2060
2061  rtx addr = XEXP (op, 0);
2062
2063  if (REG_P (addr))
2064    return true;
2065  if (SUBREG_P (addr) && REG_P (SUBREG_REG (addr)))
2066    return true;
2067
2068  return !indexed_address (addr, mode);
2069})
2070
2071;; Return 1 if this operand is valid as the index for vec_set.
2072(define_predicate "vec_set_index_operand"
2073 (if_then_else (match_test "TARGET_VSX")
2074  (match_operand 0 "reg_or_cint_operand")
2075  (match_operand 0 "const_int_operand")))
2076
2077;; Return true if the operand is a valid Mach-O pic address.
2078;;
2079(define_predicate "macho_pic_address"
2080  (match_code "const,unspec")
2081{
2082  if (GET_CODE (op) == CONST)
2083    op = XEXP (op, 0);
2084
2085  if (GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_MACHOPIC_OFFSET)
2086    return CONSTANT_P (XVECEXP (op, 0, 0));
2087  else
2088    return false;
2089})
2090