Line data Source code
1 : /* Generated automatically by the program 'build/genpreds'
2 : from the machine description file '/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/i386.md'. */
3 :
4 : #define IN_TARGET_CODE 1
5 : #include "config.h"
6 : #include "system.h"
7 : #include "coretypes.h"
8 : #include "backend.h"
9 : #include "predict.h"
10 : #include "tree.h"
11 : #include "rtl.h"
12 : #include "alias.h"
13 : #include "varasm.h"
14 : #include "stor-layout.h"
15 : #include "calls.h"
16 : #include "memmodel.h"
17 : #include "tm_p.h"
18 : #include "insn-config.h"
19 : #include "recog.h"
20 : #include "output.h"
21 : #include "flags.h"
22 : #include "df.h"
23 : #include "resource.h"
24 : #include "diagnostic-core.h"
25 : #include "reload.h"
26 : #include "regs.h"
27 : #include "emit-rtl.h"
28 : #include "tm-constrs.h"
29 : #include "target.h"
30 :
31 :
32 : struct target_constraints default_target_constraints;
33 : #if SWITCHABLE_TARGET
34 : struct target_constraints *this_target_constraints = &default_target_constraints;
35 : #endif
36 : static inline bool
37 0 : aligned_register_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
38 : #line 25 "/home/worker/buildworker/tiber-lcov/build/gcc/common.md"
39 : {
40 : /* Require the offset in a non-paradoxical subreg to be naturally aligned.
41 : For example, if we have a subreg of something that is double the size of
42 : this operand, the offset must select the first or second half of it. */
43 : if (SUBREG_P (op)
44 : && multiple_p (SUBREG_BYTE (op), GET_MODE_SIZE (GET_MODE (op))))
45 : op = SUBREG_REG (op);
46 : if (!REG_P (op))
47 : return false;
48 :
49 : if (HARD_REGISTER_P (op))
50 : {
51 : if (!in_hard_reg_set_p (operand_reg_set, GET_MODE (op), REGNO (op)))
52 : return false;
53 :
54 : /* Reject hard registers that would need reloading, so that the reload
55 : is visible to IRA and to pre-RA optimizers. */
56 : if (REGNO (op) % REG_NREGS (op) != 0)
57 : return false;
58 : }
59 : return true;
60 : }
61 :
62 : bool
63 : aligned_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
64 : {
65 : switch (GET_CODE (op))
66 : {
67 : case REG:
68 : case SUBREG:
69 : break;
70 : default:
71 : return false;
72 : }
73 : return (
74 : (aligned_register_operand_1 (op, mode))) && (
75 : (mode == VOIDmode || GET_MODE (op) == mode));
76 : }
77 :
78 : bool
79 : any_fp_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
80 : {
81 : return ((GET_CODE (op) == REG) && (
82 : #line 23 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
83 : (ANY_FP_REGNO_P (REGNO (op))))) && (
84 : (mode == VOIDmode || GET_MODE (op) == mode));
85 : }
86 :
87 : bool
88 : fp_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
89 : {
90 : return ((GET_CODE (op) == REG) && (
91 : #line 28 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
92 : (STACK_REGNO_P (REGNO (op))))) && (
93 : (mode == VOIDmode || GET_MODE (op) == mode));
94 : }
95 :
96 : bool
97 : general_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
98 : {
99 : return ((GET_CODE (op) == REG) && (
100 : #line 33 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
101 : (GENERAL_REGNO_P (REGNO (op))))) && (
102 : (mode == VOIDmode || GET_MODE (op) == mode));
103 : }
104 :
105 : bool
106 : index_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
107 : {
108 : return ((GET_CODE (op) == REG) && (
109 : #line 38 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
110 : (INDEX_REGNO_P (REGNO (op))))) && (
111 : (mode == VOIDmode || GET_MODE (op) == mode));
112 : }
113 :
114 : bool
115 : nonimmediate_gr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
116 : {
117 : return (GET_CODE (op) == REG) ? ((
118 : #line 43 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
119 : (GENERAL_REGNO_P (REGNO (op)))) && (
120 : (mode == VOIDmode || GET_MODE (op) == mode))) : (nonimmediate_operand (op, mode));
121 : }
122 :
123 : bool
124 : general_gr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
125 : {
126 : return (GET_CODE (op) == REG) ? ((
127 : #line 49 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
128 : (GENERAL_REGNO_P (REGNO (op)))) && (
129 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode))) : (general_operand (op, mode));
130 : }
131 :
132 : bool
133 : mmx_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
134 : {
135 : return ((GET_CODE (op) == REG) && (
136 : #line 55 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
137 : (MMX_REGNO_P (REGNO (op))))) && (
138 : (mode == VOIDmode || GET_MODE (op) == mode));
139 : }
140 :
141 : bool
142 : register_mmxmem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
143 : {
144 : return (register_operand (op, mode)) || ((!(
145 : #line 61 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
146 : (TARGET_MMX_WITH_SSE))) && (memory_operand (op, mode)));
147 : }
148 :
149 : bool
150 : sse_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
151 : {
152 : return ((GET_CODE (op) == REG) && (
153 : #line 67 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
154 : (SSE_REGNO_P (REGNO (op))))) && (
155 : (mode == VOIDmode || GET_MODE (op) == mode));
156 : }
157 :
158 : bool
159 : any_QIreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
160 : {
161 : return ((GET_CODE (op) == REG) && (
162 : #line 72 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
163 : (ANY_QI_REGNO_P (REGNO (op))))) && (
164 : (mode == VOIDmode || GET_MODE (op) == mode));
165 : }
166 :
167 : bool
168 : QIreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
169 : {
170 : return ((GET_CODE (op) == REG) && (
171 : #line 77 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
172 : (QI_REGNO_P (REGNO (op))))) && (
173 : (mode == VOIDmode || GET_MODE (op) == mode));
174 : }
175 :
176 : bool
177 : ext_QIreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
178 : {
179 : return ((
180 : #line 81 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
181 : (TARGET_64BIT)) && ((GET_CODE (op) == REG) && (!(
182 : #line 83 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
183 : (QI_REGNO_P (REGNO (op))))))) && (
184 : (mode == VOIDmode || GET_MODE (op) == mode));
185 : }
186 :
187 : bool
188 : ax_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
189 : {
190 : return ((GET_CODE (op) == REG) && (
191 : #line 88 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
192 : (REGNO (op) == AX_REG))) && (
193 : (mode == VOIDmode || GET_MODE (op) == mode));
194 : }
195 :
196 : bool
197 : flags_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
198 : {
199 : return (GET_CODE (op) == REG) && (
200 : #line 93 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
201 : (REGNO (op) == FLAGS_REG));
202 : }
203 :
204 : bool
205 : mask_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
206 : {
207 : return ((GET_CODE (op) == REG) && (
208 : #line 98 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
209 : (MASK_REGNO_P (REGNO (op))))) && (
210 : (mode == VOIDmode || GET_MODE (op) == mode));
211 : }
212 :
213 : bool
214 : int248_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
215 : {
216 : return (register_operand (op, mode)) && (((
217 : #line 103 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
218 : (TARGET_64BIT)) && (
219 : #line 104 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
220 : (GET_MODE (op) == DImode))) || ((
221 : #line 105 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
222 : (GET_MODE (op) == SImode)) || (
223 : #line 106 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
224 : (GET_MODE (op) == HImode))));
225 : }
226 :
227 : bool
228 : int_nonimmediate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
229 : {
230 : return (nonimmediate_operand (op, mode)) && (((
231 : #line 111 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
232 : (TARGET_64BIT)) && (
233 : #line 112 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
234 : (GET_MODE (op) == DImode))) || ((
235 : #line 113 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
236 : (GET_MODE (op) == SImode)) || ((
237 : #line 114 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
238 : (GET_MODE (op) == HImode)) || (
239 : #line 115 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
240 : (GET_MODE (op) == QImode)))));
241 : }
242 :
243 : bool
244 : register_ssemem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
245 : {
246 : return (
247 : #line 120 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
248 : (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)) ? (nonimmediate_operand (op, mode)) : (register_operand (op, mode));
249 : }
250 :
251 : bool
252 : nonimm_ssenomem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
253 : {
254 : return ((
255 : #line 128 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
256 : (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)) && (!(
257 : #line 129 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
258 : (TARGET_MIX_SSE_I387)))) ? (register_operand (op, mode)) : (nonimmediate_operand (op, mode));
259 : }
260 :
261 : bool
262 : x87nonimm_ssenomem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
263 : {
264 : return ((
265 : #line 136 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
266 : (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)) && (!(
267 : #line 137 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
268 : (TARGET_MIX_SSE_I387 && X87_ENABLE_ARITH (mode))))) ? (register_operand (op, mode)) : (nonimmediate_operand (op, mode));
269 : }
270 :
271 : bool
272 : register_sse4nonimm_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
273 : {
274 : return (
275 : #line 143 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
276 : (TARGET_SSE4_1)) ? (nonimmediate_operand (op, mode)) : (register_operand (op, mode));
277 : }
278 :
279 : bool
280 : symbol_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
281 : {
282 : return (GET_CODE (op) == SYMBOL_REF) && (
283 : (mode == VOIDmode || GET_MODE (op) == mode));
284 : }
285 :
286 : static inline bool
287 : ix86_endbr_immediate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
288 : #line 154 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
289 : {
290 : if (flag_cf_protection & CF_BRANCH)
291 : {
292 : unsigned HOST_WIDE_INT imm = UINTVAL (op);
293 : unsigned HOST_WIDE_INT val = TARGET_64BIT ? 0xfa1e0ff3 : 0xfb1e0ff3;
294 :
295 : if (imm == val)
296 : return true;
297 :
298 : /* NB: Encoding is byte based. */
299 : if (TARGET_64BIT)
300 : for (; imm >= val; imm >>= 8)
301 : if (imm == val)
302 : return true;
303 : }
304 :
305 : return false;
306 : }
307 :
308 : bool
309 : ix86_endbr_immediate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
310 : {
311 : return (GET_CODE (op) == CONST_INT) && (
312 : (ix86_endbr_immediate_operand_1 (op, mode)));
313 : }
314 :
315 : static inline bool
316 : x86_64_immediate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
317 : #line 176 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
318 : {
319 : if (ix86_endbr_immediate_operand (op, VOIDmode))
320 : return false;
321 :
322 : if (!TARGET_64BIT)
323 : return immediate_operand (op, mode);
324 :
325 : switch (GET_CODE (op))
326 : {
327 : case CONST_INT:
328 : {
329 : HOST_WIDE_INT val = INTVAL (op);
330 : return trunc_int_for_mode (val, SImode) == val;
331 : }
332 : case SYMBOL_REF:
333 : /* TLS symbols are not constant. */
334 : if (SYMBOL_REF_TLS_MODEL (op))
335 : return false;
336 :
337 : /* Load the external function address via the GOT slot. */
338 : if (ix86_force_load_from_GOT_p (op))
339 : return false;
340 :
341 : /* For certain code models, the symbolic references are known to fit.
342 : in CM_SMALL_PIC model we know it fits if it is local to the shared
343 : library. Don't count TLS SYMBOL_REFs here, since they should fit
344 : only if inside of UNSPEC handled below. */
345 : return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL
346 : || (ix86_cmodel == CM_MEDIUM && !SYMBOL_REF_FAR_ADDR_P (op)));
347 :
348 : case LABEL_REF:
349 : /* For certain code models, the code is near as well. */
350 : return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM
351 : || ix86_cmodel == CM_KERNEL);
352 :
353 : case CONST:
354 : /* We also may accept the offsetted memory references in certain
355 : special cases. */
356 : if (GET_CODE (XEXP (op, 0)) == UNSPEC)
357 : switch (XINT (XEXP (op, 0), 1))
358 : {
359 : case UNSPEC_GOTPCREL:
360 : case UNSPEC_DTPOFF:
361 : case UNSPEC_GOTNTPOFF:
362 : case UNSPEC_NTPOFF:
363 : case UNSPEC_SECREL32:
364 : return true;
365 : default:
366 : break;
367 : }
368 :
369 : if (GET_CODE (XEXP (op, 0)) == PLUS)
370 : {
371 : rtx op1 = XEXP (XEXP (op, 0), 0);
372 : rtx op2 = XEXP (XEXP (op, 0), 1);
373 :
374 : if (ix86_cmodel == CM_LARGE && GET_CODE (op1) != UNSPEC)
375 : return false;
376 : if (!CONST_INT_P (op2))
377 : return false;
378 :
379 : HOST_WIDE_INT offset = INTVAL (op2);
380 : if (trunc_int_for_mode (offset, SImode) != offset)
381 : return false;
382 :
383 : switch (GET_CODE (op1))
384 : {
385 : case SYMBOL_REF:
386 : /* TLS symbols are not constant. */
387 : if (SYMBOL_REF_TLS_MODEL (op1))
388 : return false;
389 :
390 : /* Load the external function address via the GOT slot. */
391 : if (ix86_force_load_from_GOT_p (op1))
392 : return false;
393 :
394 : /* For CM_SMALL assume that latest object is 16MB before
395 : end of 31bits boundary. We may also accept pretty
396 : large negative constants knowing that all objects are
397 : in the positive half of address space. */
398 : if ((ix86_cmodel == CM_SMALL
399 : || (ix86_cmodel == CM_MEDIUM
400 : && !SYMBOL_REF_FAR_ADDR_P (op1)))
401 : && offset < 16*1024*1024)
402 : return true;
403 : /* For CM_KERNEL we know that all object resist in the
404 : negative half of 32bits address space. We may not
405 : accept negative offsets, since they may be just off
406 : and we may accept pretty large positive ones. */
407 : if (ix86_cmodel == CM_KERNEL
408 : && offset > 0)
409 : return true;
410 : break;
411 :
412 : case LABEL_REF:
413 : /* These conditions are similar to SYMBOL_REF ones, just the
414 : constraints for code models differ. */
415 : if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
416 : && offset < 16*1024*1024)
417 : return true;
418 : if (ix86_cmodel == CM_KERNEL
419 : && offset > 0)
420 : return true;
421 : break;
422 :
423 : case UNSPEC:
424 : switch (XINT (op1, 1))
425 : {
426 : case UNSPEC_DTPOFF:
427 : case UNSPEC_NTPOFF:
428 : return true;
429 : }
430 : break;
431 :
432 : default:
433 : break;
434 : }
435 : }
436 : break;
437 :
438 : default:
439 : gcc_unreachable ();
440 : }
441 :
442 : return false;
443 : }
444 :
445 : bool
446 : x86_64_immediate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
447 : {
448 : switch (GET_CODE (op))
449 : {
450 : case CONST_INT:
451 : case SYMBOL_REF:
452 : case LABEL_REF:
453 : case CONST:
454 : break;
455 : default:
456 : return false;
457 : }
458 : return (
459 : (x86_64_immediate_operand_1 (op, mode))) && (
460 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
461 : }
462 :
463 : static inline bool
464 : x86_64_zext_immediate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
465 : #line 306 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
466 : {
467 : if (ix86_endbr_immediate_operand (op, VOIDmode))
468 : return false;
469 :
470 : switch (GET_CODE (op))
471 : {
472 : case CONST_INT:
473 : return !(INTVAL (op) & ~HOST_WIDE_INT_C (0xffffffff));
474 :
475 : case SYMBOL_REF:
476 : /* TLS symbols are not constant. */
477 : if (SYMBOL_REF_TLS_MODEL (op))
478 : return false;
479 :
480 : /* Load the external function address via the GOT slot. */
481 : if (ix86_force_load_from_GOT_p (op))
482 : return false;
483 :
484 : /* For certain code models, the symbolic references are known to fit. */
485 : return (ix86_cmodel == CM_SMALL
486 : || (ix86_cmodel == CM_MEDIUM
487 : && !SYMBOL_REF_FAR_ADDR_P (op)));
488 :
489 : case LABEL_REF:
490 : /* For certain code models, the code is near as well. */
491 : return ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM;
492 :
493 : case CONST:
494 : /* We also may accept the offsetted memory references in certain
495 : special cases. */
496 : if (GET_CODE (XEXP (op, 0)) == PLUS)
497 : {
498 : rtx op1 = XEXP (XEXP (op, 0), 0);
499 : rtx op2 = XEXP (XEXP (op, 0), 1);
500 :
501 : if (ix86_cmodel == CM_LARGE)
502 : return false;
503 : if (!CONST_INT_P (op2))
504 : return false;
505 :
506 : HOST_WIDE_INT offset = INTVAL (op2);
507 : if (trunc_int_for_mode (offset, SImode) != offset)
508 : return false;
509 :
510 : switch (GET_CODE (op1))
511 : {
512 : case SYMBOL_REF:
513 : /* TLS symbols are not constant. */
514 : if (SYMBOL_REF_TLS_MODEL (op1))
515 : return false;
516 :
517 : /* Load the external function address via the GOT slot. */
518 : if (ix86_force_load_from_GOT_p (op1))
519 : return false;
520 :
521 : /* For small code model we may accept pretty large positive
522 : offsets, since one bit is available for free. Negative
523 : offsets are limited by the size of NULL pointer area
524 : specified by the ABI. */
525 : if ((ix86_cmodel == CM_SMALL
526 : || (ix86_cmodel == CM_MEDIUM
527 : && !SYMBOL_REF_FAR_ADDR_P (op1)))
528 : && offset > -0x10000)
529 : return true;
530 : /* ??? For the kernel, we may accept adjustment of
531 : -0x10000000, since we know that it will just convert
532 : negative address space to positive, but perhaps this
533 : is not worthwhile. */
534 : break;
535 :
536 : case LABEL_REF:
537 : /* These conditions are similar to SYMBOL_REF ones, just the
538 : constraints for code models differ. */
539 : if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
540 : && offset > -0x10000)
541 : return true;
542 : break;
543 :
544 : default:
545 : return false;
546 : }
547 : }
548 : break;
549 :
550 : default:
551 : gcc_unreachable ();
552 : }
553 : return false;
554 : }
555 :
556 : bool
557 : x86_64_zext_immediate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
558 : {
559 : switch (GET_CODE (op))
560 : {
561 : case CONST_INT:
562 : case SYMBOL_REF:
563 : case LABEL_REF:
564 : case CONST:
565 : break;
566 : default:
567 : return false;
568 : }
569 : return (
570 : (x86_64_zext_immediate_operand_1 (op, mode))) && (
571 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
572 : }
573 :
574 : static inline bool
575 : x86_64_neg_const_int_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
576 : #line 400 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
577 : {
578 : HOST_WIDE_INT val = -UINTVAL (op);
579 : if (mode == DImode && trunc_int_for_mode (val, SImode) != val)
580 : return false;
581 : if (flag_cf_protection & CF_BRANCH)
582 : {
583 : unsigned HOST_WIDE_INT endbr = TARGET_64BIT ? 0xfa1e0ff3 : 0xfb1e0ff3;
584 : if ((val & HOST_WIDE_INT_C (0xffffffff)) == endbr)
585 : return false;
586 : }
587 : return true;
588 : }
589 :
590 : bool
591 : x86_64_neg_const_int_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
592 : {
593 : return (GET_CODE (op) == CONST_INT) && (
594 : (x86_64_neg_const_int_operand_1 (op, mode)));
595 : }
596 :
597 : static inline bool
598 : x86_64_hilo_int_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
599 : #line 417 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
600 : {
601 : switch (GET_CODE (op))
602 : {
603 : case CONST_INT:
604 : return x86_64_immediate_operand (op, mode);
605 :
606 : case CONST_WIDE_INT:
607 : gcc_assert (CONST_WIDE_INT_NUNITS (op) == 2);
608 : return (x86_64_immediate_operand (GEN_INT (CONST_WIDE_INT_ELT (op, 0)),
609 : DImode)
610 : && x86_64_immediate_operand (GEN_INT (CONST_WIDE_INT_ELT (op,
611 : 1)),
612 : DImode));
613 :
614 : default:
615 : gcc_unreachable ();
616 : }
617 : }
618 :
619 : bool
620 : x86_64_hilo_int_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
621 : {
622 : switch (GET_CODE (op))
623 : {
624 : case CONST_INT:
625 : case CONST_WIDE_INT:
626 : break;
627 : default:
628 : return false;
629 : }
630 : return
631 : (x86_64_hilo_int_operand_1 (op, mode));
632 : }
633 :
634 : static inline bool
635 : x86_64_dwzext_immediate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
636 : #line 440 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
637 : {
638 : if (ix86_endbr_immediate_operand (op, VOIDmode))
639 : return false;
640 :
641 : switch (GET_CODE (op))
642 : {
643 : case CONST_INT:
644 : if (!TARGET_64BIT)
645 : return UINTVAL (op) <= HOST_WIDE_INT_UC (0xffffffff);
646 : return UINTVAL (op) <= HOST_WIDE_INT_UC (0x7fffffff);
647 :
648 : case CONST_WIDE_INT:
649 : if (!TARGET_64BIT)
650 : return false;
651 : return (CONST_WIDE_INT_NUNITS (op) == 2
652 : && CONST_WIDE_INT_ELT (op, 1) == 0
653 : && (trunc_int_for_mode (CONST_WIDE_INT_ELT (op, 0), SImode)
654 : == (HOST_WIDE_INT) CONST_WIDE_INT_ELT (op, 0)));
655 :
656 : default:
657 : gcc_unreachable ();
658 : }
659 : }
660 :
661 : bool
662 : x86_64_dwzext_immediate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
663 : {
664 : switch (GET_CODE (op))
665 : {
666 : case CONST_INT:
667 : case CONST_WIDE_INT:
668 : break;
669 : default:
670 : return false;
671 : }
672 : return
673 : (x86_64_dwzext_immediate_operand_1 (op, mode));
674 : }
675 :
676 : bool
677 : x86_64_immediate_size_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
678 : {
679 : return ((GET_CODE (op) == SYMBOL_REF) && ((!(
680 : #line 468 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
681 : (TARGET_64BIT))) || ((
682 : #line 469 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
683 : (ix86_cmodel == CM_SMALL)) || (
684 : #line 470 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
685 : (ix86_cmodel == CM_KERNEL))))) && (
686 : (mode == VOIDmode || GET_MODE (op) == mode));
687 : }
688 :
689 : bool
690 : x86_64_general_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
691 : {
692 : return (
693 : #line 474 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
694 : (TARGET_64BIT)) ? ((nonimmediate_operand (op, mode)) || (x86_64_immediate_operand (op, mode))) : (general_operand (op, mode));
695 : }
696 :
697 : bool
698 : x86_64_hilo_general_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
699 : {
700 : return (
701 : #line 482 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
702 : (TARGET_64BIT)) ? ((nonimmediate_operand (op, mode)) || (x86_64_hilo_int_operand (op, mode))) : (general_operand (op, mode));
703 : }
704 :
705 : bool
706 : x86_64_sext_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
707 : {
708 : return (
709 : #line 491 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
710 : (GET_MODE (op) != VOIDmode)) && (x86_64_general_operand (op, mode));
711 : }
712 :
713 : bool
714 : sext_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
715 : {
716 : return (
717 : #line 498 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
718 : (GET_MODE (op) != VOIDmode)) && (general_operand (op, mode));
719 : }
720 :
721 : bool
722 : x86_64_zext_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
723 : {
724 : return (
725 : #line 505 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
726 : (TARGET_64BIT)) ? ((nonimmediate_operand (op, mode)) || ((x86_64_zext_immediate_operand (op, mode)) && (
727 : #line 508 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
728 : (GET_MODE (op) != VOIDmode)))) : (nonimmediate_operand (op, mode));
729 : }
730 :
731 : bool
732 : x86_64_szext_general_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
733 : {
734 : return (
735 : #line 514 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
736 : (TARGET_64BIT)) ? ((nonimmediate_operand (op, mode)) || ((x86_64_immediate_operand (op, mode)) || (x86_64_zext_immediate_operand (op, mode)))) : (general_operand (op, mode));
737 : }
738 :
739 : bool
740 : x86_64_nonmemory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
741 : {
742 : return (
743 : #line 522 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
744 : (TARGET_64BIT)) ? ((register_operand (op, mode)) || (x86_64_immediate_operand (op, mode))) : (nonmemory_operand (op, mode));
745 : }
746 :
747 : bool
748 : x86_64_szext_nonmemory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
749 : {
750 : return (
751 : #line 529 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
752 : (TARGET_64BIT)) ? ((register_operand (op, mode)) || ((x86_64_immediate_operand (op, mode)) || (x86_64_zext_immediate_operand (op, mode)))) : (nonmemory_operand (op, mode));
753 : }
754 :
755 : static inline bool
756 : pic_32bit_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
757 : #line 539 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
758 : {
759 : if (!flag_pic)
760 : return false;
761 :
762 : /* Rule out relocations that translate into 64bit constants. */
763 : if (TARGET_64BIT && GET_CODE (op) == CONST)
764 : {
765 : rtx tmp = XEXP (op, 0);
766 : if (GET_CODE (tmp) == PLUS && CONST_INT_P (XEXP (tmp, 1)))
767 : tmp = XEXP (tmp, 0);
768 : if (GET_CODE (tmp) == UNSPEC
769 : && (XINT (tmp, 1) == UNSPEC_GOTOFF
770 : || XINT (tmp, 1) == UNSPEC_GOT))
771 : return false;
772 : }
773 :
774 : return symbolic_operand (op, mode);
775 : }
776 :
777 : bool
778 : pic_32bit_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
779 : {
780 : switch (GET_CODE (op))
781 : {
782 : case CONST:
783 : case SYMBOL_REF:
784 : case LABEL_REF:
785 : break;
786 : default:
787 : return false;
788 : }
789 : return (
790 : (pic_32bit_operand_1 (op, mode))) && (
791 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
792 : }
793 :
794 : bool
795 : x86_64_movabs_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
796 : {
797 : return (nonmemory_operand (op, mode)) && (!(pic_32bit_operand (op, mode)));
798 : }
799 :
800 : static inline bool
801 : symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
802 : #line 567 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
803 : {
804 : switch (GET_CODE (op))
805 : {
806 : case SYMBOL_REF:
807 : case LABEL_REF:
808 : return true;
809 :
810 : case CONST:
811 : op = XEXP (op, 0);
812 : if (SYMBOL_REF_P (op)
813 : || LABEL_REF_P (op)
814 : || (GET_CODE (op) == UNSPEC
815 : && (XINT (op, 1) == UNSPEC_GOT
816 : || XINT (op, 1) == UNSPEC_GOTOFF
817 : || XINT (op, 1) == UNSPEC_SECREL32
818 : || XINT (op, 1) == UNSPEC_PCREL
819 : || XINT (op, 1) == UNSPEC_GOTPCREL)))
820 : return true;
821 : if (GET_CODE (op) != PLUS
822 : || !CONST_INT_P (XEXP (op, 1)))
823 : return false;
824 :
825 : op = XEXP (op, 0);
826 : if (SYMBOL_REF_P (op)
827 : || LABEL_REF_P (op))
828 : return true;
829 : /* Only @GOTOFF and @SECREL32 get offsets. */
830 : if (GET_CODE (op) != UNSPEC
831 : || (XINT (op, 1) != UNSPEC_GOTOFF
832 : && XINT (op, 1) != UNSPEC_SECREL32))
833 : return false;
834 :
835 : op = XVECEXP (op, 0, 0);
836 : if (SYMBOL_REF_P (op)
837 : || LABEL_REF_P (op))
838 : return true;
839 : return false;
840 :
841 : default:
842 : gcc_unreachable ();
843 : }
844 : }
845 :
846 : bool
847 : symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
848 : {
849 : switch (GET_CODE (op))
850 : {
851 : case SYMBOL_REF:
852 : case LABEL_REF:
853 : case CONST:
854 : break;
855 : default:
856 : return false;
857 : }
858 : return (
859 : (symbolic_operand_1 (op, mode))) && (
860 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
861 : }
862 :
863 : static inline bool
864 : local_symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
865 : #line 613 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
866 : {
867 : if (GET_CODE (op) == CONST
868 : && GET_CODE (XEXP (op, 0)) == PLUS
869 : && CONST_INT_P (XEXP (XEXP (op, 0), 1)))
870 : op = XEXP (XEXP (op, 0), 0);
871 :
872 : if (LABEL_REF_P (op))
873 : return true;
874 :
875 : if (!SYMBOL_REF_P (op))
876 : return false;
877 :
878 : if (SYMBOL_REF_TLS_MODEL (op))
879 : return false;
880 :
881 : /* Dll-imported symbols are always external. */
882 : if (TARGET_DLLIMPORT_DECL_ATTRIBUTES && SYMBOL_REF_DLLIMPORT_P (op))
883 : return false;
884 : if (SYMBOL_REF_LOCAL_P (op))
885 : return true;
886 :
887 : /* There is, however, a not insubstantial body of code in the rest of
888 : the compiler that assumes it can just stick the results of
889 : ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */
890 : /* ??? This is a hack. Should update the body of the compiler to
891 : always create a DECL an invoke targetm.encode_section_info. */
892 : if (strncmp (XSTR (op, 0), internal_label_prefix,
893 : internal_label_prefix_len) == 0)
894 : return true;
895 :
896 : return false;
897 : }
898 :
899 : bool
900 : local_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
901 : {
902 : switch (GET_CODE (op))
903 : {
904 : case CONST:
905 : case LABEL_REF:
906 : case SYMBOL_REF:
907 : break;
908 : default:
909 : return false;
910 : }
911 : return (
912 : (local_symbolic_operand_1 (op, mode))) && (
913 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
914 : }
915 :
916 : static inline bool
917 : local_func_symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
918 : #line 648 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
919 : {
920 : if (GET_CODE (op) == CONST
921 : && GET_CODE (XEXP (op, 0)) == PLUS
922 : && CONST_INT_P (XEXP (XEXP (op, 0), 1)))
923 : op = XEXP (XEXP (op, 0), 0);
924 :
925 : if (SYMBOL_REF_P (op)
926 : && !SYMBOL_REF_FUNCTION_P (op))
927 : return false;
928 :
929 : return true;
930 : }
931 :
932 : bool
933 : local_func_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
934 : {
935 : return (local_symbolic_operand (op, mode)) && (
936 : (local_func_symbolic_operand_1 (op, mode)));
937 : }
938 :
939 : bool
940 : gotoff_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
941 : {
942 : return ((!(
943 : #line 671 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
944 : (TARGET_VXWORKS_VAROFF))) || ((
945 : #line 672 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
946 : (ix86_cmodel == CM_LARGE)) || (
947 : #line 673 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
948 : (ix86_cmodel == CM_LARGE_PIC)))) && (local_symbolic_operand (op, mode));
949 : }
950 :
951 : bool
952 : tls_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
953 : {
954 : return (GET_CODE (op) == SYMBOL_REF) && (
955 : #line 679 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
956 : (SYMBOL_REF_TLS_MODEL (op)));
957 : }
958 :
959 : bool
960 : tls_modbase_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
961 : {
962 : return (GET_CODE (op) == SYMBOL_REF) && (
963 : #line 683 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
964 : (op == ix86_tls_module_base ()));
965 : }
966 :
967 : bool
968 : tls_address_pattern (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
969 : {
970 : switch (GET_CODE (op))
971 : {
972 : case SET:
973 : case PARALLEL:
974 : case UNSPEC:
975 : case UNSPEC_VOLATILE:
976 : break;
977 : default:
978 : return false;
979 : }
980 : return (
981 : #line 687 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
982 : (ix86_tls_address_pattern_p (op))) && (
983 : (mode == VOIDmode || GET_MODE (op) == mode));
984 : }
985 :
986 : static inline bool
987 : constant_call_address_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
988 : #line 692 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
989 : {
990 : if (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC
991 : || flag_force_indirect_call
992 : || (TARGET_INDIRECT_BRANCH_REGISTER
993 : && ix86_nopic_noplt_attribute_p (op)))
994 : return false;
995 : if (TARGET_DLLIMPORT_DECL_ATTRIBUTES && SYMBOL_REF_DLLIMPORT_P (op))
996 : return false;
997 : return true;
998 : }
999 :
1000 : bool
1001 : constant_call_address_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1002 : {
1003 : return ((GET_CODE (op) == SYMBOL_REF) && (
1004 : (constant_call_address_operand_1 (op, mode)))) && (
1005 : (mode == VOIDmode || GET_MODE (op) == mode));
1006 : }
1007 :
1008 : static inline bool
1009 : register_no_elim_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1010 : #line 707 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1011 : {
1012 : if (SUBREG_P (op))
1013 : op = SUBREG_REG (op);
1014 :
1015 : /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1016 : because it is guaranteed to be reloaded into one. */
1017 : if (MEM_P (op))
1018 : return true;
1019 :
1020 : return !(op == arg_pointer_rtx
1021 : || op == frame_pointer_rtx
1022 : || VIRTUAL_REGISTER_P (op));
1023 : }
1024 :
1025 : bool
1026 : register_no_elim_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1027 : {
1028 : return (register_operand (op, mode)) && (
1029 : (register_no_elim_operand_1 (op, mode)));
1030 : }
1031 :
1032 : static inline bool
1033 : register_no_SP_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1034 : #line 725 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1035 : {
1036 : if (SUBREG_P (op))
1037 : op = SUBREG_REG (op);
1038 :
1039 : /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1040 : because it is guaranteed to be reloaded into one. */
1041 : if (MEM_P (op))
1042 : return true;
1043 :
1044 : return !(op == arg_pointer_rtx
1045 : || op == frame_pointer_rtx
1046 : || op == stack_pointer_rtx
1047 : || VIRTUAL_REGISTER_P (op));
1048 : }
1049 :
1050 : bool
1051 : register_no_SP_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1052 : {
1053 : return (register_operand (op, mode)) && (
1054 : (register_no_SP_operand_1 (op, mode)));
1055 : }
1056 :
1057 : bool
1058 : call_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1059 : {
1060 : return (
1061 : #line 745 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1062 : (TARGET_64BIT)) ? (register_operand (op, mode)) : (register_no_SP_operand (op, mode));
1063 : }
1064 :
1065 : bool
1066 : general_no_elim_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1067 : {
1068 : return (GET_CODE (op) == REG || GET_CODE (op) == SUBREG) ? (register_no_elim_operand (op, mode)) : (general_operand (op, mode));
1069 : }
1070 :
1071 : bool
1072 : nonmemory_no_elim_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1073 : {
1074 : return (register_no_elim_operand (op, mode)) || (immediate_operand (op, mode));
1075 : }
1076 :
1077 : bool
1078 : indirect_branch_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1079 : {
1080 : return (register_operand (op, mode)) || ((!(
1081 : #line 764 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1082 : (TARGET_INDIRECT_BRANCH_REGISTER))) && ((!(
1083 : #line 765 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1084 : (TARGET_X32))) && (memory_operand (op, mode))));
1085 : }
1086 :
1087 : static inline bool
1088 : sibcall_memory_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1089 : #line 775 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1090 : {
1091 : op = XEXP (op, 0);
1092 : if (CONSTANT_P (op))
1093 : return true;
1094 : if (GET_CODE (op) == PLUS && REG_P (XEXP (op, 0)))
1095 : {
1096 : int regno = REGNO (XEXP (op, 0));
1097 : if (!HARD_REGISTER_NUM_P (regno) || call_used_or_fixed_reg_p (regno))
1098 : {
1099 : op = XEXP (op, 1);
1100 : if (GOT32_symbol_operand (op, VOIDmode))
1101 : return true;
1102 : }
1103 : }
1104 : return false;
1105 : }
1106 :
1107 : bool
1108 : sibcall_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1109 : {
1110 : return (memory_operand (op, mode)) && (
1111 : (sibcall_memory_operand_1 (op, mode)));
1112 : }
1113 :
1114 : bool
1115 : GOT_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1116 : {
1117 : return (memory_operand (op, mode)) && ((GET_CODE (XEXP (op, 0)) == CONST) && ((GET_CODE (XEXP (XEXP (op, 0), 0)) == UNSPEC) && (
1118 : #line 797 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1119 : (XINT (XEXP (XEXP (op, 0), 0), 1) == UNSPEC_GOTPCREL))));
1120 : }
1121 :
1122 : bool
1123 : call_insn_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1124 : {
1125 : return (
1126 : #line 802 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1127 : (constant_call_address_operand
1128 : (op, mode == VOIDmode ? mode : Pmode))) || ((call_register_operand (op, mode)) || (
1129 : #line 805 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1130 : (satisfies_constraint_Bw (op))));
1131 : }
1132 :
1133 : bool
1134 : sibcall_insn_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1135 : {
1136 : return (
1137 : #line 809 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1138 : (constant_call_address_operand
1139 : (op, mode == VOIDmode ? mode : Pmode))) || ((register_no_elim_operand (op, mode)) || (
1140 : #line 812 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1141 : (satisfies_constraint_Bs (op))));
1142 : }
1143 :
1144 : bool
1145 : GOT32_symbol_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1146 : {
1147 : return ((GET_CODE (op) == CONST) && ((GET_CODE (XEXP (op, 0)) == UNSPEC) && (
1148 : #line 818 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1149 : (XINT (XEXP (op, 0), 1) == UNSPEC_GOT)))) && (
1150 : (mode == VOIDmode || GET_MODE (op) == mode));
1151 : }
1152 :
1153 : static inline bool
1154 : const0_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1155 : #line 823 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1156 : {
1157 : if (mode == VOIDmode)
1158 : mode = GET_MODE (op);
1159 : return op == CONST0_RTX (mode);
1160 : }
1161 :
1162 : bool
1163 : const0_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1164 : {
1165 : switch (GET_CODE (op))
1166 : {
1167 : case CONST_INT:
1168 : case CONST_DOUBLE:
1169 : case CONST_VECTOR:
1170 : break;
1171 : default:
1172 : return false;
1173 : }
1174 : return (
1175 : (const0_operand_1 (op, mode))) && (
1176 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
1177 : }
1178 :
1179 : static inline bool
1180 : const1_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1181 : #line 832 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1182 : {
1183 : if (mode == VOIDmode)
1184 : mode = GET_MODE (op);
1185 : return op == CONST1_RTX (mode);
1186 : }
1187 :
1188 : bool
1189 : const1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1190 : {
1191 : switch (GET_CODE (op))
1192 : {
1193 : case CONST_INT:
1194 : case CONST_DOUBLE:
1195 : case CONST_VECTOR:
1196 : break;
1197 : default:
1198 : return false;
1199 : }
1200 : return (
1201 : (const1_operand_1 (op, mode))) && (
1202 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
1203 : }
1204 :
1205 : bool
1206 : constm1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1207 : {
1208 : return (GET_CODE (op) == CONST_INT) && (
1209 : #line 841 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1210 : (op == constm1_rtx));
1211 : }
1212 :
1213 : bool
1214 : const0_or_m1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1215 : {
1216 : return (const0_operand (op, mode)) || (constm1_operand (op, mode));
1217 : }
1218 :
1219 : bool
1220 : const8_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1221 : {
1222 : return (GET_CODE (op) == CONST_INT) && (
1223 : #line 851 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1224 : (INTVAL (op) == 8));
1225 : }
1226 :
1227 : bool
1228 : const128_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1229 : {
1230 : return (GET_CODE (op) == CONST_INT) && (
1231 : #line 856 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1232 : (INTVAL (op) == 128));
1233 : }
1234 :
1235 : bool
1236 : const_32bit_mask (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1237 : {
1238 : return (GET_CODE (op) == CONST_INT) && (
1239 : #line 861 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1240 : (trunc_int_for_mode (INTVAL (op), DImode)
1241 : == HOST_WIDE_INT_C (0xffffffff)));
1242 : }
1243 :
1244 : static inline bool
1245 : const248_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1246 : #line 867 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1247 : {
1248 : HOST_WIDE_INT i = INTVAL (op);
1249 : return i == 2 || i == 4 || i == 8;
1250 : }
1251 :
1252 : bool
1253 : const248_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1254 : {
1255 : return (GET_CODE (op) == CONST_INT) && (
1256 : (const248_operand_1 (op, mode)));
1257 : }
1258 :
1259 : static inline bool
1260 : const123_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1261 : #line 875 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1262 : {
1263 : HOST_WIDE_INT i = INTVAL (op);
1264 : return i == 1 || i == 2 || i == 3;
1265 : }
1266 :
1267 : bool
1268 : const123_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1269 : {
1270 : return (GET_CODE (op) == CONST_INT) && (
1271 : (const123_operand_1 (op, mode)));
1272 : }
1273 :
1274 : static inline bool
1275 : const2367_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1276 : #line 883 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1277 : {
1278 : HOST_WIDE_INT i = INTVAL (op);
1279 : return i == 2 || i == 3 || i == 6 || i == 7;
1280 : }
1281 :
1282 : bool
1283 : const2367_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1284 : {
1285 : return (GET_CODE (op) == CONST_INT) && (
1286 : (const2367_operand_1 (op, mode)));
1287 : }
1288 :
1289 : static inline bool
1290 : const1248_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1291 : #line 891 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1292 : {
1293 : HOST_WIDE_INT i = INTVAL (op);
1294 : return i == 1 || i == 2 || i == 4 || i == 8;
1295 : }
1296 :
1297 : bool
1298 : const1248_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1299 : {
1300 : return (GET_CODE (op) == CONST_INT) && (
1301 : (const1248_operand_1 (op, mode)));
1302 : }
1303 :
1304 : static inline bool
1305 : const359_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1306 : #line 899 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1307 : {
1308 : HOST_WIDE_INT i = INTVAL (op);
1309 : return i == 3 || i == 5 || i == 9;
1310 : }
1311 :
1312 : bool
1313 : const359_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1314 : {
1315 : return (GET_CODE (op) == CONST_INT) && (
1316 : (const359_operand_1 (op, mode)));
1317 : }
1318 :
1319 : static inline bool
1320 : const_4_or_8_to_11_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1321 : #line 907 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1322 : {
1323 : HOST_WIDE_INT i = INTVAL (op);
1324 : return i == 4 || (i >= 8 && i <= 11);
1325 : }
1326 :
1327 : bool
1328 : const_4_or_8_to_11_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1329 : {
1330 : return (GET_CODE (op) == CONST_INT) && (
1331 : (const_4_or_8_to_11_operand_1 (op, mode)));
1332 : }
1333 :
1334 : static inline bool
1335 : const48_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1336 : #line 915 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1337 : {
1338 : HOST_WIDE_INT i = INTVAL (op);
1339 : return i == 4 || i == 8;
1340 : }
1341 :
1342 : bool
1343 : const48_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1344 : {
1345 : return (GET_CODE (op) == CONST_INT) && (
1346 : (const48_operand_1 (op, mode)));
1347 : }
1348 :
1349 : bool
1350 : const_0_to_1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1351 : {
1352 : return (GET_CODE (op) == CONST_INT) && ((
1353 : #line 923 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1354 : (op == const0_rtx)) || (
1355 : #line 924 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1356 : (op == const1_rtx)));
1357 : }
1358 :
1359 : bool
1360 : const_0_to_3_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1361 : {
1362 : return (GET_CODE (op) == CONST_INT) && (
1363 : #line 929 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1364 : (IN_RANGE (INTVAL (op), 0, 3)));
1365 : }
1366 :
1367 : bool
1368 : const_0_to_4_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1369 : {
1370 : return (GET_CODE (op) == CONST_INT) && (
1371 : #line 934 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1372 : (IN_RANGE (INTVAL (op), 0, 4)));
1373 : }
1374 :
1375 : bool
1376 : const_0_to_5_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1377 : {
1378 : return (GET_CODE (op) == CONST_INT) && (
1379 : #line 939 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1380 : (IN_RANGE (INTVAL (op), 0, 5)));
1381 : }
1382 :
1383 : bool
1384 : const_0_to_7_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1385 : {
1386 : return (GET_CODE (op) == CONST_INT) && (
1387 : #line 944 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1388 : (IN_RANGE (INTVAL (op), 0, 7)));
1389 : }
1390 :
1391 : bool
1392 : const_0_to_15_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1393 : {
1394 : return (GET_CODE (op) == CONST_INT) && (
1395 : #line 949 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1396 : (IN_RANGE (INTVAL (op), 0, 15)));
1397 : }
1398 :
1399 : bool
1400 : const_0_to_31_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1401 : {
1402 : return (GET_CODE (op) == CONST_INT) && (
1403 : #line 954 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1404 : (IN_RANGE (INTVAL (op), 0, 31)));
1405 : }
1406 :
1407 : bool
1408 : const_0_to_63_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1409 : {
1410 : return (GET_CODE (op) == CONST_INT) && (
1411 : #line 959 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1412 : (IN_RANGE (INTVAL (op), 0, 63)));
1413 : }
1414 :
1415 : bool
1416 : const_0_to_127_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1417 : {
1418 : return (GET_CODE (op) == CONST_INT) && (
1419 : #line 964 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1420 : (IN_RANGE (INTVAL (op), 0, 127)));
1421 : }
1422 :
1423 : bool
1424 : const_0_to_255_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1425 : {
1426 : return (GET_CODE (op) == CONST_INT) && (
1427 : #line 969 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1428 : (IN_RANGE (INTVAL (op), 0, 255)));
1429 : }
1430 :
1431 : static inline bool
1432 : const_0_to_255_mul_8_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1433 : #line 974 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1434 : {
1435 : unsigned HOST_WIDE_INT val = INTVAL (op);
1436 : return val <= 255*8 && val % 8 == 0;
1437 : }
1438 :
1439 : bool
1440 : const_0_to_255_mul_8_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1441 : {
1442 : return (GET_CODE (op) == CONST_INT) && (
1443 : (const_0_to_255_mul_8_operand_1 (op, mode)));
1444 : }
1445 :
1446 : static inline bool
1447 : const_0_to_255_not_mul_8_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1448 : #line 982 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1449 : {
1450 : unsigned HOST_WIDE_INT val = INTVAL (op);
1451 : return val <= 255 && val % 8 != 0;
1452 : }
1453 :
1454 : bool
1455 : const_0_to_255_not_mul_8_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1456 : {
1457 : return (GET_CODE (op) == CONST_INT) && (
1458 : (const_0_to_255_not_mul_8_operand_1 (op, mode)));
1459 : }
1460 :
1461 : bool
1462 : const_1_to_31_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1463 : {
1464 : return (GET_CODE (op) == CONST_INT) && (
1465 : #line 991 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1466 : (IN_RANGE (INTVAL (op), 1, 31)));
1467 : }
1468 :
1469 : bool
1470 : const_1_to_63_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1471 : {
1472 : return (GET_CODE (op) == CONST_INT) && (
1473 : #line 997 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1474 : (IN_RANGE (INTVAL (op), 1, 63)));
1475 : }
1476 :
1477 : bool
1478 : const_2_to_3_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1479 : {
1480 : return (GET_CODE (op) == CONST_INT) && (
1481 : #line 1002 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1482 : (IN_RANGE (INTVAL (op), 2, 3)));
1483 : }
1484 :
1485 : bool
1486 : const_4_to_5_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1487 : {
1488 : return (GET_CODE (op) == CONST_INT) && (
1489 : #line 1007 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1490 : (IN_RANGE (INTVAL (op), 4, 5)));
1491 : }
1492 :
1493 : bool
1494 : const_4_to_7_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1495 : {
1496 : return (GET_CODE (op) == CONST_INT) && (
1497 : #line 1012 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1498 : (IN_RANGE (INTVAL (op), 4, 7)));
1499 : }
1500 :
1501 : bool
1502 : const_6_to_7_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1503 : {
1504 : return (GET_CODE (op) == CONST_INT) && (
1505 : #line 1017 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1506 : (IN_RANGE (INTVAL (op), 6, 7)));
1507 : }
1508 :
1509 : bool
1510 : const_8_to_9_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1511 : {
1512 : return (GET_CODE (op) == CONST_INT) && (
1513 : #line 1022 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1514 : (IN_RANGE (INTVAL (op), 8, 9)));
1515 : }
1516 :
1517 : bool
1518 : const_8_to_11_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1519 : {
1520 : return (GET_CODE (op) == CONST_INT) && (
1521 : #line 1027 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1522 : (IN_RANGE (INTVAL (op), 8, 11)));
1523 : }
1524 :
1525 : bool
1526 : const_8_to_15_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1527 : {
1528 : return (GET_CODE (op) == CONST_INT) && (
1529 : #line 1032 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1530 : (IN_RANGE (INTVAL (op), 8, 15)));
1531 : }
1532 :
1533 : bool
1534 : const_10_to_11_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1535 : {
1536 : return (GET_CODE (op) == CONST_INT) && (
1537 : #line 1037 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1538 : (IN_RANGE (INTVAL (op), 10, 11)));
1539 : }
1540 :
1541 : bool
1542 : const_12_to_13_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1543 : {
1544 : return (GET_CODE (op) == CONST_INT) && (
1545 : #line 1042 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1546 : (IN_RANGE (INTVAL (op), 12, 13)));
1547 : }
1548 :
1549 : bool
1550 : const_12_to_15_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1551 : {
1552 : return (GET_CODE (op) == CONST_INT) && (
1553 : #line 1047 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1554 : (IN_RANGE (INTVAL (op), 12, 15)));
1555 : }
1556 :
1557 : bool
1558 : const_14_to_15_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1559 : {
1560 : return (GET_CODE (op) == CONST_INT) && (
1561 : #line 1052 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1562 : (IN_RANGE (INTVAL (op), 14, 15)));
1563 : }
1564 :
1565 : bool
1566 : const_16_to_19_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1567 : {
1568 : return (GET_CODE (op) == CONST_INT) && (
1569 : #line 1057 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1570 : (IN_RANGE (INTVAL (op), 16, 19)));
1571 : }
1572 :
1573 : bool
1574 : const_16_to_31_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1575 : {
1576 : return (GET_CODE (op) == CONST_INT) && (
1577 : #line 1062 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1578 : (IN_RANGE (INTVAL (op), 16, 31)));
1579 : }
1580 :
1581 : bool
1582 : const_20_to_23_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1583 : {
1584 : return (GET_CODE (op) == CONST_INT) && (
1585 : #line 1067 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1586 : (IN_RANGE (INTVAL (op), 20, 23)));
1587 : }
1588 :
1589 : bool
1590 : const_24_to_27_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1591 : {
1592 : return (GET_CODE (op) == CONST_INT) && (
1593 : #line 1072 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1594 : (IN_RANGE (INTVAL (op), 24, 27)));
1595 : }
1596 :
1597 : bool
1598 : const_28_to_31_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1599 : {
1600 : return (GET_CODE (op) == CONST_INT) && (
1601 : #line 1077 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1602 : (IN_RANGE (INTVAL (op), 28, 31)));
1603 : }
1604 :
1605 : bool
1606 : cmpps_imm_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1607 : {
1608 : return (const_0_to_7_operand (op, mode)) || ((
1609 : #line 1081 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1610 : (TARGET_AVX)) && (const_0_to_31_operand (op, mode)));
1611 : }
1612 :
1613 : static inline bool
1614 : incdec_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1615 : #line 1087 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1616 : {
1617 : /* On Pentium4, the inc and dec operations causes extra dependency on flag
1618 : registers, since carry flag is not set. */
1619 : if (!TARGET_USE_INCDEC && !optimize_insn_for_size_p ())
1620 : return false;
1621 : return op == const1_rtx || op == constm1_rtx;
1622 : }
1623 :
1624 : bool
1625 : incdec_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1626 : {
1627 : return (GET_CODE (op) == CONST_INT) && (
1628 : (incdec_operand_1 (op, mode)));
1629 : }
1630 :
1631 : bool
1632 : vec_setm_sse41_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1633 : {
1634 : return ((register_operand (op, mode)) && (
1635 : #line 1098 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1636 : (TARGET_SSE4_1))) || ((GET_CODE (op) == CONST_INT) && (
1637 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
1638 : }
1639 :
1640 : bool
1641 : vec_setm_avx2_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1642 : {
1643 : return ((register_operand (op, mode)) && (
1644 : #line 1103 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1645 : (TARGET_AVX2))) || ((GET_CODE (op) == CONST_INT) && (
1646 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
1647 : }
1648 :
1649 : bool
1650 : vec_setm_mmx_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1651 : {
1652 : return ((register_operand (op, mode)) && ((
1653 : #line 1108 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1654 : (TARGET_SSE4_1)) && (
1655 : #line 1109 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1656 : (TARGET_MMX_WITH_SSE)))) || ((GET_CODE (op) == CONST_INT) && (
1657 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
1658 : }
1659 :
1660 : bool
1661 : reg_or_pm1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1662 : {
1663 : return (register_operand (op, mode)) || (((GET_CODE (op) == CONST_INT) && ((
1664 : #line 1116 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1665 : (op == const1_rtx)) || (
1666 : #line 1117 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1667 : (op == constm1_rtx)))) && (
1668 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
1669 : }
1670 :
1671 : bool
1672 : regmem_or_bitnot_regmem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1673 : {
1674 : return (nonimmediate_operand (op, mode)) || (((GET_CODE (op) == NOT) && (
1675 : #line 1124 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1676 : (nonimmediate_operand (XEXP (op, 0), mode)))) && (
1677 : (mode == VOIDmode || GET_MODE (op) == mode)));
1678 : }
1679 :
1680 : bool
1681 : ternlog_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1682 : {
1683 : switch (GET_CODE (op))
1684 : {
1685 : case NOT:
1686 : case AND:
1687 : case IOR:
1688 : case XOR:
1689 : break;
1690 : default:
1691 : return false;
1692 : }
1693 : return (
1694 : #line 1129 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1695 : (ix86_ternlog_operand_p (op))) && (
1696 : (mode == VOIDmode || GET_MODE (op) == mode));
1697 : }
1698 :
1699 : bool
1700 : shiftdi_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1701 : {
1702 : return (
1703 : #line 1133 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1704 : (TARGET_64BIT)) ? (nonimmediate_operand (op, mode)) : (register_operand (op, mode));
1705 : }
1706 :
1707 : bool
1708 : ashldi_input_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1709 : {
1710 : return (
1711 : #line 1138 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1712 : (TARGET_64BIT)) ? (nonimmediate_operand (op, mode)) : (reg_or_pm1_operand (op, mode));
1713 : }
1714 :
1715 : static inline bool
1716 : zero_extended_scalar_load_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1717 : #line 1146 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1718 : {
1719 : unsigned n_elts;
1720 : op = avoid_constant_pool_reference (op);
1721 :
1722 : if (!CONST_VECTOR_P (op))
1723 : return false;
1724 :
1725 : n_elts = CONST_VECTOR_NUNITS (op);
1726 :
1727 : for (n_elts--; n_elts > 0; n_elts--)
1728 : {
1729 : rtx elt = CONST_VECTOR_ELT (op, n_elts);
1730 : if (elt != CONST0_RTX (GET_MODE_INNER (GET_MODE (op))))
1731 : return false;
1732 : }
1733 : return true;
1734 : }
1735 :
1736 : bool
1737 : zero_extended_scalar_load_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1738 : {
1739 : return ((GET_CODE (op) == MEM) && (
1740 : (zero_extended_scalar_load_operand_1 (op, mode)))) && (
1741 : (mode == VOIDmode || GET_MODE (op) == mode));
1742 : }
1743 :
1744 : static inline bool
1745 : float_vector_all_ones_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1746 : #line 1167 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1747 : {
1748 : mode = GET_MODE (op);
1749 : if (!FLOAT_MODE_P (mode)
1750 : || (MEM_P (op)
1751 : && (!SYMBOL_REF_P (XEXP (op, 0))
1752 : || !CONSTANT_POOL_ADDRESS_P (XEXP (op, 0)))))
1753 : return false;
1754 :
1755 : if (MEM_P (op))
1756 : {
1757 : op = get_pool_constant (XEXP (op, 0));
1758 : if (!CONST_VECTOR_P (op))
1759 : return false;
1760 :
1761 : if (GET_MODE (op) != mode
1762 : && INTEGRAL_MODE_P (GET_MODE (op))
1763 : && op == CONSTM1_RTX (GET_MODE (op)))
1764 : return true;
1765 : }
1766 :
1767 : rtx first = XVECEXP (op, 0, 0);
1768 : for (int i = 1; i != GET_MODE_NUNITS (GET_MODE (op)); i++)
1769 : {
1770 : rtx tmp = XVECEXP (op, 0, i);
1771 : if (!rtx_equal_p (tmp, first))
1772 : return false;
1773 : }
1774 : if (GET_MODE (first) == E_SFmode)
1775 : {
1776 : long l;
1777 : REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (first), l);
1778 : return (l & 0xffffffff) == 0xffffffff;
1779 : }
1780 : else if (GET_MODE (first) == E_DFmode)
1781 : {
1782 : long l[2];
1783 : REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (first), l);
1784 : return ((l[0] & 0xffffffff) == 0xffffffff
1785 : && (l[1] & 0xffffffff) == 0xffffffff);
1786 : }
1787 : else
1788 : return false;
1789 : }
1790 :
1791 : bool
1792 : float_vector_all_ones_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1793 : {
1794 : switch (GET_CODE (op))
1795 : {
1796 : case CONST_VECTOR:
1797 : case MEM:
1798 : break;
1799 : default:
1800 : return false;
1801 : }
1802 : return (
1803 : (float_vector_all_ones_operand_1 (op, mode))) && (
1804 : (mode == VOIDmode || GET_MODE (op) == mode));
1805 : }
1806 :
1807 : bool
1808 : vector_all_ones_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1809 : {
1810 : return ((GET_CODE (op) == CONST_VECTOR) && ((
1811 : #line 1214 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1812 : (INTEGRAL_MODE_P (GET_MODE (op)))) && (
1813 : #line 1215 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1814 : (op == CONSTM1_RTX (GET_MODE (op)))))) && (
1815 : (mode == VOIDmode || GET_MODE (op) == mode));
1816 : }
1817 :
1818 : bool
1819 : int_float_vector_all_ones_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1820 : {
1821 : return (vector_all_ones_operand (op, mode)) || ((float_vector_all_ones_operand (op, mode)) || ((
1822 : #line 1221 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1823 : (op == constm1_rtx)) && (
1824 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode))));
1825 : }
1826 :
1827 : static inline bool
1828 : vector_all_ones_zero_extend_half_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1829 : #line 1227 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1830 : {
1831 : mode = GET_MODE (op);
1832 : if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT
1833 : || (GET_MODE_SIZE (mode) != 32
1834 : && GET_MODE_SIZE (mode) != 64))
1835 : return false;
1836 :
1837 : int nelts = CONST_VECTOR_NUNITS (op);
1838 : for (int i = 0; i != nelts; i++)
1839 : {
1840 : rtx elt = CONST_VECTOR_ELT (op, i);
1841 : if (i < nelts / 2
1842 : && elt != CONSTM1_RTX (GET_MODE_INNER (mode)))
1843 : return false;
1844 : if (i >= nelts / 2
1845 : && elt != CONST0_RTX (GET_MODE_INNER (mode)))
1846 : return false;
1847 : }
1848 : return true;
1849 : }
1850 :
1851 : bool
1852 : vector_all_ones_zero_extend_half_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1853 : {
1854 : return ((GET_CODE (op) == CONST_VECTOR) && (
1855 : (vector_all_ones_zero_extend_half_operand_1 (op, mode)))) && (
1856 : (mode == VOIDmode || GET_MODE (op) == mode));
1857 : }
1858 :
1859 : static inline bool
1860 : vector_all_ones_zero_extend_quarter_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1861 : #line 1252 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1862 : {
1863 : mode = GET_MODE (op);
1864 : if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT
1865 : || GET_MODE_SIZE (mode) != 64)
1866 : return false;
1867 :
1868 : int nelts = CONST_VECTOR_NUNITS (op);
1869 : for (int i = 0; i != nelts; i++)
1870 : {
1871 : rtx elt = CONST_VECTOR_ELT (op, i);
1872 : if (i < nelts / 4
1873 : && elt != CONSTM1_RTX (GET_MODE_INNER (mode)))
1874 : return false;
1875 : if (i >= nelts / 4
1876 : && elt != CONST0_RTX (GET_MODE_INNER (mode)))
1877 : return false;
1878 : }
1879 : return true;
1880 : }
1881 :
1882 : bool
1883 : vector_all_ones_zero_extend_quarter_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1884 : {
1885 : return ((GET_CODE (op) == CONST_VECTOR) && (
1886 : (vector_all_ones_zero_extend_quarter_operand_1 (op, mode)))) && (
1887 : (mode == VOIDmode || GET_MODE (op) == mode));
1888 : }
1889 :
1890 : bool
1891 : vector_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1892 : {
1893 : return (memory_operand (op, mode)) && ((
1894 : #line 1276 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1895 : (TARGET_AVX)) || (
1896 : #line 1277 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1897 : (MEM_ALIGN (op) >= GET_MODE_ALIGNMENT (mode))));
1898 : }
1899 :
1900 : bool
1901 : vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1902 : {
1903 : return (register_operand (op, mode)) || (vector_memory_operand (op, mode));
1904 : }
1905 :
1906 : bool
1907 : vector_or_const_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1908 : {
1909 : return (register_operand (op, mode)) || ((vector_memory_operand (op, mode)) || ((GET_CODE (op) == CONST_VECTOR) && (
1910 : (mode == VOIDmode || GET_MODE (op) == mode))));
1911 : }
1912 :
1913 : bool
1914 : vector_or_0_or_1s_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1915 : {
1916 : return (register_operand (op, mode)) || ((vector_memory_operand (op, mode)) || ((const0_operand (op, mode)) || (int_float_vector_all_ones_operand (op, mode))));
1917 : }
1918 :
1919 : bool
1920 : bcst_mem_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1921 : {
1922 : return ((GET_CODE (op) == VEC_DUPLICATE) && (((
1923 : #line 1301 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1924 : (TARGET_AVX512F)) && ((
1925 : #line 1302 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1926 : (TARGET_AVX512VL)) || (
1927 : #line 1303 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1928 : (GET_MODE_SIZE (GET_MODE (op)) == 64)))) && ((
1929 : #line 1304 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1930 : (VALID_BCST_MODE_P (GET_MODE_INNER (GET_MODE (op))))) && ((
1931 : #line 1305 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1932 : (GET_MODE (XEXP (op, 0))
1933 : == GET_MODE_INNER (GET_MODE (op)))) && (
1934 : #line 1307 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1935 : (memory_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))))))))) && (
1936 : (mode == VOIDmode || GET_MODE (op) == mode));
1937 : }
1938 :
1939 : bool
1940 : bcst_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1941 : {
1942 : return (vector_operand (op, mode)) || (bcst_mem_operand (op, mode));
1943 : }
1944 :
1945 : bool
1946 : nonimmediate_or_const_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1947 : {
1948 : return (nonimmediate_operand (op, mode)) || ((GET_CODE (op) == CONST_VECTOR) && (
1949 : (mode == VOIDmode || GET_MODE (op) == mode)));
1950 : }
1951 :
1952 : bool
1953 : nonimmediate_or_const_vec_dup_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1954 : {
1955 : return (nonimmediate_operand (op, mode)) || ((
1956 : #line 1322 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1957 : (const_vec_duplicate_p (op))) && (
1958 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
1959 : }
1960 :
1961 : bool
1962 : reg_or_const_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1963 : {
1964 : return (register_operand (op, mode)) || ((GET_CODE (op) == CONST_VECTOR) && (
1965 : (mode == VOIDmode || GET_MODE (op) == mode)));
1966 : }
1967 :
1968 : static inline bool
1969 : x86_64_const_vector_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
1970 : #line 1334 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
1971 : {
1972 : if (mode == VOIDmode)
1973 : mode = GET_MODE (op);
1974 : else if (GET_MODE (op) != mode)
1975 : return false;
1976 : if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
1977 : return false;
1978 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (op, mode);
1979 : return trunc_int_for_mode (val, SImode) == val;
1980 : }
1981 :
1982 : bool
1983 : x86_64_const_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1984 : {
1985 : return ((GET_CODE (op) == CONST_VECTOR) && (
1986 : (x86_64_const_vector_operand_1 (op, mode)))) && (
1987 : (mode == VOIDmode || GET_MODE (op) == mode));
1988 : }
1989 :
1990 : bool
1991 : nonimmediate_or_x86_64_const_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1992 : {
1993 : return (nonimmediate_operand (op, mode)) || (x86_64_const_vector_operand (op, mode));
1994 : }
1995 :
1996 : bool
1997 : nonimmediate_or_sse_const_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1998 : {
1999 : return (nonimmediate_operand (op, mode)) || ((
2000 : #line 1352 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2001 : (standard_sse_constant_p (op, mode))) && (
2002 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
2003 : }
2004 :
2005 : bool
2006 : reg_or_0_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2007 : {
2008 : return (register_operand (op, mode)) || (const0_operand (op, mode));
2009 : }
2010 :
2011 : bool
2012 : nonimm_or_0_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2013 : {
2014 : return (nonimmediate_operand (op, mode)) || (const0_operand (op, mode));
2015 : }
2016 :
2017 : bool
2018 : nonimm_or_0_or_1s_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2019 : {
2020 : return (nonimmediate_operand (op, mode)) || ((const0_operand (op, mode)) || (int_float_vector_all_ones_operand (op, mode)));
2021 : }
2022 :
2023 : bool
2024 : SImode_address_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2025 : {
2026 : switch (GET_CODE (op))
2027 : {
2028 : case SUBREG:
2029 : case ZERO_EXTEND:
2030 : case AND:
2031 : break;
2032 : default:
2033 : return false;
2034 : }
2035 : return
2036 : (mode == VOIDmode || GET_MODE (op) == mode);
2037 : }
2038 :
2039 : static inline bool
2040 : address_no_seg_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2041 : #line 1379 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2042 : {
2043 : struct ix86_address parts;
2044 : int ok;
2045 :
2046 : if (!CONST_INT_P (op)
2047 : && mode != VOIDmode
2048 : && GET_MODE (op) != mode)
2049 : return false;
2050 :
2051 : ok = ix86_decompose_address (op, &parts);
2052 : gcc_assert (ok);
2053 : return parts.seg == ADDR_SPACE_GENERIC;
2054 : }
2055 :
2056 : bool
2057 : address_no_seg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2058 : {
2059 : return (
2060 : #line 1378 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2061 : (address_operand (op, VOIDmode))) && (
2062 : (address_no_seg_operand_1 (op, mode)));
2063 : }
2064 :
2065 : static inline bool
2066 : vsib_address_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2067 : #line 1397 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2068 : {
2069 : struct ix86_address parts;
2070 : int ok;
2071 : rtx disp;
2072 :
2073 : ok = ix86_decompose_address (op, &parts);
2074 : gcc_assert (ok);
2075 : if (parts.index || parts.seg != ADDR_SPACE_GENERIC)
2076 : return false;
2077 :
2078 : /* VSIB addressing doesn't support (%rip). */
2079 : if (parts.disp)
2080 : {
2081 : disp = parts.disp;
2082 : if (GET_CODE (disp) == CONST)
2083 : {
2084 : disp = XEXP (disp, 0);
2085 : if (GET_CODE (disp) == PLUS)
2086 : disp = XEXP (disp, 0);
2087 : if (GET_CODE (disp) == UNSPEC)
2088 : switch (XINT (disp, 1))
2089 : {
2090 : case UNSPEC_GOTPCREL:
2091 : case UNSPEC_PCREL:
2092 : case UNSPEC_GOTNTPOFF:
2093 : return false;
2094 : }
2095 : }
2096 : if (TARGET_64BIT
2097 : && flag_pic
2098 : && (SYMBOL_REF_P (disp)
2099 : || LABEL_REF_P (disp)))
2100 : return false;
2101 : }
2102 :
2103 : return true;
2104 : }
2105 :
2106 : bool
2107 : vsib_address_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2108 : {
2109 : return ((
2110 : #line 1396 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2111 : (address_operand (op, VOIDmode))) && (
2112 : (vsib_address_operand_1 (op, mode)))) && (
2113 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
2114 : }
2115 :
2116 : bool
2117 : vsib_mem_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2118 : {
2119 : return (GET_CODE (op) == MEM) && (
2120 : (mode == VOIDmode || GET_MODE (op) == mode));
2121 : }
2122 :
2123 : static inline bool
2124 : aligned_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2125 : #line 1441 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2126 : {
2127 : struct ix86_address parts;
2128 : int ok;
2129 :
2130 : /* Registers and immediate operands are always "aligned". */
2131 : if (!MEM_P (op))
2132 : return true;
2133 :
2134 : /* All patterns using aligned_operand on memory operands ends up
2135 : in promoting memory operand to 64bit and thus causing memory mismatch. */
2136 : if (TARGET_MEMORY_MISMATCH_STALL && !optimize_insn_for_size_p ())
2137 : return false;
2138 :
2139 : /* Don't even try to do any aligned optimizations with volatiles. */
2140 : if (MEM_VOLATILE_P (op))
2141 : return false;
2142 :
2143 : if (MEM_ALIGN (op) >= 32)
2144 : return true;
2145 :
2146 : op = XEXP (op, 0);
2147 :
2148 : /* Pushes and pops are only valid on the stack pointer. */
2149 : if (GET_CODE (op) == PRE_DEC
2150 : || GET_CODE (op) == POST_INC)
2151 : return true;
2152 :
2153 : /* Decode the address. */
2154 : ok = ix86_decompose_address (op, &parts);
2155 : gcc_assert (ok);
2156 :
2157 : if (parts.base && SUBREG_P (parts.base))
2158 : parts.base = SUBREG_REG (parts.base);
2159 : if (parts.index && SUBREG_P (parts.index))
2160 : parts.index = SUBREG_REG (parts.index);
2161 :
2162 : /* Look for some component that isn't known to be aligned. */
2163 : if (parts.index)
2164 : {
2165 : if (REGNO_POINTER_ALIGN (REGNO (parts.index)) * parts.scale < 32)
2166 : return false;
2167 : }
2168 : if (parts.base)
2169 : {
2170 : if (REGNO_POINTER_ALIGN (REGNO (parts.base)) < 32)
2171 : return false;
2172 : }
2173 : if (parts.disp)
2174 : {
2175 : if (!CONST_INT_P (parts.disp)
2176 : || (INTVAL (parts.disp) & 3))
2177 : return false;
2178 : }
2179 :
2180 : /* Didn't find one -- this must be an aligned address. */
2181 : return true;
2182 : }
2183 :
2184 : bool
2185 : aligned_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2186 : {
2187 : return (general_operand (op, mode)) && (
2188 : (aligned_operand_1 (op, mode)));
2189 : }
2190 :
2191 : static inline bool
2192 : memory_displacement_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2193 : #line 1502 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2194 : {
2195 : struct ix86_address parts;
2196 : int ok;
2197 :
2198 : ok = ix86_decompose_address (XEXP (op, 0), &parts);
2199 : gcc_assert (ok);
2200 : return parts.disp != NULL_RTX;
2201 : }
2202 :
2203 : bool
2204 : memory_displacement_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2205 : {
2206 : return (memory_operand (op, mode)) && (
2207 : (memory_displacement_operand_1 (op, mode)));
2208 : }
2209 :
2210 : static inline bool
2211 : memory_displacement_only_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2212 : #line 1514 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2213 : {
2214 : struct ix86_address parts;
2215 : int ok;
2216 :
2217 : if (TARGET_64BIT)
2218 : return false;
2219 :
2220 : ok = ix86_decompose_address (XEXP (op, 0), &parts);
2221 : gcc_assert (ok);
2222 :
2223 : if (parts.base || parts.index)
2224 : return false;
2225 :
2226 : return parts.disp != NULL_RTX;
2227 : }
2228 :
2229 : bool
2230 : memory_displacement_only_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2231 : {
2232 : return (memory_operand (op, mode)) && (
2233 : (memory_displacement_only_operand_1 (op, mode)));
2234 : }
2235 :
2236 : bool
2237 : long_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2238 : {
2239 : return (memory_operand (op, mode)) && (
2240 : #line 1534 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2241 : (memory_address_length (op, false)));
2242 : }
2243 :
2244 : static inline bool
2245 : fcmov_comparison_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2246 : #line 1539 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2247 : {
2248 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2249 : enum rtx_code code = GET_CODE (op);
2250 :
2251 : if (inmode == CCFPmode)
2252 : code = ix86_fp_compare_code_to_integer (code);
2253 :
2254 : /* i387 supports just limited amount of conditional codes. */
2255 : switch (code)
2256 : {
2257 : case GEU: case LTU:
2258 : if (inmode == CCCmode || inmode == CCGZmode)
2259 : return true;
2260 : /* FALLTHRU */
2261 : case GTU: case LEU:
2262 : if (inmode == CCmode || inmode == CCFPmode)
2263 : return true;
2264 : return false;
2265 : case ORDERED: case UNORDERED:
2266 : case EQ: case NE:
2267 : return true;
2268 : default:
2269 : return false;
2270 : }
2271 : }
2272 :
2273 : bool
2274 : fcmov_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2275 : {
2276 : return (comparison_operator (op, mode)) && (
2277 : (fcmov_comparison_operator_1 (op, mode)));
2278 : }
2279 :
2280 : bool
2281 : sse_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2282 : {
2283 : return ((GET_CODE (op) == EQ || GET_CODE (op) == NE || GET_CODE (op) == LT || GET_CODE (op) == LE || GET_CODE (op) == UNORDERED || GET_CODE (op) == UNGE || GET_CODE (op) == UNGT || GET_CODE (op) == ORDERED) || ((
2284 : #line 1571 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2285 : (TARGET_AVX)) && (GET_CODE (op) == GE || GET_CODE (op) == GT || GET_CODE (op) == UNEQ || GET_CODE (op) == UNLE || GET_CODE (op) == UNLT || GET_CODE (op) == LTGT))) && (
2286 : (mode == VOIDmode || GET_MODE (op) == mode));
2287 : }
2288 :
2289 : bool
2290 : ix86_comparison_int_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2291 : {
2292 : switch (GET_CODE (op))
2293 : {
2294 : case NE:
2295 : case EQ:
2296 : case GE:
2297 : case GT:
2298 : case LE:
2299 : case LT:
2300 : break;
2301 : default:
2302 : return false;
2303 : }
2304 : return
2305 : (mode == VOIDmode || GET_MODE (op) == mode);
2306 : }
2307 :
2308 : bool
2309 : ix86_comparison_uns_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2310 : {
2311 : switch (GET_CODE (op))
2312 : {
2313 : case NE:
2314 : case EQ:
2315 : case GEU:
2316 : case GTU:
2317 : case LEU:
2318 : case LTU:
2319 : break;
2320 : default:
2321 : return false;
2322 : }
2323 : return
2324 : (mode == VOIDmode || GET_MODE (op) == mode);
2325 : }
2326 :
2327 : bool
2328 : bt_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2329 : {
2330 : switch (GET_CODE (op))
2331 : {
2332 : case NE:
2333 : case EQ:
2334 : break;
2335 : default:
2336 : return false;
2337 : }
2338 : return
2339 : (mode == VOIDmode || GET_MODE (op) == mode);
2340 : }
2341 :
2342 : bool
2343 : shr_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2344 : {
2345 : switch (GET_CODE (op))
2346 : {
2347 : case GTU:
2348 : case LEU:
2349 : break;
2350 : default:
2351 : return false;
2352 : }
2353 : return
2354 : (mode == VOIDmode || GET_MODE (op) == mode);
2355 : }
2356 :
2357 : bool
2358 : add_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2359 : {
2360 : switch (GET_CODE (op))
2361 : {
2362 : case GEU:
2363 : case LTU:
2364 : break;
2365 : default:
2366 : return false;
2367 : }
2368 : return
2369 : (mode == VOIDmode || GET_MODE (op) == mode);
2370 : }
2371 :
2372 : bool
2373 : ieee_maxmin_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2374 : {
2375 : switch (GET_CODE (op))
2376 : {
2377 : case LT:
2378 : case GT:
2379 : break;
2380 : default:
2381 : return false;
2382 : }
2383 : return
2384 : (mode == VOIDmode || GET_MODE (op) == mode);
2385 : }
2386 :
2387 : static inline bool
2388 : ix86_comparison_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2389 : #line 1595 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2390 : {
2391 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2392 : enum rtx_code code = GET_CODE (op);
2393 :
2394 : if (inmode == CCFPmode)
2395 : return ix86_trivial_fp_comparison_operator (op, mode);
2396 :
2397 : switch (code)
2398 : {
2399 : case EQ: case NE:
2400 : if (inmode == CCGZmode)
2401 : return false;
2402 : return true;
2403 : case GE: case LT:
2404 : if (inmode == CCmode || inmode == CCGCmode
2405 : || inmode == CCGOCmode || inmode == CCNOmode || inmode == CCGZmode)
2406 : return true;
2407 : return false;
2408 : case GEU: case LTU:
2409 : if (inmode == CCCmode || inmode == CCGZmode)
2410 : return true;
2411 : /* FALLTHRU */
2412 : case GTU: case LEU:
2413 : if (inmode == CCmode)
2414 : return true;
2415 : return false;
2416 : case ORDERED: case UNORDERED:
2417 : if (inmode == CCmode)
2418 : return true;
2419 : return false;
2420 : case GT: case LE:
2421 : if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode)
2422 : return true;
2423 : return false;
2424 : default:
2425 : return false;
2426 : }
2427 : }
2428 :
2429 : bool
2430 : ix86_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2431 : {
2432 : return (comparison_operator (op, mode)) && (
2433 : (ix86_comparison_operator_1 (op, mode)));
2434 : }
2435 :
2436 : static inline bool
2437 : ix86_carry_flag_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2438 : #line 1638 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2439 : {
2440 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2441 : enum rtx_code code = GET_CODE (op);
2442 :
2443 : if (inmode == CCFPmode)
2444 : code = ix86_fp_compare_code_to_integer (code);
2445 : else if (inmode != CCmode && inmode != CCCmode && inmode != CCGZmode)
2446 : return false;
2447 :
2448 : return code == LTU;
2449 : }
2450 :
2451 : bool
2452 : ix86_carry_flag_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2453 : {
2454 : switch (GET_CODE (op))
2455 : {
2456 : case LTU:
2457 : case UNLT:
2458 : break;
2459 : default:
2460 : return false;
2461 : }
2462 : return (
2463 : (ix86_carry_flag_operator_1 (op, mode))) && (
2464 : (mode == VOIDmode || GET_MODE (op) == mode));
2465 : }
2466 :
2467 : static inline bool
2468 : ix86_carry_flag_unset_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2469 : #line 1654 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2470 : {
2471 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2472 : enum rtx_code code = GET_CODE (op);
2473 :
2474 : if (inmode == CCFPmode)
2475 : code = ix86_fp_compare_code_to_integer (code);
2476 : else if (inmode != CCmode && inmode != CCCmode && inmode != CCGZmode)
2477 : return false;
2478 :
2479 : return code == GEU;
2480 : }
2481 :
2482 : bool
2483 : ix86_carry_flag_unset_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2484 : {
2485 : switch (GET_CODE (op))
2486 : {
2487 : case GEU:
2488 : case GE:
2489 : break;
2490 : default:
2491 : return false;
2492 : }
2493 : return (
2494 : (ix86_carry_flag_unset_operator_1 (op, mode))) && (
2495 : (mode == VOIDmode || GET_MODE (op) == mode));
2496 : }
2497 :
2498 : bool
2499 : ix86_trivial_fp_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2500 : {
2501 : return ((
2502 : #line 1669 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2503 : (TARGET_AVX10_2)) ? (GET_CODE (op) == GT || GET_CODE (op) == GE || GET_CODE (op) == UNLT || GET_CODE (op) == UNLE || GET_CODE (op) == EQ || GET_CODE (op) == UNEQ || GET_CODE (op) == NE || GET_CODE (op) == LTGT || GET_CODE (op) == ORDERED || GET_CODE (op) == UNORDERED) : (GET_CODE (op) == GT || GET_CODE (op) == GE || GET_CODE (op) == UNLT || GET_CODE (op) == UNLE || GET_CODE (op) == UNEQ || GET_CODE (op) == LTGT || GET_CODE (op) == ORDERED || GET_CODE (op) == UNORDERED)) && (
2504 : (mode == VOIDmode || GET_MODE (op) == mode));
2505 : }
2506 :
2507 : bool
2508 : ix86_trivial_fp_comparison_operator_xf (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2509 : {
2510 : switch (GET_CODE (op))
2511 : {
2512 : case GT:
2513 : case GE:
2514 : case UNLT:
2515 : case UNLE:
2516 : case UNEQ:
2517 : case LTGT:
2518 : case ORDERED:
2519 : case UNORDERED:
2520 : break;
2521 : default:
2522 : return false;
2523 : }
2524 : return
2525 : (mode == VOIDmode || GET_MODE (op) == mode);
2526 : }
2527 :
2528 : bool
2529 : ix86_fp_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2530 : {
2531 : return (
2532 : #line 1680 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2533 : (ix86_fp_comparison_strategy (GET_CODE (op))
2534 : == IX86_FPCMP_ARITH)) ? (comparison_operator (op, mode)) : (ix86_trivial_fp_comparison_operator (op, mode));
2535 : }
2536 :
2537 : bool
2538 : ix86_fp_comparison_operator_xf (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2539 : {
2540 : return (
2541 : #line 1686 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2542 : (ix86_fp_comparison_strategy (GET_CODE (op))
2543 : == IX86_FPCMP_ARITH)) ? (comparison_operator (op, mode)) : (ix86_trivial_fp_comparison_operator_xf (op, mode));
2544 : }
2545 :
2546 : bool
2547 : ix86_timode_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2548 : {
2549 : return (
2550 : #line 1693 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2551 : (TARGET_64BIT)) ? (ordered_comparison_operator (op, mode)) : (bt_comparison_operator (op, mode));
2552 : }
2553 :
2554 : bool
2555 : ix86_timode_comparison_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2556 : {
2557 : return (
2558 : #line 1699 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2559 : (TARGET_64BIT)) ? (x86_64_general_operand (op, mode)) : (nonimmediate_operand (op, mode));
2560 : }
2561 :
2562 : bool
2563 : cmp_fp_expander_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2564 : {
2565 : return ((GET_CODE (op) == CONST_DOUBLE) && (
2566 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode))) || (general_operand (op, mode));
2567 : }
2568 :
2569 : bool
2570 : binary_fp_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2571 : {
2572 : switch (GET_CODE (op))
2573 : {
2574 : case PLUS:
2575 : case MINUS:
2576 : case MULT:
2577 : case DIV:
2578 : break;
2579 : default:
2580 : return false;
2581 : }
2582 : return
2583 : (mode == VOIDmode || GET_MODE (op) == mode);
2584 : }
2585 :
2586 : bool
2587 : mult_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2588 : {
2589 : return (GET_CODE (op) == MULT) && (
2590 : (mode == VOIDmode || GET_MODE (op) == mode));
2591 : }
2592 :
2593 : bool
2594 : div_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2595 : {
2596 : return (GET_CODE (op) == DIV) && (
2597 : (mode == VOIDmode || GET_MODE (op) == mode));
2598 : }
2599 :
2600 : bool
2601 : logic_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2602 : {
2603 : switch (GET_CODE (op))
2604 : {
2605 : case AND:
2606 : case IOR:
2607 : case XOR:
2608 : break;
2609 : default:
2610 : return false;
2611 : }
2612 : return
2613 : (mode == VOIDmode || GET_MODE (op) == mode);
2614 : }
2615 :
2616 : bool
2617 : and_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2618 : {
2619 : return (GET_CODE (op) == AND) && (
2620 : (mode == VOIDmode || GET_MODE (op) == mode));
2621 : }
2622 :
2623 : bool
2624 : plusminuslogic_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2625 : {
2626 : switch (GET_CODE (op))
2627 : {
2628 : case PLUS:
2629 : case MINUS:
2630 : case AND:
2631 : case IOR:
2632 : case XOR:
2633 : break;
2634 : default:
2635 : return false;
2636 : }
2637 : return
2638 : (mode == VOIDmode || GET_MODE (op) == mode);
2639 : }
2640 :
2641 : bool
2642 : arith_or_logical_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2643 : {
2644 : switch (GET_CODE (op))
2645 : {
2646 : case PLUS:
2647 : case MULT:
2648 : case AND:
2649 : case IOR:
2650 : case XOR:
2651 : case SMIN:
2652 : case SMAX:
2653 : case UMIN:
2654 : case UMAX:
2655 : case COMPARE:
2656 : case MINUS:
2657 : case DIV:
2658 : case MOD:
2659 : case UDIV:
2660 : case UMOD:
2661 : case ASHIFT:
2662 : case ROTATE:
2663 : case ASHIFTRT:
2664 : case LSHIFTRT:
2665 : case ROTATERT:
2666 : break;
2667 : default:
2668 : return false;
2669 : }
2670 : return
2671 : (mode == VOIDmode || GET_MODE (op) == mode);
2672 : }
2673 :
2674 : bool
2675 : commutative_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2676 : {
2677 : switch (GET_CODE (op))
2678 : {
2679 : case PLUS:
2680 : case MULT:
2681 : case AND:
2682 : case IOR:
2683 : case XOR:
2684 : case SMIN:
2685 : case SMAX:
2686 : case UMIN:
2687 : case UMAX:
2688 : break;
2689 : default:
2690 : return false;
2691 : }
2692 : return
2693 : (mode == VOIDmode || GET_MODE (op) == mode);
2694 : }
2695 :
2696 : bool
2697 : promotable_binary_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2698 : {
2699 : return ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS || GET_CODE (op) == AND || GET_CODE (op) == IOR || GET_CODE (op) == XOR || GET_CODE (op) == ASHIFT) || ((GET_CODE (op) == MULT) && (
2700 : #line 1747 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2701 : (TARGET_TUNE_PROMOTE_HIMODE_IMUL)))) && (
2702 : (mode == VOIDmode || GET_MODE (op) == mode));
2703 : }
2704 :
2705 : bool
2706 : compare_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2707 : {
2708 : return (GET_CODE (op) == COMPARE) && (
2709 : (mode == VOIDmode || GET_MODE (op) == mode));
2710 : }
2711 :
2712 : static inline bool
2713 : extract_high_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2714 : #line 1754 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2715 : {
2716 : return (const8_operand (XEXP (op, 1), VOIDmode)
2717 : && (BINARY_P (op) || const8_operand (XEXP (op, 2), VOIDmode)));
2718 : }
2719 :
2720 : bool
2721 : extract_high_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2722 : {
2723 : switch (GET_CODE (op))
2724 : {
2725 : case ZERO_EXTRACT:
2726 : case SIGN_EXTRACT:
2727 : case ASHIFTRT:
2728 : case LSHIFTRT:
2729 : break;
2730 : default:
2731 : return false;
2732 : }
2733 : return (
2734 : (extract_high_operator_1 (op, mode))) && (
2735 : (mode == VOIDmode || GET_MODE (op) == mode));
2736 : }
2737 :
2738 : bool
2739 : misaligned_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2740 : {
2741 : return ((GET_CODE (op) == MEM) && (
2742 : #line 1763 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2743 : (MEM_ALIGN (op) < GET_MODE_BITSIZE (mode)))) && (
2744 : (mode == VOIDmode || GET_MODE (op) == mode));
2745 : }
2746 :
2747 : static inline bool
2748 : movq_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2749 : #line 1769 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2750 : {
2751 : unsigned nelt = XVECLEN (op, 0);
2752 : unsigned nelt2 = nelt >> 1;
2753 : unsigned i;
2754 :
2755 : if (nelt < 2)
2756 : return false;
2757 :
2758 : /* Validate that all of the elements are constants,
2759 : lower halves of permute are lower halves of the first operand,
2760 : upper halves of permute come from any of the second operand. */
2761 : for (i = 0; i < nelt; ++i)
2762 : {
2763 : rtx er = XVECEXP (op, 0, i);
2764 : unsigned HOST_WIDE_INT ei;
2765 :
2766 : if (!CONST_INT_P (er))
2767 : return false;
2768 : ei = INTVAL (er);
2769 : if (i < nelt2 && ei != i)
2770 : return false;
2771 : if (i >= nelt2 && (ei < nelt || ei >= nelt << 1))
2772 : return false;
2773 : }
2774 :
2775 : return true;
2776 : }
2777 :
2778 : bool
2779 : movq_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2780 : {
2781 : return ((GET_CODE (op) == PARALLEL) && (
2782 : (movq_parallel_1 (op, mode)))) && (
2783 : (mode == VOIDmode || GET_MODE (op) == mode));
2784 : }
2785 :
2786 : static inline bool
2787 : vzeroall_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2788 : #line 1800 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2789 : {
2790 : unsigned i, nregs = TARGET_64BIT ? 16 : 8;
2791 :
2792 : if ((unsigned) XVECLEN (op, 0) != 1 + nregs)
2793 : return false;
2794 :
2795 : for (i = 0; i < nregs; i++)
2796 : {
2797 : rtx elt = XVECEXP (op, 0, i+1);
2798 :
2799 : if (GET_CODE (elt) != SET
2800 : || GET_CODE (SET_DEST (elt)) != REG
2801 : || GET_MODE (SET_DEST (elt)) != V8SImode
2802 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
2803 : || SET_SRC (elt) != CONST0_RTX (V8SImode))
2804 : return false;
2805 : }
2806 : return true;
2807 : }
2808 :
2809 : bool
2810 : vzeroall_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2811 : {
2812 : return ((GET_CODE (op) == PARALLEL) && (
2813 : (vzeroall_operation_1 (op, mode)))) && (
2814 : (mode == VOIDmode || GET_MODE (op) == mode));
2815 : }
2816 :
2817 : bool
2818 : vzeroall_pattern (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2819 : {
2820 : return ((GET_CODE (op) == PARALLEL) && ((GET_CODE (XVECEXP (op, 0, 0)) == UNSPEC_VOLATILE) && (
2821 : #line 1824 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2822 : (XINT (XVECEXP (op, 0, 0), 1) == UNSPECV_VZEROALL)))) && (
2823 : (mode == VOIDmode || GET_MODE (op) == mode));
2824 : }
2825 :
2826 : bool
2827 : vzeroupper_pattern (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2828 : {
2829 : return ((GET_CODE (op) == PARALLEL) && ((GET_CODE (XVECEXP (op, 0, 1)) == UNSPEC) && ((
2830 : #line 1830 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2831 : (XINT (XVECEXP (op, 0, 1), 1) == UNSPEC_CALLEE_ABI)) && (
2832 : #line 1831 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2833 : (INTVAL (XVECEXP (XVECEXP (op, 0, 1), 0, 0)) == ABI_VZEROUPPER))))) && (
2834 : (mode == VOIDmode || GET_MODE (op) == mode));
2835 : }
2836 :
2837 : static inline bool
2838 : addsub_vm_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2839 : #line 1836 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2840 : {
2841 : rtx op0, op1;
2842 : int swapped;
2843 : HOST_WIDE_INT mask;
2844 : int nunits, elt;
2845 :
2846 : op0 = XEXP (op, 0);
2847 : op1 = XEXP (op, 1);
2848 :
2849 : /* Sanity check. */
2850 : if (GET_CODE (op0) == MINUS && GET_CODE (op1) == PLUS)
2851 : swapped = 0;
2852 : else if (GET_CODE (op0) == PLUS && GET_CODE (op1) == MINUS)
2853 : swapped = 1;
2854 : else
2855 : gcc_unreachable ();
2856 :
2857 : mask = INTVAL (XEXP (op, 2));
2858 : nunits = GET_MODE_NUNITS (mode);
2859 :
2860 : for (elt = 0; elt < nunits; elt++)
2861 : {
2862 : /* bit clear: take from op0, set: take from op1 */
2863 : int bit = !(mask & (HOST_WIDE_INT_1U << elt));
2864 :
2865 : if (bit != ((elt & 1) ^ swapped))
2866 : return false;
2867 : }
2868 :
2869 : return true;
2870 : }
2871 :
2872 : bool
2873 : addsub_vm_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2874 : {
2875 : return ((GET_CODE (op) == VEC_MERGE) && (
2876 : (addsub_vm_operator_1 (op, mode)))) && (
2877 : (mode == VOIDmode || GET_MODE (op) == mode));
2878 : }
2879 :
2880 : static inline bool
2881 : addsub_vs_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2882 : #line 1872 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2883 : {
2884 : rtx op0, op1;
2885 : bool swapped;
2886 : int nunits, elt;
2887 :
2888 : op0 = XEXP (XEXP (op, 0), 0);
2889 : op1 = XEXP (XEXP (op, 0), 1);
2890 :
2891 : /* Sanity check. */
2892 : if (GET_CODE (op0) == MINUS && GET_CODE (op1) == PLUS)
2893 : swapped = false;
2894 : else if (GET_CODE (op0) == PLUS && GET_CODE (op1) == MINUS)
2895 : swapped = true;
2896 : else
2897 : gcc_unreachable ();
2898 :
2899 : nunits = GET_MODE_NUNITS (mode);
2900 : if (XVECLEN (XEXP (op, 1), 0) != nunits)
2901 : return false;
2902 :
2903 : /* We already checked that permutation is suitable for addsub,
2904 : so only look at the first element of the parallel. */
2905 : elt = INTVAL (XVECEXP (XEXP (op, 1), 0, 0));
2906 :
2907 : return elt == (swapped ? nunits : 0);
2908 : }
2909 :
2910 : bool
2911 : addsub_vs_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2912 : {
2913 : return (((GET_CODE (op) == VEC_SELECT) && (GET_CODE (XEXP (op, 0)) == VEC_CONCAT)) && (
2914 : (addsub_vs_operator_1 (op, mode)))) && (
2915 : (mode == VOIDmode || GET_MODE (op) == mode));
2916 : }
2917 :
2918 : static inline bool
2919 : addsub_vs_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2920 : #line 1903 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2921 : {
2922 : int nelt = XVECLEN (op, 0);
2923 : int elt, i;
2924 :
2925 : if (nelt < 2)
2926 : return false;
2927 :
2928 : /* Check that the permutation is suitable for addsub.
2929 : For example, { 0 9 2 11 4 13 6 15 } or { 8 1 10 3 12 5 14 7 }. */
2930 : elt = INTVAL (XVECEXP (op, 0, 0));
2931 : if (elt == 0)
2932 : {
2933 : for (i = 1; i < nelt; ++i)
2934 : if (INTVAL (XVECEXP (op, 0, i)) != (i + (i & 1) * nelt))
2935 : return false;
2936 : }
2937 : else if (elt == nelt)
2938 : {
2939 : for (i = 1; i < nelt; ++i)
2940 : if (INTVAL (XVECEXP (op, 0, i)) != (elt + i - (i & 1) * nelt))
2941 : return false;
2942 : }
2943 : else
2944 : return false;
2945 :
2946 : return true;
2947 : }
2948 :
2949 : bool
2950 : addsub_vs_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2951 : {
2952 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
2953 : (addsub_vs_parallel_1 (op, mode)))) && (
2954 : (mode == VOIDmode || GET_MODE (op) == mode));
2955 : }
2956 :
2957 : static inline bool
2958 : permvar_truncate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2959 : #line 1935 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2960 : {
2961 : int nelt = GET_MODE_NUNITS (mode);
2962 : int perm[128];
2963 : int id;
2964 :
2965 : if (!INTEGRAL_MODE_P (mode) || !VECTOR_MODE_P (mode))
2966 : return false;
2967 :
2968 : if (nelt < 2)
2969 : return false;
2970 :
2971 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
2972 : return false;
2973 :
2974 : id = exact_log2 (nelt);
2975 :
2976 : /* Check that the permutation is suitable for pmovz{bw,wd,dq}.
2977 : For example V16HImode to V8HImode
2978 : { 0 2 4 6 8 10 12 14 * * * * * * * * }. */
2979 : for (int i = 0; i != nelt / 2; i++)
2980 : if ((perm[i] & ((1 << id) - 1)) != i * 2)
2981 : return false;
2982 :
2983 : return true;
2984 : }
2985 :
2986 : bool
2987 : permvar_truncate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2988 : {
2989 : return ((GET_CODE (op) == MEM) && (
2990 : (permvar_truncate_operand_1 (op, mode)))) && (
2991 : (mode == VOIDmode || GET_MODE (op) == mode));
2992 : }
2993 :
2994 : static inline bool
2995 : pshufb_truncv4siv4hi_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2996 : #line 1965 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2997 : {
2998 : int perm[128];
2999 :
3000 : if (mode != E_V16QImode)
3001 : return false;
3002 :
3003 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
3004 : return false;
3005 :
3006 : /* Check that the permutation is suitable for pmovdw.
3007 : For example V4SImode to V4HImode
3008 : { 0 1 4 5 8 9 12 13 * * * * * * * * }.
3009 : index = i % 2 + (i / 2) * 4. */
3010 : for (int i = 0; i != 8; i++)
3011 : {
3012 : /* if (SRC2[(i * 8)+7] = 1) then DEST[(i*8)+7..(i*8)+0] := 0; */
3013 : if (perm[i] & 128)
3014 : return false;
3015 :
3016 : if ((perm[i] & 15) != ((i & 1) + (i & 0xFE) * 2))
3017 : return false;
3018 : }
3019 :
3020 : return true;
3021 : }
3022 :
3023 : bool
3024 : pshufb_truncv4siv4hi_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3025 : {
3026 : return ((GET_CODE (op) == MEM) && (
3027 : (pshufb_truncv4siv4hi_operand_1 (op, mode)))) && (
3028 : (mode == VOIDmode || GET_MODE (op) == mode));
3029 : }
3030 :
3031 : static inline bool
3032 : pshufb_truncv8hiv8qi_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3033 : #line 1995 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3034 : {
3035 : int perm[128];
3036 :
3037 : if (mode != E_V16QImode)
3038 : return false;
3039 :
3040 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
3041 : return false;
3042 :
3043 : /* Check that the permutation is suitable for pmovwb.
3044 : For example V16QImode to V8QImode
3045 : { 0 2 4 6 8 10 12 14 * * * * * * * * }.
3046 : index = i % 2 + (i / 2) * 4. */
3047 : for (int i = 0; i != 8; i++)
3048 : {
3049 : /* if (SRC2[(i * 8)+7] = 1) then DEST[(i*8)+7..(i*8)+0] := 0; */
3050 : if (perm[i] & 128)
3051 : return false;
3052 :
3053 : if ((perm[i] & 15) != i * 2)
3054 : return false;
3055 : }
3056 :
3057 : return true;
3058 : }
3059 :
3060 : bool
3061 : pshufb_truncv8hiv8qi_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3062 : {
3063 : return ((GET_CODE (op) == MEM) && (
3064 : (pshufb_truncv8hiv8qi_operand_1 (op, mode)))) && (
3065 : (mode == VOIDmode || GET_MODE (op) == mode));
3066 : }
3067 :
3068 : static inline bool
3069 : pmovzx_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3070 : #line 2026 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3071 : {
3072 : int nelt = XVECLEN (op, 0);
3073 : int elt, i;
3074 :
3075 : if (nelt < 2)
3076 : return false;
3077 :
3078 : /* Check that the permutation is suitable for pmovz{bw,wd,dq}.
3079 : For example { 0 16 1 17 2 18 3 19 4 20 5 21 6 22 7 23 }. */
3080 : elt = INTVAL (XVECEXP (op, 0, 0));
3081 : if (elt == 0)
3082 : {
3083 : for (i = 1; i < nelt; ++i)
3084 : if ((i & 1) != 0)
3085 : {
3086 : if (INTVAL (XVECEXP (op, 0, i)) < nelt)
3087 : return false;
3088 : }
3089 : else if (INTVAL (XVECEXP (op, 0, i)) != i / 2)
3090 : return false;
3091 : }
3092 : else
3093 : return false;
3094 :
3095 : return true;
3096 : }
3097 :
3098 : bool
3099 : pmovzx_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3100 : {
3101 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3102 : (pmovzx_parallel_1 (op, mode)))) && (
3103 : (mode == VOIDmode || GET_MODE (op) == mode));
3104 : }
3105 :
3106 : static inline bool
3107 : const_vector_duplicate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3108 : #line 2056 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3109 : {
3110 : rtx elt = XVECEXP (op, 0, 0);
3111 : int i, nelt = XVECLEN (op, 0);
3112 :
3113 : for (i = 1; i < nelt; ++i)
3114 : if (!rtx_equal_p (elt, XVECEXP (op, 0, i)))
3115 : return false;
3116 : return true;
3117 : }
3118 :
3119 : bool
3120 : const_vector_duplicate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3121 : {
3122 : return ((GET_CODE (op) == CONST_VECTOR) && (
3123 : (const_vector_duplicate_operand_1 (op, mode)))) && (
3124 : (mode == VOIDmode || GET_MODE (op) == mode));
3125 : }
3126 :
3127 : static inline bool
3128 : avx_vbroadcast_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3129 : #line 2070 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3130 : {
3131 : rtx elt = XVECEXP (op, 0, 0);
3132 : int i, nelt = XVECLEN (op, 0);
3133 :
3134 : /* Don't bother checking there are the right number of operands,
3135 : merely that they're all identical. */
3136 : for (i = 1; i < nelt; ++i)
3137 : if (XVECEXP (op, 0, i) != elt)
3138 : return false;
3139 : return true;
3140 : }
3141 :
3142 : bool
3143 : avx_vbroadcast_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3144 : {
3145 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3146 : (avx_vbroadcast_operand_1 (op, mode)))) && (
3147 : (mode == VOIDmode || GET_MODE (op) == mode));
3148 : }
3149 :
3150 : static inline bool
3151 : avx_vbroadcast128_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3152 : #line 2086 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3153 : {
3154 : int i, nelt = XVECLEN (op, 0);
3155 : int half = nelt / 2;
3156 :
3157 : for (i = 0; i < nelt; ++i)
3158 : {
3159 : int index = INTVAL (XVECEXP (op, 0, i));
3160 : if ((i < half && index != i)
3161 : || (i >= half && index != (i - half)))
3162 : return false;
3163 : }
3164 :
3165 : return true;
3166 : }
3167 :
3168 : bool
3169 : avx_vbroadcast128_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3170 : {
3171 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3172 : (avx_vbroadcast128_operand_1 (op, mode)))) && (
3173 : (mode == VOIDmode || GET_MODE (op) == mode));
3174 : }
3175 :
3176 : static inline bool
3177 : palignr_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3178 : #line 2105 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3179 : {
3180 : int elt = INTVAL (XVECEXP (op, 0, 0));
3181 : int i, nelt = XVECLEN (op, 0);
3182 :
3183 : /* Check that an order in the permutation is suitable for palignr.
3184 : For example, {5 6 7 0 1 2 3 4} is "palignr 5, xmm, xmm". */
3185 : for (i = 1; i < nelt; ++i)
3186 : if (INTVAL (XVECEXP (op, 0, i)) != ((elt + i) % nelt))
3187 : return false;
3188 : return true;
3189 : }
3190 :
3191 : bool
3192 : palignr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3193 : {
3194 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3195 : (palignr_operand_1 (op, mode)))) && (
3196 : (mode == VOIDmode || GET_MODE (op) == mode));
3197 : }
3198 :
3199 : static inline bool
3200 : avx2_pblendw_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3201 : #line 2120 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3202 : {
3203 : HOST_WIDE_INT val = INTVAL (op);
3204 : HOST_WIDE_INT low = val & 0xff;
3205 : return val == ((low << 8) | low);
3206 : }
3207 :
3208 : bool
3209 : avx2_pblendw_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3210 : {
3211 : return (GET_CODE (op) == CONST_INT) && (
3212 : (avx2_pblendw_operand_1 (op, mode)));
3213 : }
3214 :
3215 : bool
3216 : general_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3217 : {
3218 : return (vector_operand (op, mode)) || ((GET_CODE (op) == CONST_VECTOR) && (
3219 : (mode == VOIDmode || GET_MODE (op) == mode)));
3220 : }
3221 :
3222 : bool
3223 : register_or_constm1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3224 : {
3225 : return (register_operand (op, mode)) || (((GET_CODE (op) == CONST_INT) && (
3226 : #line 2135 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3227 : (op == constm1_rtx))) && (
3228 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
3229 : }
3230 :
3231 : static inline bool
3232 : save_multiple_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3233 : #line 2141 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3234 : {
3235 : const unsigned len = XVECLEN (op, 0);
3236 : unsigned i;
3237 :
3238 : /* Starting from end of vector, count register saves. */
3239 : for (i = 0; i < len; ++i)
3240 : {
3241 : rtx src, dest, addr;
3242 : rtx e = XVECEXP (op, 0, len - 1 - i);
3243 :
3244 : if (GET_CODE (e) != SET)
3245 : break;
3246 :
3247 : src = SET_SRC (e);
3248 : dest = SET_DEST (e);
3249 :
3250 : if (!REG_P (src) || !MEM_P (dest))
3251 : break;
3252 :
3253 : addr = XEXP (dest, 0);
3254 :
3255 : /* Good if dest address is in RAX. */
3256 : if (REG_P (addr) && REGNO (addr) == AX_REG)
3257 : continue;
3258 :
3259 : /* Good if dest address is offset of RAX. */
3260 : if (GET_CODE (addr) == PLUS
3261 : && REG_P (XEXP (addr, 0))
3262 : && REGNO (XEXP (addr, 0)) == AX_REG)
3263 : continue;
3264 :
3265 : break;
3266 : }
3267 : return (i >= 12 && i <= 18);
3268 : }
3269 :
3270 : bool
3271 : save_multiple (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3272 : {
3273 : return ((GET_CODE (op) == PARALLEL) && (
3274 : (save_multiple_1 (op, mode)))) && (
3275 : (mode == VOIDmode || GET_MODE (op) == mode));
3276 : }
3277 :
3278 : static inline bool
3279 : restore_multiple_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3280 : #line 2182 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3281 : {
3282 : const unsigned len = XVECLEN (op, 0);
3283 : unsigned i;
3284 :
3285 : /* Starting from end of vector, count register restores. */
3286 : for (i = 0; i < len; ++i)
3287 : {
3288 : rtx src, dest, addr;
3289 : rtx e = XVECEXP (op, 0, len - 1 - i);
3290 :
3291 : if (GET_CODE (e) != SET)
3292 : break;
3293 :
3294 : src = SET_SRC (e);
3295 : dest = SET_DEST (e);
3296 :
3297 : if (!MEM_P (src) || !REG_P (dest))
3298 : break;
3299 :
3300 : addr = XEXP (src, 0);
3301 :
3302 : /* Good if src address is in RSI. */
3303 : if (REG_P (addr) && REGNO (addr) == SI_REG)
3304 : continue;
3305 :
3306 : /* Good if src address is offset of RSI. */
3307 : if (GET_CODE (addr) == PLUS
3308 : && REG_P (XEXP (addr, 0))
3309 : && REGNO (XEXP (addr, 0)) == SI_REG)
3310 : continue;
3311 :
3312 : break;
3313 : }
3314 : return (i >= 12 && i <= 18);
3315 : }
3316 :
3317 : bool
3318 : restore_multiple (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3319 : {
3320 : return ((GET_CODE (op) == PARALLEL) && (
3321 : (restore_multiple_1 (op, mode)))) && (
3322 : (mode == VOIDmode || GET_MODE (op) == mode));
3323 : }
3324 :
3325 : static inline bool
3326 : encodekey128_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3327 : #line 2221 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3328 : {
3329 : unsigned i;
3330 : rtx elt;
3331 :
3332 : if (XVECLEN (op, 0) != 8)
3333 : return false;
3334 :
3335 : for(i = 0; i < 3; i++)
3336 : {
3337 : elt = XVECEXP (op, 0, i + 1);
3338 : if (GET_CODE (elt) != SET
3339 : || GET_CODE (SET_DEST (elt)) != REG
3340 : || GET_MODE (SET_DEST (elt)) != V2DImode
3341 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3342 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3343 : || GET_MODE (SET_SRC (elt)) != V2DImode
3344 : || XVECLEN(SET_SRC (elt), 0) != 1
3345 : || XVECEXP(SET_SRC (elt), 0, 0) != const0_rtx)
3346 : return false;
3347 : }
3348 :
3349 : for(i = 4; i < 7; i++)
3350 : {
3351 : elt = XVECEXP (op, 0, i);
3352 : if (GET_CODE (elt) != CLOBBER
3353 : || GET_MODE (elt) != VOIDmode
3354 : || GET_CODE (XEXP (elt, 0)) != REG
3355 : || GET_MODE (XEXP (elt, 0)) != V2DImode
3356 : || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
3357 : return false;
3358 : }
3359 :
3360 : elt = XVECEXP (op, 0, 7);
3361 : if (GET_CODE (elt) != CLOBBER
3362 : || GET_MODE (elt) != VOIDmode
3363 : || GET_CODE (XEXP (elt, 0)) != REG
3364 : || GET_MODE (XEXP (elt, 0)) != CCmode
3365 : || REGNO (XEXP (elt, 0)) != FLAGS_REG)
3366 : return false;
3367 : return true;
3368 : }
3369 :
3370 : bool
3371 : encodekey128_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3372 : {
3373 : return ((GET_CODE (op) == PARALLEL) && (
3374 : (encodekey128_operation_1 (op, mode)))) && (
3375 : (mode == VOIDmode || GET_MODE (op) == mode));
3376 : }
3377 :
3378 : static inline bool
3379 : encodekey256_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3380 : #line 2265 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3381 : {
3382 : unsigned i;
3383 : rtx elt;
3384 :
3385 : if (XVECLEN (op, 0) != 9)
3386 : return false;
3387 :
3388 : elt = SET_SRC (XVECEXP (op, 0, 0));
3389 : elt = XVECEXP (elt, 0, 2);
3390 : if (!REG_P (elt)
3391 : || REGNO(elt) != GET_SSE_REGNO (1))
3392 : return false;
3393 :
3394 : for(i = 0; i < 4; i++)
3395 : {
3396 : elt = XVECEXP (op, 0, i + 1);
3397 : if (GET_CODE (elt) != SET
3398 : || GET_CODE (SET_DEST (elt)) != REG
3399 : || GET_MODE (SET_DEST (elt)) != V2DImode
3400 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3401 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3402 : || GET_MODE (SET_SRC (elt)) != V2DImode
3403 : || XVECLEN(SET_SRC (elt), 0) != 1
3404 : || XVECEXP(SET_SRC (elt), 0, 0) != const0_rtx)
3405 : return false;
3406 : }
3407 :
3408 : for(i = 4; i < 7; i++)
3409 : {
3410 : elt = XVECEXP (op, 0, i + 1);
3411 : if (GET_CODE (elt) != CLOBBER
3412 : || GET_MODE (elt) != VOIDmode
3413 : || GET_CODE (XEXP (elt, 0)) != REG
3414 : || GET_MODE (XEXP (elt, 0)) != V2DImode
3415 : || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
3416 : return false;
3417 : }
3418 :
3419 : elt = XVECEXP (op, 0, 8);
3420 : if (GET_CODE (elt) != CLOBBER
3421 : || GET_MODE (elt) != VOIDmode
3422 : || GET_CODE (XEXP (elt, 0)) != REG
3423 : || GET_MODE (XEXP (elt, 0)) != CCmode
3424 : || REGNO (XEXP (elt, 0)) != FLAGS_REG)
3425 : return false;
3426 : return true;
3427 : }
3428 :
3429 : bool
3430 : encodekey256_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3431 : {
3432 : return ((GET_CODE (op) == PARALLEL) && (
3433 : (encodekey256_operation_1 (op, mode)))) && (
3434 : (mode == VOIDmode || GET_MODE (op) == mode));
3435 : }
3436 :
3437 : static inline bool
3438 : aeswidekl_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3439 : #line 2316 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3440 : {
3441 : unsigned i;
3442 : rtx elt;
3443 :
3444 : for (i = 0; i < 8; i++)
3445 : {
3446 : elt = XVECEXP (op, 0, i + 1);
3447 : if (GET_CODE (elt) != SET
3448 : || GET_CODE (SET_DEST (elt)) != REG
3449 : || GET_MODE (SET_DEST (elt)) != V2DImode
3450 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3451 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3452 : || GET_MODE (SET_SRC (elt)) != V2DImode
3453 : || XVECLEN (SET_SRC (elt), 0) != 1
3454 : || !REG_P (XVECEXP (SET_SRC (elt), 0, 0))
3455 : || REGNO (XVECEXP (SET_SRC (elt), 0, 0)) != GET_SSE_REGNO (i))
3456 : return false;
3457 : }
3458 : return true;
3459 : }
3460 :
3461 : bool
3462 : aeswidekl_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3463 : {
3464 : return ((GET_CODE (op) == PARALLEL) && (
3465 : (aeswidekl_operation_1 (op, mode)))) && (
3466 : (mode == VOIDmode || GET_MODE (op) == mode));
3467 : }
3468 :
3469 : static inline bool
3470 : apx_evex_memory_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3471 : #line 2343 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3472 : {
3473 : /* OK if immediate operand size < 4 bytes. */
3474 : if (GET_MODE_SIZE (mode) < 4)
3475 : return true;
3476 :
3477 : bool default_addr = ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (op));
3478 : bool address_size_prefix = TARGET_X32 && Pmode == SImode;
3479 :
3480 : struct ix86_address parts;
3481 : int ok;
3482 :
3483 : op = XEXP (op, 0);
3484 : ok = ix86_decompose_address (op, &parts);
3485 : gcc_assert (ok);
3486 :
3487 : if (default_addr)
3488 : {
3489 : /* Default address space. */
3490 :
3491 : /* Not OK with address size prefix, index register and disp. */
3492 : if (address_size_prefix
3493 : && parts.index
3494 : && parts.disp
3495 : && parts.disp != const0_rtx)
3496 : return false;
3497 : }
3498 : else
3499 : {
3500 : /* Non-default address space. */
3501 :
3502 : /* Not OK without base register. */
3503 : if (!parts.base)
3504 : return false;
3505 :
3506 : /* Not OK with disp and address size prefix. */
3507 : if (address_size_prefix && parts.disp)
3508 : return false;
3509 : }
3510 :
3511 : return true;
3512 : }
3513 :
3514 : bool
3515 : apx_evex_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3516 : {
3517 : return (memory_operand (op, mode)) && (
3518 : (apx_evex_memory_operand_1 (op, mode)));
3519 : }
3520 :
3521 : static inline bool
3522 : apx_evex_add_memory_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3523 : #line 2391 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3524 : {
3525 : /* OK if "add %reg1, name@gottpoff(%rip), %reg2" or
3526 : "{nf} add name@gottpoff(%rip), %reg1" are supported. */
3527 : if (HAVE_AS_R_X86_64_CODE_6_GOTTPOFF)
3528 : return true;
3529 :
3530 : op = XEXP (op, 0);
3531 :
3532 : /* Disallow APX EVEX-encoded ADD with UNSPEC_GOTNTPOFF. */
3533 : if (GET_CODE (op) == CONST
3534 : && GET_CODE (XEXP (op, 0)) == UNSPEC
3535 : && XINT (XEXP (op, 0), 1) == UNSPEC_GOTNTPOFF)
3536 : return false;
3537 :
3538 : return true;
3539 : }
3540 :
3541 : bool
3542 : apx_evex_add_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3543 : {
3544 : return (memory_operand (op, mode)) && (
3545 : (apx_evex_add_memory_operand_1 (op, mode)));
3546 : }
3547 :
3548 : enum constraint_num
3549 : lookup_constraint_1 (const char *str)
3550 : {
3551 : switch (str[0])
3552 : {
3553 : case ':':
3554 : return CONSTRAINT__c;
3555 : case '<':
3556 : return CONSTRAINT__l;
3557 : case '>':
3558 : return CONSTRAINT__g;
3559 : case 'A':
3560 : return CONSTRAINT_A;
3561 : case 'B':
3562 : if (str[1] == 'g')
3563 : return CONSTRAINT_Bg;
3564 : if (str[1] == 'm')
3565 : return CONSTRAINT_Bm;
3566 : if (str[1] == 'k')
3567 : return CONSTRAINT_Bk;
3568 : if (str[1] == 'n')
3569 : return CONSTRAINT_Bn;
3570 : if (str[1] == 'r')
3571 : return CONSTRAINT_Br;
3572 : if (str[1] == 's')
3573 : return CONSTRAINT_Bs;
3574 : if (str[1] == 'w')
3575 : return CONSTRAINT_Bw;
3576 : if (str[1] == 'z')
3577 : return CONSTRAINT_Bz;
3578 : if (str[1] == 'C')
3579 : return CONSTRAINT_BC;
3580 : if (str[1] == 'F')
3581 : return CONSTRAINT_BF;
3582 : if (str[1] == 'H')
3583 : return CONSTRAINT_BH;
3584 : if (str[1] == 'M')
3585 : return CONSTRAINT_BM;
3586 : if (str[1] == 'f')
3587 : return CONSTRAINT_Bf;
3588 : break;
3589 : case 'C':
3590 : return CONSTRAINT_C;
3591 : case 'D':
3592 : return CONSTRAINT_D;
3593 : case 'E':
3594 : return CONSTRAINT_E;
3595 : case 'F':
3596 : return CONSTRAINT_F;
3597 : case 'G':
3598 : return CONSTRAINT_G;
3599 : case 'I':
3600 : return CONSTRAINT_I;
3601 : case 'J':
3602 : return CONSTRAINT_J;
3603 : case 'K':
3604 : return CONSTRAINT_K;
3605 : case 'L':
3606 : return CONSTRAINT_L;
3607 : case 'M':
3608 : return CONSTRAINT_M;
3609 : case 'N':
3610 : return CONSTRAINT_N;
3611 : case 'O':
3612 : return CONSTRAINT_O;
3613 : case 'Q':
3614 : return CONSTRAINT_Q;
3615 : case 'R':
3616 : return CONSTRAINT_R;
3617 : case 'S':
3618 : return CONSTRAINT_S;
3619 : case 'T':
3620 : if (str[1] == 's')
3621 : return CONSTRAINT_Ts;
3622 : if (str[1] == 'v')
3623 : return CONSTRAINT_Tv;
3624 : break;
3625 : case 'U':
3626 : return CONSTRAINT_U;
3627 : case 'V':
3628 : return CONSTRAINT_V;
3629 : case 'W':
3630 : if (str[1] == 'c')
3631 : return CONSTRAINT_Wc;
3632 : if (str[1] == 'w')
3633 : return CONSTRAINT_Ww;
3634 : if (str[1] == 'e')
3635 : return CONSTRAINT_We;
3636 : if (str[1] == 'z')
3637 : return CONSTRAINT_Wz;
3638 : if (str[1] == 'd')
3639 : return CONSTRAINT_Wd;
3640 : if (str[1] == 'f')
3641 : return CONSTRAINT_Wf;
3642 : if (str[1] == 's')
3643 : return CONSTRAINT_Ws;
3644 : if (str[1] == 'b')
3645 : return CONSTRAINT_Wb;
3646 : break;
3647 : case 'X':
3648 : return CONSTRAINT_X;
3649 : case 'Y':
3650 : if (str[1] == 'z')
3651 : return CONSTRAINT_Yz;
3652 : if (str[1] == 'd')
3653 : return CONSTRAINT_Yd;
3654 : if (str[1] == 'p')
3655 : return CONSTRAINT_Yp;
3656 : if (str[1] == 'a')
3657 : return CONSTRAINT_Ya;
3658 : if (str[1] == 'b')
3659 : return CONSTRAINT_Yb;
3660 : if (str[1] == 'f')
3661 : return CONSTRAINT_Yf;
3662 : if (str[1] == 'r')
3663 : return CONSTRAINT_Yr;
3664 : if (str[1] == 'v')
3665 : return CONSTRAINT_Yv;
3666 : if (str[1] == 'w')
3667 : return CONSTRAINT_Yw;
3668 : if (str[1] == 'W')
3669 : return CONSTRAINT_YW;
3670 : if (str[1] == 'k')
3671 : return CONSTRAINT_Yk;
3672 : break;
3673 : case 'Z':
3674 : return CONSTRAINT_Z;
3675 : case 'a':
3676 : return CONSTRAINT_a;
3677 : case 'b':
3678 : return CONSTRAINT_b;
3679 : case 'c':
3680 : return CONSTRAINT_c;
3681 : case 'd':
3682 : return CONSTRAINT_d;
3683 : case 'e':
3684 : return CONSTRAINT_e;
3685 : case 'f':
3686 : return CONSTRAINT_f;
3687 : case 'i':
3688 : return CONSTRAINT_i;
3689 : case 'j':
3690 : if (str[1] == 'r')
3691 : return CONSTRAINT_jr;
3692 : if (str[1] == 'm')
3693 : return CONSTRAINT_jm;
3694 : if (str[1] == '<')
3695 : return CONSTRAINT_j_l;
3696 : if (str[1] == '>')
3697 : return CONSTRAINT_j_g;
3698 : if (str[1] == 'o')
3699 : return CONSTRAINT_jo;
3700 : if (str[1] == 'V')
3701 : return CONSTRAINT_jV;
3702 : if (str[1] == 'p')
3703 : return CONSTRAINT_jp;
3704 : if (str[1] == 'a')
3705 : return CONSTRAINT_ja;
3706 : if (str[1] == 'b')
3707 : return CONSTRAINT_jb;
3708 : if (str[1] == 'c')
3709 : return CONSTRAINT_jc;
3710 : if (str[1] == 'e')
3711 : return CONSTRAINT_je;
3712 : if (str[1] == 'M')
3713 : return CONSTRAINT_jM;
3714 : if (str[1] == 'O')
3715 : return CONSTRAINT_jO;
3716 : if (str[1] == 'R')
3717 : return CONSTRAINT_jR;
3718 : break;
3719 : case 'k':
3720 : return CONSTRAINT_k;
3721 : case 'l':
3722 : return CONSTRAINT_l;
3723 : case 'm':
3724 : return CONSTRAINT_m;
3725 : case 'n':
3726 : return CONSTRAINT_n;
3727 : case 'o':
3728 : return CONSTRAINT_o;
3729 : case 'p':
3730 : return CONSTRAINT_p;
3731 : case 'q':
3732 : return CONSTRAINT_q;
3733 : case 'r':
3734 : return CONSTRAINT_r;
3735 : case 's':
3736 : return CONSTRAINT_s;
3737 : case 't':
3738 : return CONSTRAINT_t;
3739 : case 'u':
3740 : return CONSTRAINT_u;
3741 : case 'v':
3742 : return CONSTRAINT_v;
3743 : case 'x':
3744 : return CONSTRAINT_x;
3745 : case 'y':
3746 : return CONSTRAINT_y;
3747 : default: break;
3748 : }
3749 : return CONSTRAINT__UNKNOWN;
3750 : }
3751 :
3752 : const unsigned char lookup_constraint_array[] = {
3753 : CONSTRAINT__UNKNOWN,
3754 : CONSTRAINT__UNKNOWN,
3755 : CONSTRAINT__UNKNOWN,
3756 : CONSTRAINT__UNKNOWN,
3757 : CONSTRAINT__UNKNOWN,
3758 : CONSTRAINT__UNKNOWN,
3759 : CONSTRAINT__UNKNOWN,
3760 : CONSTRAINT__UNKNOWN,
3761 : CONSTRAINT__UNKNOWN,
3762 : CONSTRAINT__UNKNOWN,
3763 : CONSTRAINT__UNKNOWN,
3764 : CONSTRAINT__UNKNOWN,
3765 : CONSTRAINT__UNKNOWN,
3766 : CONSTRAINT__UNKNOWN,
3767 : CONSTRAINT__UNKNOWN,
3768 : CONSTRAINT__UNKNOWN,
3769 : CONSTRAINT__UNKNOWN,
3770 : CONSTRAINT__UNKNOWN,
3771 : CONSTRAINT__UNKNOWN,
3772 : CONSTRAINT__UNKNOWN,
3773 : CONSTRAINT__UNKNOWN,
3774 : CONSTRAINT__UNKNOWN,
3775 : CONSTRAINT__UNKNOWN,
3776 : CONSTRAINT__UNKNOWN,
3777 : CONSTRAINT__UNKNOWN,
3778 : CONSTRAINT__UNKNOWN,
3779 : CONSTRAINT__UNKNOWN,
3780 : CONSTRAINT__UNKNOWN,
3781 : CONSTRAINT__UNKNOWN,
3782 : CONSTRAINT__UNKNOWN,
3783 : CONSTRAINT__UNKNOWN,
3784 : CONSTRAINT__UNKNOWN,
3785 : CONSTRAINT__UNKNOWN,
3786 : CONSTRAINT__UNKNOWN,
3787 : CONSTRAINT__UNKNOWN,
3788 : CONSTRAINT__UNKNOWN,
3789 : CONSTRAINT__UNKNOWN,
3790 : CONSTRAINT__UNKNOWN,
3791 : CONSTRAINT__UNKNOWN,
3792 : CONSTRAINT__UNKNOWN,
3793 : CONSTRAINT__UNKNOWN,
3794 : CONSTRAINT__UNKNOWN,
3795 : CONSTRAINT__UNKNOWN,
3796 : CONSTRAINT__UNKNOWN,
3797 : CONSTRAINT__UNKNOWN,
3798 : CONSTRAINT__UNKNOWN,
3799 : CONSTRAINT__UNKNOWN,
3800 : CONSTRAINT__UNKNOWN,
3801 : CONSTRAINT__UNKNOWN,
3802 : CONSTRAINT__UNKNOWN,
3803 : CONSTRAINT__UNKNOWN,
3804 : CONSTRAINT__UNKNOWN,
3805 : CONSTRAINT__UNKNOWN,
3806 : CONSTRAINT__UNKNOWN,
3807 : CONSTRAINT__UNKNOWN,
3808 : CONSTRAINT__UNKNOWN,
3809 : CONSTRAINT__UNKNOWN,
3810 : CONSTRAINT__UNKNOWN,
3811 : MIN ((int) CONSTRAINT__c, (int) UCHAR_MAX),
3812 : CONSTRAINT__UNKNOWN,
3813 : MIN ((int) CONSTRAINT__l, (int) UCHAR_MAX),
3814 : CONSTRAINT__UNKNOWN,
3815 : MIN ((int) CONSTRAINT__g, (int) UCHAR_MAX),
3816 : CONSTRAINT__UNKNOWN,
3817 : CONSTRAINT__UNKNOWN,
3818 : MIN ((int) CONSTRAINT_A, (int) UCHAR_MAX),
3819 : UCHAR_MAX,
3820 : MIN ((int) CONSTRAINT_C, (int) UCHAR_MAX),
3821 : MIN ((int) CONSTRAINT_D, (int) UCHAR_MAX),
3822 : MIN ((int) CONSTRAINT_E, (int) UCHAR_MAX),
3823 : MIN ((int) CONSTRAINT_F, (int) UCHAR_MAX),
3824 : MIN ((int) CONSTRAINT_G, (int) UCHAR_MAX),
3825 : CONSTRAINT__UNKNOWN,
3826 : MIN ((int) CONSTRAINT_I, (int) UCHAR_MAX),
3827 : MIN ((int) CONSTRAINT_J, (int) UCHAR_MAX),
3828 : MIN ((int) CONSTRAINT_K, (int) UCHAR_MAX),
3829 : MIN ((int) CONSTRAINT_L, (int) UCHAR_MAX),
3830 : MIN ((int) CONSTRAINT_M, (int) UCHAR_MAX),
3831 : MIN ((int) CONSTRAINT_N, (int) UCHAR_MAX),
3832 : MIN ((int) CONSTRAINT_O, (int) UCHAR_MAX),
3833 : CONSTRAINT__UNKNOWN,
3834 : MIN ((int) CONSTRAINT_Q, (int) UCHAR_MAX),
3835 : MIN ((int) CONSTRAINT_R, (int) UCHAR_MAX),
3836 : MIN ((int) CONSTRAINT_S, (int) UCHAR_MAX),
3837 : UCHAR_MAX,
3838 : MIN ((int) CONSTRAINT_U, (int) UCHAR_MAX),
3839 : MIN ((int) CONSTRAINT_V, (int) UCHAR_MAX),
3840 : UCHAR_MAX,
3841 : MIN ((int) CONSTRAINT_X, (int) UCHAR_MAX),
3842 : UCHAR_MAX,
3843 : MIN ((int) CONSTRAINT_Z, (int) UCHAR_MAX),
3844 : CONSTRAINT__UNKNOWN,
3845 : CONSTRAINT__UNKNOWN,
3846 : CONSTRAINT__UNKNOWN,
3847 : CONSTRAINT__UNKNOWN,
3848 : CONSTRAINT__UNKNOWN,
3849 : CONSTRAINT__UNKNOWN,
3850 : MIN ((int) CONSTRAINT_a, (int) UCHAR_MAX),
3851 : MIN ((int) CONSTRAINT_b, (int) UCHAR_MAX),
3852 : MIN ((int) CONSTRAINT_c, (int) UCHAR_MAX),
3853 : MIN ((int) CONSTRAINT_d, (int) UCHAR_MAX),
3854 : MIN ((int) CONSTRAINT_e, (int) UCHAR_MAX),
3855 : MIN ((int) CONSTRAINT_f, (int) UCHAR_MAX),
3856 : CONSTRAINT__UNKNOWN,
3857 : CONSTRAINT__UNKNOWN,
3858 : MIN ((int) CONSTRAINT_i, (int) UCHAR_MAX),
3859 : UCHAR_MAX,
3860 : MIN ((int) CONSTRAINT_k, (int) UCHAR_MAX),
3861 : MIN ((int) CONSTRAINT_l, (int) UCHAR_MAX),
3862 : MIN ((int) CONSTRAINT_m, (int) UCHAR_MAX),
3863 : MIN ((int) CONSTRAINT_n, (int) UCHAR_MAX),
3864 : MIN ((int) CONSTRAINT_o, (int) UCHAR_MAX),
3865 : MIN ((int) CONSTRAINT_p, (int) UCHAR_MAX),
3866 : MIN ((int) CONSTRAINT_q, (int) UCHAR_MAX),
3867 : MIN ((int) CONSTRAINT_r, (int) UCHAR_MAX),
3868 : MIN ((int) CONSTRAINT_s, (int) UCHAR_MAX),
3869 : MIN ((int) CONSTRAINT_t, (int) UCHAR_MAX),
3870 : MIN ((int) CONSTRAINT_u, (int) UCHAR_MAX),
3871 : MIN ((int) CONSTRAINT_v, (int) UCHAR_MAX),
3872 : CONSTRAINT__UNKNOWN,
3873 : MIN ((int) CONSTRAINT_x, (int) UCHAR_MAX),
3874 : MIN ((int) CONSTRAINT_y, (int) UCHAR_MAX),
3875 : CONSTRAINT__UNKNOWN,
3876 : CONSTRAINT__UNKNOWN,
3877 : CONSTRAINT__UNKNOWN,
3878 : CONSTRAINT__UNKNOWN,
3879 : CONSTRAINT__UNKNOWN,
3880 : CONSTRAINT__UNKNOWN,
3881 : CONSTRAINT__UNKNOWN,
3882 : CONSTRAINT__UNKNOWN,
3883 : CONSTRAINT__UNKNOWN,
3884 : CONSTRAINT__UNKNOWN,
3885 : CONSTRAINT__UNKNOWN,
3886 : CONSTRAINT__UNKNOWN,
3887 : CONSTRAINT__UNKNOWN,
3888 : CONSTRAINT__UNKNOWN,
3889 : CONSTRAINT__UNKNOWN,
3890 : CONSTRAINT__UNKNOWN,
3891 : CONSTRAINT__UNKNOWN,
3892 : CONSTRAINT__UNKNOWN,
3893 : CONSTRAINT__UNKNOWN,
3894 : CONSTRAINT__UNKNOWN,
3895 : CONSTRAINT__UNKNOWN,
3896 : CONSTRAINT__UNKNOWN,
3897 : CONSTRAINT__UNKNOWN,
3898 : CONSTRAINT__UNKNOWN,
3899 : CONSTRAINT__UNKNOWN,
3900 : CONSTRAINT__UNKNOWN,
3901 : CONSTRAINT__UNKNOWN,
3902 : CONSTRAINT__UNKNOWN,
3903 : CONSTRAINT__UNKNOWN,
3904 : CONSTRAINT__UNKNOWN,
3905 : CONSTRAINT__UNKNOWN,
3906 : CONSTRAINT__UNKNOWN,
3907 : CONSTRAINT__UNKNOWN,
3908 : CONSTRAINT__UNKNOWN,
3909 : CONSTRAINT__UNKNOWN,
3910 : CONSTRAINT__UNKNOWN,
3911 : CONSTRAINT__UNKNOWN,
3912 : CONSTRAINT__UNKNOWN,
3913 : CONSTRAINT__UNKNOWN,
3914 : CONSTRAINT__UNKNOWN,
3915 : CONSTRAINT__UNKNOWN,
3916 : CONSTRAINT__UNKNOWN,
3917 : CONSTRAINT__UNKNOWN,
3918 : CONSTRAINT__UNKNOWN,
3919 : CONSTRAINT__UNKNOWN,
3920 : CONSTRAINT__UNKNOWN,
3921 : CONSTRAINT__UNKNOWN,
3922 : CONSTRAINT__UNKNOWN,
3923 : CONSTRAINT__UNKNOWN,
3924 : CONSTRAINT__UNKNOWN,
3925 : CONSTRAINT__UNKNOWN,
3926 : CONSTRAINT__UNKNOWN,
3927 : CONSTRAINT__UNKNOWN,
3928 : CONSTRAINT__UNKNOWN,
3929 : CONSTRAINT__UNKNOWN,
3930 : CONSTRAINT__UNKNOWN,
3931 : CONSTRAINT__UNKNOWN,
3932 : CONSTRAINT__UNKNOWN,
3933 : CONSTRAINT__UNKNOWN,
3934 : CONSTRAINT__UNKNOWN,
3935 : CONSTRAINT__UNKNOWN,
3936 : CONSTRAINT__UNKNOWN,
3937 : CONSTRAINT__UNKNOWN,
3938 : CONSTRAINT__UNKNOWN,
3939 : CONSTRAINT__UNKNOWN,
3940 : CONSTRAINT__UNKNOWN,
3941 : CONSTRAINT__UNKNOWN,
3942 : CONSTRAINT__UNKNOWN,
3943 : CONSTRAINT__UNKNOWN,
3944 : CONSTRAINT__UNKNOWN,
3945 : CONSTRAINT__UNKNOWN,
3946 : CONSTRAINT__UNKNOWN,
3947 : CONSTRAINT__UNKNOWN,
3948 : CONSTRAINT__UNKNOWN,
3949 : CONSTRAINT__UNKNOWN,
3950 : CONSTRAINT__UNKNOWN,
3951 : CONSTRAINT__UNKNOWN,
3952 : CONSTRAINT__UNKNOWN,
3953 : CONSTRAINT__UNKNOWN,
3954 : CONSTRAINT__UNKNOWN,
3955 : CONSTRAINT__UNKNOWN,
3956 : CONSTRAINT__UNKNOWN,
3957 : CONSTRAINT__UNKNOWN,
3958 : CONSTRAINT__UNKNOWN,
3959 : CONSTRAINT__UNKNOWN,
3960 : CONSTRAINT__UNKNOWN,
3961 : CONSTRAINT__UNKNOWN,
3962 : CONSTRAINT__UNKNOWN,
3963 : CONSTRAINT__UNKNOWN,
3964 : CONSTRAINT__UNKNOWN,
3965 : CONSTRAINT__UNKNOWN,
3966 : CONSTRAINT__UNKNOWN,
3967 : CONSTRAINT__UNKNOWN,
3968 : CONSTRAINT__UNKNOWN,
3969 : CONSTRAINT__UNKNOWN,
3970 : CONSTRAINT__UNKNOWN,
3971 : CONSTRAINT__UNKNOWN,
3972 : CONSTRAINT__UNKNOWN,
3973 : CONSTRAINT__UNKNOWN,
3974 : CONSTRAINT__UNKNOWN,
3975 : CONSTRAINT__UNKNOWN,
3976 : CONSTRAINT__UNKNOWN,
3977 : CONSTRAINT__UNKNOWN,
3978 : CONSTRAINT__UNKNOWN,
3979 : CONSTRAINT__UNKNOWN,
3980 : CONSTRAINT__UNKNOWN,
3981 : CONSTRAINT__UNKNOWN,
3982 : CONSTRAINT__UNKNOWN,
3983 : CONSTRAINT__UNKNOWN,
3984 : CONSTRAINT__UNKNOWN,
3985 : CONSTRAINT__UNKNOWN,
3986 : CONSTRAINT__UNKNOWN,
3987 : CONSTRAINT__UNKNOWN,
3988 : CONSTRAINT__UNKNOWN,
3989 : CONSTRAINT__UNKNOWN,
3990 : CONSTRAINT__UNKNOWN,
3991 : CONSTRAINT__UNKNOWN,
3992 : CONSTRAINT__UNKNOWN,
3993 : CONSTRAINT__UNKNOWN,
3994 : CONSTRAINT__UNKNOWN,
3995 : CONSTRAINT__UNKNOWN,
3996 : CONSTRAINT__UNKNOWN,
3997 : CONSTRAINT__UNKNOWN,
3998 : CONSTRAINT__UNKNOWN,
3999 : CONSTRAINT__UNKNOWN,
4000 : CONSTRAINT__UNKNOWN,
4001 : CONSTRAINT__UNKNOWN,
4002 : CONSTRAINT__UNKNOWN,
4003 : CONSTRAINT__UNKNOWN,
4004 : CONSTRAINT__UNKNOWN,
4005 : CONSTRAINT__UNKNOWN,
4006 : CONSTRAINT__UNKNOWN,
4007 : CONSTRAINT__UNKNOWN,
4008 : CONSTRAINT__UNKNOWN
4009 : };
4010 :
4011 : enum reg_class
4012 : reg_class_for_constraint_1 (enum constraint_num c)
4013 : {
4014 : switch (c)
4015 : {
4016 : case CONSTRAINT_r: return GENERAL_REGS;
4017 : case CONSTRAINT_R: return LEGACY_GENERAL_REGS;
4018 : case CONSTRAINT_q: return TARGET_64BIT ? GENERAL_REGS : Q_REGS;
4019 : case CONSTRAINT_Q: return Q_REGS;
4020 : case CONSTRAINT_l: return INDEX_REGS;
4021 : case CONSTRAINT_a: return AREG;
4022 : case CONSTRAINT_b: return BREG;
4023 : case CONSTRAINT_c: return CREG;
4024 : case CONSTRAINT_d: return DREG;
4025 : case CONSTRAINT_S: return SIREG;
4026 : case CONSTRAINT_D: return DIREG;
4027 : case CONSTRAINT_A: return AD_REGS;
4028 : case CONSTRAINT_U: return CLOBBERED_REGS;
4029 : case CONSTRAINT_f: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FLOAT_REGS : NO_REGS;
4030 : case CONSTRAINT_t: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FP_TOP_REG : NO_REGS;
4031 : case CONSTRAINT_u: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FP_SECOND_REG : NO_REGS;
4032 : case CONSTRAINT_Yk: return TARGET_AVX512F ? MASK_REGS : NO_REGS;
4033 : case CONSTRAINT_k: return TARGET_AVX512F ? ALL_MASK_REGS : NO_REGS;
4034 : case CONSTRAINT_y: return TARGET_MMX ? MMX_REGS : NO_REGS;
4035 : case CONSTRAINT_x: return TARGET_SSE ? SSE_REGS : NO_REGS;
4036 : case CONSTRAINT_v: return TARGET_SSE ? ALL_SSE_REGS : NO_REGS;
4037 : case CONSTRAINT_Yz: return TARGET_SSE ? SSE_FIRST_REG : NO_REGS;
4038 : case CONSTRAINT_Yd: return TARGET_AVX512DQ ? ALL_SSE_REGS : TARGET_SSE4_1 ? SSE_REGS : NO_REGS;
4039 : case CONSTRAINT_Yp: return TARGET_PARTIAL_REG_STALL ? NO_REGS : GENERAL_REGS;
4040 : case CONSTRAINT_Ya: return TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)
4041 : ? NO_REGS : GENERAL_REGS;
4042 : case CONSTRAINT_Yb: return (!flag_plt && HAVE_AS_IX86_TLS_GET_ADDR_GOT) ? TLS_GOTBASE_REGS : BREG;
4043 : case CONSTRAINT_Yf: return (ix86_fpmath & FPMATH_387) ? FLOAT_REGS : NO_REGS;
4044 : case CONSTRAINT_Yr: return TARGET_SSE ? (TARGET_AVOID_4BYTE_PREFIXES ? NO_REX_SSE_REGS : ALL_SSE_REGS) : NO_REGS;
4045 : case CONSTRAINT_Yv: return TARGET_AVX512VL ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4046 : case CONSTRAINT_Yw: return TARGET_AVX512BW && TARGET_AVX512VL ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4047 : case CONSTRAINT_YW: return TARGET_AVX512BW ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4048 : case CONSTRAINT_jR: return GENERAL_REGS;
4049 : case CONSTRAINT_jr: return TARGET_APX_EGPR ? GENERAL_GPR16 : GENERAL_REGS;
4050 : case CONSTRAINT_jc: return TARGET_APX_EGPR && !TARGET_AVX ? GENERAL_GPR16 : GENERAL_REGS;
4051 : default: break;
4052 : }
4053 : return NO_REGS;
4054 : }
4055 :
4056 : bool (*constraint_satisfied_p_array[]) (rtx) = {
4057 : satisfies_constraint_I,
4058 : satisfies_constraint_J,
4059 : satisfies_constraint_K,
4060 : satisfies_constraint_L,
4061 : satisfies_constraint_M,
4062 : satisfies_constraint_N,
4063 : satisfies_constraint_O,
4064 : satisfies_constraint_m,
4065 : satisfies_constraint_o,
4066 : satisfies_constraint_jm,
4067 : satisfies_constraint_jo,
4068 : satisfies_constraint_je,
4069 : satisfies_constraint_jM,
4070 : satisfies_constraint_jO,
4071 : satisfies_constraint_Bm,
4072 : satisfies_constraint_Bk,
4073 : satisfies_constraint_Bn,
4074 : satisfies_constraint_Br,
4075 : satisfies_constraint_ja,
4076 : satisfies_constraint_p,
4077 : satisfies_constraint_Tv,
4078 : satisfies_constraint_Ts,
4079 : satisfies_constraint_jp,
4080 : satisfies_constraint_jb,
4081 : satisfies_constraint_Bz,
4082 : satisfies_constraint_BH,
4083 : satisfies_constraint_Wb,
4084 : satisfies_constraint_Wc,
4085 : satisfies_constraint_Ww,
4086 : satisfies_constraint_G,
4087 : satisfies_constraint_e,
4088 : satisfies_constraint_We,
4089 : satisfies_constraint_Wz,
4090 : satisfies_constraint_Wd,
4091 : satisfies_constraint_Wf,
4092 : satisfies_constraint_Ws,
4093 : satisfies_constraint_Z,
4094 : satisfies_constraint_Bf,
4095 : satisfies_constraint_V,
4096 : satisfies_constraint__l,
4097 : satisfies_constraint__g,
4098 : satisfies_constraint_BF,
4099 : satisfies_constraint_BM,
4100 : satisfies_constraint_j_l,
4101 : satisfies_constraint_j_g,
4102 : satisfies_constraint_jV,
4103 : satisfies_constraint_i,
4104 : satisfies_constraint_s,
4105 : satisfies_constraint__c,
4106 : satisfies_constraint_n,
4107 : satisfies_constraint_E,
4108 : satisfies_constraint_F,
4109 : satisfies_constraint_X,
4110 : satisfies_constraint_Bg,
4111 : satisfies_constraint_Bs,
4112 : satisfies_constraint_Bw,
4113 : satisfies_constraint_BC,
4114 : satisfies_constraint_C
4115 : };
4116 :
4117 : bool
4118 : insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, enum constraint_num c)
4119 : {
4120 : switch (c)
4121 : {
4122 : case CONSTRAINT_I:
4123 : return
4124 : #line 269 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4125 : (IN_RANGE (ival, 0, 31));
4126 :
4127 : case CONSTRAINT_J:
4128 : return
4129 : #line 274 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4130 : (IN_RANGE (ival, 0, 63));
4131 :
4132 : case CONSTRAINT_K:
4133 : return
4134 : #line 279 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4135 : (IN_RANGE (ival, -128, 127));
4136 :
4137 : case CONSTRAINT_L:
4138 : return (
4139 : #line 285 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4140 : (ival == 0xff)) || ((
4141 : #line 286 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4142 : (ival == 0xffff)) || (
4143 : #line 287 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4144 : (ival == HOST_WIDE_INT_C (0xffffffff))));
4145 :
4146 : case CONSTRAINT_M:
4147 : return
4148 : #line 292 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4149 : (IN_RANGE (ival, 0, 3));
4150 :
4151 : case CONSTRAINT_N:
4152 : return
4153 : #line 298 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4154 : (IN_RANGE (ival, 0, 255));
4155 :
4156 : case CONSTRAINT_O:
4157 : return
4158 : #line 303 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4159 : (IN_RANGE (ival, 0, 127));
4160 :
4161 : default: break;
4162 : }
4163 : return false;
4164 : }
4165 :
4166 :
4167 : void
4168 : init_reg_class_start_regs ()
4169 : {
4170 : }
|