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_fp_vec_cmp_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2293 : {
2294 : return (comparison_operator (op, mode)) && ((!(GET_CODE (op) == UNLT || GET_CODE (op) == UNLE || GET_CODE (op) == UNGT || GET_CODE (op) == UNGE)) || ((
2295 : #line 1578 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2296 : (TARGET_AVX)) || ((!(
2297 : #line 1579 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2298 : (flag_trapping_math))) || (!(
2299 : #line 1580 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2300 : (HONOR_NANS (GET_MODE (XEXP (op, 0)))))))));
2301 : }
2302 :
2303 : bool
2304 : ix86_comparison_int_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2305 : {
2306 : switch (GET_CODE (op))
2307 : {
2308 : case NE:
2309 : case EQ:
2310 : case GE:
2311 : case GT:
2312 : case LE:
2313 : case LT:
2314 : break;
2315 : default:
2316 : return false;
2317 : }
2318 : return
2319 : (mode == VOIDmode || GET_MODE (op) == mode);
2320 : }
2321 :
2322 : bool
2323 : ix86_comparison_uns_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2324 : {
2325 : switch (GET_CODE (op))
2326 : {
2327 : case NE:
2328 : case EQ:
2329 : case GEU:
2330 : case GTU:
2331 : case LEU:
2332 : case LTU:
2333 : break;
2334 : default:
2335 : return false;
2336 : }
2337 : return
2338 : (mode == VOIDmode || GET_MODE (op) == mode);
2339 : }
2340 :
2341 : bool
2342 : bt_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2343 : {
2344 : switch (GET_CODE (op))
2345 : {
2346 : case NE:
2347 : case EQ:
2348 : break;
2349 : default:
2350 : return false;
2351 : }
2352 : return
2353 : (mode == VOIDmode || GET_MODE (op) == mode);
2354 : }
2355 :
2356 : bool
2357 : shr_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2358 : {
2359 : switch (GET_CODE (op))
2360 : {
2361 : case GTU:
2362 : case LEU:
2363 : break;
2364 : default:
2365 : return false;
2366 : }
2367 : return
2368 : (mode == VOIDmode || GET_MODE (op) == mode);
2369 : }
2370 :
2371 : bool
2372 : add_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2373 : {
2374 : switch (GET_CODE (op))
2375 : {
2376 : case GEU:
2377 : case LTU:
2378 : break;
2379 : default:
2380 : return false;
2381 : }
2382 : return
2383 : (mode == VOIDmode || GET_MODE (op) == mode);
2384 : }
2385 :
2386 : bool
2387 : ieee_maxmin_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2388 : {
2389 : switch (GET_CODE (op))
2390 : {
2391 : case LT:
2392 : case GT:
2393 : break;
2394 : default:
2395 : return false;
2396 : }
2397 : return
2398 : (mode == VOIDmode || GET_MODE (op) == mode);
2399 : }
2400 :
2401 : static inline bool
2402 : ix86_comparison_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2403 : #line 1603 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2404 : {
2405 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2406 : enum rtx_code code = GET_CODE (op);
2407 :
2408 : if (inmode == CCFPmode)
2409 : return ix86_trivial_fp_comparison_operator (op, mode);
2410 :
2411 : switch (code)
2412 : {
2413 : case EQ: case NE:
2414 : if (inmode == CCGZmode)
2415 : return false;
2416 : return true;
2417 : case GE: case LT:
2418 : if (inmode == CCmode || inmode == CCGCmode
2419 : || inmode == CCGOCmode || inmode == CCNOmode || inmode == CCGZmode)
2420 : return true;
2421 : return false;
2422 : case GEU: case LTU:
2423 : if (inmode == CCCmode || inmode == CCGZmode)
2424 : return true;
2425 : /* FALLTHRU */
2426 : case GTU: case LEU:
2427 : if (inmode == CCmode)
2428 : return true;
2429 : return false;
2430 : case ORDERED: case UNORDERED:
2431 : if (inmode == CCmode)
2432 : return true;
2433 : return false;
2434 : case GT: case LE:
2435 : if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode)
2436 : return true;
2437 : return false;
2438 : default:
2439 : return false;
2440 : }
2441 : }
2442 :
2443 : bool
2444 : ix86_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2445 : {
2446 : return (comparison_operator (op, mode)) && (
2447 : (ix86_comparison_operator_1 (op, mode)));
2448 : }
2449 :
2450 : static inline bool
2451 : ix86_carry_flag_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2452 : #line 1646 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2453 : {
2454 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2455 : enum rtx_code code = GET_CODE (op);
2456 :
2457 : if (inmode == CCFPmode)
2458 : code = ix86_fp_compare_code_to_integer (code);
2459 : else if (inmode != CCmode && inmode != CCCmode && inmode != CCGZmode)
2460 : return false;
2461 :
2462 : return code == LTU;
2463 : }
2464 :
2465 : bool
2466 : ix86_carry_flag_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2467 : {
2468 : switch (GET_CODE (op))
2469 : {
2470 : case LTU:
2471 : case UNLT:
2472 : break;
2473 : default:
2474 : return false;
2475 : }
2476 : return (
2477 : (ix86_carry_flag_operator_1 (op, mode))) && (
2478 : (mode == VOIDmode || GET_MODE (op) == mode));
2479 : }
2480 :
2481 : static inline bool
2482 : ix86_carry_flag_unset_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2483 : #line 1662 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2484 : {
2485 : machine_mode inmode = GET_MODE (XEXP (op, 0));
2486 : enum rtx_code code = GET_CODE (op);
2487 :
2488 : if (inmode == CCFPmode)
2489 : code = ix86_fp_compare_code_to_integer (code);
2490 : else if (inmode != CCmode && inmode != CCCmode && inmode != CCGZmode)
2491 : return false;
2492 :
2493 : return code == GEU;
2494 : }
2495 :
2496 : bool
2497 : ix86_carry_flag_unset_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2498 : {
2499 : switch (GET_CODE (op))
2500 : {
2501 : case GEU:
2502 : case GE:
2503 : break;
2504 : default:
2505 : return false;
2506 : }
2507 : return (
2508 : (ix86_carry_flag_unset_operator_1 (op, mode))) && (
2509 : (mode == VOIDmode || GET_MODE (op) == mode));
2510 : }
2511 :
2512 : bool
2513 : ix86_trivial_fp_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2514 : {
2515 : return ((
2516 : #line 1677 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2517 : (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)) && (
2518 : (mode == VOIDmode || GET_MODE (op) == mode));
2519 : }
2520 :
2521 : bool
2522 : ix86_trivial_fp_comparison_operator_xf (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2523 : {
2524 : switch (GET_CODE (op))
2525 : {
2526 : case GT:
2527 : case GE:
2528 : case UNLT:
2529 : case UNLE:
2530 : case UNEQ:
2531 : case LTGT:
2532 : case ORDERED:
2533 : case UNORDERED:
2534 : break;
2535 : default:
2536 : return false;
2537 : }
2538 : return
2539 : (mode == VOIDmode || GET_MODE (op) == mode);
2540 : }
2541 :
2542 : bool
2543 : ix86_fp_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2544 : {
2545 : return (
2546 : #line 1688 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2547 : (ix86_fp_comparison_strategy (GET_CODE (op))
2548 : == IX86_FPCMP_ARITH)) ? (comparison_operator (op, mode)) : (ix86_trivial_fp_comparison_operator (op, mode));
2549 : }
2550 :
2551 : bool
2552 : ix86_fp_comparison_operator_xf (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2553 : {
2554 : return (
2555 : #line 1694 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2556 : (ix86_fp_comparison_strategy (GET_CODE (op))
2557 : == IX86_FPCMP_ARITH)) ? (comparison_operator (op, mode)) : (ix86_trivial_fp_comparison_operator_xf (op, mode));
2558 : }
2559 :
2560 : bool
2561 : ix86_timode_comparison_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2562 : {
2563 : return (
2564 : #line 1701 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2565 : (TARGET_64BIT)) ? (ordered_comparison_operator (op, mode)) : (bt_comparison_operator (op, mode));
2566 : }
2567 :
2568 : bool
2569 : ix86_timode_comparison_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2570 : {
2571 : return (
2572 : #line 1707 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2573 : (TARGET_64BIT)) ? (x86_64_general_operand (op, mode)) : (nonimmediate_operand (op, mode));
2574 : }
2575 :
2576 : bool
2577 : cmp_fp_expander_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2578 : {
2579 : return ((GET_CODE (op) == CONST_DOUBLE) && (
2580 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode))) || (general_operand (op, mode));
2581 : }
2582 :
2583 : bool
2584 : binary_fp_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2585 : {
2586 : switch (GET_CODE (op))
2587 : {
2588 : case PLUS:
2589 : case MINUS:
2590 : case MULT:
2591 : case DIV:
2592 : break;
2593 : default:
2594 : return false;
2595 : }
2596 : return
2597 : (mode == VOIDmode || GET_MODE (op) == mode);
2598 : }
2599 :
2600 : bool
2601 : mult_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2602 : {
2603 : return (GET_CODE (op) == MULT) && (
2604 : (mode == VOIDmode || GET_MODE (op) == mode));
2605 : }
2606 :
2607 : bool
2608 : div_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2609 : {
2610 : return (GET_CODE (op) == DIV) && (
2611 : (mode == VOIDmode || GET_MODE (op) == mode));
2612 : }
2613 :
2614 : bool
2615 : logic_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2616 : {
2617 : switch (GET_CODE (op))
2618 : {
2619 : case AND:
2620 : case IOR:
2621 : case XOR:
2622 : break;
2623 : default:
2624 : return false;
2625 : }
2626 : return
2627 : (mode == VOIDmode || GET_MODE (op) == mode);
2628 : }
2629 :
2630 : bool
2631 : and_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2632 : {
2633 : return (GET_CODE (op) == AND) && (
2634 : (mode == VOIDmode || GET_MODE (op) == mode));
2635 : }
2636 :
2637 : bool
2638 : plusminuslogic_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2639 : {
2640 : switch (GET_CODE (op))
2641 : {
2642 : case PLUS:
2643 : case MINUS:
2644 : case AND:
2645 : case IOR:
2646 : case XOR:
2647 : break;
2648 : default:
2649 : return false;
2650 : }
2651 : return
2652 : (mode == VOIDmode || GET_MODE (op) == mode);
2653 : }
2654 :
2655 : bool
2656 : arith_or_logical_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2657 : {
2658 : switch (GET_CODE (op))
2659 : {
2660 : case PLUS:
2661 : case MULT:
2662 : case AND:
2663 : case IOR:
2664 : case XOR:
2665 : case SMIN:
2666 : case SMAX:
2667 : case UMIN:
2668 : case UMAX:
2669 : case COMPARE:
2670 : case MINUS:
2671 : case DIV:
2672 : case MOD:
2673 : case UDIV:
2674 : case UMOD:
2675 : case ASHIFT:
2676 : case ROTATE:
2677 : case ASHIFTRT:
2678 : case LSHIFTRT:
2679 : case ROTATERT:
2680 : break;
2681 : default:
2682 : return false;
2683 : }
2684 : return
2685 : (mode == VOIDmode || GET_MODE (op) == mode);
2686 : }
2687 :
2688 : bool
2689 : commutative_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2690 : {
2691 : switch (GET_CODE (op))
2692 : {
2693 : case PLUS:
2694 : case MULT:
2695 : case AND:
2696 : case IOR:
2697 : case XOR:
2698 : case SMIN:
2699 : case SMAX:
2700 : case UMIN:
2701 : case UMAX:
2702 : break;
2703 : default:
2704 : return false;
2705 : }
2706 : return
2707 : (mode == VOIDmode || GET_MODE (op) == mode);
2708 : }
2709 :
2710 : bool
2711 : promotable_binary_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2712 : {
2713 : 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) && (
2714 : #line 1755 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2715 : (TARGET_TUNE_PROMOTE_HIMODE_IMUL)))) && (
2716 : (mode == VOIDmode || GET_MODE (op) == mode));
2717 : }
2718 :
2719 : bool
2720 : compare_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2721 : {
2722 : return (GET_CODE (op) == COMPARE) && (
2723 : (mode == VOIDmode || GET_MODE (op) == mode));
2724 : }
2725 :
2726 : static inline bool
2727 : extract_high_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2728 : #line 1762 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2729 : {
2730 : return (const8_operand (XEXP (op, 1), VOIDmode)
2731 : && (BINARY_P (op) || const8_operand (XEXP (op, 2), VOIDmode)));
2732 : }
2733 :
2734 : bool
2735 : extract_high_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2736 : {
2737 : switch (GET_CODE (op))
2738 : {
2739 : case ZERO_EXTRACT:
2740 : case SIGN_EXTRACT:
2741 : case ASHIFTRT:
2742 : case LSHIFTRT:
2743 : break;
2744 : default:
2745 : return false;
2746 : }
2747 : return (
2748 : (extract_high_operator_1 (op, mode))) && (
2749 : (mode == VOIDmode || GET_MODE (op) == mode));
2750 : }
2751 :
2752 : bool
2753 : misaligned_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2754 : {
2755 : return ((GET_CODE (op) == MEM) && (
2756 : #line 1771 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2757 : (MEM_ALIGN (op) < GET_MODE_BITSIZE (mode)))) && (
2758 : (mode == VOIDmode || GET_MODE (op) == mode));
2759 : }
2760 :
2761 : static inline bool
2762 : movq_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2763 : #line 1777 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2764 : {
2765 : unsigned nelt = XVECLEN (op, 0);
2766 : unsigned nelt2 = nelt >> 1;
2767 : unsigned i;
2768 :
2769 : if (nelt < 2)
2770 : return false;
2771 :
2772 : /* Validate that all of the elements are constants,
2773 : lower halves of permute are lower halves of the first operand,
2774 : upper halves of permute come from any of the second operand. */
2775 : for (i = 0; i < nelt; ++i)
2776 : {
2777 : rtx er = XVECEXP (op, 0, i);
2778 : unsigned HOST_WIDE_INT ei;
2779 :
2780 : if (!CONST_INT_P (er))
2781 : return false;
2782 : ei = INTVAL (er);
2783 : if (i < nelt2 && ei != i)
2784 : return false;
2785 : if (i >= nelt2 && (ei < nelt || ei >= nelt << 1))
2786 : return false;
2787 : }
2788 :
2789 : return true;
2790 : }
2791 :
2792 : bool
2793 : movq_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2794 : {
2795 : return ((GET_CODE (op) == PARALLEL) && (
2796 : (movq_parallel_1 (op, mode)))) && (
2797 : (mode == VOIDmode || GET_MODE (op) == mode));
2798 : }
2799 :
2800 : static inline bool
2801 : vzeroall_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2802 : #line 1808 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2803 : {
2804 : unsigned i, nregs = TARGET_64BIT ? 16 : 8;
2805 :
2806 : if ((unsigned) XVECLEN (op, 0) != 1 + nregs)
2807 : return false;
2808 :
2809 : for (i = 0; i < nregs; i++)
2810 : {
2811 : rtx elt = XVECEXP (op, 0, i+1);
2812 :
2813 : if (GET_CODE (elt) != SET
2814 : || GET_CODE (SET_DEST (elt)) != REG
2815 : || GET_MODE (SET_DEST (elt)) != V8SImode
2816 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
2817 : || SET_SRC (elt) != CONST0_RTX (V8SImode))
2818 : return false;
2819 : }
2820 : return true;
2821 : }
2822 :
2823 : bool
2824 : vzeroall_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2825 : {
2826 : return ((GET_CODE (op) == PARALLEL) && (
2827 : (vzeroall_operation_1 (op, mode)))) && (
2828 : (mode == VOIDmode || GET_MODE (op) == mode));
2829 : }
2830 :
2831 : bool
2832 : vzeroall_pattern (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2833 : {
2834 : return ((GET_CODE (op) == PARALLEL) && ((GET_CODE (XVECEXP (op, 0, 0)) == UNSPEC_VOLATILE) && (
2835 : #line 1832 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2836 : (XINT (XVECEXP (op, 0, 0), 1) == UNSPECV_VZEROALL)))) && (
2837 : (mode == VOIDmode || GET_MODE (op) == mode));
2838 : }
2839 :
2840 : bool
2841 : vzeroupper_pattern (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2842 : {
2843 : return ((GET_CODE (op) == PARALLEL) && ((GET_CODE (XVECEXP (op, 0, 1)) == UNSPEC) && ((
2844 : #line 1838 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2845 : (XINT (XVECEXP (op, 0, 1), 1) == UNSPEC_CALLEE_ABI)) && (
2846 : #line 1839 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2847 : (INTVAL (XVECEXP (XVECEXP (op, 0, 1), 0, 0)) == ABI_VZEROUPPER))))) && (
2848 : (mode == VOIDmode || GET_MODE (op) == mode));
2849 : }
2850 :
2851 : static inline bool
2852 : addsub_vm_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2853 : #line 1844 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2854 : {
2855 : rtx op0, op1;
2856 : int swapped;
2857 : HOST_WIDE_INT mask;
2858 : int nunits, elt;
2859 :
2860 : op0 = XEXP (op, 0);
2861 : op1 = XEXP (op, 1);
2862 :
2863 : /* Sanity check. */
2864 : if (GET_CODE (op0) == MINUS && GET_CODE (op1) == PLUS)
2865 : swapped = 0;
2866 : else if (GET_CODE (op0) == PLUS && GET_CODE (op1) == MINUS)
2867 : swapped = 1;
2868 : else
2869 : gcc_unreachable ();
2870 :
2871 : mask = INTVAL (XEXP (op, 2));
2872 : nunits = GET_MODE_NUNITS (mode);
2873 :
2874 : for (elt = 0; elt < nunits; elt++)
2875 : {
2876 : /* bit clear: take from op0, set: take from op1 */
2877 : int bit = !(mask & (HOST_WIDE_INT_1U << elt));
2878 :
2879 : if (bit != ((elt & 1) ^ swapped))
2880 : return false;
2881 : }
2882 :
2883 : return true;
2884 : }
2885 :
2886 : bool
2887 : addsub_vm_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2888 : {
2889 : return ((GET_CODE (op) == VEC_MERGE) && (
2890 : (addsub_vm_operator_1 (op, mode)))) && (
2891 : (mode == VOIDmode || GET_MODE (op) == mode));
2892 : }
2893 :
2894 : static inline bool
2895 : addsub_vs_operator_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2896 : #line 1880 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2897 : {
2898 : rtx op0, op1;
2899 : bool swapped;
2900 : int nunits, elt;
2901 :
2902 : op0 = XEXP (XEXP (op, 0), 0);
2903 : op1 = XEXP (XEXP (op, 0), 1);
2904 :
2905 : /* Sanity check. */
2906 : if (GET_CODE (op0) == MINUS && GET_CODE (op1) == PLUS)
2907 : swapped = false;
2908 : else if (GET_CODE (op0) == PLUS && GET_CODE (op1) == MINUS)
2909 : swapped = true;
2910 : else
2911 : gcc_unreachable ();
2912 :
2913 : nunits = GET_MODE_NUNITS (mode);
2914 : if (XVECLEN (XEXP (op, 1), 0) != nunits)
2915 : return false;
2916 :
2917 : /* We already checked that permutation is suitable for addsub,
2918 : so only look at the first element of the parallel. */
2919 : elt = INTVAL (XVECEXP (XEXP (op, 1), 0, 0));
2920 :
2921 : return elt == (swapped ? nunits : 0);
2922 : }
2923 :
2924 : bool
2925 : addsub_vs_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2926 : {
2927 : return (((GET_CODE (op) == VEC_SELECT) && (GET_CODE (XEXP (op, 0)) == VEC_CONCAT)) && (
2928 : (addsub_vs_operator_1 (op, mode)))) && (
2929 : (mode == VOIDmode || GET_MODE (op) == mode));
2930 : }
2931 :
2932 : static inline bool
2933 : addsub_vs_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2934 : #line 1911 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2935 : {
2936 : int nelt = XVECLEN (op, 0);
2937 : int elt, i;
2938 :
2939 : if (nelt < 2)
2940 : return false;
2941 :
2942 : /* Check that the permutation is suitable for addsub.
2943 : For example, { 0 9 2 11 4 13 6 15 } or { 8 1 10 3 12 5 14 7 }. */
2944 : elt = INTVAL (XVECEXP (op, 0, 0));
2945 : if (elt == 0)
2946 : {
2947 : for (i = 1; i < nelt; ++i)
2948 : if (INTVAL (XVECEXP (op, 0, i)) != (i + (i & 1) * nelt))
2949 : return false;
2950 : }
2951 : else if (elt == nelt)
2952 : {
2953 : for (i = 1; i < nelt; ++i)
2954 : if (INTVAL (XVECEXP (op, 0, i)) != (elt + i - (i & 1) * nelt))
2955 : return false;
2956 : }
2957 : else
2958 : return false;
2959 :
2960 : return true;
2961 : }
2962 :
2963 : bool
2964 : addsub_vs_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
2965 : {
2966 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
2967 : (addsub_vs_parallel_1 (op, mode)))) && (
2968 : (mode == VOIDmode || GET_MODE (op) == mode));
2969 : }
2970 :
2971 : static inline bool
2972 : permvar_truncate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
2973 : #line 1943 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
2974 : {
2975 : int nelt = GET_MODE_NUNITS (mode);
2976 : int perm[128];
2977 : int id;
2978 :
2979 : if (!INTEGRAL_MODE_P (mode) || !VECTOR_MODE_P (mode))
2980 : return false;
2981 :
2982 : if (nelt < 2)
2983 : return false;
2984 :
2985 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
2986 : return false;
2987 :
2988 : id = exact_log2 (nelt);
2989 :
2990 : /* Check that the permutation is suitable for pmovz{bw,wd,dq}.
2991 : For example V16HImode to V8HImode
2992 : { 0 2 4 6 8 10 12 14 * * * * * * * * }. */
2993 : for (int i = 0; i != nelt / 2; i++)
2994 : if ((perm[i] & ((1 << id) - 1)) != i * 2)
2995 : return false;
2996 :
2997 : return true;
2998 : }
2999 :
3000 : bool
3001 : permvar_truncate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3002 : {
3003 : return ((GET_CODE (op) == MEM) && (
3004 : (permvar_truncate_operand_1 (op, mode)))) && (
3005 : (mode == VOIDmode || GET_MODE (op) == mode));
3006 : }
3007 :
3008 : static inline bool
3009 : pshufb_truncv4siv4hi_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3010 : #line 1973 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3011 : {
3012 : int perm[128];
3013 :
3014 : if (mode != E_V16QImode)
3015 : return false;
3016 :
3017 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
3018 : return false;
3019 :
3020 : /* Check that the permutation is suitable for pmovdw.
3021 : For example V4SImode to V4HImode
3022 : { 0 1 4 5 8 9 12 13 * * * * * * * * }.
3023 : index = i % 2 + (i / 2) * 4. */
3024 : for (int i = 0; i != 8; i++)
3025 : {
3026 : /* if (SRC2[(i * 8)+7] = 1) then DEST[(i*8)+7..(i*8)+0] := 0; */
3027 : if (perm[i] & 128)
3028 : return false;
3029 :
3030 : if ((perm[i] & 15) != ((i & 1) + (i & 0xFE) * 2))
3031 : return false;
3032 : }
3033 :
3034 : return true;
3035 : }
3036 :
3037 : bool
3038 : pshufb_truncv4siv4hi_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3039 : {
3040 : return ((GET_CODE (op) == MEM) && (
3041 : (pshufb_truncv4siv4hi_operand_1 (op, mode)))) && (
3042 : (mode == VOIDmode || GET_MODE (op) == mode));
3043 : }
3044 :
3045 : static inline bool
3046 : pshufb_truncv8hiv8qi_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3047 : #line 2003 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3048 : {
3049 : int perm[128];
3050 :
3051 : if (mode != E_V16QImode)
3052 : return false;
3053 :
3054 : if (!ix86_extract_perm_from_pool_constant (&perm[0], op))
3055 : return false;
3056 :
3057 : /* Check that the permutation is suitable for pmovwb.
3058 : For example V16QImode to V8QImode
3059 : { 0 2 4 6 8 10 12 14 * * * * * * * * }.
3060 : index = i % 2 + (i / 2) * 4. */
3061 : for (int i = 0; i != 8; i++)
3062 : {
3063 : /* if (SRC2[(i * 8)+7] = 1) then DEST[(i*8)+7..(i*8)+0] := 0; */
3064 : if (perm[i] & 128)
3065 : return false;
3066 :
3067 : if ((perm[i] & 15) != i * 2)
3068 : return false;
3069 : }
3070 :
3071 : return true;
3072 : }
3073 :
3074 : bool
3075 : pshufb_truncv8hiv8qi_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3076 : {
3077 : return ((GET_CODE (op) == MEM) && (
3078 : (pshufb_truncv8hiv8qi_operand_1 (op, mode)))) && (
3079 : (mode == VOIDmode || GET_MODE (op) == mode));
3080 : }
3081 :
3082 : static inline bool
3083 : pmovzx_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3084 : #line 2034 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3085 : {
3086 : int nelt = XVECLEN (op, 0);
3087 : int elt, i;
3088 :
3089 : if (nelt < 2)
3090 : return false;
3091 :
3092 : /* Check that the permutation is suitable for pmovz{bw,wd,dq}.
3093 : For example { 0 16 1 17 2 18 3 19 4 20 5 21 6 22 7 23 }. */
3094 : elt = INTVAL (XVECEXP (op, 0, 0));
3095 : if (elt == 0)
3096 : {
3097 : for (i = 1; i < nelt; ++i)
3098 : if ((i & 1) != 0)
3099 : {
3100 : if (INTVAL (XVECEXP (op, 0, i)) < nelt)
3101 : return false;
3102 : }
3103 : else if (INTVAL (XVECEXP (op, 0, i)) != i / 2)
3104 : return false;
3105 : }
3106 : else
3107 : return false;
3108 :
3109 : return true;
3110 : }
3111 :
3112 : bool
3113 : pmovzx_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3114 : {
3115 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3116 : (pmovzx_parallel_1 (op, mode)))) && (
3117 : (mode == VOIDmode || GET_MODE (op) == mode));
3118 : }
3119 :
3120 : static inline bool
3121 : insertps_parallel_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3122 : #line 2066 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3123 : {
3124 : int i;
3125 :
3126 : if (XVECLEN (op, 0) != 4)
3127 : return false;
3128 :
3129 : /* One element in [0..3], and the other 3 in [4..7]. */
3130 : bool found = false;
3131 : for (i = 0; i < 4; ++i)
3132 : if (INTVAL (XVECEXP (op, 0, i)) < 4)
3133 : {
3134 : if (found)
3135 : return false;
3136 : found = true;
3137 : }
3138 :
3139 : return found;
3140 : }
3141 :
3142 : bool
3143 : insertps_parallel (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3144 : {
3145 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3146 : (insertps_parallel_1 (op, mode)))) && (
3147 : (mode == VOIDmode || GET_MODE (op) == mode));
3148 : }
3149 :
3150 : static inline bool
3151 : const_vector_duplicate_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3152 : #line 2088 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3153 : {
3154 : rtx elt = XVECEXP (op, 0, 0);
3155 : int i, nelt = XVECLEN (op, 0);
3156 :
3157 : for (i = 1; i < nelt; ++i)
3158 : if (!rtx_equal_p (elt, XVECEXP (op, 0, i)))
3159 : return false;
3160 : return true;
3161 : }
3162 :
3163 : bool
3164 : const_vector_duplicate_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3165 : {
3166 : return ((GET_CODE (op) == CONST_VECTOR) && (
3167 : (const_vector_duplicate_operand_1 (op, mode)))) && (
3168 : (mode == VOIDmode || GET_MODE (op) == mode));
3169 : }
3170 :
3171 : static inline bool
3172 : avx_vbroadcast_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3173 : #line 2102 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3174 : {
3175 : rtx elt = XVECEXP (op, 0, 0);
3176 : int i, nelt = XVECLEN (op, 0);
3177 :
3178 : /* Don't bother checking there are the right number of operands,
3179 : merely that they're all identical. */
3180 : for (i = 1; i < nelt; ++i)
3181 : if (XVECEXP (op, 0, i) != elt)
3182 : return false;
3183 : return true;
3184 : }
3185 :
3186 : bool
3187 : avx_vbroadcast_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3188 : {
3189 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3190 : (avx_vbroadcast_operand_1 (op, mode)))) && (
3191 : (mode == VOIDmode || GET_MODE (op) == mode));
3192 : }
3193 :
3194 : static inline bool
3195 : avx_vbroadcast128_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3196 : #line 2118 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3197 : {
3198 : int i, nelt = XVECLEN (op, 0);
3199 : int half = nelt / 2;
3200 :
3201 : for (i = 0; i < nelt; ++i)
3202 : {
3203 : int index = INTVAL (XVECEXP (op, 0, i));
3204 : if ((i < half && index != i)
3205 : || (i >= half && index != (i - half)))
3206 : return false;
3207 : }
3208 :
3209 : return true;
3210 : }
3211 :
3212 : bool
3213 : avx_vbroadcast128_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3214 : {
3215 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3216 : (avx_vbroadcast128_operand_1 (op, mode)))) && (
3217 : (mode == VOIDmode || GET_MODE (op) == mode));
3218 : }
3219 :
3220 : static inline bool
3221 : palignr_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3222 : #line 2137 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3223 : {
3224 : int elt = INTVAL (XVECEXP (op, 0, 0));
3225 : int i, nelt = XVECLEN (op, 0);
3226 :
3227 : /* Check that an order in the permutation is suitable for palignr.
3228 : For example, {5 6 7 0 1 2 3 4} is "palignr 5, xmm, xmm". */
3229 : for (i = 1; i < nelt; ++i)
3230 : if (INTVAL (XVECEXP (op, 0, i)) != ((elt + i) % nelt))
3231 : return false;
3232 : return true;
3233 : }
3234 :
3235 : bool
3236 : palignr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3237 : {
3238 : return (((GET_CODE (op) == PARALLEL) && (GET_CODE (XVECEXP (op, 0, 0)) == CONST_INT)) && (
3239 : (palignr_operand_1 (op, mode)))) && (
3240 : (mode == VOIDmode || GET_MODE (op) == mode));
3241 : }
3242 :
3243 : static inline bool
3244 : avx2_pblendw_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3245 : #line 2152 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3246 : {
3247 : HOST_WIDE_INT val = INTVAL (op);
3248 : HOST_WIDE_INT low = val & 0xff;
3249 : return val == ((low << 8) | low);
3250 : }
3251 :
3252 : bool
3253 : avx2_pblendw_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3254 : {
3255 : return (GET_CODE (op) == CONST_INT) && (
3256 : (avx2_pblendw_operand_1 (op, mode)));
3257 : }
3258 :
3259 : bool
3260 : general_vector_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3261 : {
3262 : return (vector_operand (op, mode)) || ((GET_CODE (op) == CONST_VECTOR) && (
3263 : (mode == VOIDmode || GET_MODE (op) == mode)));
3264 : }
3265 :
3266 : bool
3267 : register_or_constm1_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3268 : {
3269 : return (register_operand (op, mode)) || (((GET_CODE (op) == CONST_INT) && (
3270 : #line 2167 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3271 : (op == constm1_rtx))) && (
3272 : (mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)));
3273 : }
3274 :
3275 : static inline bool
3276 : save_multiple_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3277 : #line 2173 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3278 : {
3279 : const unsigned len = XVECLEN (op, 0);
3280 : unsigned i;
3281 :
3282 : /* Starting from end of vector, count register saves. */
3283 : for (i = 0; i < len; ++i)
3284 : {
3285 : rtx src, dest, addr;
3286 : rtx e = XVECEXP (op, 0, len - 1 - i);
3287 :
3288 : if (GET_CODE (e) != SET)
3289 : break;
3290 :
3291 : src = SET_SRC (e);
3292 : dest = SET_DEST (e);
3293 :
3294 : if (!REG_P (src) || !MEM_P (dest))
3295 : break;
3296 :
3297 : addr = XEXP (dest, 0);
3298 :
3299 : /* Good if dest address is in RAX. */
3300 : if (REG_P (addr) && REGNO (addr) == AX_REG)
3301 : continue;
3302 :
3303 : /* Good if dest address is offset of RAX. */
3304 : if (GET_CODE (addr) == PLUS
3305 : && REG_P (XEXP (addr, 0))
3306 : && REGNO (XEXP (addr, 0)) == AX_REG)
3307 : continue;
3308 :
3309 : break;
3310 : }
3311 : return (i >= 12 && i <= 18);
3312 : }
3313 :
3314 : bool
3315 : save_multiple (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3316 : {
3317 : return ((GET_CODE (op) == PARALLEL) && (
3318 : (save_multiple_1 (op, mode)))) && (
3319 : (mode == VOIDmode || GET_MODE (op) == mode));
3320 : }
3321 :
3322 : static inline bool
3323 : restore_multiple_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3324 : #line 2214 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3325 : {
3326 : const unsigned len = XVECLEN (op, 0);
3327 : unsigned i;
3328 :
3329 : /* Starting from end of vector, count register restores. */
3330 : for (i = 0; i < len; ++i)
3331 : {
3332 : rtx src, dest, addr;
3333 : rtx e = XVECEXP (op, 0, len - 1 - i);
3334 :
3335 : if (GET_CODE (e) != SET)
3336 : break;
3337 :
3338 : src = SET_SRC (e);
3339 : dest = SET_DEST (e);
3340 :
3341 : if (!MEM_P (src) || !REG_P (dest))
3342 : break;
3343 :
3344 : addr = XEXP (src, 0);
3345 :
3346 : /* Good if src address is in RSI. */
3347 : if (REG_P (addr) && REGNO (addr) == SI_REG)
3348 : continue;
3349 :
3350 : /* Good if src address is offset of RSI. */
3351 : if (GET_CODE (addr) == PLUS
3352 : && REG_P (XEXP (addr, 0))
3353 : && REGNO (XEXP (addr, 0)) == SI_REG)
3354 : continue;
3355 :
3356 : break;
3357 : }
3358 : return (i >= 12 && i <= 18);
3359 : }
3360 :
3361 : bool
3362 : restore_multiple (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3363 : {
3364 : return ((GET_CODE (op) == PARALLEL) && (
3365 : (restore_multiple_1 (op, mode)))) && (
3366 : (mode == VOIDmode || GET_MODE (op) == mode));
3367 : }
3368 :
3369 : static inline bool
3370 : encodekey128_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3371 : #line 2253 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3372 : {
3373 : unsigned i;
3374 : rtx elt;
3375 :
3376 : if (XVECLEN (op, 0) != 8)
3377 : return false;
3378 :
3379 : for(i = 0; i < 3; i++)
3380 : {
3381 : elt = XVECEXP (op, 0, i + 1);
3382 : if (GET_CODE (elt) != SET
3383 : || GET_CODE (SET_DEST (elt)) != REG
3384 : || GET_MODE (SET_DEST (elt)) != V2DImode
3385 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3386 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3387 : || GET_MODE (SET_SRC (elt)) != V2DImode
3388 : || XVECLEN(SET_SRC (elt), 0) != 1
3389 : || XVECEXP(SET_SRC (elt), 0, 0) != const0_rtx)
3390 : return false;
3391 : }
3392 :
3393 : for(i = 4; i < 7; i++)
3394 : {
3395 : elt = XVECEXP (op, 0, i);
3396 : if (GET_CODE (elt) != CLOBBER
3397 : || GET_MODE (elt) != VOIDmode
3398 : || GET_CODE (XEXP (elt, 0)) != REG
3399 : || GET_MODE (XEXP (elt, 0)) != V2DImode
3400 : || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
3401 : return false;
3402 : }
3403 :
3404 : elt = XVECEXP (op, 0, 7);
3405 : if (GET_CODE (elt) != CLOBBER
3406 : || GET_MODE (elt) != VOIDmode
3407 : || GET_CODE (XEXP (elt, 0)) != REG
3408 : || GET_MODE (XEXP (elt, 0)) != CCmode
3409 : || REGNO (XEXP (elt, 0)) != FLAGS_REG)
3410 : return false;
3411 : return true;
3412 : }
3413 :
3414 : bool
3415 : encodekey128_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3416 : {
3417 : return ((GET_CODE (op) == PARALLEL) && (
3418 : (encodekey128_operation_1 (op, mode)))) && (
3419 : (mode == VOIDmode || GET_MODE (op) == mode));
3420 : }
3421 :
3422 : static inline bool
3423 : encodekey256_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3424 : #line 2297 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3425 : {
3426 : unsigned i;
3427 : rtx elt;
3428 :
3429 : if (XVECLEN (op, 0) != 9)
3430 : return false;
3431 :
3432 : elt = SET_SRC (XVECEXP (op, 0, 0));
3433 : elt = XVECEXP (elt, 0, 2);
3434 : if (!REG_P (elt)
3435 : || REGNO(elt) != GET_SSE_REGNO (1))
3436 : return false;
3437 :
3438 : for(i = 0; i < 4; i++)
3439 : {
3440 : elt = XVECEXP (op, 0, i + 1);
3441 : if (GET_CODE (elt) != SET
3442 : || GET_CODE (SET_DEST (elt)) != REG
3443 : || GET_MODE (SET_DEST (elt)) != V2DImode
3444 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3445 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3446 : || GET_MODE (SET_SRC (elt)) != V2DImode
3447 : || XVECLEN(SET_SRC (elt), 0) != 1
3448 : || XVECEXP(SET_SRC (elt), 0, 0) != const0_rtx)
3449 : return false;
3450 : }
3451 :
3452 : for(i = 4; i < 7; i++)
3453 : {
3454 : elt = XVECEXP (op, 0, i + 1);
3455 : if (GET_CODE (elt) != CLOBBER
3456 : || GET_MODE (elt) != VOIDmode
3457 : || GET_CODE (XEXP (elt, 0)) != REG
3458 : || GET_MODE (XEXP (elt, 0)) != V2DImode
3459 : || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
3460 : return false;
3461 : }
3462 :
3463 : elt = XVECEXP (op, 0, 8);
3464 : if (GET_CODE (elt) != CLOBBER
3465 : || GET_MODE (elt) != VOIDmode
3466 : || GET_CODE (XEXP (elt, 0)) != REG
3467 : || GET_MODE (XEXP (elt, 0)) != CCmode
3468 : || REGNO (XEXP (elt, 0)) != FLAGS_REG)
3469 : return false;
3470 : return true;
3471 : }
3472 :
3473 : bool
3474 : encodekey256_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3475 : {
3476 : return ((GET_CODE (op) == PARALLEL) && (
3477 : (encodekey256_operation_1 (op, mode)))) && (
3478 : (mode == VOIDmode || GET_MODE (op) == mode));
3479 : }
3480 :
3481 : static inline bool
3482 : aeswidekl_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3483 : #line 2348 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3484 : {
3485 : unsigned i;
3486 : rtx elt;
3487 :
3488 : for (i = 0; i < 8; i++)
3489 : {
3490 : elt = XVECEXP (op, 0, i + 1);
3491 : if (GET_CODE (elt) != SET
3492 : || GET_CODE (SET_DEST (elt)) != REG
3493 : || GET_MODE (SET_DEST (elt)) != V2DImode
3494 : || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
3495 : || GET_CODE (SET_SRC (elt)) != UNSPEC_VOLATILE
3496 : || GET_MODE (SET_SRC (elt)) != V2DImode
3497 : || XVECLEN (SET_SRC (elt), 0) != 1
3498 : || !REG_P (XVECEXP (SET_SRC (elt), 0, 0))
3499 : || REGNO (XVECEXP (SET_SRC (elt), 0, 0)) != GET_SSE_REGNO (i))
3500 : return false;
3501 : }
3502 : return true;
3503 : }
3504 :
3505 : bool
3506 : aeswidekl_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3507 : {
3508 : return ((GET_CODE (op) == PARALLEL) && (
3509 : (aeswidekl_operation_1 (op, mode)))) && (
3510 : (mode == VOIDmode || GET_MODE (op) == mode));
3511 : }
3512 :
3513 : static inline bool
3514 : apx_evex_memory_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3515 : #line 2375 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3516 : {
3517 : /* OK if immediate operand size < 4 bytes. */
3518 : if (GET_MODE_SIZE (mode) < 4)
3519 : return true;
3520 :
3521 : bool default_addr = ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (op));
3522 : bool address_size_prefix = TARGET_X32 && Pmode == SImode;
3523 :
3524 : struct ix86_address parts;
3525 : int ok;
3526 :
3527 : op = XEXP (op, 0);
3528 : ok = ix86_decompose_address (op, &parts);
3529 : gcc_assert (ok);
3530 :
3531 : if (default_addr)
3532 : {
3533 : /* Default address space. */
3534 :
3535 : /* Not OK with address size prefix, index register and disp. */
3536 : if (address_size_prefix
3537 : && parts.index
3538 : && parts.disp
3539 : && parts.disp != const0_rtx)
3540 : return false;
3541 : }
3542 : else
3543 : {
3544 : /* Non-default address space. */
3545 :
3546 : /* Not OK without base register. */
3547 : if (!parts.base)
3548 : return false;
3549 :
3550 : /* Not OK with disp and address size prefix. */
3551 : if (address_size_prefix && parts.disp)
3552 : return false;
3553 : }
3554 :
3555 : return true;
3556 : }
3557 :
3558 : bool
3559 : apx_evex_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3560 : {
3561 : return (memory_operand (op, mode)) && (
3562 : (apx_evex_memory_operand_1 (op, mode)));
3563 : }
3564 :
3565 : static inline bool
3566 : apx_evex_add_memory_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
3567 : #line 2423 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/predicates.md"
3568 : {
3569 : /* OK if "add %reg1, name@gottpoff(%rip), %reg2" or
3570 : "{nf} add name@gottpoff(%rip), %reg1" are supported. */
3571 : if (HAVE_AS_R_X86_64_CODE_6_GOTTPOFF)
3572 : return true;
3573 :
3574 : op = XEXP (op, 0);
3575 :
3576 : /* Disallow APX EVEX-encoded ADD with UNSPEC_GOTNTPOFF. */
3577 : if (GET_CODE (op) == CONST
3578 : && GET_CODE (XEXP (op, 0)) == UNSPEC
3579 : && XINT (XEXP (op, 0), 1) == UNSPEC_GOTNTPOFF)
3580 : return false;
3581 :
3582 : return true;
3583 : }
3584 :
3585 : bool
3586 : apx_evex_add_memory_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
3587 : {
3588 : return (memory_operand (op, mode)) && (
3589 : (apx_evex_add_memory_operand_1 (op, mode)));
3590 : }
3591 :
3592 : enum constraint_num
3593 : lookup_constraint_1 (const char *str)
3594 : {
3595 : switch (str[0])
3596 : {
3597 : case ':':
3598 : return CONSTRAINT__c;
3599 : case '<':
3600 : return CONSTRAINT__l;
3601 : case '>':
3602 : return CONSTRAINT__g;
3603 : case 'A':
3604 : return CONSTRAINT_A;
3605 : case 'B':
3606 : if (str[1] == 'g')
3607 : return CONSTRAINT_Bg;
3608 : if (str[1] == 'm')
3609 : return CONSTRAINT_Bm;
3610 : if (str[1] == 'k')
3611 : return CONSTRAINT_Bk;
3612 : if (str[1] == 'n')
3613 : return CONSTRAINT_Bn;
3614 : if (str[1] == 'r')
3615 : return CONSTRAINT_Br;
3616 : if (str[1] == 's')
3617 : return CONSTRAINT_Bs;
3618 : if (str[1] == 'w')
3619 : return CONSTRAINT_Bw;
3620 : if (str[1] == 'z')
3621 : return CONSTRAINT_Bz;
3622 : if (str[1] == 'C')
3623 : return CONSTRAINT_BC;
3624 : if (str[1] == 'F')
3625 : return CONSTRAINT_BF;
3626 : if (str[1] == 'H')
3627 : return CONSTRAINT_BH;
3628 : if (str[1] == 'M')
3629 : return CONSTRAINT_BM;
3630 : if (str[1] == 'f')
3631 : return CONSTRAINT_Bf;
3632 : break;
3633 : case 'C':
3634 : return CONSTRAINT_C;
3635 : case 'D':
3636 : return CONSTRAINT_D;
3637 : case 'E':
3638 : return CONSTRAINT_E;
3639 : case 'F':
3640 : return CONSTRAINT_F;
3641 : case 'G':
3642 : return CONSTRAINT_G;
3643 : case 'I':
3644 : return CONSTRAINT_I;
3645 : case 'J':
3646 : return CONSTRAINT_J;
3647 : case 'K':
3648 : return CONSTRAINT_K;
3649 : case 'L':
3650 : return CONSTRAINT_L;
3651 : case 'M':
3652 : return CONSTRAINT_M;
3653 : case 'N':
3654 : return CONSTRAINT_N;
3655 : case 'O':
3656 : return CONSTRAINT_O;
3657 : case 'Q':
3658 : return CONSTRAINT_Q;
3659 : case 'R':
3660 : return CONSTRAINT_R;
3661 : case 'S':
3662 : return CONSTRAINT_S;
3663 : case 'T':
3664 : if (str[1] == 's')
3665 : return CONSTRAINT_Ts;
3666 : if (str[1] == 'v')
3667 : return CONSTRAINT_Tv;
3668 : break;
3669 : case 'U':
3670 : return CONSTRAINT_U;
3671 : case 'V':
3672 : return CONSTRAINT_V;
3673 : case 'W':
3674 : if (str[1] == 'c')
3675 : return CONSTRAINT_Wc;
3676 : if (str[1] == 'w')
3677 : return CONSTRAINT_Ww;
3678 : if (str[1] == 'e')
3679 : return CONSTRAINT_We;
3680 : if (str[1] == 'z')
3681 : return CONSTRAINT_Wz;
3682 : if (str[1] == 'd')
3683 : return CONSTRAINT_Wd;
3684 : if (str[1] == 'f')
3685 : return CONSTRAINT_Wf;
3686 : if (str[1] == 's')
3687 : return CONSTRAINT_Ws;
3688 : if (str[1] == 'b')
3689 : return CONSTRAINT_Wb;
3690 : break;
3691 : case 'X':
3692 : return CONSTRAINT_X;
3693 : case 'Y':
3694 : if (str[1] == 'z')
3695 : return CONSTRAINT_Yz;
3696 : if (str[1] == 'd')
3697 : return CONSTRAINT_Yd;
3698 : if (str[1] == 'D')
3699 : return CONSTRAINT_YD;
3700 : if (str[1] == 'p')
3701 : return CONSTRAINT_Yp;
3702 : if (str[1] == 'a')
3703 : return CONSTRAINT_Ya;
3704 : if (str[1] == 'b')
3705 : return CONSTRAINT_Yb;
3706 : if (str[1] == 'f')
3707 : return CONSTRAINT_Yf;
3708 : if (str[1] == 'r')
3709 : return CONSTRAINT_Yr;
3710 : if (str[1] == 'v')
3711 : return CONSTRAINT_Yv;
3712 : if (str[1] == 'w')
3713 : return CONSTRAINT_Yw;
3714 : if (str[1] == 'W')
3715 : return CONSTRAINT_YW;
3716 : if (str[1] == 'k')
3717 : return CONSTRAINT_Yk;
3718 : break;
3719 : case 'Z':
3720 : return CONSTRAINT_Z;
3721 : case 'a':
3722 : return CONSTRAINT_a;
3723 : case 'b':
3724 : return CONSTRAINT_b;
3725 : case 'c':
3726 : return CONSTRAINT_c;
3727 : case 'd':
3728 : return CONSTRAINT_d;
3729 : case 'e':
3730 : return CONSTRAINT_e;
3731 : case 'f':
3732 : return CONSTRAINT_f;
3733 : case 'i':
3734 : return CONSTRAINT_i;
3735 : case 'j':
3736 : if (str[1] == 'r')
3737 : return CONSTRAINT_jr;
3738 : if (str[1] == 'm')
3739 : return CONSTRAINT_jm;
3740 : if (str[1] == '<')
3741 : return CONSTRAINT_j_l;
3742 : if (str[1] == '>')
3743 : return CONSTRAINT_j_g;
3744 : if (str[1] == 'o')
3745 : return CONSTRAINT_jo;
3746 : if (str[1] == 'V')
3747 : return CONSTRAINT_jV;
3748 : if (str[1] == 'p')
3749 : return CONSTRAINT_jp;
3750 : if (str[1] == 'a')
3751 : return CONSTRAINT_ja;
3752 : if (str[1] == 'b')
3753 : return CONSTRAINT_jb;
3754 : if (str[1] == 'c')
3755 : return CONSTRAINT_jc;
3756 : if (str[1] == 'e')
3757 : return CONSTRAINT_je;
3758 : if (str[1] == 'M')
3759 : return CONSTRAINT_jM;
3760 : if (str[1] == 'O')
3761 : return CONSTRAINT_jO;
3762 : if (str[1] == 'R')
3763 : return CONSTRAINT_jR;
3764 : break;
3765 : case 'k':
3766 : return CONSTRAINT_k;
3767 : case 'l':
3768 : return CONSTRAINT_l;
3769 : case 'm':
3770 : return CONSTRAINT_m;
3771 : case 'n':
3772 : return CONSTRAINT_n;
3773 : case 'o':
3774 : return CONSTRAINT_o;
3775 : case 'p':
3776 : return CONSTRAINT_p;
3777 : case 'q':
3778 : return CONSTRAINT_q;
3779 : case 'r':
3780 : return CONSTRAINT_r;
3781 : case 's':
3782 : return CONSTRAINT_s;
3783 : case 't':
3784 : return CONSTRAINT_t;
3785 : case 'u':
3786 : return CONSTRAINT_u;
3787 : case 'v':
3788 : return CONSTRAINT_v;
3789 : case 'x':
3790 : return CONSTRAINT_x;
3791 : case 'y':
3792 : return CONSTRAINT_y;
3793 : default: break;
3794 : }
3795 : return CONSTRAINT__UNKNOWN;
3796 : }
3797 :
3798 : const unsigned char lookup_constraint_array[] = {
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 : CONSTRAINT__UNKNOWN,
3844 : CONSTRAINT__UNKNOWN,
3845 : CONSTRAINT__UNKNOWN,
3846 : CONSTRAINT__UNKNOWN,
3847 : CONSTRAINT__UNKNOWN,
3848 : CONSTRAINT__UNKNOWN,
3849 : CONSTRAINT__UNKNOWN,
3850 : CONSTRAINT__UNKNOWN,
3851 : CONSTRAINT__UNKNOWN,
3852 : CONSTRAINT__UNKNOWN,
3853 : CONSTRAINT__UNKNOWN,
3854 : CONSTRAINT__UNKNOWN,
3855 : CONSTRAINT__UNKNOWN,
3856 : CONSTRAINT__UNKNOWN,
3857 : MIN ((int) CONSTRAINT__c, (int) UCHAR_MAX),
3858 : CONSTRAINT__UNKNOWN,
3859 : MIN ((int) CONSTRAINT__l, (int) UCHAR_MAX),
3860 : CONSTRAINT__UNKNOWN,
3861 : MIN ((int) CONSTRAINT__g, (int) UCHAR_MAX),
3862 : CONSTRAINT__UNKNOWN,
3863 : CONSTRAINT__UNKNOWN,
3864 : MIN ((int) CONSTRAINT_A, (int) UCHAR_MAX),
3865 : UCHAR_MAX,
3866 : MIN ((int) CONSTRAINT_C, (int) UCHAR_MAX),
3867 : MIN ((int) CONSTRAINT_D, (int) UCHAR_MAX),
3868 : MIN ((int) CONSTRAINT_E, (int) UCHAR_MAX),
3869 : MIN ((int) CONSTRAINT_F, (int) UCHAR_MAX),
3870 : MIN ((int) CONSTRAINT_G, (int) UCHAR_MAX),
3871 : CONSTRAINT__UNKNOWN,
3872 : MIN ((int) CONSTRAINT_I, (int) UCHAR_MAX),
3873 : MIN ((int) CONSTRAINT_J, (int) UCHAR_MAX),
3874 : MIN ((int) CONSTRAINT_K, (int) UCHAR_MAX),
3875 : MIN ((int) CONSTRAINT_L, (int) UCHAR_MAX),
3876 : MIN ((int) CONSTRAINT_M, (int) UCHAR_MAX),
3877 : MIN ((int) CONSTRAINT_N, (int) UCHAR_MAX),
3878 : MIN ((int) CONSTRAINT_O, (int) UCHAR_MAX),
3879 : CONSTRAINT__UNKNOWN,
3880 : MIN ((int) CONSTRAINT_Q, (int) UCHAR_MAX),
3881 : MIN ((int) CONSTRAINT_R, (int) UCHAR_MAX),
3882 : MIN ((int) CONSTRAINT_S, (int) UCHAR_MAX),
3883 : UCHAR_MAX,
3884 : MIN ((int) CONSTRAINT_U, (int) UCHAR_MAX),
3885 : MIN ((int) CONSTRAINT_V, (int) UCHAR_MAX),
3886 : UCHAR_MAX,
3887 : MIN ((int) CONSTRAINT_X, (int) UCHAR_MAX),
3888 : UCHAR_MAX,
3889 : MIN ((int) CONSTRAINT_Z, (int) UCHAR_MAX),
3890 : CONSTRAINT__UNKNOWN,
3891 : CONSTRAINT__UNKNOWN,
3892 : CONSTRAINT__UNKNOWN,
3893 : CONSTRAINT__UNKNOWN,
3894 : CONSTRAINT__UNKNOWN,
3895 : CONSTRAINT__UNKNOWN,
3896 : MIN ((int) CONSTRAINT_a, (int) UCHAR_MAX),
3897 : MIN ((int) CONSTRAINT_b, (int) UCHAR_MAX),
3898 : MIN ((int) CONSTRAINT_c, (int) UCHAR_MAX),
3899 : MIN ((int) CONSTRAINT_d, (int) UCHAR_MAX),
3900 : MIN ((int) CONSTRAINT_e, (int) UCHAR_MAX),
3901 : MIN ((int) CONSTRAINT_f, (int) UCHAR_MAX),
3902 : CONSTRAINT__UNKNOWN,
3903 : CONSTRAINT__UNKNOWN,
3904 : MIN ((int) CONSTRAINT_i, (int) UCHAR_MAX),
3905 : UCHAR_MAX,
3906 : MIN ((int) CONSTRAINT_k, (int) UCHAR_MAX),
3907 : MIN ((int) CONSTRAINT_l, (int) UCHAR_MAX),
3908 : MIN ((int) CONSTRAINT_m, (int) UCHAR_MAX),
3909 : MIN ((int) CONSTRAINT_n, (int) UCHAR_MAX),
3910 : MIN ((int) CONSTRAINT_o, (int) UCHAR_MAX),
3911 : MIN ((int) CONSTRAINT_p, (int) UCHAR_MAX),
3912 : MIN ((int) CONSTRAINT_q, (int) UCHAR_MAX),
3913 : MIN ((int) CONSTRAINT_r, (int) UCHAR_MAX),
3914 : MIN ((int) CONSTRAINT_s, (int) UCHAR_MAX),
3915 : MIN ((int) CONSTRAINT_t, (int) UCHAR_MAX),
3916 : MIN ((int) CONSTRAINT_u, (int) UCHAR_MAX),
3917 : MIN ((int) CONSTRAINT_v, (int) UCHAR_MAX),
3918 : CONSTRAINT__UNKNOWN,
3919 : MIN ((int) CONSTRAINT_x, (int) UCHAR_MAX),
3920 : MIN ((int) CONSTRAINT_y, (int) UCHAR_MAX),
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 : CONSTRAINT__UNKNOWN,
4042 : CONSTRAINT__UNKNOWN,
4043 : CONSTRAINT__UNKNOWN,
4044 : CONSTRAINT__UNKNOWN,
4045 : CONSTRAINT__UNKNOWN,
4046 : CONSTRAINT__UNKNOWN,
4047 : CONSTRAINT__UNKNOWN,
4048 : CONSTRAINT__UNKNOWN,
4049 : CONSTRAINT__UNKNOWN,
4050 : CONSTRAINT__UNKNOWN,
4051 : CONSTRAINT__UNKNOWN,
4052 : CONSTRAINT__UNKNOWN,
4053 : CONSTRAINT__UNKNOWN,
4054 : CONSTRAINT__UNKNOWN
4055 : };
4056 :
4057 : enum reg_class
4058 : reg_class_for_constraint_1 (enum constraint_num c)
4059 : {
4060 : switch (c)
4061 : {
4062 : case CONSTRAINT_r: return GENERAL_REGS;
4063 : case CONSTRAINT_R: return LEGACY_GENERAL_REGS;
4064 : case CONSTRAINT_q: return TARGET_64BIT ? GENERAL_REGS : Q_REGS;
4065 : case CONSTRAINT_Q: return Q_REGS;
4066 : case CONSTRAINT_l: return INDEX_REGS;
4067 : case CONSTRAINT_a: return AREG;
4068 : case CONSTRAINT_b: return BREG;
4069 : case CONSTRAINT_c: return CREG;
4070 : case CONSTRAINT_d: return DREG;
4071 : case CONSTRAINT_S: return SIREG;
4072 : case CONSTRAINT_D: return DIREG;
4073 : case CONSTRAINT_A: return AD_REGS;
4074 : case CONSTRAINT_U: return CLOBBERED_REGS;
4075 : case CONSTRAINT_f: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FLOAT_REGS : NO_REGS;
4076 : case CONSTRAINT_t: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FP_TOP_REG : NO_REGS;
4077 : case CONSTRAINT_u: return TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 ? FP_SECOND_REG : NO_REGS;
4078 : case CONSTRAINT_Yk: return TARGET_AVX512F ? MASK_REGS : NO_REGS;
4079 : case CONSTRAINT_k: return TARGET_AVX512F ? ALL_MASK_REGS : NO_REGS;
4080 : case CONSTRAINT_y: return TARGET_MMX ? MMX_REGS : NO_REGS;
4081 : case CONSTRAINT_x: return TARGET_SSE ? SSE_REGS : NO_REGS;
4082 : case CONSTRAINT_v: return TARGET_SSE ? ALL_SSE_REGS : NO_REGS;
4083 : case CONSTRAINT_Yz: return TARGET_SSE ? SSE_FIRST_REG : NO_REGS;
4084 : case CONSTRAINT_Yd: return TARGET_AVX512DQ ? ALL_SSE_REGS : TARGET_SSE4_1 ? SSE_REGS : NO_REGS;
4085 : case CONSTRAINT_YD: return TARGET_AVX512DQ ? ALL_SSE_REGS : TARGET_SSE2 ? SSE_REGS : NO_REGS;
4086 : case CONSTRAINT_Yp: return TARGET_PARTIAL_REG_STALL ? NO_REGS : GENERAL_REGS;
4087 : case CONSTRAINT_Ya: return TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)
4088 : ? NO_REGS : GENERAL_REGS;
4089 : case CONSTRAINT_Yb: return (!flag_plt && HAVE_AS_IX86_TLS_GET_ADDR_GOT) ? TLS_GOTBASE_REGS : BREG;
4090 : case CONSTRAINT_Yf: return (ix86_fpmath & FPMATH_387) ? FLOAT_REGS : NO_REGS;
4091 : case CONSTRAINT_Yr: return TARGET_SSE ? (TARGET_AVOID_4BYTE_PREFIXES ? NO_REX_SSE_REGS : ALL_SSE_REGS) : NO_REGS;
4092 : case CONSTRAINT_Yv: return TARGET_AVX512VL ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4093 : case CONSTRAINT_Yw: return TARGET_AVX512BW && TARGET_AVX512VL ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4094 : case CONSTRAINT_YW: return TARGET_AVX512BW ? ALL_SSE_REGS : TARGET_SSE ? SSE_REGS : NO_REGS;
4095 : case CONSTRAINT_jR: return GENERAL_REGS;
4096 : case CONSTRAINT_jr: return TARGET_APX_EGPR ? GENERAL_GPR16 : GENERAL_REGS;
4097 : case CONSTRAINT_jc: return TARGET_APX_EGPR && !TARGET_AVX ? GENERAL_GPR16 : GENERAL_REGS;
4098 : default: break;
4099 : }
4100 : return NO_REGS;
4101 : }
4102 :
4103 : bool (*constraint_satisfied_p_array[]) (rtx) = {
4104 : satisfies_constraint_I,
4105 : satisfies_constraint_J,
4106 : satisfies_constraint_K,
4107 : satisfies_constraint_L,
4108 : satisfies_constraint_M,
4109 : satisfies_constraint_N,
4110 : satisfies_constraint_O,
4111 : satisfies_constraint_m,
4112 : satisfies_constraint_o,
4113 : satisfies_constraint_jm,
4114 : satisfies_constraint_jo,
4115 : satisfies_constraint_je,
4116 : satisfies_constraint_jM,
4117 : satisfies_constraint_jO,
4118 : satisfies_constraint_Bm,
4119 : satisfies_constraint_Bk,
4120 : satisfies_constraint_Bn,
4121 : satisfies_constraint_Br,
4122 : satisfies_constraint_ja,
4123 : satisfies_constraint_p,
4124 : satisfies_constraint_Tv,
4125 : satisfies_constraint_Ts,
4126 : satisfies_constraint_jp,
4127 : satisfies_constraint_jb,
4128 : satisfies_constraint_Bz,
4129 : satisfies_constraint_BH,
4130 : satisfies_constraint_Wb,
4131 : satisfies_constraint_Wc,
4132 : satisfies_constraint_Ww,
4133 : satisfies_constraint_G,
4134 : satisfies_constraint_e,
4135 : satisfies_constraint_We,
4136 : satisfies_constraint_Wz,
4137 : satisfies_constraint_Wd,
4138 : satisfies_constraint_Wf,
4139 : satisfies_constraint_Ws,
4140 : satisfies_constraint_Z,
4141 : satisfies_constraint_Bf,
4142 : satisfies_constraint_V,
4143 : satisfies_constraint__l,
4144 : satisfies_constraint__g,
4145 : satisfies_constraint_BF,
4146 : satisfies_constraint_BM,
4147 : satisfies_constraint_j_l,
4148 : satisfies_constraint_j_g,
4149 : satisfies_constraint_jV,
4150 : satisfies_constraint_i,
4151 : satisfies_constraint_s,
4152 : satisfies_constraint__c,
4153 : satisfies_constraint_n,
4154 : satisfies_constraint_E,
4155 : satisfies_constraint_F,
4156 : satisfies_constraint_X,
4157 : satisfies_constraint_Bg,
4158 : satisfies_constraint_Bs,
4159 : satisfies_constraint_Bw,
4160 : satisfies_constraint_BC,
4161 : satisfies_constraint_C
4162 : };
4163 :
4164 : bool
4165 : insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, enum constraint_num c)
4166 : {
4167 : switch (c)
4168 : {
4169 : case CONSTRAINT_I:
4170 : return
4171 : #line 275 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4172 : (IN_RANGE (ival, 0, 31));
4173 :
4174 : case CONSTRAINT_J:
4175 : return
4176 : #line 280 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4177 : (IN_RANGE (ival, 0, 63));
4178 :
4179 : case CONSTRAINT_K:
4180 : return
4181 : #line 285 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4182 : (IN_RANGE (ival, -128, 127));
4183 :
4184 : case CONSTRAINT_L:
4185 : return (
4186 : #line 291 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4187 : (ival == 0xff)) || ((
4188 : #line 292 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4189 : (ival == 0xffff)) || (
4190 : #line 293 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4191 : (ival == HOST_WIDE_INT_C (0xffffffff))));
4192 :
4193 : case CONSTRAINT_M:
4194 : return
4195 : #line 298 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4196 : (IN_RANGE (ival, 0, 3));
4197 :
4198 : case CONSTRAINT_N:
4199 : return
4200 : #line 304 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4201 : (IN_RANGE (ival, 0, 255));
4202 :
4203 : case CONSTRAINT_O:
4204 : return
4205 : #line 309 "/home/worker/buildworker/tiber-lcov/build/gcc/config/i386/constraints.md"
4206 : (IN_RANGE (ival, 0, 127));
4207 :
4208 : default: break;
4209 : }
4210 : return false;
4211 : }
4212 :
4213 :
4214 : void
4215 : init_reg_class_start_regs ()
4216 : {
4217 : }
4218 :
4219 : bool
4220 : eval_dependent_filter (int, unsigned int, machine_mode,
4221 : unsigned int, machine_mode)
4222 : {
4223 : return true;
4224 : }
|