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