1169689Skan;; Predicate definitions for IA-32 and x86-64.
2169689Skan;; Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
3169689Skan;;
4169689Skan;; This file is part of GCC.
5169689Skan;;
6169689Skan;; GCC is free software; you can redistribute it and/or modify
7169689Skan;; it under the terms of the GNU General Public License as published by
8169689Skan;; the Free Software Foundation; either version 2, or (at your option)
9169689Skan;; any later version.
10169689Skan;;
11169689Skan;; GCC is distributed in the hope that it will be useful,
12169689Skan;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13169689Skan;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14169689Skan;; GNU General Public License for more details.
15169689Skan;;
16169689Skan;; You should have received a copy of the GNU General Public License
17169689Skan;; along with GCC; see the file COPYING.  If not, write to
18169689Skan;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
19169689Skan;; Boston, MA 02110-1301, USA.
20169689Skan
21169689Skan;; Return nonzero if OP is either a i387 or SSE fp register.
22169689Skan(define_predicate "any_fp_register_operand"
23169689Skan  (and (match_code "reg")
24169689Skan       (match_test "ANY_FP_REGNO_P (REGNO (op))")))
25169689Skan
26169689Skan;; Return nonzero if OP is an i387 fp register.
27169689Skan(define_predicate "fp_register_operand"
28169689Skan  (and (match_code "reg")
29169689Skan       (match_test "FP_REGNO_P (REGNO (op))")))
30169689Skan
31169689Skan;; Return nonzero if OP is a non-fp register_operand.
32169689Skan(define_predicate "register_and_not_any_fp_reg_operand"
33169689Skan  (and (match_code "reg")
34169689Skan       (not (match_test "ANY_FP_REGNO_P (REGNO (op))"))))
35169689Skan
36169689Skan;; Return nonzero if OP is a register operand other than an i387 fp register.
37169689Skan(define_predicate "register_and_not_fp_reg_operand"
38169689Skan  (and (match_code "reg")
39169689Skan       (not (match_test "FP_REGNO_P (REGNO (op))"))))
40169689Skan
41169689Skan;; True if the operand is an MMX register.
42169689Skan(define_predicate "mmx_reg_operand"
43169689Skan  (and (match_code "reg")
44169689Skan       (match_test "MMX_REGNO_P (REGNO (op))")))
45169689Skan
46169689Skan;; True if the operand is a Q_REGS class register.
47169689Skan(define_predicate "q_regs_operand"
48169689Skan  (match_operand 0 "register_operand")
49169689Skan{
50169689Skan  if (GET_CODE (op) == SUBREG)
51169689Skan    op = SUBREG_REG (op);
52169689Skan  return ANY_QI_REG_P (op);
53169689Skan})
54169689Skan
55169689Skan;; Return true if op is a NON_Q_REGS class register.
56169689Skan(define_predicate "non_q_regs_operand"
57169689Skan  (match_operand 0 "register_operand")
58169689Skan{
59169689Skan  if (GET_CODE (op) == SUBREG)
60169689Skan    op = SUBREG_REG (op);
61169689Skan  return NON_QI_REG_P (op);
62169689Skan})
63169689Skan
64169689Skan;; Match an SI or HImode register for a zero_extract.
65169689Skan(define_special_predicate "ext_register_operand"
66169689Skan  (match_operand 0 "register_operand")
67169689Skan{
68169689Skan  if ((!TARGET_64BIT || GET_MODE (op) != DImode)
69169689Skan      && GET_MODE (op) != SImode && GET_MODE (op) != HImode)
70169689Skan    return 0;
71169689Skan  if (GET_CODE (op) == SUBREG)
72169689Skan    op = SUBREG_REG (op);
73169689Skan
74169689Skan  /* Be careful to accept only registers having upper parts.  */
75169689Skan  return REGNO (op) > LAST_VIRTUAL_REGISTER || REGNO (op) < 4;
76169689Skan})
77169689Skan
78169689Skan;; Return true if op is the AX register.
79169689Skan(define_predicate "ax_reg_operand"
80169689Skan  (and (match_code "reg")
81169689Skan       (match_test "REGNO (op) == 0")))
82169689Skan
83169689Skan;; Return true if op is the flags register.
84169689Skan(define_predicate "flags_reg_operand"
85169689Skan  (and (match_code "reg")
86169689Skan       (match_test "REGNO (op) == FLAGS_REG")))
87169689Skan
88169689Skan;; Return 1 if VALUE can be stored in a sign extended immediate field.
89169689Skan(define_predicate "x86_64_immediate_operand"
90169689Skan  (match_code "const_int,symbol_ref,label_ref,const")
91169689Skan{
92169689Skan  if (!TARGET_64BIT)
93169689Skan    return immediate_operand (op, mode);
94169689Skan
95169689Skan  switch (GET_CODE (op))
96169689Skan    {
97169689Skan    case CONST_INT:
98169689Skan      /* CONST_DOUBLES never match, since HOST_BITS_PER_WIDE_INT is known
99169689Skan         to be at least 32 and this all acceptable constants are
100169689Skan	 represented as CONST_INT.  */
101169689Skan      if (HOST_BITS_PER_WIDE_INT == 32)
102169689Skan	return 1;
103169689Skan      else
104169689Skan	{
105169689Skan	  HOST_WIDE_INT val = trunc_int_for_mode (INTVAL (op), DImode);
106169689Skan	  return trunc_int_for_mode (val, SImode) == val;
107169689Skan	}
108169689Skan      break;
109169689Skan
110169689Skan    case SYMBOL_REF:
111169689Skan      /* For certain code models, the symbolic references are known to fit.
112169689Skan	 in CM_SMALL_PIC model we know it fits if it is local to the shared
113169689Skan	 library.  Don't count TLS SYMBOL_REFs here, since they should fit
114169689Skan	 only if inside of UNSPEC handled below.  */
115169689Skan      /* TLS symbols are not constant.  */
116169689Skan      if (SYMBOL_REF_TLS_MODEL (op))
117169689Skan	return false;
118169689Skan      return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL
119169689Skan	      || (ix86_cmodel == CM_MEDIUM && !SYMBOL_REF_FAR_ADDR_P (op)));
120169689Skan
121169689Skan    case LABEL_REF:
122169689Skan      /* For certain code models, the code is near as well.  */
123169689Skan      return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM
124169689Skan	      || ix86_cmodel == CM_KERNEL);
125169689Skan
126169689Skan    case CONST:
127169689Skan      /* We also may accept the offsetted memory references in certain
128169689Skan	 special cases.  */
129169689Skan      if (GET_CODE (XEXP (op, 0)) == UNSPEC)
130169689Skan	switch (XINT (XEXP (op, 0), 1))
131169689Skan	  {
132169689Skan	  case UNSPEC_GOTPCREL:
133169689Skan	  case UNSPEC_DTPOFF:
134169689Skan	  case UNSPEC_GOTNTPOFF:
135169689Skan	  case UNSPEC_NTPOFF:
136169689Skan	    return 1;
137169689Skan	  default:
138169689Skan	    break;
139169689Skan	  }
140169689Skan
141169689Skan      if (GET_CODE (XEXP (op, 0)) == PLUS)
142169689Skan	{
143169689Skan	  rtx op1 = XEXP (XEXP (op, 0), 0);
144169689Skan	  rtx op2 = XEXP (XEXP (op, 0), 1);
145169689Skan	  HOST_WIDE_INT offset;
146169689Skan
147169689Skan	  if (ix86_cmodel == CM_LARGE)
148169689Skan	    return 0;
149169689Skan	  if (GET_CODE (op2) != CONST_INT)
150169689Skan	    return 0;
151169689Skan	  offset = trunc_int_for_mode (INTVAL (op2), DImode);
152169689Skan	  switch (GET_CODE (op1))
153169689Skan	    {
154169689Skan	    case SYMBOL_REF:
155169689Skan	      /* TLS symbols are not constant.  */
156169689Skan	      if (SYMBOL_REF_TLS_MODEL (op1))
157169689Skan		return 0;
158169689Skan	      /* For CM_SMALL assume that latest object is 16MB before
159169689Skan		 end of 31bits boundary.  We may also accept pretty
160169689Skan		 large negative constants knowing that all objects are
161169689Skan		 in the positive half of address space.  */
162169689Skan	      if ((ix86_cmodel == CM_SMALL
163169689Skan		   || (ix86_cmodel == CM_MEDIUM
164169689Skan		       && !SYMBOL_REF_FAR_ADDR_P (op1)))
165169689Skan		  && offset < 16*1024*1024
166169689Skan		  && trunc_int_for_mode (offset, SImode) == offset)
167169689Skan		return 1;
168169689Skan	      /* For CM_KERNEL we know that all object resist in the
169169689Skan		 negative half of 32bits address space.  We may not
170169689Skan		 accept negative offsets, since they may be just off
171169689Skan		 and we may accept pretty large positive ones.  */
172169689Skan	      if (ix86_cmodel == CM_KERNEL
173169689Skan		  && offset > 0
174169689Skan		  && trunc_int_for_mode (offset, SImode) == offset)
175169689Skan		return 1;
176169689Skan	      break;
177169689Skan
178169689Skan	    case LABEL_REF:
179169689Skan	      /* These conditions are similar to SYMBOL_REF ones, just the
180169689Skan		 constraints for code models differ.  */
181169689Skan	      if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
182169689Skan		  && offset < 16*1024*1024
183169689Skan		  && trunc_int_for_mode (offset, SImode) == offset)
184169689Skan		return 1;
185169689Skan	      if (ix86_cmodel == CM_KERNEL
186169689Skan		  && offset > 0
187169689Skan		  && trunc_int_for_mode (offset, SImode) == offset)
188169689Skan		return 1;
189169689Skan	      break;
190169689Skan
191169689Skan	    case UNSPEC:
192169689Skan	      switch (XINT (op1, 1))
193169689Skan		{
194169689Skan		case UNSPEC_DTPOFF:
195169689Skan		case UNSPEC_NTPOFF:
196169689Skan		  if (offset > 0
197169689Skan		      && trunc_int_for_mode (offset, SImode) == offset)
198169689Skan		    return 1;
199169689Skan		}
200169689Skan	      break;
201169689Skan
202169689Skan	    default:
203169689Skan	      break;
204169689Skan	    }
205169689Skan	}
206169689Skan      break;
207169689Skan
208169689Skan      default:
209169689Skan	gcc_unreachable ();
210169689Skan    }
211169689Skan
212169689Skan  return 0;
213169689Skan})
214169689Skan
215169689Skan;; Return 1 if VALUE can be stored in the zero extended immediate field.
216169689Skan(define_predicate "x86_64_zext_immediate_operand"
217169689Skan  (match_code "const_double,const_int,symbol_ref,label_ref,const")
218169689Skan{
219169689Skan  switch (GET_CODE (op))
220169689Skan    {
221169689Skan    case CONST_DOUBLE:
222169689Skan      if (HOST_BITS_PER_WIDE_INT == 32)
223169689Skan	return (GET_MODE (op) == VOIDmode && !CONST_DOUBLE_HIGH (op));
224169689Skan      else
225169689Skan	return 0;
226169689Skan
227169689Skan    case CONST_INT:
228169689Skan      if (HOST_BITS_PER_WIDE_INT == 32)
229169689Skan	return INTVAL (op) >= 0;
230169689Skan      else
231169689Skan	return !(INTVAL (op) & ~(HOST_WIDE_INT) 0xffffffff);
232169689Skan
233169689Skan    case SYMBOL_REF:
234169689Skan      /* For certain code models, the symbolic references are known to fit.  */
235169689Skan      /* TLS symbols are not constant.  */
236169689Skan      if (SYMBOL_REF_TLS_MODEL (op))
237169689Skan	return false;
238169689Skan      return (ix86_cmodel == CM_SMALL
239169689Skan	      || (ix86_cmodel == CM_MEDIUM
240169689Skan		  && !SYMBOL_REF_FAR_ADDR_P (op)));
241169689Skan
242169689Skan    case LABEL_REF:
243169689Skan      /* For certain code models, the code is near as well.  */
244169689Skan      return ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM;
245169689Skan
246169689Skan    case CONST:
247169689Skan      /* We also may accept the offsetted memory references in certain
248169689Skan	 special cases.  */
249169689Skan      if (GET_CODE (XEXP (op, 0)) == PLUS)
250169689Skan	{
251169689Skan	  rtx op1 = XEXP (XEXP (op, 0), 0);
252169689Skan	  rtx op2 = XEXP (XEXP (op, 0), 1);
253169689Skan
254169689Skan	  if (ix86_cmodel == CM_LARGE)
255169689Skan	    return 0;
256169689Skan	  switch (GET_CODE (op1))
257169689Skan	    {
258169689Skan	    case SYMBOL_REF:
259169689Skan	      /* TLS symbols are not constant.  */
260169689Skan	      if (SYMBOL_REF_TLS_MODEL (op1))
261169689Skan		return 0;
262169689Skan	      /* For small code model we may accept pretty large positive
263169689Skan		 offsets, since one bit is available for free.  Negative
264169689Skan		 offsets are limited by the size of NULL pointer area
265169689Skan		 specified by the ABI.  */
266169689Skan	      if ((ix86_cmodel == CM_SMALL
267169689Skan		   || (ix86_cmodel == CM_MEDIUM
268169689Skan		       && !SYMBOL_REF_FAR_ADDR_P (op1)))
269169689Skan		  && GET_CODE (op2) == CONST_INT
270169689Skan		  && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000
271169689Skan		  && trunc_int_for_mode (INTVAL (op2), SImode) == INTVAL (op2))
272169689Skan		return 1;
273169689Skan	      /* ??? For the kernel, we may accept adjustment of
274169689Skan		 -0x10000000, since we know that it will just convert
275169689Skan		 negative address space to positive, but perhaps this
276169689Skan		 is not worthwhile.  */
277169689Skan	      break;
278169689Skan
279169689Skan	    case LABEL_REF:
280169689Skan	      /* These conditions are similar to SYMBOL_REF ones, just the
281169689Skan		 constraints for code models differ.  */
282169689Skan	      if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
283169689Skan		  && GET_CODE (op2) == CONST_INT
284169689Skan		  && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000
285169689Skan		  && trunc_int_for_mode (INTVAL (op2), SImode) == INTVAL (op2))
286169689Skan		return 1;
287169689Skan	      break;
288169689Skan
289169689Skan	    default:
290169689Skan	      return 0;
291169689Skan	    }
292169689Skan	}
293169689Skan      break;
294169689Skan
295169689Skan    default:
296169689Skan      gcc_unreachable ();
297169689Skan    }
298169689Skan  return 0;
299169689Skan})
300169689Skan
301169689Skan;; Return nonzero if OP is general operand representable on x86_64.
302169689Skan(define_predicate "x86_64_general_operand"
303169689Skan  (if_then_else (match_test "TARGET_64BIT")
304169689Skan    (ior (match_operand 0 "nonimmediate_operand")
305169689Skan	 (match_operand 0 "x86_64_immediate_operand"))
306169689Skan    (match_operand 0 "general_operand")))
307169689Skan
308169689Skan;; Return nonzero if OP is general operand representable on x86_64
309169689Skan;; as either sign extended or zero extended constant.
310169689Skan(define_predicate "x86_64_szext_general_operand"
311169689Skan  (if_then_else (match_test "TARGET_64BIT")
312169689Skan    (ior (match_operand 0 "nonimmediate_operand")
313169689Skan	 (ior (match_operand 0 "x86_64_immediate_operand")
314169689Skan	      (match_operand 0 "x86_64_zext_immediate_operand")))
315169689Skan    (match_operand 0 "general_operand")))
316169689Skan
317169689Skan;; Return nonzero if OP is nonmemory operand representable on x86_64.
318169689Skan(define_predicate "x86_64_nonmemory_operand"
319169689Skan  (if_then_else (match_test "TARGET_64BIT")
320169689Skan    (ior (match_operand 0 "register_operand")
321169689Skan	 (match_operand 0 "x86_64_immediate_operand"))
322169689Skan    (match_operand 0 "nonmemory_operand")))
323169689Skan
324169689Skan;; Return nonzero if OP is nonmemory operand representable on x86_64.
325169689Skan(define_predicate "x86_64_szext_nonmemory_operand"
326169689Skan  (if_then_else (match_test "TARGET_64BIT")
327169689Skan    (ior (match_operand 0 "register_operand")
328169689Skan	 (ior (match_operand 0 "x86_64_immediate_operand")
329169689Skan	      (match_operand 0 "x86_64_zext_immediate_operand")))
330169689Skan    (match_operand 0 "nonmemory_operand")))
331169689Skan
332169689Skan;; Return true when operand is PIC expression that can be computed by lea
333169689Skan;; operation.
334169689Skan(define_predicate "pic_32bit_operand"
335169689Skan  (match_code "const,symbol_ref,label_ref")
336169689Skan{
337169689Skan  if (!flag_pic)
338169689Skan    return 0;
339169689Skan  /* Rule out relocations that translate into 64bit constants.  */
340169689Skan  if (TARGET_64BIT && GET_CODE (op) == CONST)
341169689Skan    {
342169689Skan      op = XEXP (op, 0);
343169689Skan      if (GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 1)) == CONST_INT)
344169689Skan	op = XEXP (op, 0);
345169689Skan      if (GET_CODE (op) == UNSPEC
346169689Skan	  && (XINT (op, 1) == UNSPEC_GOTOFF
347169689Skan	      || XINT (op, 1) == UNSPEC_GOT))
348169689Skan	return 0;
349169689Skan    }
350169689Skan  return symbolic_operand (op, mode);
351169689Skan})
352169689Skan
353169689Skan
354169689Skan;; Return nonzero if OP is nonmemory operand acceptable by movabs patterns.
355169689Skan(define_predicate "x86_64_movabs_operand"
356169689Skan  (if_then_else (match_test "!TARGET_64BIT || !flag_pic")
357169689Skan    (match_operand 0 "nonmemory_operand")
358169689Skan    (ior (match_operand 0 "register_operand")
359169689Skan	 (and (match_operand 0 "const_double_operand")
360169689Skan	      (match_test "GET_MODE_SIZE (mode) <= 8")))))
361169689Skan
362169689Skan;; Returns nonzero if OP is either a symbol reference or a sum of a symbol
363169689Skan;; reference and a constant.
364169689Skan(define_predicate "symbolic_operand"
365169689Skan  (match_code "symbol_ref,label_ref,const")
366169689Skan{
367169689Skan  switch (GET_CODE (op))
368169689Skan    {
369169689Skan    case SYMBOL_REF:
370169689Skan    case LABEL_REF:
371169689Skan      return 1;
372169689Skan
373169689Skan    case CONST:
374169689Skan      op = XEXP (op, 0);
375169689Skan      if (GET_CODE (op) == SYMBOL_REF
376169689Skan	  || GET_CODE (op) == LABEL_REF
377169689Skan	  || (GET_CODE (op) == UNSPEC
378169689Skan	      && (XINT (op, 1) == UNSPEC_GOT
379169689Skan		  || XINT (op, 1) == UNSPEC_GOTOFF
380169689Skan		  || XINT (op, 1) == UNSPEC_GOTPCREL)))
381169689Skan	return 1;
382169689Skan      if (GET_CODE (op) != PLUS
383169689Skan	  || GET_CODE (XEXP (op, 1)) != CONST_INT)
384169689Skan	return 0;
385169689Skan
386169689Skan      op = XEXP (op, 0);
387169689Skan      if (GET_CODE (op) == SYMBOL_REF
388169689Skan	  || GET_CODE (op) == LABEL_REF)
389169689Skan	return 1;
390169689Skan      /* Only @GOTOFF gets offsets.  */
391169689Skan      if (GET_CODE (op) != UNSPEC
392169689Skan	  || XINT (op, 1) != UNSPEC_GOTOFF)
393169689Skan	return 0;
394169689Skan
395169689Skan      op = XVECEXP (op, 0, 0);
396169689Skan      if (GET_CODE (op) == SYMBOL_REF
397169689Skan	  || GET_CODE (op) == LABEL_REF)
398169689Skan	return 1;
399169689Skan      return 0;
400169689Skan
401169689Skan    default:
402169689Skan      gcc_unreachable ();
403169689Skan    }
404169689Skan})
405169689Skan
406169689Skan;; Return true if the operand contains a @GOT or @GOTOFF reference.
407169689Skan(define_predicate "pic_symbolic_operand"
408169689Skan  (match_code "const")
409169689Skan{
410169689Skan  op = XEXP (op, 0);
411169689Skan  if (TARGET_64BIT)
412169689Skan    {
413169689Skan      if (GET_CODE (op) == UNSPEC
414169689Skan	  && XINT (op, 1) == UNSPEC_GOTPCREL)
415169689Skan	return 1;
416169689Skan      if (GET_CODE (op) == PLUS
417169689Skan	  && GET_CODE (XEXP (op, 0)) == UNSPEC
418169689Skan	  && XINT (XEXP (op, 0), 1) == UNSPEC_GOTPCREL)
419169689Skan	return 1;
420169689Skan    }
421169689Skan  else
422169689Skan    {
423169689Skan      if (GET_CODE (op) == UNSPEC)
424169689Skan	return 1;
425169689Skan      if (GET_CODE (op) != PLUS
426169689Skan	  || GET_CODE (XEXP (op, 1)) != CONST_INT)
427169689Skan	return 0;
428169689Skan      op = XEXP (op, 0);
429169689Skan      if (GET_CODE (op) == UNSPEC)
430169689Skan	return 1;
431169689Skan    }
432169689Skan  return 0;
433169689Skan})
434169689Skan
435169689Skan;; Return true if OP is a symbolic operand that resolves locally.
436169689Skan(define_predicate "local_symbolic_operand"
437169689Skan  (match_code "const,label_ref,symbol_ref")
438169689Skan{
439169689Skan  if (GET_CODE (op) == CONST
440169689Skan      && GET_CODE (XEXP (op, 0)) == PLUS
441169689Skan      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
442169689Skan    op = XEXP (XEXP (op, 0), 0);
443169689Skan
444169689Skan  if (GET_CODE (op) == LABEL_REF)
445169689Skan    return 1;
446169689Skan
447169689Skan  if (GET_CODE (op) != SYMBOL_REF)
448169689Skan    return 0;
449169689Skan
450169689Skan  if (SYMBOL_REF_TLS_MODEL (op) != 0)
451169689Skan    return 0;
452169689Skan
453169689Skan  if (SYMBOL_REF_LOCAL_P (op))
454169689Skan    return 1;
455169689Skan
456169689Skan  /* There is, however, a not insubstantial body of code in the rest of
457169689Skan     the compiler that assumes it can just stick the results of
458169689Skan     ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done.  */
459169689Skan  /* ??? This is a hack.  Should update the body of the compiler to
460169689Skan     always create a DECL an invoke targetm.encode_section_info.  */
461169689Skan  if (strncmp (XSTR (op, 0), internal_label_prefix,
462169689Skan	       internal_label_prefix_len) == 0)
463169689Skan    return 1;
464169689Skan
465169689Skan  return 0;
466169689Skan})
467169689Skan
468169689Skan;; Test for various thread-local symbols.
469169689Skan(define_predicate "tls_symbolic_operand"
470169689Skan  (and (match_code "symbol_ref")
471169689Skan       (match_test "SYMBOL_REF_TLS_MODEL (op) != 0")))
472169689Skan
473169689Skan(define_predicate "tls_modbase_operand"
474169689Skan  (and (match_code "symbol_ref")
475169689Skan       (match_test "op == ix86_tls_module_base ()")))
476169689Skan
477169689Skan(define_predicate "tp_or_register_operand"
478169689Skan  (ior (match_operand 0 "register_operand")
479169689Skan       (and (match_code "unspec")
480169689Skan	    (match_test "XINT (op, 1) == UNSPEC_TP"))))
481169689Skan
482169689Skan;; Test for a pc-relative call operand
483169689Skan(define_predicate "constant_call_address_operand"
484169689Skan  (ior (match_code "symbol_ref")
485169689Skan       (match_operand 0 "local_symbolic_operand")))
486169689Skan
487169689Skan;; True for any non-virtual or eliminable register.  Used in places where
488169689Skan;; instantiation of such a register may cause the pattern to not be recognized.
489169689Skan(define_predicate "register_no_elim_operand"
490169689Skan  (match_operand 0 "register_operand")
491169689Skan{
492169689Skan  if (GET_CODE (op) == SUBREG)
493169689Skan    op = SUBREG_REG (op);
494169689Skan  return !(op == arg_pointer_rtx
495169689Skan	   || op == frame_pointer_rtx
496169689Skan	   || (REGNO (op) >= FIRST_PSEUDO_REGISTER
497169689Skan	       && REGNO (op) <= LAST_VIRTUAL_REGISTER));
498169689Skan})
499169689Skan
500169689Skan;; Similarly, but include the stack pointer.  This is used to prevent esp
501169689Skan;; from being used as an index reg.
502169689Skan(define_predicate "index_register_operand"
503169689Skan  (match_operand 0 "register_operand")
504169689Skan{
505169689Skan  if (GET_CODE (op) == SUBREG)
506169689Skan    op = SUBREG_REG (op);
507169689Skan  if (reload_in_progress || reload_completed)
508169689Skan    return REG_OK_FOR_INDEX_STRICT_P (op);
509169689Skan  else
510169689Skan    return REG_OK_FOR_INDEX_NONSTRICT_P (op);
511169689Skan})
512169689Skan
513169689Skan;; Return false if this is any eliminable register.  Otherwise general_operand.
514169689Skan(define_predicate "general_no_elim_operand"
515169689Skan  (if_then_else (match_code "reg,subreg")
516169689Skan    (match_operand 0 "register_no_elim_operand")
517169689Skan    (match_operand 0 "general_operand")))
518169689Skan
519169689Skan;; Return false if this is any eliminable register.  Otherwise
520169689Skan;; register_operand or a constant.
521169689Skan(define_predicate "nonmemory_no_elim_operand"
522169689Skan  (ior (match_operand 0 "register_no_elim_operand")
523169689Skan       (match_operand 0 "immediate_operand")))
524169689Skan
525169689Skan;; Test for a valid operand for a call instruction.
526169689Skan(define_predicate "call_insn_operand"
527169689Skan  (ior (match_operand 0 "constant_call_address_operand")
528169689Skan       (ior (match_operand 0 "register_no_elim_operand")
529169689Skan	    (match_operand 0 "memory_operand"))))
530169689Skan
531169689Skan;; Similarly, but for tail calls, in which we cannot allow memory references.
532169689Skan(define_predicate "sibcall_insn_operand"
533169689Skan  (ior (match_operand 0 "constant_call_address_operand")
534169689Skan       (match_operand 0 "register_no_elim_operand")))
535169689Skan
536169689Skan;; Match exactly zero.
537169689Skan(define_predicate "const0_operand"
538169689Skan  (match_code "const_int,const_double,const_vector")
539169689Skan{
540169689Skan  if (mode == VOIDmode)
541169689Skan    mode = GET_MODE (op);
542169689Skan  return op == CONST0_RTX (mode);
543169689Skan})
544169689Skan
545169689Skan;; Match exactly one.
546169689Skan(define_predicate "const1_operand"
547169689Skan  (and (match_code "const_int")
548169689Skan       (match_test "op == const1_rtx")))
549169689Skan
550169689Skan;; Match exactly eight.
551169689Skan(define_predicate "const8_operand"
552169689Skan  (and (match_code "const_int")
553169689Skan       (match_test "INTVAL (op) == 8")))
554169689Skan
555169689Skan;; Match 2, 4, or 8.  Used for leal multiplicands.
556169689Skan(define_predicate "const248_operand"
557169689Skan  (match_code "const_int")
558169689Skan{
559169689Skan  HOST_WIDE_INT i = INTVAL (op);
560169689Skan  return i == 2 || i == 4 || i == 8;
561169689Skan})
562169689Skan
563169689Skan;; Match 0 or 1.
564169689Skan(define_predicate "const_0_to_1_operand"
565169689Skan  (and (match_code "const_int")
566169689Skan       (match_test "op == const0_rtx || op == const1_rtx")))
567169689Skan
568169689Skan;; Match 0 to 3.
569169689Skan(define_predicate "const_0_to_3_operand"
570169689Skan  (and (match_code "const_int")
571169689Skan       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 3")))
572169689Skan
573169689Skan;; Match 0 to 7.
574169689Skan(define_predicate "const_0_to_7_operand"
575169689Skan  (and (match_code "const_int")
576169689Skan       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7")))
577169689Skan
578169689Skan;; Match 0 to 15.
579169689Skan(define_predicate "const_0_to_15_operand"
580169689Skan  (and (match_code "const_int")
581169689Skan       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 15")))
582169689Skan
583169689Skan;; Match 0 to 63.
584169689Skan(define_predicate "const_0_to_63_operand"
585169689Skan  (and (match_code "const_int")
586169689Skan       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 63")))
587169689Skan
588169689Skan;; Match 0 to 255.
589169689Skan(define_predicate "const_0_to_255_operand"
590169689Skan  (and (match_code "const_int")
591169689Skan       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 255")))
592169689Skan
593169689Skan;; Match (0 to 255) * 8
594169689Skan(define_predicate "const_0_to_255_mul_8_operand"
595169689Skan  (match_code "const_int")
596169689Skan{
597169689Skan  unsigned HOST_WIDE_INT val = INTVAL (op);
598169689Skan  return val <= 255*8 && val % 8 == 0;
599169689Skan})
600169689Skan
601169689Skan;; Return nonzero if OP is CONST_INT >= 1 and <= 31 (a valid operand
602169689Skan;; for shift & compare patterns, as shifting by 0 does not change flags).
603169689Skan(define_predicate "const_1_to_31_operand"
604169689Skan  (and (match_code "const_int")
605169689Skan       (match_test "INTVAL (op) >= 1 && INTVAL (op) <= 31")))
606169689Skan
607169689Skan;; Match 2 or 3.
608169689Skan(define_predicate "const_2_to_3_operand"
609169689Skan  (and (match_code "const_int")
610169689Skan       (match_test "INTVAL (op) == 2 || INTVAL (op) == 3")))
611169689Skan
612169689Skan;; Match 4 to 7.
613169689Skan(define_predicate "const_4_to_7_operand"
614169689Skan  (and (match_code "const_int")
615169689Skan       (match_test "INTVAL (op) >= 4 && INTVAL (op) <= 7")))
616169689Skan
617169689Skan;; Match exactly one bit in 4-bit mask.
618169689Skan(define_predicate "const_pow2_1_to_8_operand"
619169689Skan  (match_code "const_int")
620169689Skan{
621169689Skan  unsigned int log = exact_log2 (INTVAL (op));
622169689Skan  return log <= 3;
623169689Skan})
624169689Skan
625169689Skan;; Match exactly one bit in 8-bit mask.
626169689Skan(define_predicate "const_pow2_1_to_128_operand"
627169689Skan  (match_code "const_int")
628169689Skan{
629169689Skan  unsigned int log = exact_log2 (INTVAL (op));
630169689Skan  return log <= 7;
631169689Skan})
632169689Skan
633169689Skan;; True if this is a constant appropriate for an increment or decrement.
634169689Skan(define_predicate "incdec_operand"
635169689Skan  (match_code "const_int")
636169689Skan{
637169689Skan  /* On Pentium4, the inc and dec operations causes extra dependency on flag
638169689Skan     registers, since carry flag is not set.  */
639169689Skan  if (!TARGET_USE_INCDEC && !optimize_size)
640169689Skan    return 0;
641169689Skan  return op == const1_rtx || op == constm1_rtx;
642169689Skan})
643169689Skan
644169689Skan;; True for registers, or 1 or -1.  Used to optimize double-word shifts.
645169689Skan(define_predicate "reg_or_pm1_operand"
646169689Skan  (ior (match_operand 0 "register_operand")
647169689Skan       (and (match_code "const_int")
648169689Skan	    (match_test "op == const1_rtx || op == constm1_rtx"))))
649169689Skan
650169689Skan;; True if OP is acceptable as operand of DImode shift expander.
651169689Skan(define_predicate "shiftdi_operand"
652169689Skan  (if_then_else (match_test "TARGET_64BIT")
653169689Skan    (match_operand 0 "nonimmediate_operand")
654169689Skan    (match_operand 0 "register_operand")))
655169689Skan
656169689Skan(define_predicate "ashldi_input_operand"
657169689Skan  (if_then_else (match_test "TARGET_64BIT")
658169689Skan    (match_operand 0 "nonimmediate_operand")
659169689Skan    (match_operand 0 "reg_or_pm1_operand")))
660169689Skan
661169689Skan;; Return true if OP is a vector load from the constant pool with just
662169689Skan;; the first element nonzero.
663169689Skan(define_predicate "zero_extended_scalar_load_operand"
664169689Skan  (match_code "mem")
665169689Skan{
666169689Skan  unsigned n_elts;
667169689Skan  op = maybe_get_pool_constant (op);
668169689Skan  if (!op)
669169689Skan    return 0;
670169689Skan  if (GET_CODE (op) != CONST_VECTOR)
671169689Skan    return 0;
672169689Skan  n_elts =
673169689Skan    (GET_MODE_SIZE (GET_MODE (op)) /
674169689Skan     GET_MODE_SIZE (GET_MODE_INNER (GET_MODE (op))));
675169689Skan  for (n_elts--; n_elts > 0; n_elts--)
676169689Skan    {
677169689Skan      rtx elt = CONST_VECTOR_ELT (op, n_elts);
678169689Skan      if (elt != CONST0_RTX (GET_MODE_INNER (GET_MODE (op))))
679169689Skan	return 0;
680169689Skan    }
681169689Skan  return 1;
682169689Skan})
683169689Skan
684169689Skan/* Return true if operand is a vector constant that is all ones. */
685169689Skan(define_predicate "vector_all_ones_operand"
686169689Skan  (match_code "const_vector")
687169689Skan{
688169689Skan  int nunits = GET_MODE_NUNITS (mode);
689169689Skan
690169689Skan  if (GET_CODE (op) == CONST_VECTOR
691169689Skan      && CONST_VECTOR_NUNITS (op) == nunits)
692169689Skan    {
693169689Skan      int i;
694169689Skan      for (i = 0; i < nunits; ++i)
695169689Skan        {
696169689Skan          rtx x = CONST_VECTOR_ELT (op, i);
697169689Skan          if (x != constm1_rtx)
698169689Skan            return 0;
699169689Skan        }
700169689Skan      return 1;
701169689Skan    }
702169689Skan
703169689Skan  return 0;
704169689Skan})
705169689Skan
706169689Skan; Return 1 when OP is operand acceptable for standard SSE move.
707169689Skan(define_predicate "vector_move_operand"
708169689Skan  (ior (match_operand 0 "nonimmediate_operand")
709169689Skan       (match_operand 0 "const0_operand")))
710169689Skan
711169689Skan;; Return 1 when OP is nonimmediate or standard SSE constant.
712169689Skan(define_predicate "nonimmediate_or_sse_const_operand"
713169689Skan  (match_operand 0 "general_operand")
714169689Skan{
715169689Skan  if (nonimmediate_operand (op, mode))
716169689Skan    return 1;
717169689Skan  if (standard_sse_constant_p (op) > 0)
718169689Skan    return 1;
719169689Skan  return 0;
720169689Skan})
721169689Skan
722169689Skan;; Return true if OP is a register or a zero.
723169689Skan(define_predicate "reg_or_0_operand"
724169689Skan  (ior (match_operand 0 "register_operand")
725169689Skan       (match_operand 0 "const0_operand")))
726169689Skan
727169689Skan;; Return true if op if a valid address, and does not contain
728169689Skan;; a segment override.
729169689Skan(define_special_predicate "no_seg_address_operand"
730169689Skan  (match_operand 0 "address_operand")
731169689Skan{
732169689Skan  struct ix86_address parts;
733169689Skan  int ok;
734169689Skan
735169689Skan  ok = ix86_decompose_address (op, &parts);
736169689Skan  gcc_assert (ok);
737169689Skan  return parts.seg == SEG_DEFAULT;
738169689Skan})
739169689Skan
740169689Skan;; Return nonzero if the rtx is known to be at least 32 bits aligned.
741169689Skan(define_predicate "aligned_operand"
742169689Skan  (match_operand 0 "general_operand")
743169689Skan{
744169689Skan  struct ix86_address parts;
745169689Skan  int ok;
746169689Skan
747169689Skan  /* Registers and immediate operands are always "aligned".  */
748169689Skan  if (GET_CODE (op) != MEM)
749169689Skan    return 1;
750169689Skan
751169689Skan  /* All patterns using aligned_operand on memory operands ends up
752169689Skan     in promoting memory operand to 64bit and thus causing memory mismatch.  */
753169689Skan  if (TARGET_MEMORY_MISMATCH_STALL && !optimize_size)
754169689Skan    return 0;
755169689Skan
756169689Skan  /* Don't even try to do any aligned optimizations with volatiles.  */
757169689Skan  if (MEM_VOLATILE_P (op))
758169689Skan    return 0;
759169689Skan
760169689Skan  if (MEM_ALIGN (op) >= 32)
761169689Skan    return 1;
762169689Skan
763169689Skan  op = XEXP (op, 0);
764169689Skan
765169689Skan  /* Pushes and pops are only valid on the stack pointer.  */
766169689Skan  if (GET_CODE (op) == PRE_DEC
767169689Skan      || GET_CODE (op) == POST_INC)
768169689Skan    return 1;
769169689Skan
770169689Skan  /* Decode the address.  */
771169689Skan  ok = ix86_decompose_address (op, &parts);
772169689Skan  gcc_assert (ok);
773169689Skan
774169689Skan  /* Look for some component that isn't known to be aligned.  */
775169689Skan  if (parts.index)
776169689Skan    {
777169689Skan      if (REGNO_POINTER_ALIGN (REGNO (parts.index)) * parts.scale < 32)
778169689Skan	return 0;
779169689Skan    }
780169689Skan  if (parts.base)
781169689Skan    {
782169689Skan      if (REGNO_POINTER_ALIGN (REGNO (parts.base)) < 32)
783169689Skan	return 0;
784169689Skan    }
785169689Skan  if (parts.disp)
786169689Skan    {
787169689Skan      if (GET_CODE (parts.disp) != CONST_INT
788169689Skan	  || (INTVAL (parts.disp) & 3) != 0)
789169689Skan	return 0;
790169689Skan    }
791169689Skan
792169689Skan  /* Didn't find one -- this must be an aligned address.  */
793169689Skan  return 1;
794169689Skan})
795169689Skan
796169689Skan;; Returns 1 if OP is memory operand with a displacement.
797169689Skan(define_predicate "memory_displacement_operand"
798169689Skan  (match_operand 0 "memory_operand")
799169689Skan{
800169689Skan  struct ix86_address parts;
801169689Skan  int ok;
802169689Skan
803169689Skan  ok = ix86_decompose_address (XEXP (op, 0), &parts);
804169689Skan  gcc_assert (ok);
805169689Skan  return parts.disp != NULL_RTX;
806169689Skan})
807169689Skan
808169689Skan;; Returns 1 if OP is memory operand with a displacement only.
809169689Skan(define_predicate "memory_displacement_only_operand"
810169689Skan  (match_operand 0 "memory_operand")
811169689Skan{
812169689Skan  struct ix86_address parts;
813169689Skan  int ok;
814169689Skan
815169689Skan  ok = ix86_decompose_address (XEXP (op, 0), &parts);
816169689Skan  gcc_assert (ok);
817169689Skan
818169689Skan  if (parts.base || parts.index)
819169689Skan    return 0;
820169689Skan
821169689Skan  return parts.disp != NULL_RTX;
822169689Skan})
823169689Skan
824169689Skan;; Returns 1 if OP is memory operand that cannot be represented
825169689Skan;; by the modRM array.
826169689Skan(define_predicate "long_memory_operand"
827169689Skan  (and (match_operand 0 "memory_operand")
828169689Skan       (match_test "memory_address_length (op) != 0")))
829169689Skan
830169689Skan;; Return 1 if OP is a comparison operator that can be issued by fcmov.
831169689Skan(define_predicate "fcmov_comparison_operator"
832169689Skan  (match_operand 0 "comparison_operator")
833169689Skan{
834169689Skan  enum machine_mode inmode = GET_MODE (XEXP (op, 0));
835169689Skan  enum rtx_code code = GET_CODE (op);
836169689Skan
837169689Skan  if (inmode == CCFPmode || inmode == CCFPUmode)
838169689Skan    {
839169689Skan      enum rtx_code second_code, bypass_code;
840169689Skan      ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
841169689Skan      if (bypass_code != UNKNOWN || second_code != UNKNOWN)
842169689Skan	return 0;
843169689Skan      code = ix86_fp_compare_code_to_integer (code);
844169689Skan    }
845169689Skan  /* i387 supports just limited amount of conditional codes.  */
846169689Skan  switch (code)
847169689Skan    {
848169689Skan    case LTU: case GTU: case LEU: case GEU:
849169689Skan      if (inmode == CCmode || inmode == CCFPmode || inmode == CCFPUmode)
850169689Skan	return 1;
851169689Skan      return 0;
852169689Skan    case ORDERED: case UNORDERED:
853169689Skan    case EQ: case NE:
854169689Skan      return 1;
855169689Skan    default:
856169689Skan      return 0;
857169689Skan    }
858169689Skan})
859169689Skan
860169689Skan;; Return 1 if OP is a comparison that can be used in the CMPSS/CMPPS insns.
861169689Skan;; The first set are supported directly; the second set can't be done with
862169689Skan;; full IEEE support, i.e. NaNs.
863169689Skan;;
864169689Skan;; ??? It would seem that we have a lot of uses of this predicate that pass
865169689Skan;; it the wrong mode.  We got away with this because the old function didn't
866169689Skan;; check the mode at all.  Mirror that for now by calling this a special
867169689Skan;; predicate.
868169689Skan
869169689Skan(define_special_predicate "sse_comparison_operator"
870169689Skan  (match_code "eq,lt,le,unordered,ne,unge,ungt,ordered"))
871169689Skan
872169689Skan;; Return 1 if OP is a valid comparison operator in valid mode.
873169689Skan(define_predicate "ix86_comparison_operator"
874169689Skan  (match_operand 0 "comparison_operator")
875169689Skan{
876169689Skan  enum machine_mode inmode = GET_MODE (XEXP (op, 0));
877169689Skan  enum rtx_code code = GET_CODE (op);
878169689Skan
879169689Skan  if (inmode == CCFPmode || inmode == CCFPUmode)
880169689Skan    {
881169689Skan      enum rtx_code second_code, bypass_code;
882169689Skan      ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
883169689Skan      return (bypass_code == UNKNOWN && second_code == UNKNOWN);
884169689Skan    }
885169689Skan  switch (code)
886169689Skan    {
887169689Skan    case EQ: case NE:
888169689Skan      return 1;
889169689Skan    case LT: case GE:
890169689Skan      if (inmode == CCmode || inmode == CCGCmode
891169689Skan	  || inmode == CCGOCmode || inmode == CCNOmode)
892169689Skan	return 1;
893169689Skan      return 0;
894169689Skan    case LTU: case GTU: case LEU: case ORDERED: case UNORDERED: case GEU:
895169689Skan      if (inmode == CCmode)
896169689Skan	return 1;
897169689Skan      return 0;
898169689Skan    case GT: case LE:
899169689Skan      if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode)
900169689Skan	return 1;
901169689Skan      return 0;
902169689Skan    default:
903169689Skan      return 0;
904169689Skan    }
905169689Skan})
906169689Skan
907169689Skan;; Return 1 if OP is a valid comparison operator testing carry flag to be set.
908169689Skan(define_predicate "ix86_carry_flag_operator"
909169689Skan  (match_code "ltu,lt,unlt,gt,ungt,le,unle,ge,unge,ltgt,uneq")
910169689Skan{
911169689Skan  enum machine_mode inmode = GET_MODE (XEXP (op, 0));
912169689Skan  enum rtx_code code = GET_CODE (op);
913169689Skan
914169689Skan  if (GET_CODE (XEXP (op, 0)) != REG
915169689Skan      || REGNO (XEXP (op, 0)) != FLAGS_REG
916169689Skan      || XEXP (op, 1) != const0_rtx)
917169689Skan    return 0;
918169689Skan
919169689Skan  if (inmode == CCFPmode || inmode == CCFPUmode)
920169689Skan    {
921169689Skan      enum rtx_code second_code, bypass_code;
922169689Skan      ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
923169689Skan      if (bypass_code != UNKNOWN || second_code != UNKNOWN)
924169689Skan	return 0;
925169689Skan      code = ix86_fp_compare_code_to_integer (code);
926169689Skan    }
927169689Skan  else if (inmode != CCmode)
928169689Skan    return 0;
929169689Skan
930169689Skan  return code == LTU;
931169689Skan})
932169689Skan
933169689Skan;; Nearly general operand, but accept any const_double, since we wish
934169689Skan;; to be able to drop them into memory rather than have them get pulled
935169689Skan;; into registers.
936169689Skan(define_predicate "cmp_fp_expander_operand"
937169689Skan  (ior (match_code "const_double")
938169689Skan       (match_operand 0 "general_operand")))
939169689Skan
940169689Skan;; Return true if this is a valid binary floating-point operation.
941169689Skan(define_predicate "binary_fp_operator"
942169689Skan  (match_code "plus,minus,mult,div"))
943169689Skan
944169689Skan;; Return true if this is a multiply operation.
945169689Skan(define_predicate "mult_operator"
946169689Skan  (match_code "mult"))
947169689Skan
948169689Skan;; Return true if this is a division operation.
949169689Skan(define_predicate "div_operator"
950169689Skan  (match_code "div"))
951169689Skan
952169689Skan;; Return true if this is a float extend operation.
953169689Skan(define_predicate "float_operator"
954169689Skan  (match_code "float"))
955169689Skan
956169689Skan;; Return true for ARITHMETIC_P.
957169689Skan(define_predicate "arith_or_logical_operator"
958169689Skan  (match_code "plus,mult,and,ior,xor,smin,smax,umin,umax,compare,minus,div,
959169689Skan	       mod,udiv,umod,ashift,rotate,ashiftrt,lshiftrt,rotatert"))
960169689Skan
961169689Skan;; Return 1 if OP is a binary operator that can be promoted to wider mode.
962169689Skan;; Modern CPUs have same latency for HImode and SImode multiply,
963169689Skan;; but 386 and 486 do HImode multiply faster.  */
964169689Skan(define_predicate "promotable_binary_operator"
965169689Skan  (ior (match_code "plus,and,ior,xor,ashift")
966169689Skan       (and (match_code "mult")
967169689Skan	    (match_test "ix86_tune > PROCESSOR_I486"))))
968169689Skan
969169689Skan;; To avoid problems when jump re-emits comparisons like testqi_ext_ccno_0,
970169689Skan;; re-recognize the operand to avoid a copy_to_mode_reg that will fail.
971169689Skan;;
972169689Skan;; ??? It seems likely that this will only work because cmpsi is an
973169689Skan;; expander, and no actual insns use this.
974169689Skan
975169689Skan(define_predicate "cmpsi_operand"
976169689Skan  (ior (match_operand 0 "nonimmediate_operand")
977169689Skan       (and (match_code "and")
978169689Skan	    (match_code "zero_extract" "0")
979169689Skan	    (match_code "const_int"    "1")
980169689Skan	    (match_code "const_int"    "01")
981169689Skan	    (match_code "const_int"    "02")
982169689Skan	    (match_test "INTVAL (XEXP (XEXP (op, 0), 1)) == 8")
983169689Skan	    (match_test "INTVAL (XEXP (XEXP (op, 0), 2)) == 8")
984169689Skan       )))
985169689Skan
986169689Skan(define_predicate "compare_operator"
987169689Skan  (match_code "compare"))
988169689Skan
989169689Skan(define_predicate "absneg_operator"
990169689Skan  (match_code "abs,neg"))
991