1 /* RTL simplification functions for GNU compiler.
2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
33 #include "diagnostic-core.h"
37 /* Simplification and canonicalization of RTL. */
39 /* Much code operates on (low, high) pairs; the low value is an
40 unsigned wide int, the high value a signed wide int. We
41 occasionally need to sign extend from low to high as if low were a
43 #define HWI_SIGN_EXTEND(low) \
44 ((((HOST_WIDE_INT) low) < 0) ? HOST_WIDE_INT_M1 : HOST_WIDE_INT_0)
46 static rtx
neg_const_int (machine_mode
, const_rtx
);
47 static bool plus_minus_operand_p (const_rtx
);
48 static rtx
simplify_plus_minus (enum rtx_code
, machine_mode
, rtx
, rtx
);
49 static rtx
simplify_immed_subreg (machine_mode
, rtx
, machine_mode
,
51 static rtx
simplify_associative_operation (enum rtx_code
, machine_mode
,
53 static rtx
simplify_relational_operation_1 (enum rtx_code
, machine_mode
,
54 machine_mode
, rtx
, rtx
);
55 static rtx
simplify_unary_operation_1 (enum rtx_code
, machine_mode
, rtx
);
56 static rtx
simplify_binary_operation_1 (enum rtx_code
, machine_mode
,
59 /* Negate a CONST_INT rtx. */
61 neg_const_int (machine_mode mode
, const_rtx i
)
63 unsigned HOST_WIDE_INT val
= -UINTVAL (i
);
65 if (GET_MODE_PRECISION (mode
) > HOST_BITS_PER_WIDE_INT
66 && val
== UINTVAL (i
))
67 return simplify_const_unary_operation (NEG
, mode
, CONST_CAST_RTX (i
),
69 return gen_int_mode (val
, mode
);
72 /* Test whether expression, X, is an immediate constant that represents
73 the most significant bit of machine mode MODE. */
76 mode_signbit_p (machine_mode mode
, const_rtx x
)
78 unsigned HOST_WIDE_INT val
;
81 if (GET_MODE_CLASS (mode
) != MODE_INT
)
84 width
= GET_MODE_PRECISION (mode
);
88 if (width
<= HOST_BITS_PER_WIDE_INT
91 #if TARGET_SUPPORTS_WIDE_INT
92 else if (CONST_WIDE_INT_P (x
))
95 unsigned int elts
= CONST_WIDE_INT_NUNITS (x
);
96 if (elts
!= (width
+ HOST_BITS_PER_WIDE_INT
- 1) / HOST_BITS_PER_WIDE_INT
)
98 for (i
= 0; i
< elts
- 1; i
++)
99 if (CONST_WIDE_INT_ELT (x
, i
) != 0)
101 val
= CONST_WIDE_INT_ELT (x
, elts
- 1);
102 width
%= HOST_BITS_PER_WIDE_INT
;
104 width
= HOST_BITS_PER_WIDE_INT
;
107 else if (width
<= HOST_BITS_PER_DOUBLE_INT
108 && CONST_DOUBLE_AS_INT_P (x
)
109 && CONST_DOUBLE_LOW (x
) == 0)
111 val
= CONST_DOUBLE_HIGH (x
);
112 width
-= HOST_BITS_PER_WIDE_INT
;
116 /* X is not an integer constant. */
119 if (width
< HOST_BITS_PER_WIDE_INT
)
120 val
&= (HOST_WIDE_INT_1U
<< width
) - 1;
121 return val
== (HOST_WIDE_INT_1U
<< (width
- 1));
124 /* Test whether VAL is equal to the most significant bit of mode MODE
125 (after masking with the mode mask of MODE). Returns false if the
126 precision of MODE is too large to handle. */
129 val_signbit_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
133 if (GET_MODE_CLASS (mode
) != MODE_INT
)
136 width
= GET_MODE_PRECISION (mode
);
137 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
140 val
&= GET_MODE_MASK (mode
);
141 return val
== (HOST_WIDE_INT_1U
<< (width
- 1));
144 /* Test whether the most significant bit of mode MODE is set in VAL.
145 Returns false if the precision of MODE is too large to handle. */
147 val_signbit_known_set_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
151 if (GET_MODE_CLASS (mode
) != MODE_INT
)
154 width
= GET_MODE_PRECISION (mode
);
155 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
158 val
&= HOST_WIDE_INT_1U
<< (width
- 1);
162 /* Test whether the most significant bit of mode MODE is clear in VAL.
163 Returns false if the precision of MODE is too large to handle. */
165 val_signbit_known_clear_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
169 if (GET_MODE_CLASS (mode
) != MODE_INT
)
172 width
= GET_MODE_PRECISION (mode
);
173 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
176 val
&= HOST_WIDE_INT_1U
<< (width
- 1);
180 /* Make a binary operation by properly ordering the operands and
181 seeing if the expression folds. */
184 simplify_gen_binary (enum rtx_code code
, machine_mode mode
, rtx op0
,
189 /* If this simplifies, do it. */
190 tem
= simplify_binary_operation (code
, mode
, op0
, op1
);
194 /* Put complex operands first and constants second if commutative. */
195 if (GET_RTX_CLASS (code
) == RTX_COMM_ARITH
196 && swap_commutative_operands_p (op0
, op1
))
197 std::swap (op0
, op1
);
199 return gen_rtx_fmt_ee (code
, mode
, op0
, op1
);
202 /* If X is a MEM referencing the constant pool, return the real value.
203 Otherwise return X. */
205 avoid_constant_pool_reference (rtx x
)
209 HOST_WIDE_INT offset
= 0;
211 switch (GET_CODE (x
))
217 /* Handle float extensions of constant pool references. */
219 c
= avoid_constant_pool_reference (tmp
);
220 if (c
!= tmp
&& CONST_DOUBLE_AS_FLOAT_P (c
))
221 return const_double_from_real_value (*CONST_DOUBLE_REAL_VALUE (c
),
229 if (GET_MODE (x
) == BLKmode
)
234 /* Call target hook to avoid the effects of -fpic etc.... */
235 addr
= targetm
.delegitimize_address (addr
);
237 /* Split the address into a base and integer offset. */
238 if (GET_CODE (addr
) == CONST
239 && GET_CODE (XEXP (addr
, 0)) == PLUS
240 && CONST_INT_P (XEXP (XEXP (addr
, 0), 1)))
242 offset
= INTVAL (XEXP (XEXP (addr
, 0), 1));
243 addr
= XEXP (XEXP (addr
, 0), 0);
246 if (GET_CODE (addr
) == LO_SUM
)
247 addr
= XEXP (addr
, 1);
249 /* If this is a constant pool reference, we can turn it into its
250 constant and hope that simplifications happen. */
251 if (GET_CODE (addr
) == SYMBOL_REF
252 && CONSTANT_POOL_ADDRESS_P (addr
))
254 c
= get_pool_constant (addr
);
255 cmode
= get_pool_mode (addr
);
257 /* If we're accessing the constant in a different mode than it was
258 originally stored, attempt to fix that up via subreg simplifications.
259 If that fails we have no choice but to return the original memory. */
260 if (offset
== 0 && cmode
== GET_MODE (x
))
262 else if (offset
>= 0 && offset
< GET_MODE_SIZE (cmode
))
264 rtx tem
= simplify_subreg (GET_MODE (x
), c
, cmode
, offset
);
265 if (tem
&& CONSTANT_P (tem
))
273 /* Simplify a MEM based on its attributes. This is the default
274 delegitimize_address target hook, and it's recommended that every
275 overrider call it. */
278 delegitimize_mem_from_attrs (rtx x
)
280 /* MEMs without MEM_OFFSETs may have been offset, so we can't just
281 use their base addresses as equivalent. */
284 && MEM_OFFSET_KNOWN_P (x
))
286 tree decl
= MEM_EXPR (x
);
287 machine_mode mode
= GET_MODE (x
);
288 HOST_WIDE_INT offset
= 0;
290 switch (TREE_CODE (decl
))
300 case ARRAY_RANGE_REF
:
305 case VIEW_CONVERT_EXPR
:
307 HOST_WIDE_INT bitsize
, bitpos
;
309 int unsignedp
, reversep
, volatilep
= 0;
312 = get_inner_reference (decl
, &bitsize
, &bitpos
, &toffset
, &mode
,
313 &unsignedp
, &reversep
, &volatilep
);
314 if (bitsize
!= GET_MODE_BITSIZE (mode
)
315 || (bitpos
% BITS_PER_UNIT
)
316 || (toffset
&& !tree_fits_shwi_p (toffset
)))
320 offset
+= bitpos
/ BITS_PER_UNIT
;
322 offset
+= tree_to_shwi (toffset
);
329 && mode
== GET_MODE (x
)
331 && (TREE_STATIC (decl
)
332 || DECL_THREAD_LOCAL_P (decl
))
333 && DECL_RTL_SET_P (decl
)
334 && MEM_P (DECL_RTL (decl
)))
338 offset
+= MEM_OFFSET (x
);
340 newx
= DECL_RTL (decl
);
344 rtx n
= XEXP (newx
, 0), o
= XEXP (x
, 0);
346 /* Avoid creating a new MEM needlessly if we already had
347 the same address. We do if there's no OFFSET and the
348 old address X is identical to NEWX, or if X is of the
349 form (plus NEWX OFFSET), or the NEWX is of the form
350 (plus Y (const_int Z)) and X is that with the offset
351 added: (plus Y (const_int Z+OFFSET)). */
353 || (GET_CODE (o
) == PLUS
354 && GET_CODE (XEXP (o
, 1)) == CONST_INT
355 && (offset
== INTVAL (XEXP (o
, 1))
356 || (GET_CODE (n
) == PLUS
357 && GET_CODE (XEXP (n
, 1)) == CONST_INT
358 && (INTVAL (XEXP (n
, 1)) + offset
359 == INTVAL (XEXP (o
, 1)))
360 && (n
= XEXP (n
, 0))))
361 && (o
= XEXP (o
, 0))))
362 && rtx_equal_p (o
, n
)))
363 x
= adjust_address_nv (newx
, mode
, offset
);
365 else if (GET_MODE (x
) == GET_MODE (newx
)
374 /* Make a unary operation by first seeing if it folds and otherwise making
375 the specified operation. */
378 simplify_gen_unary (enum rtx_code code
, machine_mode mode
, rtx op
,
379 machine_mode op_mode
)
383 /* If this simplifies, use it. */
384 if ((tem
= simplify_unary_operation (code
, mode
, op
, op_mode
)) != 0)
387 return gen_rtx_fmt_e (code
, mode
, op
);
390 /* Likewise for ternary operations. */
393 simplify_gen_ternary (enum rtx_code code
, machine_mode mode
,
394 machine_mode op0_mode
, rtx op0
, rtx op1
, rtx op2
)
398 /* If this simplifies, use it. */
399 if (0 != (tem
= simplify_ternary_operation (code
, mode
, op0_mode
,
403 return gen_rtx_fmt_eee (code
, mode
, op0
, op1
, op2
);
406 /* Likewise, for relational operations.
407 CMP_MODE specifies mode comparison is done in. */
410 simplify_gen_relational (enum rtx_code code
, machine_mode mode
,
411 machine_mode cmp_mode
, rtx op0
, rtx op1
)
415 if (0 != (tem
= simplify_relational_operation (code
, mode
, cmp_mode
,
419 return gen_rtx_fmt_ee (code
, mode
, op0
, op1
);
422 /* If FN is NULL, replace all occurrences of OLD_RTX in X with copy_rtx (DATA)
423 and simplify the result. If FN is non-NULL, call this callback on each
424 X, if it returns non-NULL, replace X with its return value and simplify the
428 simplify_replace_fn_rtx (rtx x
, const_rtx old_rtx
,
429 rtx (*fn
) (rtx
, const_rtx
, void *), void *data
)
431 enum rtx_code code
= GET_CODE (x
);
432 machine_mode mode
= GET_MODE (x
);
433 machine_mode op_mode
;
435 rtx op0
, op1
, op2
, newx
, op
;
439 if (__builtin_expect (fn
!= NULL
, 0))
441 newx
= fn (x
, old_rtx
, data
);
445 else if (rtx_equal_p (x
, old_rtx
))
446 return copy_rtx ((rtx
) data
);
448 switch (GET_RTX_CLASS (code
))
452 op_mode
= GET_MODE (op0
);
453 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
454 if (op0
== XEXP (x
, 0))
456 return simplify_gen_unary (code
, mode
, op0
, op_mode
);
460 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
461 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
462 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
464 return simplify_gen_binary (code
, mode
, op0
, op1
);
467 case RTX_COMM_COMPARE
:
470 op_mode
= GET_MODE (op0
) != VOIDmode
? GET_MODE (op0
) : GET_MODE (op1
);
471 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
472 op1
= simplify_replace_fn_rtx (op1
, old_rtx
, fn
, data
);
473 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
475 return simplify_gen_relational (code
, mode
, op_mode
, op0
, op1
);
478 case RTX_BITFIELD_OPS
:
480 op_mode
= GET_MODE (op0
);
481 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
482 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
483 op2
= simplify_replace_fn_rtx (XEXP (x
, 2), old_rtx
, fn
, data
);
484 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1) && op2
== XEXP (x
, 2))
486 if (op_mode
== VOIDmode
)
487 op_mode
= GET_MODE (op0
);
488 return simplify_gen_ternary (code
, mode
, op_mode
, op0
, op1
, op2
);
493 op0
= simplify_replace_fn_rtx (SUBREG_REG (x
), old_rtx
, fn
, data
);
494 if (op0
== SUBREG_REG (x
))
496 op0
= simplify_gen_subreg (GET_MODE (x
), op0
,
497 GET_MODE (SUBREG_REG (x
)),
499 return op0
? op0
: x
;
506 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
507 if (op0
== XEXP (x
, 0))
509 return replace_equiv_address_nv (x
, op0
);
511 else if (code
== LO_SUM
)
513 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
514 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
516 /* (lo_sum (high x) y) -> y where x and y have the same base. */
517 if (GET_CODE (op0
) == HIGH
)
519 rtx base0
, base1
, offset0
, offset1
;
520 split_const (XEXP (op0
, 0), &base0
, &offset0
);
521 split_const (op1
, &base1
, &offset1
);
522 if (rtx_equal_p (base0
, base1
))
526 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
528 return gen_rtx_LO_SUM (mode
, op0
, op1
);
537 fmt
= GET_RTX_FORMAT (code
);
538 for (i
= 0; fmt
[i
]; i
++)
543 newvec
= XVEC (newx
, i
);
544 for (j
= 0; j
< GET_NUM_ELEM (vec
); j
++)
546 op
= simplify_replace_fn_rtx (RTVEC_ELT (vec
, j
),
548 if (op
!= RTVEC_ELT (vec
, j
))
552 newvec
= shallow_copy_rtvec (vec
);
554 newx
= shallow_copy_rtx (x
);
555 XVEC (newx
, i
) = newvec
;
557 RTVEC_ELT (newvec
, j
) = op
;
565 op
= simplify_replace_fn_rtx (XEXP (x
, i
), old_rtx
, fn
, data
);
566 if (op
!= XEXP (x
, i
))
569 newx
= shallow_copy_rtx (x
);
578 /* Replace all occurrences of OLD_RTX in X with NEW_RTX and try to simplify the
579 resulting RTX. Return a new RTX which is as simplified as possible. */
582 simplify_replace_rtx (rtx x
, const_rtx old_rtx
, rtx new_rtx
)
584 return simplify_replace_fn_rtx (x
, old_rtx
, 0, new_rtx
);
587 /* Try to simplify a MODE truncation of OP, which has OP_MODE.
588 Only handle cases where the truncated value is inherently an rvalue.
590 RTL provides two ways of truncating a value:
592 1. a lowpart subreg. This form is only a truncation when both
593 the outer and inner modes (here MODE and OP_MODE respectively)
594 are scalar integers, and only then when the subreg is used as
597 It is only valid to form such truncating subregs if the
598 truncation requires no action by the target. The onus for
599 proving this is on the creator of the subreg -- e.g. the
600 caller to simplify_subreg or simplify_gen_subreg -- and typically
601 involves either TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode.
603 2. a TRUNCATE. This form handles both scalar and compound integers.
605 The first form is preferred where valid. However, the TRUNCATE
606 handling in simplify_unary_operation turns the second form into the
607 first form when TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode allow,
608 so it is generally safe to form rvalue truncations using:
610 simplify_gen_unary (TRUNCATE, ...)
612 and leave simplify_unary_operation to work out which representation
615 Because of the proof requirements on (1), simplify_truncation must
616 also use simplify_gen_unary (TRUNCATE, ...) to truncate parts of OP,
617 regardless of whether the outer truncation came from a SUBREG or a
618 TRUNCATE. For example, if the caller has proven that an SImode
623 is a no-op and can be represented as a subreg, it does not follow
624 that SImode truncations of X and Y are also no-ops. On a target
625 like 64-bit MIPS that requires SImode values to be stored in
626 sign-extended form, an SImode truncation of:
628 (and:DI (reg:DI X) (const_int 63))
630 is trivially a no-op because only the lower 6 bits can be set.
631 However, X is still an arbitrary 64-bit number and so we cannot
632 assume that truncating it too is a no-op. */
635 simplify_truncation (machine_mode mode
, rtx op
,
636 machine_mode op_mode
)
638 unsigned int precision
= GET_MODE_UNIT_PRECISION (mode
);
639 unsigned int op_precision
= GET_MODE_UNIT_PRECISION (op_mode
);
640 gcc_assert (precision
<= op_precision
);
642 /* Optimize truncations of zero and sign extended values. */
643 if (GET_CODE (op
) == ZERO_EXTEND
644 || GET_CODE (op
) == SIGN_EXTEND
)
646 /* There are three possibilities. If MODE is the same as the
647 origmode, we can omit both the extension and the subreg.
648 If MODE is not larger than the origmode, we can apply the
649 truncation without the extension. Finally, if the outermode
650 is larger than the origmode, we can just extend to the appropriate
652 machine_mode origmode
= GET_MODE (XEXP (op
, 0));
653 if (mode
== origmode
)
655 else if (precision
<= GET_MODE_UNIT_PRECISION (origmode
))
656 return simplify_gen_unary (TRUNCATE
, mode
,
657 XEXP (op
, 0), origmode
);
659 return simplify_gen_unary (GET_CODE (op
), mode
,
660 XEXP (op
, 0), origmode
);
663 /* If the machine can perform operations in the truncated mode, distribute
664 the truncation, i.e. simplify (truncate:QI (op:SI (x:SI) (y:SI))) into
665 (op:QI (truncate:QI (x:SI)) (truncate:QI (y:SI))). */
667 && (!WORD_REGISTER_OPERATIONS
|| precision
>= BITS_PER_WORD
)
668 && (GET_CODE (op
) == PLUS
669 || GET_CODE (op
) == MINUS
670 || GET_CODE (op
) == MULT
))
672 rtx op0
= simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 0), op_mode
);
675 rtx op1
= simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 1), op_mode
);
677 return simplify_gen_binary (GET_CODE (op
), mode
, op0
, op1
);
681 /* Simplify (truncate:QI (lshiftrt:SI (sign_extend:SI (x:QI)) C)) into
682 to (ashiftrt:QI (x:QI) C), where C is a suitable small constant and
683 the outer subreg is effectively a truncation to the original mode. */
684 if ((GET_CODE (op
) == LSHIFTRT
685 || GET_CODE (op
) == ASHIFTRT
)
686 /* Ensure that OP_MODE is at least twice as wide as MODE
687 to avoid the possibility that an outer LSHIFTRT shifts by more
688 than the sign extension's sign_bit_copies and introduces zeros
689 into the high bits of the result. */
690 && 2 * precision
<= op_precision
691 && CONST_INT_P (XEXP (op
, 1))
692 && GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
693 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
694 && UINTVAL (XEXP (op
, 1)) < precision
)
695 return simplify_gen_binary (ASHIFTRT
, mode
,
696 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
698 /* Likewise (truncate:QI (lshiftrt:SI (zero_extend:SI (x:QI)) C)) into
699 to (lshiftrt:QI (x:QI) C), where C is a suitable small constant and
700 the outer subreg is effectively a truncation to the original mode. */
701 if ((GET_CODE (op
) == LSHIFTRT
702 || GET_CODE (op
) == ASHIFTRT
)
703 && CONST_INT_P (XEXP (op
, 1))
704 && GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
705 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
706 && UINTVAL (XEXP (op
, 1)) < precision
)
707 return simplify_gen_binary (LSHIFTRT
, mode
,
708 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
710 /* Likewise (truncate:QI (ashift:SI (zero_extend:SI (x:QI)) C)) into
711 to (ashift:QI (x:QI) C), where C is a suitable small constant and
712 the outer subreg is effectively a truncation to the original mode. */
713 if (GET_CODE (op
) == ASHIFT
714 && CONST_INT_P (XEXP (op
, 1))
715 && (GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
716 || GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
)
717 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
718 && UINTVAL (XEXP (op
, 1)) < precision
)
719 return simplify_gen_binary (ASHIFT
, mode
,
720 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
722 /* Likewise (truncate:QI (and:SI (lshiftrt:SI (x:SI) C) C2)) into
723 (and:QI (lshiftrt:QI (truncate:QI (x:SI)) C) C2) for suitable C
725 if (GET_CODE (op
) == AND
726 && (GET_CODE (XEXP (op
, 0)) == LSHIFTRT
727 || GET_CODE (XEXP (op
, 0)) == ASHIFTRT
)
728 && CONST_INT_P (XEXP (XEXP (op
, 0), 1))
729 && CONST_INT_P (XEXP (op
, 1)))
731 rtx op0
= (XEXP (XEXP (op
, 0), 0));
732 rtx shift_op
= XEXP (XEXP (op
, 0), 1);
733 rtx mask_op
= XEXP (op
, 1);
734 unsigned HOST_WIDE_INT shift
= UINTVAL (shift_op
);
735 unsigned HOST_WIDE_INT mask
= UINTVAL (mask_op
);
737 if (shift
< precision
738 /* If doing this transform works for an X with all bits set,
739 it works for any X. */
740 && ((GET_MODE_MASK (mode
) >> shift
) & mask
)
741 == ((GET_MODE_MASK (op_mode
) >> shift
) & mask
)
742 && (op0
= simplify_gen_unary (TRUNCATE
, mode
, op0
, op_mode
))
743 && (op0
= simplify_gen_binary (LSHIFTRT
, mode
, op0
, shift_op
)))
745 mask_op
= GEN_INT (trunc_int_for_mode (mask
, mode
));
746 return simplify_gen_binary (AND
, mode
, op0
, mask_op
);
750 /* Turn (truncate:M1 (*_extract:M2 (reg:M2) (len) (pos))) into
751 (*_extract:M1 (truncate:M1 (reg:M2)) (len) (pos')) if possible without
753 if ((GET_CODE (op
) == ZERO_EXTRACT
|| GET_CODE (op
) == SIGN_EXTRACT
)
754 && REG_P (XEXP (op
, 0))
755 && GET_MODE (XEXP (op
, 0)) == GET_MODE (op
)
756 && CONST_INT_P (XEXP (op
, 1))
757 && CONST_INT_P (XEXP (op
, 2)))
759 rtx op0
= XEXP (op
, 0);
760 unsigned HOST_WIDE_INT len
= UINTVAL (XEXP (op
, 1));
761 unsigned HOST_WIDE_INT pos
= UINTVAL (XEXP (op
, 2));
762 if (BITS_BIG_ENDIAN
&& pos
>= op_precision
- precision
)
764 op0
= simplify_gen_unary (TRUNCATE
, mode
, op0
, GET_MODE (op0
));
767 pos
-= op_precision
- precision
;
768 return simplify_gen_ternary (GET_CODE (op
), mode
, mode
, op0
,
769 XEXP (op
, 1), GEN_INT (pos
));
772 else if (!BITS_BIG_ENDIAN
&& precision
>= len
+ pos
)
774 op0
= simplify_gen_unary (TRUNCATE
, mode
, op0
, GET_MODE (op0
));
776 return simplify_gen_ternary (GET_CODE (op
), mode
, mode
, op0
,
777 XEXP (op
, 1), XEXP (op
, 2));
781 /* Recognize a word extraction from a multi-word subreg. */
782 if ((GET_CODE (op
) == LSHIFTRT
783 || GET_CODE (op
) == ASHIFTRT
)
784 && SCALAR_INT_MODE_P (mode
)
785 && SCALAR_INT_MODE_P (op_mode
)
786 && precision
>= BITS_PER_WORD
787 && 2 * precision
<= op_precision
788 && CONST_INT_P (XEXP (op
, 1))
789 && (INTVAL (XEXP (op
, 1)) & (precision
- 1)) == 0
790 && UINTVAL (XEXP (op
, 1)) < op_precision
)
792 int byte
= subreg_lowpart_offset (mode
, op_mode
);
793 int shifted_bytes
= INTVAL (XEXP (op
, 1)) / BITS_PER_UNIT
;
794 return simplify_gen_subreg (mode
, XEXP (op
, 0), op_mode
,
796 ? byte
- shifted_bytes
797 : byte
+ shifted_bytes
));
800 /* If we have a TRUNCATE of a right shift of MEM, make a new MEM
801 and try replacing the TRUNCATE and shift with it. Don't do this
802 if the MEM has a mode-dependent address. */
803 if ((GET_CODE (op
) == LSHIFTRT
804 || GET_CODE (op
) == ASHIFTRT
)
805 && SCALAR_INT_MODE_P (op_mode
)
806 && MEM_P (XEXP (op
, 0))
807 && CONST_INT_P (XEXP (op
, 1))
808 && (INTVAL (XEXP (op
, 1)) % GET_MODE_BITSIZE (mode
)) == 0
809 && INTVAL (XEXP (op
, 1)) > 0
810 && INTVAL (XEXP (op
, 1)) < GET_MODE_BITSIZE (op_mode
)
811 && ! mode_dependent_address_p (XEXP (XEXP (op
, 0), 0),
812 MEM_ADDR_SPACE (XEXP (op
, 0)))
813 && ! MEM_VOLATILE_P (XEXP (op
, 0))
814 && (GET_MODE_SIZE (mode
) >= UNITS_PER_WORD
815 || WORDS_BIG_ENDIAN
== BYTES_BIG_ENDIAN
))
817 int byte
= subreg_lowpart_offset (mode
, op_mode
);
818 int shifted_bytes
= INTVAL (XEXP (op
, 1)) / BITS_PER_UNIT
;
819 return adjust_address_nv (XEXP (op
, 0), mode
,
821 ? byte
- shifted_bytes
822 : byte
+ shifted_bytes
));
825 /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
826 (OP:SI foo:SI) if OP is NEG or ABS. */
827 if ((GET_CODE (op
) == ABS
828 || GET_CODE (op
) == NEG
)
829 && (GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
830 || GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
)
831 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
)
832 return simplify_gen_unary (GET_CODE (op
), mode
,
833 XEXP (XEXP (op
, 0), 0), mode
);
835 /* (truncate:A (subreg:B (truncate:C X) 0)) is
837 if (GET_CODE (op
) == SUBREG
838 && SCALAR_INT_MODE_P (mode
)
839 && SCALAR_INT_MODE_P (op_mode
)
840 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (op
)))
841 && GET_CODE (SUBREG_REG (op
)) == TRUNCATE
842 && subreg_lowpart_p (op
))
844 rtx inner
= XEXP (SUBREG_REG (op
), 0);
845 if (GET_MODE_PRECISION (mode
)
846 <= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
))))
847 return simplify_gen_unary (TRUNCATE
, mode
, inner
, GET_MODE (inner
));
849 /* If subreg above is paradoxical and C is narrower
850 than A, return (subreg:A (truncate:C X) 0). */
851 return simplify_gen_subreg (mode
, SUBREG_REG (op
),
852 GET_MODE (SUBREG_REG (op
)), 0);
855 /* (truncate:A (truncate:B X)) is (truncate:A X). */
856 if (GET_CODE (op
) == TRUNCATE
)
857 return simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 0),
858 GET_MODE (XEXP (op
, 0)));
863 /* Try to simplify a unary operation CODE whose output mode is to be
864 MODE with input operand OP whose mode was originally OP_MODE.
865 Return zero if no simplification can be made. */
867 simplify_unary_operation (enum rtx_code code
, machine_mode mode
,
868 rtx op
, machine_mode op_mode
)
872 trueop
= avoid_constant_pool_reference (op
);
874 tem
= simplify_const_unary_operation (code
, mode
, trueop
, op_mode
);
878 return simplify_unary_operation_1 (code
, mode
, op
);
881 /* Return true if FLOAT or UNSIGNED_FLOAT operation OP is known
885 exact_int_to_float_conversion_p (const_rtx op
)
887 int out_bits
= significand_size (GET_MODE_INNER (GET_MODE (op
)));
888 machine_mode op0_mode
= GET_MODE (XEXP (op
, 0));
889 /* Constants shouldn't reach here. */
890 gcc_assert (op0_mode
!= VOIDmode
);
891 int in_prec
= GET_MODE_UNIT_PRECISION (op0_mode
);
892 int in_bits
= in_prec
;
893 if (HWI_COMPUTABLE_MODE_P (op0_mode
))
895 unsigned HOST_WIDE_INT nonzero
= nonzero_bits (XEXP (op
, 0), op0_mode
);
896 if (GET_CODE (op
) == FLOAT
)
897 in_bits
-= num_sign_bit_copies (XEXP (op
, 0), op0_mode
);
898 else if (GET_CODE (op
) == UNSIGNED_FLOAT
)
899 in_bits
= wi::min_precision (wi::uhwi (nonzero
, in_prec
), UNSIGNED
);
902 in_bits
-= wi::ctz (wi::uhwi (nonzero
, in_prec
));
904 return in_bits
<= out_bits
;
907 /* Perform some simplifications we can do even if the operands
910 simplify_unary_operation_1 (enum rtx_code code
, machine_mode mode
, rtx op
)
912 enum rtx_code reversed
;
918 /* (not (not X)) == X. */
919 if (GET_CODE (op
) == NOT
)
922 /* (not (eq X Y)) == (ne X Y), etc. if BImode or the result of the
923 comparison is all ones. */
924 if (COMPARISON_P (op
)
925 && (mode
== BImode
|| STORE_FLAG_VALUE
== -1)
926 && ((reversed
= reversed_comparison_code (op
, NULL
)) != UNKNOWN
))
927 return simplify_gen_relational (reversed
, mode
, VOIDmode
,
928 XEXP (op
, 0), XEXP (op
, 1));
930 /* (not (plus X -1)) can become (neg X). */
931 if (GET_CODE (op
) == PLUS
932 && XEXP (op
, 1) == constm1_rtx
)
933 return simplify_gen_unary (NEG
, mode
, XEXP (op
, 0), mode
);
935 /* Similarly, (not (neg X)) is (plus X -1). */
936 if (GET_CODE (op
) == NEG
)
937 return simplify_gen_binary (PLUS
, mode
, XEXP (op
, 0),
940 /* (not (xor X C)) for C constant is (xor X D) with D = ~C. */
941 if (GET_CODE (op
) == XOR
942 && CONST_INT_P (XEXP (op
, 1))
943 && (temp
= simplify_unary_operation (NOT
, mode
,
944 XEXP (op
, 1), mode
)) != 0)
945 return simplify_gen_binary (XOR
, mode
, XEXP (op
, 0), temp
);
947 /* (not (plus X C)) for signbit C is (xor X D) with D = ~C. */
948 if (GET_CODE (op
) == PLUS
949 && CONST_INT_P (XEXP (op
, 1))
950 && mode_signbit_p (mode
, XEXP (op
, 1))
951 && (temp
= simplify_unary_operation (NOT
, mode
,
952 XEXP (op
, 1), mode
)) != 0)
953 return simplify_gen_binary (XOR
, mode
, XEXP (op
, 0), temp
);
956 /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for
957 operands other than 1, but that is not valid. We could do a
958 similar simplification for (not (lshiftrt C X)) where C is
959 just the sign bit, but this doesn't seem common enough to
961 if (GET_CODE (op
) == ASHIFT
962 && XEXP (op
, 0) == const1_rtx
)
964 temp
= simplify_gen_unary (NOT
, mode
, const1_rtx
, mode
);
965 return simplify_gen_binary (ROTATE
, mode
, temp
, XEXP (op
, 1));
968 /* (not (ashiftrt foo C)) where C is the number of bits in FOO
969 minus 1 is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1,
970 so we can perform the above simplification. */
971 if (STORE_FLAG_VALUE
== -1
972 && GET_CODE (op
) == ASHIFTRT
973 && CONST_INT_P (XEXP (op
, 1))
974 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
975 return simplify_gen_relational (GE
, mode
, VOIDmode
,
976 XEXP (op
, 0), const0_rtx
);
979 if (GET_CODE (op
) == SUBREG
980 && subreg_lowpart_p (op
)
981 && (GET_MODE_SIZE (GET_MODE (op
))
982 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op
))))
983 && GET_CODE (SUBREG_REG (op
)) == ASHIFT
984 && XEXP (SUBREG_REG (op
), 0) == const1_rtx
)
986 machine_mode inner_mode
= GET_MODE (SUBREG_REG (op
));
989 x
= gen_rtx_ROTATE (inner_mode
,
990 simplify_gen_unary (NOT
, inner_mode
, const1_rtx
,
992 XEXP (SUBREG_REG (op
), 1));
993 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, x
);
998 /* Apply De Morgan's laws to reduce number of patterns for machines
999 with negating logical insns (and-not, nand, etc.). If result has
1000 only one NOT, put it first, since that is how the patterns are
1002 if (GET_CODE (op
) == IOR
|| GET_CODE (op
) == AND
)
1004 rtx in1
= XEXP (op
, 0), in2
= XEXP (op
, 1);
1005 machine_mode op_mode
;
1007 op_mode
= GET_MODE (in1
);
1008 in1
= simplify_gen_unary (NOT
, op_mode
, in1
, op_mode
);
1010 op_mode
= GET_MODE (in2
);
1011 if (op_mode
== VOIDmode
)
1013 in2
= simplify_gen_unary (NOT
, op_mode
, in2
, op_mode
);
1015 if (GET_CODE (in2
) == NOT
&& GET_CODE (in1
) != NOT
)
1016 std::swap (in1
, in2
);
1018 return gen_rtx_fmt_ee (GET_CODE (op
) == IOR
? AND
: IOR
,
1022 /* (not (bswap x)) -> (bswap (not x)). */
1023 if (GET_CODE (op
) == BSWAP
)
1025 rtx x
= simplify_gen_unary (NOT
, mode
, XEXP (op
, 0), mode
);
1026 return simplify_gen_unary (BSWAP
, mode
, x
, mode
);
1031 /* (neg (neg X)) == X. */
1032 if (GET_CODE (op
) == NEG
)
1033 return XEXP (op
, 0);
1035 /* (neg (x ? (neg y) : y)) == !x ? (neg y) : y.
1036 If comparison is not reversible use
1038 if (GET_CODE (op
) == IF_THEN_ELSE
)
1040 rtx cond
= XEXP (op
, 0);
1041 rtx true_rtx
= XEXP (op
, 1);
1042 rtx false_rtx
= XEXP (op
, 2);
1044 if ((GET_CODE (true_rtx
) == NEG
1045 && rtx_equal_p (XEXP (true_rtx
, 0), false_rtx
))
1046 || (GET_CODE (false_rtx
) == NEG
1047 && rtx_equal_p (XEXP (false_rtx
, 0), true_rtx
)))
1049 if (reversed_comparison_code (cond
, NULL
) != UNKNOWN
)
1050 temp
= reversed_comparison (cond
, mode
);
1054 std::swap (true_rtx
, false_rtx
);
1056 return simplify_gen_ternary (IF_THEN_ELSE
, mode
,
1057 mode
, temp
, true_rtx
, false_rtx
);
1061 /* (neg (plus X 1)) can become (not X). */
1062 if (GET_CODE (op
) == PLUS
1063 && XEXP (op
, 1) == const1_rtx
)
1064 return simplify_gen_unary (NOT
, mode
, XEXP (op
, 0), mode
);
1066 /* Similarly, (neg (not X)) is (plus X 1). */
1067 if (GET_CODE (op
) == NOT
)
1068 return simplify_gen_binary (PLUS
, mode
, XEXP (op
, 0),
1071 /* (neg (minus X Y)) can become (minus Y X). This transformation
1072 isn't safe for modes with signed zeros, since if X and Y are
1073 both +0, (minus Y X) is the same as (minus X Y). If the
1074 rounding mode is towards +infinity (or -infinity) then the two
1075 expressions will be rounded differently. */
1076 if (GET_CODE (op
) == MINUS
1077 && !HONOR_SIGNED_ZEROS (mode
)
1078 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
1079 return simplify_gen_binary (MINUS
, mode
, XEXP (op
, 1), XEXP (op
, 0));
1081 if (GET_CODE (op
) == PLUS
1082 && !HONOR_SIGNED_ZEROS (mode
)
1083 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
1085 /* (neg (plus A C)) is simplified to (minus -C A). */
1086 if (CONST_SCALAR_INT_P (XEXP (op
, 1))
1087 || CONST_DOUBLE_AS_FLOAT_P (XEXP (op
, 1)))
1089 temp
= simplify_unary_operation (NEG
, mode
, XEXP (op
, 1), mode
);
1091 return simplify_gen_binary (MINUS
, mode
, temp
, XEXP (op
, 0));
1094 /* (neg (plus A B)) is canonicalized to (minus (neg A) B). */
1095 temp
= simplify_gen_unary (NEG
, mode
, XEXP (op
, 0), mode
);
1096 return simplify_gen_binary (MINUS
, mode
, temp
, XEXP (op
, 1));
1099 /* (neg (mult A B)) becomes (mult A (neg B)).
1100 This works even for floating-point values. */
1101 if (GET_CODE (op
) == MULT
1102 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
1104 temp
= simplify_gen_unary (NEG
, mode
, XEXP (op
, 1), mode
);
1105 return simplify_gen_binary (MULT
, mode
, XEXP (op
, 0), temp
);
1108 /* NEG commutes with ASHIFT since it is multiplication. Only do
1109 this if we can then eliminate the NEG (e.g., if the operand
1111 if (GET_CODE (op
) == ASHIFT
)
1113 temp
= simplify_unary_operation (NEG
, mode
, XEXP (op
, 0), mode
);
1115 return simplify_gen_binary (ASHIFT
, mode
, temp
, XEXP (op
, 1));
1118 /* (neg (ashiftrt X C)) can be replaced by (lshiftrt X C) when
1119 C is equal to the width of MODE minus 1. */
1120 if (GET_CODE (op
) == ASHIFTRT
1121 && CONST_INT_P (XEXP (op
, 1))
1122 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
1123 return simplify_gen_binary (LSHIFTRT
, mode
,
1124 XEXP (op
, 0), XEXP (op
, 1));
1126 /* (neg (lshiftrt X C)) can be replaced by (ashiftrt X C) when
1127 C is equal to the width of MODE minus 1. */
1128 if (GET_CODE (op
) == LSHIFTRT
1129 && CONST_INT_P (XEXP (op
, 1))
1130 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
1131 return simplify_gen_binary (ASHIFTRT
, mode
,
1132 XEXP (op
, 0), XEXP (op
, 1));
1134 /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
1135 if (GET_CODE (op
) == XOR
1136 && XEXP (op
, 1) == const1_rtx
1137 && nonzero_bits (XEXP (op
, 0), mode
) == 1)
1138 return plus_constant (mode
, XEXP (op
, 0), -1);
1140 /* (neg (lt x 0)) is (ashiftrt X C) if STORE_FLAG_VALUE is 1. */
1141 /* (neg (lt x 0)) is (lshiftrt X C) if STORE_FLAG_VALUE is -1. */
1142 if (GET_CODE (op
) == LT
1143 && XEXP (op
, 1) == const0_rtx
1144 && SCALAR_INT_MODE_P (GET_MODE (XEXP (op
, 0))))
1146 machine_mode inner
= GET_MODE (XEXP (op
, 0));
1147 int isize
= GET_MODE_PRECISION (inner
);
1148 if (STORE_FLAG_VALUE
== 1)
1150 temp
= simplify_gen_binary (ASHIFTRT
, inner
, XEXP (op
, 0),
1151 GEN_INT (isize
- 1));
1154 if (GET_MODE_PRECISION (mode
) > isize
)
1155 return simplify_gen_unary (SIGN_EXTEND
, mode
, temp
, inner
);
1156 return simplify_gen_unary (TRUNCATE
, mode
, temp
, inner
);
1158 else if (STORE_FLAG_VALUE
== -1)
1160 temp
= simplify_gen_binary (LSHIFTRT
, inner
, XEXP (op
, 0),
1161 GEN_INT (isize
- 1));
1164 if (GET_MODE_PRECISION (mode
) > isize
)
1165 return simplify_gen_unary (ZERO_EXTEND
, mode
, temp
, inner
);
1166 return simplify_gen_unary (TRUNCATE
, mode
, temp
, inner
);
1172 /* Don't optimize (lshiftrt (mult ...)) as it would interfere
1173 with the umulXi3_highpart patterns. */
1174 if (GET_CODE (op
) == LSHIFTRT
1175 && GET_CODE (XEXP (op
, 0)) == MULT
)
1178 if (GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
1180 if (TRULY_NOOP_TRUNCATION_MODES_P (mode
, GET_MODE (op
)))
1182 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1186 /* We can't handle truncation to a partial integer mode here
1187 because we don't know the real bitsize of the partial
1192 if (GET_MODE (op
) != VOIDmode
)
1194 temp
= simplify_truncation (mode
, op
, GET_MODE (op
));
1199 /* If we know that the value is already truncated, we can
1200 replace the TRUNCATE with a SUBREG. */
1201 if (GET_MODE_NUNITS (mode
) == 1
1202 && (TRULY_NOOP_TRUNCATION_MODES_P (mode
, GET_MODE (op
))
1203 || truncated_to_mode (mode
, op
)))
1205 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1210 /* A truncate of a comparison can be replaced with a subreg if
1211 STORE_FLAG_VALUE permits. This is like the previous test,
1212 but it works even if the comparison is done in a mode larger
1213 than HOST_BITS_PER_WIDE_INT. */
1214 if (HWI_COMPUTABLE_MODE_P (mode
)
1215 && COMPARISON_P (op
)
1216 && (STORE_FLAG_VALUE
& ~GET_MODE_MASK (mode
)) == 0)
1218 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1223 /* A truncate of a memory is just loading the low part of the memory
1224 if we are not changing the meaning of the address. */
1225 if (GET_CODE (op
) == MEM
1226 && !VECTOR_MODE_P (mode
)
1227 && !MEM_VOLATILE_P (op
)
1228 && !mode_dependent_address_p (XEXP (op
, 0), MEM_ADDR_SPACE (op
)))
1230 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1237 case FLOAT_TRUNCATE
:
1238 if (DECIMAL_FLOAT_MODE_P (mode
))
1241 /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */
1242 if (GET_CODE (op
) == FLOAT_EXTEND
1243 && GET_MODE (XEXP (op
, 0)) == mode
)
1244 return XEXP (op
, 0);
1246 /* (float_truncate:SF (float_truncate:DF foo:XF))
1247 = (float_truncate:SF foo:XF).
1248 This may eliminate double rounding, so it is unsafe.
1250 (float_truncate:SF (float_extend:XF foo:DF))
1251 = (float_truncate:SF foo:DF).
1253 (float_truncate:DF (float_extend:XF foo:SF))
1254 = (float_extend:DF foo:SF). */
1255 if ((GET_CODE (op
) == FLOAT_TRUNCATE
1256 && flag_unsafe_math_optimizations
)
1257 || GET_CODE (op
) == FLOAT_EXTEND
)
1258 return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (op
,
1260 > GET_MODE_SIZE (mode
)
1261 ? FLOAT_TRUNCATE
: FLOAT_EXTEND
,
1263 XEXP (op
, 0), mode
);
1265 /* (float_truncate (float x)) is (float x) */
1266 if ((GET_CODE (op
) == FLOAT
|| GET_CODE (op
) == UNSIGNED_FLOAT
)
1267 && (flag_unsafe_math_optimizations
1268 || exact_int_to_float_conversion_p (op
)))
1269 return simplify_gen_unary (GET_CODE (op
), mode
,
1271 GET_MODE (XEXP (op
, 0)));
1273 /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
1274 (OP:SF foo:SF) if OP is NEG or ABS. */
1275 if ((GET_CODE (op
) == ABS
1276 || GET_CODE (op
) == NEG
)
1277 && GET_CODE (XEXP (op
, 0)) == FLOAT_EXTEND
1278 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
)
1279 return simplify_gen_unary (GET_CODE (op
), mode
,
1280 XEXP (XEXP (op
, 0), 0), mode
);
1282 /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
1283 is (float_truncate:SF x). */
1284 if (GET_CODE (op
) == SUBREG
1285 && subreg_lowpart_p (op
)
1286 && GET_CODE (SUBREG_REG (op
)) == FLOAT_TRUNCATE
)
1287 return SUBREG_REG (op
);
1291 if (DECIMAL_FLOAT_MODE_P (mode
))
1294 /* (float_extend (float_extend x)) is (float_extend x)
1296 (float_extend (float x)) is (float x) assuming that double
1297 rounding can't happen.
1299 if (GET_CODE (op
) == FLOAT_EXTEND
1300 || ((GET_CODE (op
) == FLOAT
|| GET_CODE (op
) == UNSIGNED_FLOAT
)
1301 && exact_int_to_float_conversion_p (op
)))
1302 return simplify_gen_unary (GET_CODE (op
), mode
,
1304 GET_MODE (XEXP (op
, 0)));
1309 /* (abs (neg <foo>)) -> (abs <foo>) */
1310 if (GET_CODE (op
) == NEG
)
1311 return simplify_gen_unary (ABS
, mode
, XEXP (op
, 0),
1312 GET_MODE (XEXP (op
, 0)));
1314 /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
1316 if (GET_MODE (op
) == VOIDmode
)
1319 /* If operand is something known to be positive, ignore the ABS. */
1320 if (GET_CODE (op
) == FFS
|| GET_CODE (op
) == ABS
1321 || val_signbit_known_clear_p (GET_MODE (op
),
1322 nonzero_bits (op
, GET_MODE (op
))))
1325 /* If operand is known to be only -1 or 0, convert ABS to NEG. */
1326 if (num_sign_bit_copies (op
, mode
) == GET_MODE_PRECISION (mode
))
1327 return gen_rtx_NEG (mode
, op
);
1332 /* (ffs (*_extend <X>)) = (ffs <X>) */
1333 if (GET_CODE (op
) == SIGN_EXTEND
1334 || GET_CODE (op
) == ZERO_EXTEND
)
1335 return simplify_gen_unary (FFS
, mode
, XEXP (op
, 0),
1336 GET_MODE (XEXP (op
, 0)));
1340 switch (GET_CODE (op
))
1344 /* (popcount (zero_extend <X>)) = (popcount <X>) */
1345 return simplify_gen_unary (POPCOUNT
, mode
, XEXP (op
, 0),
1346 GET_MODE (XEXP (op
, 0)));
1350 /* Rotations don't affect popcount. */
1351 if (!side_effects_p (XEXP (op
, 1)))
1352 return simplify_gen_unary (POPCOUNT
, mode
, XEXP (op
, 0),
1353 GET_MODE (XEXP (op
, 0)));
1362 switch (GET_CODE (op
))
1368 return simplify_gen_unary (PARITY
, mode
, XEXP (op
, 0),
1369 GET_MODE (XEXP (op
, 0)));
1373 /* Rotations don't affect parity. */
1374 if (!side_effects_p (XEXP (op
, 1)))
1375 return simplify_gen_unary (PARITY
, mode
, XEXP (op
, 0),
1376 GET_MODE (XEXP (op
, 0)));
1385 /* (bswap (bswap x)) -> x. */
1386 if (GET_CODE (op
) == BSWAP
)
1387 return XEXP (op
, 0);
1391 /* (float (sign_extend <X>)) = (float <X>). */
1392 if (GET_CODE (op
) == SIGN_EXTEND
)
1393 return simplify_gen_unary (FLOAT
, mode
, XEXP (op
, 0),
1394 GET_MODE (XEXP (op
, 0)));
1398 /* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
1399 becomes just the MINUS if its mode is MODE. This allows
1400 folding switch statements on machines using casesi (such as
1402 if (GET_CODE (op
) == TRUNCATE
1403 && GET_MODE (XEXP (op
, 0)) == mode
1404 && GET_CODE (XEXP (op
, 0)) == MINUS
1405 && GET_CODE (XEXP (XEXP (op
, 0), 0)) == LABEL_REF
1406 && GET_CODE (XEXP (XEXP (op
, 0), 1)) == LABEL_REF
)
1407 return XEXP (op
, 0);
1409 /* Extending a widening multiplication should be canonicalized to
1410 a wider widening multiplication. */
1411 if (GET_CODE (op
) == MULT
)
1413 rtx lhs
= XEXP (op
, 0);
1414 rtx rhs
= XEXP (op
, 1);
1415 enum rtx_code lcode
= GET_CODE (lhs
);
1416 enum rtx_code rcode
= GET_CODE (rhs
);
1418 /* Widening multiplies usually extend both operands, but sometimes
1419 they use a shift to extract a portion of a register. */
1420 if ((lcode
== SIGN_EXTEND
1421 || (lcode
== ASHIFTRT
&& CONST_INT_P (XEXP (lhs
, 1))))
1422 && (rcode
== SIGN_EXTEND
1423 || (rcode
== ASHIFTRT
&& CONST_INT_P (XEXP (rhs
, 1)))))
1425 machine_mode lmode
= GET_MODE (lhs
);
1426 machine_mode rmode
= GET_MODE (rhs
);
1429 if (lcode
== ASHIFTRT
)
1430 /* Number of bits not shifted off the end. */
1431 bits
= GET_MODE_PRECISION (lmode
) - INTVAL (XEXP (lhs
, 1));
1432 else /* lcode == SIGN_EXTEND */
1433 /* Size of inner mode. */
1434 bits
= GET_MODE_PRECISION (GET_MODE (XEXP (lhs
, 0)));
1436 if (rcode
== ASHIFTRT
)
1437 bits
+= GET_MODE_PRECISION (rmode
) - INTVAL (XEXP (rhs
, 1));
1438 else /* rcode == SIGN_EXTEND */
1439 bits
+= GET_MODE_PRECISION (GET_MODE (XEXP (rhs
, 0)));
1441 /* We can only widen multiplies if the result is mathematiclly
1442 equivalent. I.e. if overflow was impossible. */
1443 if (bits
<= GET_MODE_PRECISION (GET_MODE (op
)))
1444 return simplify_gen_binary
1446 simplify_gen_unary (SIGN_EXTEND
, mode
, lhs
, lmode
),
1447 simplify_gen_unary (SIGN_EXTEND
, mode
, rhs
, rmode
));
1451 /* Check for a sign extension of a subreg of a promoted
1452 variable, where the promotion is sign-extended, and the
1453 target mode is the same as the variable's promotion. */
1454 if (GET_CODE (op
) == SUBREG
1455 && SUBREG_PROMOTED_VAR_P (op
)
1456 && SUBREG_PROMOTED_SIGNED_P (op
)
1457 && GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (GET_MODE (XEXP (op
, 0))))
1459 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1464 /* (sign_extend:M (sign_extend:N <X>)) is (sign_extend:M <X>).
1465 (sign_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>). */
1466 if (GET_CODE (op
) == SIGN_EXTEND
|| GET_CODE (op
) == ZERO_EXTEND
)
1468 gcc_assert (GET_MODE_PRECISION (mode
)
1469 > GET_MODE_PRECISION (GET_MODE (op
)));
1470 return simplify_gen_unary (GET_CODE (op
), mode
, XEXP (op
, 0),
1471 GET_MODE (XEXP (op
, 0)));
1474 /* (sign_extend:M (ashiftrt:N (ashift <X> (const_int I)) (const_int I)))
1475 is (sign_extend:M (subreg:O <X>)) if there is mode with
1476 GET_MODE_BITSIZE (N) - I bits.
1477 (sign_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1478 is similarly (zero_extend:M (subreg:O <X>)). */
1479 if ((GET_CODE (op
) == ASHIFTRT
|| GET_CODE (op
) == LSHIFTRT
)
1480 && GET_CODE (XEXP (op
, 0)) == ASHIFT
1481 && CONST_INT_P (XEXP (op
, 1))
1482 && XEXP (XEXP (op
, 0), 1) == XEXP (op
, 1)
1483 && GET_MODE_BITSIZE (GET_MODE (op
)) > INTVAL (XEXP (op
, 1)))
1486 = mode_for_size (GET_MODE_BITSIZE (GET_MODE (op
))
1487 - INTVAL (XEXP (op
, 1)), MODE_INT
, 1);
1488 gcc_assert (GET_MODE_BITSIZE (mode
)
1489 > GET_MODE_BITSIZE (GET_MODE (op
)));
1490 if (tmode
!= BLKmode
)
1493 rtl_hooks
.gen_lowpart_no_emit (tmode
, XEXP (XEXP (op
, 0), 0));
1495 return simplify_gen_unary (GET_CODE (op
) == ASHIFTRT
1496 ? SIGN_EXTEND
: ZERO_EXTEND
,
1497 mode
, inner
, tmode
);
1501 /* (sign_extend:M (lshiftrt:N <X> (const_int I))) is better as
1502 (zero_extend:M (lshiftrt:N <X> (const_int I))) if I is not 0. */
1503 if (GET_CODE (op
) == LSHIFTRT
1504 && CONST_INT_P (XEXP (op
, 1))
1505 && XEXP (op
, 1) != const0_rtx
)
1506 return simplify_gen_unary (ZERO_EXTEND
, mode
, op
, GET_MODE (op
));
1508 #if defined(POINTERS_EXTEND_UNSIGNED)
1509 /* As we do not know which address space the pointer is referring to,
1510 we can do this only if the target does not support different pointer
1511 or address modes depending on the address space. */
1512 if (target_default_pointer_address_modes_p ()
1513 && ! POINTERS_EXTEND_UNSIGNED
1514 && mode
== Pmode
&& GET_MODE (op
) == ptr_mode
1516 || (GET_CODE (op
) == SUBREG
1517 && REG_P (SUBREG_REG (op
))
1518 && REG_POINTER (SUBREG_REG (op
))
1519 && GET_MODE (SUBREG_REG (op
)) == Pmode
))
1520 && !targetm
.have_ptr_extend ())
1523 = convert_memory_address_addr_space_1 (Pmode
, op
,
1524 ADDR_SPACE_GENERIC
, false,
1533 /* Check for a zero extension of a subreg of a promoted
1534 variable, where the promotion is zero-extended, and the
1535 target mode is the same as the variable's promotion. */
1536 if (GET_CODE (op
) == SUBREG
1537 && SUBREG_PROMOTED_VAR_P (op
)
1538 && SUBREG_PROMOTED_UNSIGNED_P (op
)
1539 && GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (GET_MODE (XEXP (op
, 0))))
1541 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1546 /* Extending a widening multiplication should be canonicalized to
1547 a wider widening multiplication. */
1548 if (GET_CODE (op
) == MULT
)
1550 rtx lhs
= XEXP (op
, 0);
1551 rtx rhs
= XEXP (op
, 1);
1552 enum rtx_code lcode
= GET_CODE (lhs
);
1553 enum rtx_code rcode
= GET_CODE (rhs
);
1555 /* Widening multiplies usually extend both operands, but sometimes
1556 they use a shift to extract a portion of a register. */
1557 if ((lcode
== ZERO_EXTEND
1558 || (lcode
== LSHIFTRT
&& CONST_INT_P (XEXP (lhs
, 1))))
1559 && (rcode
== ZERO_EXTEND
1560 || (rcode
== LSHIFTRT
&& CONST_INT_P (XEXP (rhs
, 1)))))
1562 machine_mode lmode
= GET_MODE (lhs
);
1563 machine_mode rmode
= GET_MODE (rhs
);
1566 if (lcode
== LSHIFTRT
)
1567 /* Number of bits not shifted off the end. */
1568 bits
= GET_MODE_PRECISION (lmode
) - INTVAL (XEXP (lhs
, 1));
1569 else /* lcode == ZERO_EXTEND */
1570 /* Size of inner mode. */
1571 bits
= GET_MODE_PRECISION (GET_MODE (XEXP (lhs
, 0)));
1573 if (rcode
== LSHIFTRT
)
1574 bits
+= GET_MODE_PRECISION (rmode
) - INTVAL (XEXP (rhs
, 1));
1575 else /* rcode == ZERO_EXTEND */
1576 bits
+= GET_MODE_PRECISION (GET_MODE (XEXP (rhs
, 0)));
1578 /* We can only widen multiplies if the result is mathematiclly
1579 equivalent. I.e. if overflow was impossible. */
1580 if (bits
<= GET_MODE_PRECISION (GET_MODE (op
)))
1581 return simplify_gen_binary
1583 simplify_gen_unary (ZERO_EXTEND
, mode
, lhs
, lmode
),
1584 simplify_gen_unary (ZERO_EXTEND
, mode
, rhs
, rmode
));
1588 /* (zero_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>). */
1589 if (GET_CODE (op
) == ZERO_EXTEND
)
1590 return simplify_gen_unary (ZERO_EXTEND
, mode
, XEXP (op
, 0),
1591 GET_MODE (XEXP (op
, 0)));
1593 /* (zero_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1594 is (zero_extend:M (subreg:O <X>)) if there is mode with
1595 GET_MODE_PRECISION (N) - I bits. */
1596 if (GET_CODE (op
) == LSHIFTRT
1597 && GET_CODE (XEXP (op
, 0)) == ASHIFT
1598 && CONST_INT_P (XEXP (op
, 1))
1599 && XEXP (XEXP (op
, 0), 1) == XEXP (op
, 1)
1600 && GET_MODE_PRECISION (GET_MODE (op
)) > INTVAL (XEXP (op
, 1)))
1603 = mode_for_size (GET_MODE_PRECISION (GET_MODE (op
))
1604 - INTVAL (XEXP (op
, 1)), MODE_INT
, 1);
1605 if (tmode
!= BLKmode
)
1608 rtl_hooks
.gen_lowpart_no_emit (tmode
, XEXP (XEXP (op
, 0), 0));
1610 return simplify_gen_unary (ZERO_EXTEND
, mode
, inner
, tmode
);
1614 /* (zero_extend:M (subreg:N <X:O>)) is <X:O> (for M == O) or
1615 (zero_extend:M <X:O>), if X doesn't have any non-zero bits outside
1617 (zero_extend:SI (subreg:QI (and:SI (reg:SI) (const_int 63)) 0)) is
1618 (and:SI (reg:SI) (const_int 63)). */
1619 if (GET_CODE (op
) == SUBREG
1620 && GET_MODE_PRECISION (GET_MODE (op
))
1621 < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1622 && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1623 <= HOST_BITS_PER_WIDE_INT
1624 && GET_MODE_PRECISION (mode
)
1625 >= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1626 && subreg_lowpart_p (op
)
1627 && (nonzero_bits (SUBREG_REG (op
), GET_MODE (SUBREG_REG (op
)))
1628 & ~GET_MODE_MASK (GET_MODE (op
))) == 0)
1630 if (GET_MODE_PRECISION (mode
)
1631 == GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
))))
1632 return SUBREG_REG (op
);
1633 return simplify_gen_unary (ZERO_EXTEND
, mode
, SUBREG_REG (op
),
1634 GET_MODE (SUBREG_REG (op
)));
1637 #if defined(POINTERS_EXTEND_UNSIGNED)
1638 /* As we do not know which address space the pointer is referring to,
1639 we can do this only if the target does not support different pointer
1640 or address modes depending on the address space. */
1641 if (target_default_pointer_address_modes_p ()
1642 && POINTERS_EXTEND_UNSIGNED
> 0
1643 && mode
== Pmode
&& GET_MODE (op
) == ptr_mode
1645 || (GET_CODE (op
) == SUBREG
1646 && REG_P (SUBREG_REG (op
))
1647 && REG_POINTER (SUBREG_REG (op
))
1648 && GET_MODE (SUBREG_REG (op
)) == Pmode
))
1649 && !targetm
.have_ptr_extend ())
1652 = convert_memory_address_addr_space_1 (Pmode
, op
,
1653 ADDR_SPACE_GENERIC
, false,
1668 /* Try to compute the value of a unary operation CODE whose output mode is to
1669 be MODE with input operand OP whose mode was originally OP_MODE.
1670 Return zero if the value cannot be computed. */
1672 simplify_const_unary_operation (enum rtx_code code
, machine_mode mode
,
1673 rtx op
, machine_mode op_mode
)
1675 unsigned int width
= GET_MODE_PRECISION (mode
);
1677 if (code
== VEC_DUPLICATE
)
1679 gcc_assert (VECTOR_MODE_P (mode
));
1680 if (GET_MODE (op
) != VOIDmode
)
1682 if (!VECTOR_MODE_P (GET_MODE (op
)))
1683 gcc_assert (GET_MODE_INNER (mode
) == GET_MODE (op
));
1685 gcc_assert (GET_MODE_INNER (mode
) == GET_MODE_INNER
1688 if (CONST_SCALAR_INT_P (op
) || CONST_DOUBLE_AS_FLOAT_P (op
)
1689 || GET_CODE (op
) == CONST_VECTOR
)
1691 int elt_size
= GET_MODE_UNIT_SIZE (mode
);
1692 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
1693 rtvec v
= rtvec_alloc (n_elts
);
1696 if (GET_CODE (op
) != CONST_VECTOR
)
1697 for (i
= 0; i
< n_elts
; i
++)
1698 RTVEC_ELT (v
, i
) = op
;
1701 machine_mode inmode
= GET_MODE (op
);
1702 int in_elt_size
= GET_MODE_UNIT_SIZE (inmode
);
1703 unsigned in_n_elts
= (GET_MODE_SIZE (inmode
) / in_elt_size
);
1705 gcc_assert (in_n_elts
< n_elts
);
1706 gcc_assert ((n_elts
% in_n_elts
) == 0);
1707 for (i
= 0; i
< n_elts
; i
++)
1708 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (op
, i
% in_n_elts
);
1710 return gen_rtx_CONST_VECTOR (mode
, v
);
1714 if (VECTOR_MODE_P (mode
) && GET_CODE (op
) == CONST_VECTOR
)
1716 int elt_size
= GET_MODE_UNIT_SIZE (mode
);
1717 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
1718 machine_mode opmode
= GET_MODE (op
);
1719 int op_elt_size
= GET_MODE_UNIT_SIZE (opmode
);
1720 unsigned op_n_elts
= (GET_MODE_SIZE (opmode
) / op_elt_size
);
1721 rtvec v
= rtvec_alloc (n_elts
);
1724 gcc_assert (op_n_elts
== n_elts
);
1725 for (i
= 0; i
< n_elts
; i
++)
1727 rtx x
= simplify_unary_operation (code
, GET_MODE_INNER (mode
),
1728 CONST_VECTOR_ELT (op
, i
),
1729 GET_MODE_INNER (opmode
));
1732 RTVEC_ELT (v
, i
) = x
;
1734 return gen_rtx_CONST_VECTOR (mode
, v
);
1737 /* The order of these tests is critical so that, for example, we don't
1738 check the wrong mode (input vs. output) for a conversion operation,
1739 such as FIX. At some point, this should be simplified. */
1741 if (code
== FLOAT
&& CONST_SCALAR_INT_P (op
))
1745 if (op_mode
== VOIDmode
)
1747 /* CONST_INT have VOIDmode as the mode. We assume that all
1748 the bits of the constant are significant, though, this is
1749 a dangerous assumption as many times CONST_INTs are
1750 created and used with garbage in the bits outside of the
1751 precision of the implied mode of the const_int. */
1752 op_mode
= MAX_MODE_INT
;
1755 real_from_integer (&d
, mode
, rtx_mode_t (op
, op_mode
), SIGNED
);
1757 /* Avoid the folding if flag_signaling_nans is on and
1758 operand is a signaling NaN. */
1759 if (HONOR_SNANS (mode
) && REAL_VALUE_ISSIGNALING_NAN (d
))
1762 d
= real_value_truncate (mode
, d
);
1763 return const_double_from_real_value (d
, mode
);
1765 else if (code
== UNSIGNED_FLOAT
&& CONST_SCALAR_INT_P (op
))
1769 if (op_mode
== VOIDmode
)
1771 /* CONST_INT have VOIDmode as the mode. We assume that all
1772 the bits of the constant are significant, though, this is
1773 a dangerous assumption as many times CONST_INTs are
1774 created and used with garbage in the bits outside of the
1775 precision of the implied mode of the const_int. */
1776 op_mode
= MAX_MODE_INT
;
1779 real_from_integer (&d
, mode
, rtx_mode_t (op
, op_mode
), UNSIGNED
);
1781 /* Avoid the folding if flag_signaling_nans is on and
1782 operand is a signaling NaN. */
1783 if (HONOR_SNANS (mode
) && REAL_VALUE_ISSIGNALING_NAN (d
))
1786 d
= real_value_truncate (mode
, d
);
1787 return const_double_from_real_value (d
, mode
);
1790 if (CONST_SCALAR_INT_P (op
) && width
> 0)
1793 machine_mode imode
= op_mode
== VOIDmode
? mode
: op_mode
;
1794 rtx_mode_t op0
= rtx_mode_t (op
, imode
);
1797 #if TARGET_SUPPORTS_WIDE_INT == 0
1798 /* This assert keeps the simplification from producing a result
1799 that cannot be represented in a CONST_DOUBLE but a lot of
1800 upstream callers expect that this function never fails to
1801 simplify something and so you if you added this to the test
1802 above the code would die later anyway. If this assert
1803 happens, you just need to make the port support wide int. */
1804 gcc_assert (width
<= HOST_BITS_PER_DOUBLE_INT
);
1810 result
= wi::bit_not (op0
);
1814 result
= wi::neg (op0
);
1818 result
= wi::abs (op0
);
1822 result
= wi::shwi (wi::ffs (op0
), mode
);
1826 if (wi::ne_p (op0
, 0))
1827 int_value
= wi::clz (op0
);
1828 else if (! CLZ_DEFINED_VALUE_AT_ZERO (mode
, int_value
))
1829 int_value
= GET_MODE_PRECISION (mode
);
1830 result
= wi::shwi (int_value
, mode
);
1834 result
= wi::shwi (wi::clrsb (op0
), mode
);
1838 if (wi::ne_p (op0
, 0))
1839 int_value
= wi::ctz (op0
);
1840 else if (! CTZ_DEFINED_VALUE_AT_ZERO (mode
, int_value
))
1841 int_value
= GET_MODE_PRECISION (mode
);
1842 result
= wi::shwi (int_value
, mode
);
1846 result
= wi::shwi (wi::popcount (op0
), mode
);
1850 result
= wi::shwi (wi::parity (op0
), mode
);
1854 result
= wide_int (op0
).bswap ();
1859 result
= wide_int::from (op0
, width
, UNSIGNED
);
1863 result
= wide_int::from (op0
, width
, SIGNED
);
1871 return immed_wide_int_const (result
, mode
);
1874 else if (CONST_DOUBLE_AS_FLOAT_P (op
)
1875 && SCALAR_FLOAT_MODE_P (mode
)
1876 && SCALAR_FLOAT_MODE_P (GET_MODE (op
)))
1878 REAL_VALUE_TYPE d
= *CONST_DOUBLE_REAL_VALUE (op
);
1884 d
= real_value_abs (&d
);
1887 d
= real_value_negate (&d
);
1889 case FLOAT_TRUNCATE
:
1890 /* Don't perform the operation if flag_signaling_nans is on
1891 and the operand is a signaling NaN. */
1892 if (!(HONOR_SNANS (mode
) && REAL_VALUE_ISSIGNALING_NAN (d
)))
1893 d
= real_value_truncate (mode
, d
);
1896 /* All this does is change the mode, unless changing
1898 /* Don't perform the operation if flag_signaling_nans is on
1899 and the operand is a signaling NaN. */
1900 if (GET_MODE_CLASS (mode
) != GET_MODE_CLASS (GET_MODE (op
))
1901 && !(HONOR_SNANS (mode
) && REAL_VALUE_ISSIGNALING_NAN (d
)))
1902 real_convert (&d
, mode
, &d
);
1905 /* Don't perform the operation if flag_signaling_nans is on
1906 and the operand is a signaling NaN. */
1907 if (!(HONOR_SNANS (mode
) && REAL_VALUE_ISSIGNALING_NAN (d
)))
1908 real_arithmetic (&d
, FIX_TRUNC_EXPR
, &d
, NULL
);
1915 real_to_target (tmp
, &d
, GET_MODE (op
));
1916 for (i
= 0; i
< 4; i
++)
1918 real_from_target (&d
, tmp
, mode
);
1924 return const_double_from_real_value (d
, mode
);
1926 else if (CONST_DOUBLE_AS_FLOAT_P (op
)
1927 && SCALAR_FLOAT_MODE_P (GET_MODE (op
))
1928 && GET_MODE_CLASS (mode
) == MODE_INT
1931 /* Although the overflow semantics of RTL's FIX and UNSIGNED_FIX
1932 operators are intentionally left unspecified (to ease implementation
1933 by target backends), for consistency, this routine implements the
1934 same semantics for constant folding as used by the middle-end. */
1936 /* This was formerly used only for non-IEEE float.
1937 eggert@twinsun.com says it is safe for IEEE also. */
1939 const REAL_VALUE_TYPE
*x
= CONST_DOUBLE_REAL_VALUE (op
);
1940 wide_int wmax
, wmin
;
1941 /* This is part of the abi to real_to_integer, but we check
1942 things before making this call. */
1948 if (REAL_VALUE_ISNAN (*x
))
1951 /* Test against the signed upper bound. */
1952 wmax
= wi::max_value (width
, SIGNED
);
1953 real_from_integer (&t
, VOIDmode
, wmax
, SIGNED
);
1954 if (real_less (&t
, x
))
1955 return immed_wide_int_const (wmax
, mode
);
1957 /* Test against the signed lower bound. */
1958 wmin
= wi::min_value (width
, SIGNED
);
1959 real_from_integer (&t
, VOIDmode
, wmin
, SIGNED
);
1960 if (real_less (x
, &t
))
1961 return immed_wide_int_const (wmin
, mode
);
1963 return immed_wide_int_const (real_to_integer (x
, &fail
, width
),
1967 if (REAL_VALUE_ISNAN (*x
) || REAL_VALUE_NEGATIVE (*x
))
1970 /* Test against the unsigned upper bound. */
1971 wmax
= wi::max_value (width
, UNSIGNED
);
1972 real_from_integer (&t
, VOIDmode
, wmax
, UNSIGNED
);
1973 if (real_less (&t
, x
))
1974 return immed_wide_int_const (wmax
, mode
);
1976 return immed_wide_int_const (real_to_integer (x
, &fail
, width
),
1987 /* Subroutine of simplify_binary_operation to simplify a binary operation
1988 CODE that can commute with byte swapping, with result mode MODE and
1989 operating on OP0 and OP1. CODE is currently one of AND, IOR or XOR.
1990 Return zero if no simplification or canonicalization is possible. */
1993 simplify_byte_swapping_operation (enum rtx_code code
, machine_mode mode
,
1998 /* (op (bswap x) C1)) -> (bswap (op x C2)) with C2 swapped. */
1999 if (GET_CODE (op0
) == BSWAP
&& CONST_SCALAR_INT_P (op1
))
2001 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0),
2002 simplify_gen_unary (BSWAP
, mode
, op1
, mode
));
2003 return simplify_gen_unary (BSWAP
, mode
, tem
, mode
);
2006 /* (op (bswap x) (bswap y)) -> (bswap (op x y)). */
2007 if (GET_CODE (op0
) == BSWAP
&& GET_CODE (op1
) == BSWAP
)
2009 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
2010 return simplify_gen_unary (BSWAP
, mode
, tem
, mode
);
2016 /* Subroutine of simplify_binary_operation to simplify a commutative,
2017 associative binary operation CODE with result mode MODE, operating
2018 on OP0 and OP1. CODE is currently one of PLUS, MULT, AND, IOR, XOR,
2019 SMIN, SMAX, UMIN or UMAX. Return zero if no simplification or
2020 canonicalization is possible. */
2023 simplify_associative_operation (enum rtx_code code
, machine_mode mode
,
2028 /* Linearize the operator to the left. */
2029 if (GET_CODE (op1
) == code
)
2031 /* "(a op b) op (c op d)" becomes "((a op b) op c) op d)". */
2032 if (GET_CODE (op0
) == code
)
2034 tem
= simplify_gen_binary (code
, mode
, op0
, XEXP (op1
, 0));
2035 return simplify_gen_binary (code
, mode
, tem
, XEXP (op1
, 1));
2038 /* "a op (b op c)" becomes "(b op c) op a". */
2039 if (! swap_commutative_operands_p (op1
, op0
))
2040 return simplify_gen_binary (code
, mode
, op1
, op0
);
2042 std::swap (op0
, op1
);
2045 if (GET_CODE (op0
) == code
)
2047 /* Canonicalize "(x op c) op y" as "(x op y) op c". */
2048 if (swap_commutative_operands_p (XEXP (op0
, 1), op1
))
2050 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0), op1
);
2051 return simplify_gen_binary (code
, mode
, tem
, XEXP (op0
, 1));
2054 /* Attempt to simplify "(a op b) op c" as "a op (b op c)". */
2055 tem
= simplify_binary_operation (code
, mode
, XEXP (op0
, 1), op1
);
2057 return simplify_gen_binary (code
, mode
, XEXP (op0
, 0), tem
);
2059 /* Attempt to simplify "(a op b) op c" as "(a op c) op b". */
2060 tem
= simplify_binary_operation (code
, mode
, XEXP (op0
, 0), op1
);
2062 return simplify_gen_binary (code
, mode
, tem
, XEXP (op0
, 1));
2069 /* Simplify a binary operation CODE with result mode MODE, operating on OP0
2070 and OP1. Return 0 if no simplification is possible.
2072 Don't use this for relational operations such as EQ or LT.
2073 Use simplify_relational_operation instead. */
2075 simplify_binary_operation (enum rtx_code code
, machine_mode mode
,
2078 rtx trueop0
, trueop1
;
2081 /* Relational operations don't work here. We must know the mode
2082 of the operands in order to do the comparison correctly.
2083 Assuming a full word can give incorrect results.
2084 Consider comparing 128 with -128 in QImode. */
2085 gcc_assert (GET_RTX_CLASS (code
) != RTX_COMPARE
);
2086 gcc_assert (GET_RTX_CLASS (code
) != RTX_COMM_COMPARE
);
2088 /* Make sure the constant is second. */
2089 if (GET_RTX_CLASS (code
) == RTX_COMM_ARITH
2090 && swap_commutative_operands_p (op0
, op1
))
2091 std::swap (op0
, op1
);
2093 trueop0
= avoid_constant_pool_reference (op0
);
2094 trueop1
= avoid_constant_pool_reference (op1
);
2096 tem
= simplify_const_binary_operation (code
, mode
, trueop0
, trueop1
);
2099 tem
= simplify_binary_operation_1 (code
, mode
, op0
, op1
, trueop0
, trueop1
);
2104 /* If the above steps did not result in a simplification and op0 or op1
2105 were constant pool references, use the referenced constants directly. */
2106 if (trueop0
!= op0
|| trueop1
!= op1
)
2107 return simplify_gen_binary (code
, mode
, trueop0
, trueop1
);
2112 /* Subroutine of simplify_binary_operation. Simplify a binary operation
2113 CODE with result mode MODE, operating on OP0 and OP1. If OP0 and/or
2114 OP1 are constant pool references, TRUEOP0 and TRUEOP1 represent the
2115 actual constants. */
2118 simplify_binary_operation_1 (enum rtx_code code
, machine_mode mode
,
2119 rtx op0
, rtx op1
, rtx trueop0
, rtx trueop1
)
2121 rtx tem
, reversed
, opleft
, opright
;
2123 unsigned int width
= GET_MODE_PRECISION (mode
);
2125 /* Even if we can't compute a constant result,
2126 there are some cases worth simplifying. */
2131 /* Maybe simplify x + 0 to x. The two expressions are equivalent
2132 when x is NaN, infinite, or finite and nonzero. They aren't
2133 when x is -0 and the rounding mode is not towards -infinity,
2134 since (-0) + 0 is then 0. */
2135 if (!HONOR_SIGNED_ZEROS (mode
) && trueop1
== CONST0_RTX (mode
))
2138 /* ((-a) + b) -> (b - a) and similarly for (a + (-b)). These
2139 transformations are safe even for IEEE. */
2140 if (GET_CODE (op0
) == NEG
)
2141 return simplify_gen_binary (MINUS
, mode
, op1
, XEXP (op0
, 0));
2142 else if (GET_CODE (op1
) == NEG
)
2143 return simplify_gen_binary (MINUS
, mode
, op0
, XEXP (op1
, 0));
2145 /* (~a) + 1 -> -a */
2146 if (INTEGRAL_MODE_P (mode
)
2147 && GET_CODE (op0
) == NOT
2148 && trueop1
== const1_rtx
)
2149 return simplify_gen_unary (NEG
, mode
, XEXP (op0
, 0), mode
);
2151 /* Handle both-operands-constant cases. We can only add
2152 CONST_INTs to constants since the sum of relocatable symbols
2153 can't be handled by most assemblers. Don't add CONST_INT
2154 to CONST_INT since overflow won't be computed properly if wider
2155 than HOST_BITS_PER_WIDE_INT. */
2157 if ((GET_CODE (op0
) == CONST
2158 || GET_CODE (op0
) == SYMBOL_REF
2159 || GET_CODE (op0
) == LABEL_REF
)
2160 && CONST_INT_P (op1
))
2161 return plus_constant (mode
, op0
, INTVAL (op1
));
2162 else if ((GET_CODE (op1
) == CONST
2163 || GET_CODE (op1
) == SYMBOL_REF
2164 || GET_CODE (op1
) == LABEL_REF
)
2165 && CONST_INT_P (op0
))
2166 return plus_constant (mode
, op1
, INTVAL (op0
));
2168 /* See if this is something like X * C - X or vice versa or
2169 if the multiplication is written as a shift. If so, we can
2170 distribute and make a new multiply, shift, or maybe just
2171 have X (if C is 2 in the example above). But don't make
2172 something more expensive than we had before. */
2174 if (SCALAR_INT_MODE_P (mode
))
2176 rtx lhs
= op0
, rhs
= op1
;
2178 wide_int coeff0
= wi::one (GET_MODE_PRECISION (mode
));
2179 wide_int coeff1
= wi::one (GET_MODE_PRECISION (mode
));
2181 if (GET_CODE (lhs
) == NEG
)
2183 coeff0
= wi::minus_one (GET_MODE_PRECISION (mode
));
2184 lhs
= XEXP (lhs
, 0);
2186 else if (GET_CODE (lhs
) == MULT
2187 && CONST_SCALAR_INT_P (XEXP (lhs
, 1)))
2189 coeff0
= rtx_mode_t (XEXP (lhs
, 1), mode
);
2190 lhs
= XEXP (lhs
, 0);
2192 else if (GET_CODE (lhs
) == ASHIFT
2193 && CONST_INT_P (XEXP (lhs
, 1))
2194 && INTVAL (XEXP (lhs
, 1)) >= 0
2195 && INTVAL (XEXP (lhs
, 1)) < GET_MODE_PRECISION (mode
))
2197 coeff0
= wi::set_bit_in_zero (INTVAL (XEXP (lhs
, 1)),
2198 GET_MODE_PRECISION (mode
));
2199 lhs
= XEXP (lhs
, 0);
2202 if (GET_CODE (rhs
) == NEG
)
2204 coeff1
= wi::minus_one (GET_MODE_PRECISION (mode
));
2205 rhs
= XEXP (rhs
, 0);
2207 else if (GET_CODE (rhs
) == MULT
2208 && CONST_INT_P (XEXP (rhs
, 1)))
2210 coeff1
= rtx_mode_t (XEXP (rhs
, 1), mode
);
2211 rhs
= XEXP (rhs
, 0);
2213 else if (GET_CODE (rhs
) == ASHIFT
2214 && CONST_INT_P (XEXP (rhs
, 1))
2215 && INTVAL (XEXP (rhs
, 1)) >= 0
2216 && INTVAL (XEXP (rhs
, 1)) < GET_MODE_PRECISION (mode
))
2218 coeff1
= wi::set_bit_in_zero (INTVAL (XEXP (rhs
, 1)),
2219 GET_MODE_PRECISION (mode
));
2220 rhs
= XEXP (rhs
, 0);
2223 if (rtx_equal_p (lhs
, rhs
))
2225 rtx orig
= gen_rtx_PLUS (mode
, op0
, op1
);
2227 bool speed
= optimize_function_for_speed_p (cfun
);
2229 coeff
= immed_wide_int_const (coeff0
+ coeff1
, mode
);
2231 tem
= simplify_gen_binary (MULT
, mode
, lhs
, coeff
);
2232 return (set_src_cost (tem
, mode
, speed
)
2233 <= set_src_cost (orig
, mode
, speed
) ? tem
: 0);
2237 /* (plus (xor X C1) C2) is (xor X (C1^C2)) if C2 is signbit. */
2238 if (CONST_SCALAR_INT_P (op1
)
2239 && GET_CODE (op0
) == XOR
2240 && CONST_SCALAR_INT_P (XEXP (op0
, 1))
2241 && mode_signbit_p (mode
, op1
))
2242 return simplify_gen_binary (XOR
, mode
, XEXP (op0
, 0),
2243 simplify_gen_binary (XOR
, mode
, op1
,
2246 /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)). */
2247 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2248 && GET_CODE (op0
) == MULT
2249 && GET_CODE (XEXP (op0
, 0)) == NEG
)
2253 in1
= XEXP (XEXP (op0
, 0), 0);
2254 in2
= XEXP (op0
, 1);
2255 return simplify_gen_binary (MINUS
, mode
, op1
,
2256 simplify_gen_binary (MULT
, mode
,
2260 /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
2261 C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
2263 if (COMPARISON_P (op0
)
2264 && ((STORE_FLAG_VALUE
== -1 && trueop1
== const1_rtx
)
2265 || (STORE_FLAG_VALUE
== 1 && trueop1
== constm1_rtx
))
2266 && (reversed
= reversed_comparison (op0
, mode
)))
2268 simplify_gen_unary (NEG
, mode
, reversed
, mode
);
2270 /* If one of the operands is a PLUS or a MINUS, see if we can
2271 simplify this by the associative law.
2272 Don't use the associative law for floating point.
2273 The inaccuracy makes it nonassociative,
2274 and subtle programs can break if operations are associated. */
2276 if (INTEGRAL_MODE_P (mode
)
2277 && (plus_minus_operand_p (op0
)
2278 || plus_minus_operand_p (op1
))
2279 && (tem
= simplify_plus_minus (code
, mode
, op0
, op1
)) != 0)
2282 /* Reassociate floating point addition only when the user
2283 specifies associative math operations. */
2284 if (FLOAT_MODE_P (mode
)
2285 && flag_associative_math
)
2287 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2294 /* Convert (compare (gt (flags) 0) (lt (flags) 0)) to (flags). */
2295 if (((GET_CODE (op0
) == GT
&& GET_CODE (op1
) == LT
)
2296 || (GET_CODE (op0
) == GTU
&& GET_CODE (op1
) == LTU
))
2297 && XEXP (op0
, 1) == const0_rtx
&& XEXP (op1
, 1) == const0_rtx
)
2299 rtx xop00
= XEXP (op0
, 0);
2300 rtx xop10
= XEXP (op1
, 0);
2302 if (GET_CODE (xop00
) == CC0
&& GET_CODE (xop10
) == CC0
)
2305 if (REG_P (xop00
) && REG_P (xop10
)
2306 && GET_MODE (xop00
) == GET_MODE (xop10
)
2307 && REGNO (xop00
) == REGNO (xop10
)
2308 && GET_MODE_CLASS (GET_MODE (xop00
)) == MODE_CC
2309 && GET_MODE_CLASS (GET_MODE (xop10
)) == MODE_CC
)
2315 /* We can't assume x-x is 0 even with non-IEEE floating point,
2316 but since it is zero except in very strange circumstances, we
2317 will treat it as zero with -ffinite-math-only. */
2318 if (rtx_equal_p (trueop0
, trueop1
)
2319 && ! side_effects_p (op0
)
2320 && (!FLOAT_MODE_P (mode
) || !HONOR_NANS (mode
)))
2321 return CONST0_RTX (mode
);
2323 /* Change subtraction from zero into negation. (0 - x) is the
2324 same as -x when x is NaN, infinite, or finite and nonzero.
2325 But if the mode has signed zeros, and does not round towards
2326 -infinity, then 0 - 0 is 0, not -0. */
2327 if (!HONOR_SIGNED_ZEROS (mode
) && trueop0
== CONST0_RTX (mode
))
2328 return simplify_gen_unary (NEG
, mode
, op1
, mode
);
2330 /* (-1 - a) is ~a, unless the expression contains symbolic
2331 constants, in which case not retaining additions and
2332 subtractions could cause invalid assembly to be produced. */
2333 if (trueop0
== constm1_rtx
2334 && !contains_symbolic_reference_p (op1
))
2335 return simplify_gen_unary (NOT
, mode
, op1
, mode
);
2337 /* Subtracting 0 has no effect unless the mode has signed zeros
2338 and supports rounding towards -infinity. In such a case,
2340 if (!(HONOR_SIGNED_ZEROS (mode
)
2341 && HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
2342 && trueop1
== CONST0_RTX (mode
))
2345 /* See if this is something like X * C - X or vice versa or
2346 if the multiplication is written as a shift. If so, we can
2347 distribute and make a new multiply, shift, or maybe just
2348 have X (if C is 2 in the example above). But don't make
2349 something more expensive than we had before. */
2351 if (SCALAR_INT_MODE_P (mode
))
2353 rtx lhs
= op0
, rhs
= op1
;
2355 wide_int coeff0
= wi::one (GET_MODE_PRECISION (mode
));
2356 wide_int negcoeff1
= wi::minus_one (GET_MODE_PRECISION (mode
));
2358 if (GET_CODE (lhs
) == NEG
)
2360 coeff0
= wi::minus_one (GET_MODE_PRECISION (mode
));
2361 lhs
= XEXP (lhs
, 0);
2363 else if (GET_CODE (lhs
) == MULT
2364 && CONST_SCALAR_INT_P (XEXP (lhs
, 1)))
2366 coeff0
= rtx_mode_t (XEXP (lhs
, 1), mode
);
2367 lhs
= XEXP (lhs
, 0);
2369 else if (GET_CODE (lhs
) == ASHIFT
2370 && CONST_INT_P (XEXP (lhs
, 1))
2371 && INTVAL (XEXP (lhs
, 1)) >= 0
2372 && INTVAL (XEXP (lhs
, 1)) < GET_MODE_PRECISION (mode
))
2374 coeff0
= wi::set_bit_in_zero (INTVAL (XEXP (lhs
, 1)),
2375 GET_MODE_PRECISION (mode
));
2376 lhs
= XEXP (lhs
, 0);
2379 if (GET_CODE (rhs
) == NEG
)
2381 negcoeff1
= wi::one (GET_MODE_PRECISION (mode
));
2382 rhs
= XEXP (rhs
, 0);
2384 else if (GET_CODE (rhs
) == MULT
2385 && CONST_INT_P (XEXP (rhs
, 1)))
2387 negcoeff1
= wi::neg (rtx_mode_t (XEXP (rhs
, 1), mode
));
2388 rhs
= XEXP (rhs
, 0);
2390 else if (GET_CODE (rhs
) == ASHIFT
2391 && CONST_INT_P (XEXP (rhs
, 1))
2392 && INTVAL (XEXP (rhs
, 1)) >= 0
2393 && INTVAL (XEXP (rhs
, 1)) < GET_MODE_PRECISION (mode
))
2395 negcoeff1
= wi::set_bit_in_zero (INTVAL (XEXP (rhs
, 1)),
2396 GET_MODE_PRECISION (mode
));
2397 negcoeff1
= -negcoeff1
;
2398 rhs
= XEXP (rhs
, 0);
2401 if (rtx_equal_p (lhs
, rhs
))
2403 rtx orig
= gen_rtx_MINUS (mode
, op0
, op1
);
2405 bool speed
= optimize_function_for_speed_p (cfun
);
2407 coeff
= immed_wide_int_const (coeff0
+ negcoeff1
, mode
);
2409 tem
= simplify_gen_binary (MULT
, mode
, lhs
, coeff
);
2410 return (set_src_cost (tem
, mode
, speed
)
2411 <= set_src_cost (orig
, mode
, speed
) ? tem
: 0);
2415 /* (a - (-b)) -> (a + b). True even for IEEE. */
2416 if (GET_CODE (op1
) == NEG
)
2417 return simplify_gen_binary (PLUS
, mode
, op0
, XEXP (op1
, 0));
2419 /* (-x - c) may be simplified as (-c - x). */
2420 if (GET_CODE (op0
) == NEG
2421 && (CONST_SCALAR_INT_P (op1
) || CONST_DOUBLE_AS_FLOAT_P (op1
)))
2423 tem
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
2425 return simplify_gen_binary (MINUS
, mode
, tem
, XEXP (op0
, 0));
2428 /* Don't let a relocatable value get a negative coeff. */
2429 if (CONST_INT_P (op1
) && GET_MODE (op0
) != VOIDmode
)
2430 return simplify_gen_binary (PLUS
, mode
,
2432 neg_const_int (mode
, op1
));
2434 /* (x - (x & y)) -> (x & ~y) */
2435 if (INTEGRAL_MODE_P (mode
) && GET_CODE (op1
) == AND
)
2437 if (rtx_equal_p (op0
, XEXP (op1
, 0)))
2439 tem
= simplify_gen_unary (NOT
, mode
, XEXP (op1
, 1),
2440 GET_MODE (XEXP (op1
, 1)));
2441 return simplify_gen_binary (AND
, mode
, op0
, tem
);
2443 if (rtx_equal_p (op0
, XEXP (op1
, 1)))
2445 tem
= simplify_gen_unary (NOT
, mode
, XEXP (op1
, 0),
2446 GET_MODE (XEXP (op1
, 0)));
2447 return simplify_gen_binary (AND
, mode
, op0
, tem
);
2451 /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
2452 by reversing the comparison code if valid. */
2453 if (STORE_FLAG_VALUE
== 1
2454 && trueop0
== const1_rtx
2455 && COMPARISON_P (op1
)
2456 && (reversed
= reversed_comparison (op1
, mode
)))
2459 /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A). */
2460 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2461 && GET_CODE (op1
) == MULT
2462 && GET_CODE (XEXP (op1
, 0)) == NEG
)
2466 in1
= XEXP (XEXP (op1
, 0), 0);
2467 in2
= XEXP (op1
, 1);
2468 return simplify_gen_binary (PLUS
, mode
,
2469 simplify_gen_binary (MULT
, mode
,
2474 /* Canonicalize (minus (neg A) (mult B C)) to
2475 (minus (mult (neg B) C) A). */
2476 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2477 && GET_CODE (op1
) == MULT
2478 && GET_CODE (op0
) == NEG
)
2482 in1
= simplify_gen_unary (NEG
, mode
, XEXP (op1
, 0), mode
);
2483 in2
= XEXP (op1
, 1);
2484 return simplify_gen_binary (MINUS
, mode
,
2485 simplify_gen_binary (MULT
, mode
,
2490 /* If one of the operands is a PLUS or a MINUS, see if we can
2491 simplify this by the associative law. This will, for example,
2492 canonicalize (minus A (plus B C)) to (minus (minus A B) C).
2493 Don't use the associative law for floating point.
2494 The inaccuracy makes it nonassociative,
2495 and subtle programs can break if operations are associated. */
2497 if (INTEGRAL_MODE_P (mode
)
2498 && (plus_minus_operand_p (op0
)
2499 || plus_minus_operand_p (op1
))
2500 && (tem
= simplify_plus_minus (code
, mode
, op0
, op1
)) != 0)
2505 if (trueop1
== constm1_rtx
)
2506 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
2508 if (GET_CODE (op0
) == NEG
)
2510 rtx temp
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
2511 /* If op1 is a MULT as well and simplify_unary_operation
2512 just moved the NEG to the second operand, simplify_gen_binary
2513 below could through simplify_associative_operation move
2514 the NEG around again and recurse endlessly. */
2516 && GET_CODE (op1
) == MULT
2517 && GET_CODE (temp
) == MULT
2518 && XEXP (op1
, 0) == XEXP (temp
, 0)
2519 && GET_CODE (XEXP (temp
, 1)) == NEG
2520 && XEXP (op1
, 1) == XEXP (XEXP (temp
, 1), 0))
2523 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), temp
);
2525 if (GET_CODE (op1
) == NEG
)
2527 rtx temp
= simplify_unary_operation (NEG
, mode
, op0
, mode
);
2528 /* If op0 is a MULT as well and simplify_unary_operation
2529 just moved the NEG to the second operand, simplify_gen_binary
2530 below could through simplify_associative_operation move
2531 the NEG around again and recurse endlessly. */
2533 && GET_CODE (op0
) == MULT
2534 && GET_CODE (temp
) == MULT
2535 && XEXP (op0
, 0) == XEXP (temp
, 0)
2536 && GET_CODE (XEXP (temp
, 1)) == NEG
2537 && XEXP (op0
, 1) == XEXP (XEXP (temp
, 1), 0))
2540 return simplify_gen_binary (MULT
, mode
, temp
, XEXP (op1
, 0));
2543 /* Maybe simplify x * 0 to 0. The reduction is not valid if
2544 x is NaN, since x * 0 is then also NaN. Nor is it valid
2545 when the mode has signed zeros, since multiplying a negative
2546 number by 0 will give -0, not 0. */
2547 if (!HONOR_NANS (mode
)
2548 && !HONOR_SIGNED_ZEROS (mode
)
2549 && trueop1
== CONST0_RTX (mode
)
2550 && ! side_effects_p (op0
))
2553 /* In IEEE floating point, x*1 is not equivalent to x for
2555 if (!HONOR_SNANS (mode
)
2556 && trueop1
== CONST1_RTX (mode
))
2559 /* Convert multiply by constant power of two into shift. */
2560 if (CONST_SCALAR_INT_P (trueop1
))
2562 val
= wi::exact_log2 (rtx_mode_t (trueop1
, mode
));
2564 return simplify_gen_binary (ASHIFT
, mode
, op0
, GEN_INT (val
));
2567 /* x*2 is x+x and x*(-1) is -x */
2568 if (CONST_DOUBLE_AS_FLOAT_P (trueop1
)
2569 && SCALAR_FLOAT_MODE_P (GET_MODE (trueop1
))
2570 && !DECIMAL_FLOAT_MODE_P (GET_MODE (trueop1
))
2571 && GET_MODE (op0
) == mode
)
2573 const REAL_VALUE_TYPE
*d1
= CONST_DOUBLE_REAL_VALUE (trueop1
);
2575 if (real_equal (d1
, &dconst2
))
2576 return simplify_gen_binary (PLUS
, mode
, op0
, copy_rtx (op0
));
2578 if (!HONOR_SNANS (mode
)
2579 && real_equal (d1
, &dconstm1
))
2580 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
2583 /* Optimize -x * -x as x * x. */
2584 if (FLOAT_MODE_P (mode
)
2585 && GET_CODE (op0
) == NEG
2586 && GET_CODE (op1
) == NEG
2587 && rtx_equal_p (XEXP (op0
, 0), XEXP (op1
, 0))
2588 && !side_effects_p (XEXP (op0
, 0)))
2589 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
2591 /* Likewise, optimize abs(x) * abs(x) as x * x. */
2592 if (SCALAR_FLOAT_MODE_P (mode
)
2593 && GET_CODE (op0
) == ABS
2594 && GET_CODE (op1
) == ABS
2595 && rtx_equal_p (XEXP (op0
, 0), XEXP (op1
, 0))
2596 && !side_effects_p (XEXP (op0
, 0)))
2597 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
2599 /* Reassociate multiplication, but for floating point MULTs
2600 only when the user specifies unsafe math optimizations. */
2601 if (! FLOAT_MODE_P (mode
)
2602 || flag_unsafe_math_optimizations
)
2604 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2611 if (trueop1
== CONST0_RTX (mode
))
2613 if (INTEGRAL_MODE_P (mode
)
2614 && trueop1
== CONSTM1_RTX (mode
)
2615 && !side_effects_p (op0
))
2617 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
2619 /* A | (~A) -> -1 */
2620 if (((GET_CODE (op0
) == NOT
&& rtx_equal_p (XEXP (op0
, 0), op1
))
2621 || (GET_CODE (op1
) == NOT
&& rtx_equal_p (XEXP (op1
, 0), op0
)))
2622 && ! side_effects_p (op0
)
2623 && SCALAR_INT_MODE_P (mode
))
2626 /* (ior A C) is C if all bits of A that might be nonzero are on in C. */
2627 if (CONST_INT_P (op1
)
2628 && HWI_COMPUTABLE_MODE_P (mode
)
2629 && (nonzero_bits (op0
, mode
) & ~UINTVAL (op1
)) == 0
2630 && !side_effects_p (op0
))
2633 /* Canonicalize (X & C1) | C2. */
2634 if (GET_CODE (op0
) == AND
2635 && CONST_INT_P (trueop1
)
2636 && CONST_INT_P (XEXP (op0
, 1)))
2638 HOST_WIDE_INT mask
= GET_MODE_MASK (mode
);
2639 HOST_WIDE_INT c1
= INTVAL (XEXP (op0
, 1));
2640 HOST_WIDE_INT c2
= INTVAL (trueop1
);
2642 /* If (C1&C2) == C1, then (X&C1)|C2 becomes X. */
2644 && !side_effects_p (XEXP (op0
, 0)))
2647 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
2648 if (((c1
|c2
) & mask
) == mask
)
2649 return simplify_gen_binary (IOR
, mode
, XEXP (op0
, 0), op1
);
2651 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2. */
2652 if (((c1
& ~c2
) & mask
) != (c1
& mask
))
2654 tem
= simplify_gen_binary (AND
, mode
, XEXP (op0
, 0),
2655 gen_int_mode (c1
& ~c2
, mode
));
2656 return simplify_gen_binary (IOR
, mode
, tem
, op1
);
2660 /* Convert (A & B) | A to A. */
2661 if (GET_CODE (op0
) == AND
2662 && (rtx_equal_p (XEXP (op0
, 0), op1
)
2663 || rtx_equal_p (XEXP (op0
, 1), op1
))
2664 && ! side_effects_p (XEXP (op0
, 0))
2665 && ! side_effects_p (XEXP (op0
, 1)))
2668 /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
2669 mode size to (rotate A CX). */
2671 if (GET_CODE (op1
) == ASHIFT
2672 || GET_CODE (op1
) == SUBREG
)
2683 if (GET_CODE (opleft
) == ASHIFT
&& GET_CODE (opright
) == LSHIFTRT
2684 && rtx_equal_p (XEXP (opleft
, 0), XEXP (opright
, 0))
2685 && CONST_INT_P (XEXP (opleft
, 1))
2686 && CONST_INT_P (XEXP (opright
, 1))
2687 && (INTVAL (XEXP (opleft
, 1)) + INTVAL (XEXP (opright
, 1))
2688 == GET_MODE_PRECISION (mode
)))
2689 return gen_rtx_ROTATE (mode
, XEXP (opright
, 0), XEXP (opleft
, 1));
2691 /* Same, but for ashift that has been "simplified" to a wider mode
2692 by simplify_shift_const. */
2694 if (GET_CODE (opleft
) == SUBREG
2695 && GET_CODE (SUBREG_REG (opleft
)) == ASHIFT
2696 && GET_CODE (opright
) == LSHIFTRT
2697 && GET_CODE (XEXP (opright
, 0)) == SUBREG
2698 && GET_MODE (opleft
) == GET_MODE (XEXP (opright
, 0))
2699 && SUBREG_BYTE (opleft
) == SUBREG_BYTE (XEXP (opright
, 0))
2700 && (GET_MODE_SIZE (GET_MODE (opleft
))
2701 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (opleft
))))
2702 && rtx_equal_p (XEXP (SUBREG_REG (opleft
), 0),
2703 SUBREG_REG (XEXP (opright
, 0)))
2704 && CONST_INT_P (XEXP (SUBREG_REG (opleft
), 1))
2705 && CONST_INT_P (XEXP (opright
, 1))
2706 && (INTVAL (XEXP (SUBREG_REG (opleft
), 1)) + INTVAL (XEXP (opright
, 1))
2707 == GET_MODE_PRECISION (mode
)))
2708 return gen_rtx_ROTATE (mode
, XEXP (opright
, 0),
2709 XEXP (SUBREG_REG (opleft
), 1));
2711 /* If we have (ior (and (X C1) C2)), simplify this by making
2712 C1 as small as possible if C1 actually changes. */
2713 if (CONST_INT_P (op1
)
2714 && (HWI_COMPUTABLE_MODE_P (mode
)
2715 || INTVAL (op1
) > 0)
2716 && GET_CODE (op0
) == AND
2717 && CONST_INT_P (XEXP (op0
, 1))
2718 && CONST_INT_P (op1
)
2719 && (UINTVAL (XEXP (op0
, 1)) & UINTVAL (op1
)) != 0)
2721 rtx tmp
= simplify_gen_binary (AND
, mode
, XEXP (op0
, 0),
2722 gen_int_mode (UINTVAL (XEXP (op0
, 1))
2725 return simplify_gen_binary (IOR
, mode
, tmp
, op1
);
2728 /* If OP0 is (ashiftrt (plus ...) C), it might actually be
2729 a (sign_extend (plus ...)). Then check if OP1 is a CONST_INT and
2730 the PLUS does not affect any of the bits in OP1: then we can do
2731 the IOR as a PLUS and we can associate. This is valid if OP1
2732 can be safely shifted left C bits. */
2733 if (CONST_INT_P (trueop1
) && GET_CODE (op0
) == ASHIFTRT
2734 && GET_CODE (XEXP (op0
, 0)) == PLUS
2735 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1))
2736 && CONST_INT_P (XEXP (op0
, 1))
2737 && INTVAL (XEXP (op0
, 1)) < HOST_BITS_PER_WIDE_INT
)
2739 int count
= INTVAL (XEXP (op0
, 1));
2740 HOST_WIDE_INT mask
= INTVAL (trueop1
) << count
;
2742 if (mask
>> count
== INTVAL (trueop1
)
2743 && trunc_int_for_mode (mask
, mode
) == mask
2744 && (mask
& nonzero_bits (XEXP (op0
, 0), mode
)) == 0)
2745 return simplify_gen_binary (ASHIFTRT
, mode
,
2746 plus_constant (mode
, XEXP (op0
, 0),
2751 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
2755 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2761 if (trueop1
== CONST0_RTX (mode
))
2763 if (INTEGRAL_MODE_P (mode
) && trueop1
== CONSTM1_RTX (mode
))
2764 return simplify_gen_unary (NOT
, mode
, op0
, mode
);
2765 if (rtx_equal_p (trueop0
, trueop1
)
2766 && ! side_effects_p (op0
)
2767 && GET_MODE_CLASS (mode
) != MODE_CC
)
2768 return CONST0_RTX (mode
);
2770 /* Canonicalize XOR of the most significant bit to PLUS. */
2771 if (CONST_SCALAR_INT_P (op1
)
2772 && mode_signbit_p (mode
, op1
))
2773 return simplify_gen_binary (PLUS
, mode
, op0
, op1
);
2774 /* (xor (plus X C1) C2) is (xor X (C1^C2)) if C1 is signbit. */
2775 if (CONST_SCALAR_INT_P (op1
)
2776 && GET_CODE (op0
) == PLUS
2777 && CONST_SCALAR_INT_P (XEXP (op0
, 1))
2778 && mode_signbit_p (mode
, XEXP (op0
, 1)))
2779 return simplify_gen_binary (XOR
, mode
, XEXP (op0
, 0),
2780 simplify_gen_binary (XOR
, mode
, op1
,
2783 /* If we are XORing two things that have no bits in common,
2784 convert them into an IOR. This helps to detect rotation encoded
2785 using those methods and possibly other simplifications. */
2787 if (HWI_COMPUTABLE_MODE_P (mode
)
2788 && (nonzero_bits (op0
, mode
)
2789 & nonzero_bits (op1
, mode
)) == 0)
2790 return (simplify_gen_binary (IOR
, mode
, op0
, op1
));
2792 /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
2793 Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
2796 int num_negated
= 0;
2798 if (GET_CODE (op0
) == NOT
)
2799 num_negated
++, op0
= XEXP (op0
, 0);
2800 if (GET_CODE (op1
) == NOT
)
2801 num_negated
++, op1
= XEXP (op1
, 0);
2803 if (num_negated
== 2)
2804 return simplify_gen_binary (XOR
, mode
, op0
, op1
);
2805 else if (num_negated
== 1)
2806 return simplify_gen_unary (NOT
, mode
,
2807 simplify_gen_binary (XOR
, mode
, op0
, op1
),
2811 /* Convert (xor (and A B) B) to (and (not A) B). The latter may
2812 correspond to a machine insn or result in further simplifications
2813 if B is a constant. */
2815 if (GET_CODE (op0
) == AND
2816 && rtx_equal_p (XEXP (op0
, 1), op1
)
2817 && ! side_effects_p (op1
))
2818 return simplify_gen_binary (AND
, mode
,
2819 simplify_gen_unary (NOT
, mode
,
2820 XEXP (op0
, 0), mode
),
2823 else if (GET_CODE (op0
) == AND
2824 && rtx_equal_p (XEXP (op0
, 0), op1
)
2825 && ! side_effects_p (op1
))
2826 return simplify_gen_binary (AND
, mode
,
2827 simplify_gen_unary (NOT
, mode
,
2828 XEXP (op0
, 1), mode
),
2831 /* Given (xor (ior (xor A B) C) D), where B, C and D are
2832 constants, simplify to (xor (ior A C) (B&~C)^D), canceling
2833 out bits inverted twice and not set by C. Similarly, given
2834 (xor (and (xor A B) C) D), simplify without inverting C in
2835 the xor operand: (xor (and A C) (B&C)^D).
2837 else if ((GET_CODE (op0
) == IOR
|| GET_CODE (op0
) == AND
)
2838 && GET_CODE (XEXP (op0
, 0)) == XOR
2839 && CONST_INT_P (op1
)
2840 && CONST_INT_P (XEXP (op0
, 1))
2841 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1)))
2843 enum rtx_code op
= GET_CODE (op0
);
2844 rtx a
= XEXP (XEXP (op0
, 0), 0);
2845 rtx b
= XEXP (XEXP (op0
, 0), 1);
2846 rtx c
= XEXP (op0
, 1);
2848 HOST_WIDE_INT bval
= INTVAL (b
);
2849 HOST_WIDE_INT cval
= INTVAL (c
);
2850 HOST_WIDE_INT dval
= INTVAL (d
);
2851 HOST_WIDE_INT xcval
;
2858 return simplify_gen_binary (XOR
, mode
,
2859 simplify_gen_binary (op
, mode
, a
, c
),
2860 gen_int_mode ((bval
& xcval
) ^ dval
,
2864 /* Given (xor (and A B) C), using P^Q == (~P&Q) | (~Q&P),
2865 we can transform like this:
2866 (A&B)^C == ~(A&B)&C | ~C&(A&B)
2867 == (~A|~B)&C | ~C&(A&B) * DeMorgan's Law
2868 == ~A&C | ~B&C | A&(~C&B) * Distribute and re-order
2869 Attempt a few simplifications when B and C are both constants. */
2870 if (GET_CODE (op0
) == AND
2871 && CONST_INT_P (op1
)
2872 && CONST_INT_P (XEXP (op0
, 1)))
2874 rtx a
= XEXP (op0
, 0);
2875 rtx b
= XEXP (op0
, 1);
2877 HOST_WIDE_INT bval
= INTVAL (b
);
2878 HOST_WIDE_INT cval
= INTVAL (c
);
2880 /* Instead of computing ~A&C, we compute its negated value,
2881 ~(A|~C). If it yields -1, ~A&C is zero, so we can
2882 optimize for sure. If it does not simplify, we still try
2883 to compute ~A&C below, but since that always allocates
2884 RTL, we don't try that before committing to returning a
2885 simplified expression. */
2886 rtx n_na_c
= simplify_binary_operation (IOR
, mode
, a
,
2889 if ((~cval
& bval
) == 0)
2891 rtx na_c
= NULL_RTX
;
2893 na_c
= simplify_gen_unary (NOT
, mode
, n_na_c
, mode
);
2896 /* If ~A does not simplify, don't bother: we don't
2897 want to simplify 2 operations into 3, and if na_c
2898 were to simplify with na, n_na_c would have
2899 simplified as well. */
2900 rtx na
= simplify_unary_operation (NOT
, mode
, a
, mode
);
2902 na_c
= simplify_gen_binary (AND
, mode
, na
, c
);
2905 /* Try to simplify ~A&C | ~B&C. */
2906 if (na_c
!= NULL_RTX
)
2907 return simplify_gen_binary (IOR
, mode
, na_c
,
2908 gen_int_mode (~bval
& cval
, mode
));
2912 /* If ~A&C is zero, simplify A&(~C&B) | ~B&C. */
2913 if (n_na_c
== CONSTM1_RTX (mode
))
2915 rtx a_nc_b
= simplify_gen_binary (AND
, mode
, a
,
2916 gen_int_mode (~cval
& bval
,
2918 return simplify_gen_binary (IOR
, mode
, a_nc_b
,
2919 gen_int_mode (~bval
& cval
,
2925 /* If we have (xor (and (xor A B) C) A) with C a constant we can instead
2926 do (ior (and A ~C) (and B C)) which is a machine instruction on some
2927 machines, and also has shorter instruction path length. */
2928 if (GET_CODE (op0
) == AND
2929 && GET_CODE (XEXP (op0
, 0)) == XOR
2930 && CONST_INT_P (XEXP (op0
, 1))
2931 && rtx_equal_p (XEXP (XEXP (op0
, 0), 0), trueop1
))
2934 rtx b
= XEXP (XEXP (op0
, 0), 1);
2935 rtx c
= XEXP (op0
, 1);
2936 rtx nc
= simplify_gen_unary (NOT
, mode
, c
, mode
);
2937 rtx a_nc
= simplify_gen_binary (AND
, mode
, a
, nc
);
2938 rtx bc
= simplify_gen_binary (AND
, mode
, b
, c
);
2939 return simplify_gen_binary (IOR
, mode
, a_nc
, bc
);
2941 /* Similarly, (xor (and (xor A B) C) B) as (ior (and A C) (and B ~C)) */
2942 else if (GET_CODE (op0
) == AND
2943 && GET_CODE (XEXP (op0
, 0)) == XOR
2944 && CONST_INT_P (XEXP (op0
, 1))
2945 && rtx_equal_p (XEXP (XEXP (op0
, 0), 1), trueop1
))
2947 rtx a
= XEXP (XEXP (op0
, 0), 0);
2949 rtx c
= XEXP (op0
, 1);
2950 rtx nc
= simplify_gen_unary (NOT
, mode
, c
, mode
);
2951 rtx b_nc
= simplify_gen_binary (AND
, mode
, b
, nc
);
2952 rtx ac
= simplify_gen_binary (AND
, mode
, a
, c
);
2953 return simplify_gen_binary (IOR
, mode
, ac
, b_nc
);
2956 /* (xor (comparison foo bar) (const_int 1)) can become the reversed
2957 comparison if STORE_FLAG_VALUE is 1. */
2958 if (STORE_FLAG_VALUE
== 1
2959 && trueop1
== const1_rtx
2960 && COMPARISON_P (op0
)
2961 && (reversed
= reversed_comparison (op0
, mode
)))
2964 /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
2965 is (lt foo (const_int 0)), so we can perform the above
2966 simplification if STORE_FLAG_VALUE is 1. */
2968 if (STORE_FLAG_VALUE
== 1
2969 && trueop1
== const1_rtx
2970 && GET_CODE (op0
) == LSHIFTRT
2971 && CONST_INT_P (XEXP (op0
, 1))
2972 && INTVAL (XEXP (op0
, 1)) == GET_MODE_PRECISION (mode
) - 1)
2973 return gen_rtx_GE (mode
, XEXP (op0
, 0), const0_rtx
);
2975 /* (xor (comparison foo bar) (const_int sign-bit))
2976 when STORE_FLAG_VALUE is the sign bit. */
2977 if (val_signbit_p (mode
, STORE_FLAG_VALUE
)
2978 && trueop1
== const_true_rtx
2979 && COMPARISON_P (op0
)
2980 && (reversed
= reversed_comparison (op0
, mode
)))
2983 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
2987 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2993 if (trueop1
== CONST0_RTX (mode
) && ! side_effects_p (op0
))
2995 if (INTEGRAL_MODE_P (mode
) && trueop1
== CONSTM1_RTX (mode
))
2997 if (HWI_COMPUTABLE_MODE_P (mode
))
2999 HOST_WIDE_INT nzop0
= nonzero_bits (trueop0
, mode
);
3000 HOST_WIDE_INT nzop1
;
3001 if (CONST_INT_P (trueop1
))
3003 HOST_WIDE_INT val1
= INTVAL (trueop1
);
3004 /* If we are turning off bits already known off in OP0, we need
3006 if ((nzop0
& ~val1
) == 0)
3009 nzop1
= nonzero_bits (trueop1
, mode
);
3010 /* If we are clearing all the nonzero bits, the result is zero. */
3011 if ((nzop1
& nzop0
) == 0
3012 && !side_effects_p (op0
) && !side_effects_p (op1
))
3013 return CONST0_RTX (mode
);
3015 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
)
3016 && GET_MODE_CLASS (mode
) != MODE_CC
)
3019 if (((GET_CODE (op0
) == NOT
&& rtx_equal_p (XEXP (op0
, 0), op1
))
3020 || (GET_CODE (op1
) == NOT
&& rtx_equal_p (XEXP (op1
, 0), op0
)))
3021 && ! side_effects_p (op0
)
3022 && GET_MODE_CLASS (mode
) != MODE_CC
)
3023 return CONST0_RTX (mode
);
3025 /* Transform (and (extend X) C) into (zero_extend (and X C)) if
3026 there are no nonzero bits of C outside of X's mode. */
3027 if ((GET_CODE (op0
) == SIGN_EXTEND
3028 || GET_CODE (op0
) == ZERO_EXTEND
)
3029 && CONST_INT_P (trueop1
)
3030 && HWI_COMPUTABLE_MODE_P (mode
)
3031 && (~GET_MODE_MASK (GET_MODE (XEXP (op0
, 0)))
3032 & UINTVAL (trueop1
)) == 0)
3034 machine_mode imode
= GET_MODE (XEXP (op0
, 0));
3035 tem
= simplify_gen_binary (AND
, imode
, XEXP (op0
, 0),
3036 gen_int_mode (INTVAL (trueop1
),
3038 return simplify_gen_unary (ZERO_EXTEND
, mode
, tem
, imode
);
3041 /* Transform (and (truncate X) C) into (truncate (and X C)). This way
3042 we might be able to further simplify the AND with X and potentially
3043 remove the truncation altogether. */
3044 if (GET_CODE (op0
) == TRUNCATE
&& CONST_INT_P (trueop1
))
3046 rtx x
= XEXP (op0
, 0);
3047 machine_mode xmode
= GET_MODE (x
);
3048 tem
= simplify_gen_binary (AND
, xmode
, x
,
3049 gen_int_mode (INTVAL (trueop1
), xmode
));
3050 return simplify_gen_unary (TRUNCATE
, mode
, tem
, xmode
);
3053 /* Canonicalize (A | C1) & C2 as (A & C2) | (C1 & C2). */
3054 if (GET_CODE (op0
) == IOR
3055 && CONST_INT_P (trueop1
)
3056 && CONST_INT_P (XEXP (op0
, 1)))
3058 HOST_WIDE_INT tmp
= INTVAL (trueop1
) & INTVAL (XEXP (op0
, 1));
3059 return simplify_gen_binary (IOR
, mode
,
3060 simplify_gen_binary (AND
, mode
,
3061 XEXP (op0
, 0), op1
),
3062 gen_int_mode (tmp
, mode
));
3065 /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
3066 insn (and may simplify more). */
3067 if (GET_CODE (op0
) == XOR
3068 && rtx_equal_p (XEXP (op0
, 0), op1
)
3069 && ! side_effects_p (op1
))
3070 return simplify_gen_binary (AND
, mode
,
3071 simplify_gen_unary (NOT
, mode
,
3072 XEXP (op0
, 1), mode
),
3075 if (GET_CODE (op0
) == XOR
3076 && rtx_equal_p (XEXP (op0
, 1), op1
)
3077 && ! side_effects_p (op1
))
3078 return simplify_gen_binary (AND
, mode
,
3079 simplify_gen_unary (NOT
, mode
,
3080 XEXP (op0
, 0), mode
),
3083 /* Similarly for (~(A ^ B)) & A. */
3084 if (GET_CODE (op0
) == NOT
3085 && GET_CODE (XEXP (op0
, 0)) == XOR
3086 && rtx_equal_p (XEXP (XEXP (op0
, 0), 0), op1
)
3087 && ! side_effects_p (op1
))
3088 return simplify_gen_binary (AND
, mode
, XEXP (XEXP (op0
, 0), 1), op1
);
3090 if (GET_CODE (op0
) == NOT
3091 && GET_CODE (XEXP (op0
, 0)) == XOR
3092 && rtx_equal_p (XEXP (XEXP (op0
, 0), 1), op1
)
3093 && ! side_effects_p (op1
))
3094 return simplify_gen_binary (AND
, mode
, XEXP (XEXP (op0
, 0), 0), op1
);
3096 /* Convert (A | B) & A to A. */
3097 if (GET_CODE (op0
) == IOR
3098 && (rtx_equal_p (XEXP (op0
, 0), op1
)
3099 || rtx_equal_p (XEXP (op0
, 1), op1
))
3100 && ! side_effects_p (XEXP (op0
, 0))
3101 && ! side_effects_p (XEXP (op0
, 1)))
3104 /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
3105 ((A & N) + B) & M -> (A + B) & M
3106 Similarly if (N & M) == 0,
3107 ((A | N) + B) & M -> (A + B) & M
3108 and for - instead of + and/or ^ instead of |.
3109 Also, if (N & M) == 0, then
3110 (A +- N) & M -> A & M. */
3111 if (CONST_INT_P (trueop1
)
3112 && HWI_COMPUTABLE_MODE_P (mode
)
3113 && ~UINTVAL (trueop1
)
3114 && (UINTVAL (trueop1
) & (UINTVAL (trueop1
) + 1)) == 0
3115 && (GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
))
3120 pmop
[0] = XEXP (op0
, 0);
3121 pmop
[1] = XEXP (op0
, 1);
3123 if (CONST_INT_P (pmop
[1])
3124 && (UINTVAL (pmop
[1]) & UINTVAL (trueop1
)) == 0)
3125 return simplify_gen_binary (AND
, mode
, pmop
[0], op1
);
3127 for (which
= 0; which
< 2; which
++)
3130 switch (GET_CODE (tem
))
3133 if (CONST_INT_P (XEXP (tem
, 1))
3134 && (UINTVAL (XEXP (tem
, 1)) & UINTVAL (trueop1
))
3135 == UINTVAL (trueop1
))
3136 pmop
[which
] = XEXP (tem
, 0);
3140 if (CONST_INT_P (XEXP (tem
, 1))
3141 && (UINTVAL (XEXP (tem
, 1)) & UINTVAL (trueop1
)) == 0)
3142 pmop
[which
] = XEXP (tem
, 0);
3149 if (pmop
[0] != XEXP (op0
, 0) || pmop
[1] != XEXP (op0
, 1))
3151 tem
= simplify_gen_binary (GET_CODE (op0
), mode
,
3153 return simplify_gen_binary (code
, mode
, tem
, op1
);
3157 /* (and X (ior (not X) Y) -> (and X Y) */
3158 if (GET_CODE (op1
) == IOR
3159 && GET_CODE (XEXP (op1
, 0)) == NOT
3160 && rtx_equal_p (op0
, XEXP (XEXP (op1
, 0), 0)))
3161 return simplify_gen_binary (AND
, mode
, op0
, XEXP (op1
, 1));
3163 /* (and (ior (not X) Y) X) -> (and X Y) */
3164 if (GET_CODE (op0
) == IOR
3165 && GET_CODE (XEXP (op0
, 0)) == NOT
3166 && rtx_equal_p (op1
, XEXP (XEXP (op0
, 0), 0)))
3167 return simplify_gen_binary (AND
, mode
, op1
, XEXP (op0
, 1));
3169 /* (and X (ior Y (not X)) -> (and X Y) */
3170 if (GET_CODE (op1
) == IOR
3171 && GET_CODE (XEXP (op1
, 1)) == NOT
3172 && rtx_equal_p (op0
, XEXP (XEXP (op1
, 1), 0)))
3173 return simplify_gen_binary (AND
, mode
, op0
, XEXP (op1
, 0));
3175 /* (and (ior Y (not X)) X) -> (and X Y) */
3176 if (GET_CODE (op0
) == IOR
3177 && GET_CODE (XEXP (op0
, 1)) == NOT
3178 && rtx_equal_p (op1
, XEXP (XEXP (op0
, 1), 0)))
3179 return simplify_gen_binary (AND
, mode
, op1
, XEXP (op0
, 0));
3181 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
3185 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3191 /* 0/x is 0 (or x&0 if x has side-effects). */
3192 if (trueop0
== CONST0_RTX (mode
))
3194 if (side_effects_p (op1
))
3195 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3199 if (trueop1
== CONST1_RTX (mode
))
3201 tem
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3205 /* Convert divide by power of two into shift. */
3206 if (CONST_INT_P (trueop1
)
3207 && (val
= exact_log2 (UINTVAL (trueop1
))) > 0)
3208 return simplify_gen_binary (LSHIFTRT
, mode
, op0
, GEN_INT (val
));
3212 /* Handle floating point and integers separately. */
3213 if (SCALAR_FLOAT_MODE_P (mode
))
3215 /* Maybe change 0.0 / x to 0.0. This transformation isn't
3216 safe for modes with NaNs, since 0.0 / 0.0 will then be
3217 NaN rather than 0.0. Nor is it safe for modes with signed
3218 zeros, since dividing 0 by a negative number gives -0.0 */
3219 if (trueop0
== CONST0_RTX (mode
)
3220 && !HONOR_NANS (mode
)
3221 && !HONOR_SIGNED_ZEROS (mode
)
3222 && ! side_effects_p (op1
))
3225 if (trueop1
== CONST1_RTX (mode
)
3226 && !HONOR_SNANS (mode
))
3229 if (CONST_DOUBLE_AS_FLOAT_P (trueop1
)
3230 && trueop1
!= CONST0_RTX (mode
))
3232 const REAL_VALUE_TYPE
*d1
= CONST_DOUBLE_REAL_VALUE (trueop1
);
3235 if (real_equal (d1
, &dconstm1
)
3236 && !HONOR_SNANS (mode
))
3237 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
3239 /* Change FP division by a constant into multiplication.
3240 Only do this with -freciprocal-math. */
3241 if (flag_reciprocal_math
3242 && !real_equal (d1
, &dconst0
))
3245 real_arithmetic (&d
, RDIV_EXPR
, &dconst1
, d1
);
3246 tem
= const_double_from_real_value (d
, mode
);
3247 return simplify_gen_binary (MULT
, mode
, op0
, tem
);
3251 else if (SCALAR_INT_MODE_P (mode
))
3253 /* 0/x is 0 (or x&0 if x has side-effects). */
3254 if (trueop0
== CONST0_RTX (mode
)
3255 && !cfun
->can_throw_non_call_exceptions
)
3257 if (side_effects_p (op1
))
3258 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3262 if (trueop1
== CONST1_RTX (mode
))
3264 tem
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3269 if (trueop1
== constm1_rtx
)
3271 rtx x
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3273 return simplify_gen_unary (NEG
, mode
, x
, mode
);
3279 /* 0%x is 0 (or x&0 if x has side-effects). */
3280 if (trueop0
== CONST0_RTX (mode
))
3282 if (side_effects_p (op1
))
3283 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3286 /* x%1 is 0 (of x&0 if x has side-effects). */
3287 if (trueop1
== CONST1_RTX (mode
))
3289 if (side_effects_p (op0
))
3290 return simplify_gen_binary (AND
, mode
, op0
, CONST0_RTX (mode
));
3291 return CONST0_RTX (mode
);
3293 /* Implement modulus by power of two as AND. */
3294 if (CONST_INT_P (trueop1
)
3295 && exact_log2 (UINTVAL (trueop1
)) > 0)
3296 return simplify_gen_binary (AND
, mode
, op0
,
3297 gen_int_mode (INTVAL (op1
) - 1, mode
));
3301 /* 0%x is 0 (or x&0 if x has side-effects). */
3302 if (trueop0
== CONST0_RTX (mode
))
3304 if (side_effects_p (op1
))
3305 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3308 /* x%1 and x%-1 is 0 (or x&0 if x has side-effects). */
3309 if (trueop1
== CONST1_RTX (mode
) || trueop1
== constm1_rtx
)
3311 if (side_effects_p (op0
))
3312 return simplify_gen_binary (AND
, mode
, op0
, CONST0_RTX (mode
));
3313 return CONST0_RTX (mode
);
3319 /* Canonicalize rotates by constant amount. If op1 is bitsize / 2,
3320 prefer left rotation, if op1 is from bitsize / 2 + 1 to
3321 bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
3323 #if defined(HAVE_rotate) && defined(HAVE_rotatert)
3324 if (CONST_INT_P (trueop1
)
3325 && IN_RANGE (INTVAL (trueop1
),
3326 GET_MODE_PRECISION (mode
) / 2 + (code
== ROTATE
),
3327 GET_MODE_PRECISION (mode
) - 1))
3328 return simplify_gen_binary (code
== ROTATE
? ROTATERT
: ROTATE
,
3329 mode
, op0
, GEN_INT (GET_MODE_PRECISION (mode
)
3330 - INTVAL (trueop1
)));
3334 if (trueop1
== CONST0_RTX (mode
))
3336 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3338 /* Rotating ~0 always results in ~0. */
3339 if (CONST_INT_P (trueop0
) && width
<= HOST_BITS_PER_WIDE_INT
3340 && UINTVAL (trueop0
) == GET_MODE_MASK (mode
)
3341 && ! side_effects_p (op1
))
3345 scalar constants c1, c2
3346 size (M2) > size (M1)
3347 c1 == size (M2) - size (M1)
3349 (ashiftrt:M1 (subreg:M1 (lshiftrt:M2 (reg:M2) (const_int <c1>))
3353 (subreg:M1 (ashiftrt:M2 (reg:M2) (const_int <c1 + c2>))
3355 if (code
== ASHIFTRT
3356 && !VECTOR_MODE_P (mode
)
3358 && CONST_INT_P (op1
)
3359 && GET_CODE (SUBREG_REG (op0
)) == LSHIFTRT
3360 && !VECTOR_MODE_P (GET_MODE (SUBREG_REG (op0
)))
3361 && CONST_INT_P (XEXP (SUBREG_REG (op0
), 1))
3362 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0
)))
3363 > GET_MODE_BITSIZE (mode
))
3364 && (INTVAL (XEXP (SUBREG_REG (op0
), 1))
3365 == (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0
)))
3366 - GET_MODE_BITSIZE (mode
)))
3367 && subreg_lowpart_p (op0
))
3369 rtx tmp
= GEN_INT (INTVAL (XEXP (SUBREG_REG (op0
), 1))
3371 machine_mode inner_mode
= GET_MODE (SUBREG_REG (op0
));
3372 tmp
= simplify_gen_binary (ASHIFTRT
,
3373 GET_MODE (SUBREG_REG (op0
)),
3374 XEXP (SUBREG_REG (op0
), 0),
3376 return lowpart_subreg (mode
, tmp
, inner_mode
);
3379 if (SHIFT_COUNT_TRUNCATED
&& CONST_INT_P (op1
))
3381 val
= INTVAL (op1
) & (GET_MODE_PRECISION (mode
) - 1);
3382 if (val
!= INTVAL (op1
))
3383 return simplify_gen_binary (code
, mode
, op0
, GEN_INT (val
));
3390 if (trueop1
== CONST0_RTX (mode
))
3392 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3394 goto canonicalize_shift
;
3397 if (trueop1
== CONST0_RTX (mode
))
3399 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3401 /* Optimize (lshiftrt (clz X) C) as (eq X 0). */
3402 if (GET_CODE (op0
) == CLZ
3403 && CONST_INT_P (trueop1
)
3404 && STORE_FLAG_VALUE
== 1
3405 && INTVAL (trueop1
) < (HOST_WIDE_INT
)width
)
3407 machine_mode imode
= GET_MODE (XEXP (op0
, 0));
3408 unsigned HOST_WIDE_INT zero_val
= 0;
3410 if (CLZ_DEFINED_VALUE_AT_ZERO (imode
, zero_val
)
3411 && zero_val
== GET_MODE_PRECISION (imode
)
3412 && INTVAL (trueop1
) == exact_log2 (zero_val
))
3413 return simplify_gen_relational (EQ
, mode
, imode
,
3414 XEXP (op0
, 0), const0_rtx
);
3416 goto canonicalize_shift
;
3419 if (width
<= HOST_BITS_PER_WIDE_INT
3420 && mode_signbit_p (mode
, trueop1
)
3421 && ! side_effects_p (op0
))
3423 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3425 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3431 if (width
<= HOST_BITS_PER_WIDE_INT
3432 && CONST_INT_P (trueop1
)
3433 && (UINTVAL (trueop1
) == GET_MODE_MASK (mode
) >> 1)
3434 && ! side_effects_p (op0
))
3436 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3438 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3444 if (trueop1
== CONST0_RTX (mode
) && ! side_effects_p (op0
))
3446 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3448 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3454 if (trueop1
== constm1_rtx
&& ! side_effects_p (op0
))
3456 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3458 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3471 /* ??? There are simplifications that can be done. */
3475 if (!VECTOR_MODE_P (mode
))
3477 gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0
)));
3478 gcc_assert (mode
== GET_MODE_INNER (GET_MODE (trueop0
)));
3479 gcc_assert (GET_CODE (trueop1
) == PARALLEL
);
3480 gcc_assert (XVECLEN (trueop1
, 0) == 1);
3481 gcc_assert (CONST_INT_P (XVECEXP (trueop1
, 0, 0)));
3483 if (GET_CODE (trueop0
) == CONST_VECTOR
)
3484 return CONST_VECTOR_ELT (trueop0
, INTVAL (XVECEXP
3487 /* Extract a scalar element from a nested VEC_SELECT expression
3488 (with optional nested VEC_CONCAT expression). Some targets
3489 (i386) extract scalar element from a vector using chain of
3490 nested VEC_SELECT expressions. When input operand is a memory
3491 operand, this operation can be simplified to a simple scalar
3492 load from an offseted memory address. */
3493 if (GET_CODE (trueop0
) == VEC_SELECT
)
3495 rtx op0
= XEXP (trueop0
, 0);
3496 rtx op1
= XEXP (trueop0
, 1);
3498 machine_mode opmode
= GET_MODE (op0
);
3499 int elt_size
= GET_MODE_UNIT_SIZE (opmode
);
3500 int n_elts
= GET_MODE_SIZE (opmode
) / elt_size
;
3502 int i
= INTVAL (XVECEXP (trueop1
, 0, 0));
3508 gcc_assert (GET_CODE (op1
) == PARALLEL
);
3509 gcc_assert (i
< n_elts
);
3511 /* Select element, pointed by nested selector. */
3512 elem
= INTVAL (XVECEXP (op1
, 0, i
));
3514 /* Handle the case when nested VEC_SELECT wraps VEC_CONCAT. */
3515 if (GET_CODE (op0
) == VEC_CONCAT
)
3517 rtx op00
= XEXP (op0
, 0);
3518 rtx op01
= XEXP (op0
, 1);
3520 machine_mode mode00
, mode01
;
3521 int n_elts00
, n_elts01
;
3523 mode00
= GET_MODE (op00
);
3524 mode01
= GET_MODE (op01
);
3526 /* Find out number of elements of each operand. */
3527 if (VECTOR_MODE_P (mode00
))
3529 elt_size
= GET_MODE_UNIT_SIZE (mode00
);
3530 n_elts00
= GET_MODE_SIZE (mode00
) / elt_size
;
3535 if (VECTOR_MODE_P (mode01
))
3537 elt_size
= GET_MODE_UNIT_SIZE (mode01
);
3538 n_elts01
= GET_MODE_SIZE (mode01
) / elt_size
;
3543 gcc_assert (n_elts
== n_elts00
+ n_elts01
);
3545 /* Select correct operand of VEC_CONCAT
3546 and adjust selector. */
3547 if (elem
< n_elts01
)
3558 vec
= rtvec_alloc (1);
3559 RTVEC_ELT (vec
, 0) = GEN_INT (elem
);
3561 tmp
= gen_rtx_fmt_ee (code
, mode
,
3562 tmp_op
, gen_rtx_PARALLEL (VOIDmode
, vec
));
3565 if (GET_CODE (trueop0
) == VEC_DUPLICATE
3566 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3567 return XEXP (trueop0
, 0);
3571 gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0
)));
3572 gcc_assert (GET_MODE_INNER (mode
)
3573 == GET_MODE_INNER (GET_MODE (trueop0
)));
3574 gcc_assert (GET_CODE (trueop1
) == PARALLEL
);
3576 if (GET_CODE (trueop0
) == CONST_VECTOR
)
3578 int elt_size
= GET_MODE_UNIT_SIZE (mode
);
3579 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
3580 rtvec v
= rtvec_alloc (n_elts
);
3583 gcc_assert (XVECLEN (trueop1
, 0) == (int) n_elts
);
3584 for (i
= 0; i
< n_elts
; i
++)
3586 rtx x
= XVECEXP (trueop1
, 0, i
);
3588 gcc_assert (CONST_INT_P (x
));
3589 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop0
,
3593 return gen_rtx_CONST_VECTOR (mode
, v
);
3596 /* Recognize the identity. */
3597 if (GET_MODE (trueop0
) == mode
)
3599 bool maybe_ident
= true;
3600 for (int i
= 0; i
< XVECLEN (trueop1
, 0); i
++)
3602 rtx j
= XVECEXP (trueop1
, 0, i
);
3603 if (!CONST_INT_P (j
) || INTVAL (j
) != i
)
3605 maybe_ident
= false;
3613 /* If we build {a,b} then permute it, build the result directly. */
3614 if (XVECLEN (trueop1
, 0) == 2
3615 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3616 && CONST_INT_P (XVECEXP (trueop1
, 0, 1))
3617 && GET_CODE (trueop0
) == VEC_CONCAT
3618 && GET_CODE (XEXP (trueop0
, 0)) == VEC_CONCAT
3619 && GET_MODE (XEXP (trueop0
, 0)) == mode
3620 && GET_CODE (XEXP (trueop0
, 1)) == VEC_CONCAT
3621 && GET_MODE (XEXP (trueop0
, 1)) == mode
)
3623 unsigned int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3624 unsigned int i1
= INTVAL (XVECEXP (trueop1
, 0, 1));
3627 gcc_assert (i0
< 4 && i1
< 4);
3628 subop0
= XEXP (XEXP (trueop0
, i0
/ 2), i0
% 2);
3629 subop1
= XEXP (XEXP (trueop0
, i1
/ 2), i1
% 2);
3631 return simplify_gen_binary (VEC_CONCAT
, mode
, subop0
, subop1
);
3634 if (XVECLEN (trueop1
, 0) == 2
3635 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3636 && CONST_INT_P (XVECEXP (trueop1
, 0, 1))
3637 && GET_CODE (trueop0
) == VEC_CONCAT
3638 && GET_MODE (trueop0
) == mode
)
3640 unsigned int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3641 unsigned int i1
= INTVAL (XVECEXP (trueop1
, 0, 1));
3644 gcc_assert (i0
< 2 && i1
< 2);
3645 subop0
= XEXP (trueop0
, i0
);
3646 subop1
= XEXP (trueop0
, i1
);
3648 return simplify_gen_binary (VEC_CONCAT
, mode
, subop0
, subop1
);
3651 /* If we select one half of a vec_concat, return that. */
3652 if (GET_CODE (trueop0
) == VEC_CONCAT
3653 && CONST_INT_P (XVECEXP (trueop1
, 0, 0)))
3655 rtx subop0
= XEXP (trueop0
, 0);
3656 rtx subop1
= XEXP (trueop0
, 1);
3657 machine_mode mode0
= GET_MODE (subop0
);
3658 machine_mode mode1
= GET_MODE (subop1
);
3659 int li
= GET_MODE_UNIT_SIZE (mode0
);
3660 int l0
= GET_MODE_SIZE (mode0
) / li
;
3661 int l1
= GET_MODE_SIZE (mode1
) / li
;
3662 int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3663 if (i0
== 0 && !side_effects_p (op1
) && mode
== mode0
)
3665 bool success
= true;
3666 for (int i
= 1; i
< l0
; ++i
)
3668 rtx j
= XVECEXP (trueop1
, 0, i
);
3669 if (!CONST_INT_P (j
) || INTVAL (j
) != i
)
3678 if (i0
== l0
&& !side_effects_p (op0
) && mode
== mode1
)
3680 bool success
= true;
3681 for (int i
= 1; i
< l1
; ++i
)
3683 rtx j
= XVECEXP (trueop1
, 0, i
);
3684 if (!CONST_INT_P (j
) || INTVAL (j
) != i0
+ i
)
3696 if (XVECLEN (trueop1
, 0) == 1
3697 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3698 && GET_CODE (trueop0
) == VEC_CONCAT
)
3701 int offset
= INTVAL (XVECEXP (trueop1
, 0, 0)) * GET_MODE_SIZE (mode
);
3703 /* Try to find the element in the VEC_CONCAT. */
3704 while (GET_MODE (vec
) != mode
3705 && GET_CODE (vec
) == VEC_CONCAT
)
3707 HOST_WIDE_INT vec_size
;
3709 if (CONST_INT_P (XEXP (vec
, 0)))
3711 /* vec_concat of two const_ints doesn't make sense with
3712 respect to modes. */
3713 if (CONST_INT_P (XEXP (vec
, 1)))
3716 vec_size
= GET_MODE_SIZE (GET_MODE (trueop0
))
3717 - GET_MODE_SIZE (GET_MODE (XEXP (vec
, 1)));
3720 vec_size
= GET_MODE_SIZE (GET_MODE (XEXP (vec
, 0)));
3722 if (offset
< vec_size
)
3723 vec
= XEXP (vec
, 0);
3727 vec
= XEXP (vec
, 1);
3729 vec
= avoid_constant_pool_reference (vec
);
3732 if (GET_MODE (vec
) == mode
)
3736 /* If we select elements in a vec_merge that all come from the same
3737 operand, select from that operand directly. */
3738 if (GET_CODE (op0
) == VEC_MERGE
)
3740 rtx trueop02
= avoid_constant_pool_reference (XEXP (op0
, 2));
3741 if (CONST_INT_P (trueop02
))
3743 unsigned HOST_WIDE_INT sel
= UINTVAL (trueop02
);
3744 bool all_operand0
= true;
3745 bool all_operand1
= true;
3746 for (int i
= 0; i
< XVECLEN (trueop1
, 0); i
++)
3748 rtx j
= XVECEXP (trueop1
, 0, i
);
3749 if (sel
& (HOST_WIDE_INT_1U
<< UINTVAL (j
)))
3750 all_operand1
= false;
3752 all_operand0
= false;
3754 if (all_operand0
&& !side_effects_p (XEXP (op0
, 1)))
3755 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (op0
, 0), op1
);
3756 if (all_operand1
&& !side_effects_p (XEXP (op0
, 0)))
3757 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (op0
, 1), op1
);
3761 /* If we have two nested selects that are inverses of each
3762 other, replace them with the source operand. */
3763 if (GET_CODE (trueop0
) == VEC_SELECT
3764 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3766 rtx op0_subop1
= XEXP (trueop0
, 1);
3767 gcc_assert (GET_CODE (op0_subop1
) == PARALLEL
);
3768 gcc_assert (XVECLEN (trueop1
, 0) == GET_MODE_NUNITS (mode
));
3770 /* Apply the outer ordering vector to the inner one. (The inner
3771 ordering vector is expressly permitted to be of a different
3772 length than the outer one.) If the result is { 0, 1, ..., n-1 }
3773 then the two VEC_SELECTs cancel. */
3774 for (int i
= 0; i
< XVECLEN (trueop1
, 0); ++i
)
3776 rtx x
= XVECEXP (trueop1
, 0, i
);
3777 if (!CONST_INT_P (x
))
3779 rtx y
= XVECEXP (op0_subop1
, 0, INTVAL (x
));
3780 if (!CONST_INT_P (y
) || i
!= INTVAL (y
))
3783 return XEXP (trueop0
, 0);
3789 machine_mode op0_mode
= (GET_MODE (trueop0
) != VOIDmode
3790 ? GET_MODE (trueop0
)
3791 : GET_MODE_INNER (mode
));
3792 machine_mode op1_mode
= (GET_MODE (trueop1
) != VOIDmode
3793 ? GET_MODE (trueop1
)
3794 : GET_MODE_INNER (mode
));
3796 gcc_assert (VECTOR_MODE_P (mode
));
3797 gcc_assert (GET_MODE_SIZE (op0_mode
) + GET_MODE_SIZE (op1_mode
)
3798 == GET_MODE_SIZE (mode
));
3800 if (VECTOR_MODE_P (op0_mode
))
3801 gcc_assert (GET_MODE_INNER (mode
)
3802 == GET_MODE_INNER (op0_mode
));
3804 gcc_assert (GET_MODE_INNER (mode
) == op0_mode
);
3806 if (VECTOR_MODE_P (op1_mode
))
3807 gcc_assert (GET_MODE_INNER (mode
)
3808 == GET_MODE_INNER (op1_mode
));
3810 gcc_assert (GET_MODE_INNER (mode
) == op1_mode
);
3812 if ((GET_CODE (trueop0
) == CONST_VECTOR
3813 || CONST_SCALAR_INT_P (trueop0
)
3814 || CONST_DOUBLE_AS_FLOAT_P (trueop0
))
3815 && (GET_CODE (trueop1
) == CONST_VECTOR
3816 || CONST_SCALAR_INT_P (trueop1
)
3817 || CONST_DOUBLE_AS_FLOAT_P (trueop1
)))
3819 int elt_size
= GET_MODE_UNIT_SIZE (mode
);
3820 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
3821 rtvec v
= rtvec_alloc (n_elts
);
3823 unsigned in_n_elts
= 1;
3825 if (VECTOR_MODE_P (op0_mode
))
3826 in_n_elts
= (GET_MODE_SIZE (op0_mode
) / elt_size
);
3827 for (i
= 0; i
< n_elts
; i
++)
3831 if (!VECTOR_MODE_P (op0_mode
))
3832 RTVEC_ELT (v
, i
) = trueop0
;
3834 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop0
, i
);
3838 if (!VECTOR_MODE_P (op1_mode
))
3839 RTVEC_ELT (v
, i
) = trueop1
;
3841 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop1
,
3846 return gen_rtx_CONST_VECTOR (mode
, v
);
3849 /* Try to merge two VEC_SELECTs from the same vector into a single one.
3850 Restrict the transformation to avoid generating a VEC_SELECT with a
3851 mode unrelated to its operand. */
3852 if (GET_CODE (trueop0
) == VEC_SELECT
3853 && GET_CODE (trueop1
) == VEC_SELECT
3854 && rtx_equal_p (XEXP (trueop0
, 0), XEXP (trueop1
, 0))
3855 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3857 rtx par0
= XEXP (trueop0
, 1);
3858 rtx par1
= XEXP (trueop1
, 1);
3859 int len0
= XVECLEN (par0
, 0);
3860 int len1
= XVECLEN (par1
, 0);
3861 rtvec vec
= rtvec_alloc (len0
+ len1
);
3862 for (int i
= 0; i
< len0
; i
++)
3863 RTVEC_ELT (vec
, i
) = XVECEXP (par0
, 0, i
);
3864 for (int i
= 0; i
< len1
; i
++)
3865 RTVEC_ELT (vec
, len0
+ i
) = XVECEXP (par1
, 0, i
);
3866 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (trueop0
, 0),
3867 gen_rtx_PARALLEL (VOIDmode
, vec
));
3880 simplify_const_binary_operation (enum rtx_code code
, machine_mode mode
,
3883 unsigned int width
= GET_MODE_PRECISION (mode
);
3885 if (VECTOR_MODE_P (mode
)
3886 && code
!= VEC_CONCAT
3887 && GET_CODE (op0
) == CONST_VECTOR
3888 && GET_CODE (op1
) == CONST_VECTOR
)
3890 unsigned n_elts
= GET_MODE_NUNITS (mode
);
3891 machine_mode op0mode
= GET_MODE (op0
);
3892 unsigned op0_n_elts
= GET_MODE_NUNITS (op0mode
);
3893 machine_mode op1mode
= GET_MODE (op1
);
3894 unsigned op1_n_elts
= GET_MODE_NUNITS (op1mode
);
3895 rtvec v
= rtvec_alloc (n_elts
);
3898 gcc_assert (op0_n_elts
== n_elts
);
3899 gcc_assert (op1_n_elts
== n_elts
);
3900 for (i
= 0; i
< n_elts
; i
++)
3902 rtx x
= simplify_binary_operation (code
, GET_MODE_INNER (mode
),
3903 CONST_VECTOR_ELT (op0
, i
),
3904 CONST_VECTOR_ELT (op1
, i
));
3907 RTVEC_ELT (v
, i
) = x
;
3910 return gen_rtx_CONST_VECTOR (mode
, v
);
3913 if (VECTOR_MODE_P (mode
)
3914 && code
== VEC_CONCAT
3915 && (CONST_SCALAR_INT_P (op0
)
3916 || GET_CODE (op0
) == CONST_FIXED
3917 || CONST_DOUBLE_AS_FLOAT_P (op0
))
3918 && (CONST_SCALAR_INT_P (op1
)
3919 || CONST_DOUBLE_AS_FLOAT_P (op1
)
3920 || GET_CODE (op1
) == CONST_FIXED
))
3922 unsigned n_elts
= GET_MODE_NUNITS (mode
);
3923 rtvec v
= rtvec_alloc (n_elts
);
3925 gcc_assert (n_elts
>= 2);
3928 gcc_assert (GET_CODE (op0
) != CONST_VECTOR
);
3929 gcc_assert (GET_CODE (op1
) != CONST_VECTOR
);
3931 RTVEC_ELT (v
, 0) = op0
;
3932 RTVEC_ELT (v
, 1) = op1
;
3936 unsigned op0_n_elts
= GET_MODE_NUNITS (GET_MODE (op0
));
3937 unsigned op1_n_elts
= GET_MODE_NUNITS (GET_MODE (op1
));
3940 gcc_assert (GET_CODE (op0
) == CONST_VECTOR
);
3941 gcc_assert (GET_CODE (op1
) == CONST_VECTOR
);
3942 gcc_assert (op0_n_elts
+ op1_n_elts
== n_elts
);
3944 for (i
= 0; i
< op0_n_elts
; ++i
)
3945 RTVEC_ELT (v
, i
) = XVECEXP (op0
, 0, i
);
3946 for (i
= 0; i
< op1_n_elts
; ++i
)
3947 RTVEC_ELT (v
, op0_n_elts
+i
) = XVECEXP (op1
, 0, i
);
3950 return gen_rtx_CONST_VECTOR (mode
, v
);
3953 if (SCALAR_FLOAT_MODE_P (mode
)
3954 && CONST_DOUBLE_AS_FLOAT_P (op0
)
3955 && CONST_DOUBLE_AS_FLOAT_P (op1
)
3956 && mode
== GET_MODE (op0
) && mode
== GET_MODE (op1
))
3967 real_to_target (tmp0
, CONST_DOUBLE_REAL_VALUE (op0
),
3969 real_to_target (tmp1
, CONST_DOUBLE_REAL_VALUE (op1
),
3971 for (i
= 0; i
< 4; i
++)
3988 real_from_target (&r
, tmp0
, mode
);
3989 return const_double_from_real_value (r
, mode
);
3993 REAL_VALUE_TYPE f0
, f1
, value
, result
;
3994 const REAL_VALUE_TYPE
*opr0
, *opr1
;
3997 opr0
= CONST_DOUBLE_REAL_VALUE (op0
);
3998 opr1
= CONST_DOUBLE_REAL_VALUE (op1
);
4000 if (HONOR_SNANS (mode
)
4001 && (REAL_VALUE_ISSIGNALING_NAN (*opr0
)
4002 || REAL_VALUE_ISSIGNALING_NAN (*opr1
)))
4005 real_convert (&f0
, mode
, opr0
);
4006 real_convert (&f1
, mode
, opr1
);
4009 && real_equal (&f1
, &dconst0
)
4010 && (flag_trapping_math
|| ! MODE_HAS_INFINITIES (mode
)))
4013 if (MODE_HAS_INFINITIES (mode
) && HONOR_NANS (mode
)
4014 && flag_trapping_math
4015 && REAL_VALUE_ISINF (f0
) && REAL_VALUE_ISINF (f1
))
4017 int s0
= REAL_VALUE_NEGATIVE (f0
);
4018 int s1
= REAL_VALUE_NEGATIVE (f1
);
4023 /* Inf + -Inf = NaN plus exception. */
4028 /* Inf - Inf = NaN plus exception. */
4033 /* Inf / Inf = NaN plus exception. */
4040 if (code
== MULT
&& MODE_HAS_INFINITIES (mode
) && HONOR_NANS (mode
)
4041 && flag_trapping_math
4042 && ((REAL_VALUE_ISINF (f0
) && real_equal (&f1
, &dconst0
))
4043 || (REAL_VALUE_ISINF (f1
)
4044 && real_equal (&f0
, &dconst0
))))
4045 /* Inf * 0 = NaN plus exception. */
4048 inexact
= real_arithmetic (&value
, rtx_to_tree_code (code
),
4050 real_convert (&result
, mode
, &value
);
4052 /* Don't constant fold this floating point operation if
4053 the result has overflowed and flag_trapping_math. */
4055 if (flag_trapping_math
4056 && MODE_HAS_INFINITIES (mode
)
4057 && REAL_VALUE_ISINF (result
)
4058 && !REAL_VALUE_ISINF (f0
)
4059 && !REAL_VALUE_ISINF (f1
))
4060 /* Overflow plus exception. */
4063 /* Don't constant fold this floating point operation if the
4064 result may dependent upon the run-time rounding mode and
4065 flag_rounding_math is set, or if GCC's software emulation
4066 is unable to accurately represent the result. */
4068 if ((flag_rounding_math
4069 || (MODE_COMPOSITE_P (mode
) && !flag_unsafe_math_optimizations
))
4070 && (inexact
|| !real_identical (&result
, &value
)))
4073 return const_double_from_real_value (result
, mode
);
4077 /* We can fold some multi-word operations. */
4078 if ((GET_MODE_CLASS (mode
) == MODE_INT
4079 || GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
4080 && CONST_SCALAR_INT_P (op0
)
4081 && CONST_SCALAR_INT_P (op1
))
4085 rtx_mode_t pop0
= rtx_mode_t (op0
, mode
);
4086 rtx_mode_t pop1
= rtx_mode_t (op1
, mode
);
4088 #if TARGET_SUPPORTS_WIDE_INT == 0
4089 /* This assert keeps the simplification from producing a result
4090 that cannot be represented in a CONST_DOUBLE but a lot of
4091 upstream callers expect that this function never fails to
4092 simplify something and so you if you added this to the test
4093 above the code would die later anyway. If this assert
4094 happens, you just need to make the port support wide int. */
4095 gcc_assert (width
<= HOST_BITS_PER_DOUBLE_INT
);
4100 result
= wi::sub (pop0
, pop1
);
4104 result
= wi::add (pop0
, pop1
);
4108 result
= wi::mul (pop0
, pop1
);
4112 result
= wi::div_trunc (pop0
, pop1
, SIGNED
, &overflow
);
4118 result
= wi::mod_trunc (pop0
, pop1
, SIGNED
, &overflow
);
4124 result
= wi::div_trunc (pop0
, pop1
, UNSIGNED
, &overflow
);
4130 result
= wi::mod_trunc (pop0
, pop1
, UNSIGNED
, &overflow
);
4136 result
= wi::bit_and (pop0
, pop1
);
4140 result
= wi::bit_or (pop0
, pop1
);
4144 result
= wi::bit_xor (pop0
, pop1
);
4148 result
= wi::smin (pop0
, pop1
);
4152 result
= wi::smax (pop0
, pop1
);
4156 result
= wi::umin (pop0
, pop1
);
4160 result
= wi::umax (pop0
, pop1
);
4167 wide_int wop1
= pop1
;
4168 if (SHIFT_COUNT_TRUNCATED
)
4169 wop1
= wi::umod_trunc (wop1
, width
);
4170 else if (wi::geu_p (wop1
, width
))
4176 result
= wi::lrshift (pop0
, wop1
);
4180 result
= wi::arshift (pop0
, wop1
);
4184 result
= wi::lshift (pop0
, wop1
);
4195 if (wi::neg_p (pop1
))
4201 result
= wi::lrotate (pop0
, pop1
);
4205 result
= wi::rrotate (pop0
, pop1
);
4216 return immed_wide_int_const (result
, mode
);
4224 /* Return a positive integer if X should sort after Y. The value
4225 returned is 1 if and only if X and Y are both regs. */
4228 simplify_plus_minus_op_data_cmp (rtx x
, rtx y
)
4232 result
= (commutative_operand_precedence (y
)
4233 - commutative_operand_precedence (x
));
4235 return result
+ result
;
4237 /* Group together equal REGs to do more simplification. */
4238 if (REG_P (x
) && REG_P (y
))
4239 return REGNO (x
) > REGNO (y
);
4244 /* Simplify and canonicalize a PLUS or MINUS, at least one of whose
4245 operands may be another PLUS or MINUS.
4247 Rather than test for specific case, we do this by a brute-force method
4248 and do all possible simplifications until no more changes occur. Then
4249 we rebuild the operation.
4251 May return NULL_RTX when no changes were made. */
4254 simplify_plus_minus (enum rtx_code code
, machine_mode mode
, rtx op0
,
4257 struct simplify_plus_minus_op_data
4264 int changed
, n_constants
, canonicalized
= 0;
4267 memset (ops
, 0, sizeof ops
);
4269 /* Set up the two operands and then expand them until nothing has been
4270 changed. If we run out of room in our array, give up; this should
4271 almost never happen. */
4276 ops
[1].neg
= (code
== MINUS
);
4283 for (i
= 0; i
< n_ops
; i
++)
4285 rtx this_op
= ops
[i
].op
;
4286 int this_neg
= ops
[i
].neg
;
4287 enum rtx_code this_code
= GET_CODE (this_op
);
4293 if (n_ops
== ARRAY_SIZE (ops
))
4296 ops
[n_ops
].op
= XEXP (this_op
, 1);
4297 ops
[n_ops
].neg
= (this_code
== MINUS
) ^ this_neg
;
4300 ops
[i
].op
= XEXP (this_op
, 0);
4302 /* If this operand was negated then we will potentially
4303 canonicalize the expression. Similarly if we don't
4304 place the operands adjacent we're re-ordering the
4305 expression and thus might be performing a
4306 canonicalization. Ignore register re-ordering.
4307 ??? It might be better to shuffle the ops array here,
4308 but then (plus (plus (A, B), plus (C, D))) wouldn't
4309 be seen as non-canonical. */
4312 && !(REG_P (ops
[i
].op
) && REG_P (ops
[n_ops
- 1].op
))))
4317 ops
[i
].op
= XEXP (this_op
, 0);
4318 ops
[i
].neg
= ! this_neg
;
4324 if (n_ops
!= ARRAY_SIZE (ops
)
4325 && GET_CODE (XEXP (this_op
, 0)) == PLUS
4326 && CONSTANT_P (XEXP (XEXP (this_op
, 0), 0))
4327 && CONSTANT_P (XEXP (XEXP (this_op
, 0), 1)))
4329 ops
[i
].op
= XEXP (XEXP (this_op
, 0), 0);
4330 ops
[n_ops
].op
= XEXP (XEXP (this_op
, 0), 1);
4331 ops
[n_ops
].neg
= this_neg
;
4339 /* ~a -> (-a - 1) */
4340 if (n_ops
!= ARRAY_SIZE (ops
))
4342 ops
[n_ops
].op
= CONSTM1_RTX (mode
);
4343 ops
[n_ops
++].neg
= this_neg
;
4344 ops
[i
].op
= XEXP (this_op
, 0);
4345 ops
[i
].neg
= !this_neg
;
4355 ops
[i
].op
= neg_const_int (mode
, this_op
);
4369 if (n_constants
> 1)
4372 gcc_assert (n_ops
>= 2);
4374 /* If we only have two operands, we can avoid the loops. */
4377 enum rtx_code code
= ops
[0].neg
|| ops
[1].neg
? MINUS
: PLUS
;
4380 /* Get the two operands. Be careful with the order, especially for
4381 the cases where code == MINUS. */
4382 if (ops
[0].neg
&& ops
[1].neg
)
4384 lhs
= gen_rtx_NEG (mode
, ops
[0].op
);
4387 else if (ops
[0].neg
)
4398 return simplify_const_binary_operation (code
, mode
, lhs
, rhs
);
4401 /* Now simplify each pair of operands until nothing changes. */
4404 /* Insertion sort is good enough for a small array. */
4405 for (i
= 1; i
< n_ops
; i
++)
4407 struct simplify_plus_minus_op_data save
;
4411 cmp
= simplify_plus_minus_op_data_cmp (ops
[j
].op
, ops
[i
].op
);
4414 /* Just swapping registers doesn't count as canonicalization. */
4420 ops
[j
+ 1] = ops
[j
];
4422 && simplify_plus_minus_op_data_cmp (ops
[j
].op
, save
.op
) > 0);
4427 for (i
= n_ops
- 1; i
> 0; i
--)
4428 for (j
= i
- 1; j
>= 0; j
--)
4430 rtx lhs
= ops
[j
].op
, rhs
= ops
[i
].op
;
4431 int lneg
= ops
[j
].neg
, rneg
= ops
[i
].neg
;
4433 if (lhs
!= 0 && rhs
!= 0)
4435 enum rtx_code ncode
= PLUS
;
4441 std::swap (lhs
, rhs
);
4443 else if (swap_commutative_operands_p (lhs
, rhs
))
4444 std::swap (lhs
, rhs
);
4446 if ((GET_CODE (lhs
) == CONST
|| CONST_INT_P (lhs
))
4447 && (GET_CODE (rhs
) == CONST
|| CONST_INT_P (rhs
)))
4449 rtx tem_lhs
, tem_rhs
;
4451 tem_lhs
= GET_CODE (lhs
) == CONST
? XEXP (lhs
, 0) : lhs
;
4452 tem_rhs
= GET_CODE (rhs
) == CONST
? XEXP (rhs
, 0) : rhs
;
4453 tem
= simplify_binary_operation (ncode
, mode
, tem_lhs
,
4456 if (tem
&& !CONSTANT_P (tem
))
4457 tem
= gen_rtx_CONST (GET_MODE (tem
), tem
);
4460 tem
= simplify_binary_operation (ncode
, mode
, lhs
, rhs
);
4464 /* Reject "simplifications" that just wrap the two
4465 arguments in a CONST. Failure to do so can result
4466 in infinite recursion with simplify_binary_operation
4467 when it calls us to simplify CONST operations.
4468 Also, if we find such a simplification, don't try
4469 any more combinations with this rhs: We must have
4470 something like symbol+offset, ie. one of the
4471 trivial CONST expressions we handle later. */
4472 if (GET_CODE (tem
) == CONST
4473 && GET_CODE (XEXP (tem
, 0)) == ncode
4474 && XEXP (XEXP (tem
, 0), 0) == lhs
4475 && XEXP (XEXP (tem
, 0), 1) == rhs
)
4478 if (GET_CODE (tem
) == NEG
)
4479 tem
= XEXP (tem
, 0), lneg
= !lneg
;
4480 if (CONST_INT_P (tem
) && lneg
)
4481 tem
= neg_const_int (mode
, tem
), lneg
= 0;
4485 ops
[j
].op
= NULL_RTX
;
4495 /* Pack all the operands to the lower-numbered entries. */
4496 for (i
= 0, j
= 0; j
< n_ops
; j
++)
4505 /* If nothing changed, check that rematerialization of rtl instructions
4506 is still required. */
4509 /* Perform rematerialization if only all operands are registers and
4510 all operations are PLUS. */
4511 /* ??? Also disallow (non-global, non-frame) fixed registers to work
4512 around rs6000 and how it uses the CA register. See PR67145. */
4513 for (i
= 0; i
< n_ops
; i
++)
4515 || !REG_P (ops
[i
].op
)
4516 || (REGNO (ops
[i
].op
) < FIRST_PSEUDO_REGISTER
4517 && fixed_regs
[REGNO (ops
[i
].op
)]
4518 && !global_regs
[REGNO (ops
[i
].op
)]
4519 && ops
[i
].op
!= frame_pointer_rtx
4520 && ops
[i
].op
!= arg_pointer_rtx
4521 && ops
[i
].op
!= stack_pointer_rtx
))
4526 /* Create (minus -C X) instead of (neg (const (plus X C))). */
4528 && CONST_INT_P (ops
[1].op
)
4529 && CONSTANT_P (ops
[0].op
)
4531 return gen_rtx_fmt_ee (MINUS
, mode
, ops
[1].op
, ops
[0].op
);
4533 /* We suppressed creation of trivial CONST expressions in the
4534 combination loop to avoid recursion. Create one manually now.
4535 The combination loop should have ensured that there is exactly
4536 one CONST_INT, and the sort will have ensured that it is last
4537 in the array and that any other constant will be next-to-last. */
4540 && CONST_INT_P (ops
[n_ops
- 1].op
)
4541 && CONSTANT_P (ops
[n_ops
- 2].op
))
4543 rtx value
= ops
[n_ops
- 1].op
;
4544 if (ops
[n_ops
- 1].neg
^ ops
[n_ops
- 2].neg
)
4545 value
= neg_const_int (mode
, value
);
4546 if (CONST_INT_P (value
))
4548 ops
[n_ops
- 2].op
= plus_constant (mode
, ops
[n_ops
- 2].op
,
4554 /* Put a non-negated operand first, if possible. */
4556 for (i
= 0; i
< n_ops
&& ops
[i
].neg
; i
++)
4559 ops
[0].op
= gen_rtx_NEG (mode
, ops
[0].op
);
4568 /* Now make the result by performing the requested operations. */
4571 for (i
= 1; i
< n_ops
; i
++)
4572 result
= gen_rtx_fmt_ee (ops
[i
].neg
? MINUS
: PLUS
,
4573 mode
, result
, ops
[i
].op
);
4578 /* Check whether an operand is suitable for calling simplify_plus_minus. */
4580 plus_minus_operand_p (const_rtx x
)
4582 return GET_CODE (x
) == PLUS
4583 || GET_CODE (x
) == MINUS
4584 || (GET_CODE (x
) == CONST
4585 && GET_CODE (XEXP (x
, 0)) == PLUS
4586 && CONSTANT_P (XEXP (XEXP (x
, 0), 0))
4587 && CONSTANT_P (XEXP (XEXP (x
, 0), 1)));
4590 /* Like simplify_binary_operation except used for relational operators.
4591 MODE is the mode of the result. If MODE is VOIDmode, both operands must
4592 not also be VOIDmode.
4594 CMP_MODE specifies in which mode the comparison is done in, so it is
4595 the mode of the operands. If CMP_MODE is VOIDmode, it is taken from
4596 the operands or, if both are VOIDmode, the operands are compared in
4597 "infinite precision". */
4599 simplify_relational_operation (enum rtx_code code
, machine_mode mode
,
4600 machine_mode cmp_mode
, rtx op0
, rtx op1
)
4602 rtx tem
, trueop0
, trueop1
;
4604 if (cmp_mode
== VOIDmode
)
4605 cmp_mode
= GET_MODE (op0
);
4606 if (cmp_mode
== VOIDmode
)
4607 cmp_mode
= GET_MODE (op1
);
4609 tem
= simplify_const_relational_operation (code
, cmp_mode
, op0
, op1
);
4612 if (SCALAR_FLOAT_MODE_P (mode
))
4614 if (tem
== const0_rtx
)
4615 return CONST0_RTX (mode
);
4616 #ifdef FLOAT_STORE_FLAG_VALUE
4618 REAL_VALUE_TYPE val
;
4619 val
= FLOAT_STORE_FLAG_VALUE (mode
);
4620 return const_double_from_real_value (val
, mode
);
4626 if (VECTOR_MODE_P (mode
))
4628 if (tem
== const0_rtx
)
4629 return CONST0_RTX (mode
);
4630 #ifdef VECTOR_STORE_FLAG_VALUE
4635 rtx val
= VECTOR_STORE_FLAG_VALUE (mode
);
4636 if (val
== NULL_RTX
)
4638 if (val
== const1_rtx
)
4639 return CONST1_RTX (mode
);
4641 units
= GET_MODE_NUNITS (mode
);
4642 v
= rtvec_alloc (units
);
4643 for (i
= 0; i
< units
; i
++)
4644 RTVEC_ELT (v
, i
) = val
;
4645 return gen_rtx_raw_CONST_VECTOR (mode
, v
);
4655 /* For the following tests, ensure const0_rtx is op1. */
4656 if (swap_commutative_operands_p (op0
, op1
)
4657 || (op0
== const0_rtx
&& op1
!= const0_rtx
))
4658 std::swap (op0
, op1
), code
= swap_condition (code
);
4660 /* If op0 is a compare, extract the comparison arguments from it. */
4661 if (GET_CODE (op0
) == COMPARE
&& op1
== const0_rtx
)
4662 return simplify_gen_relational (code
, mode
, VOIDmode
,
4663 XEXP (op0
, 0), XEXP (op0
, 1));
4665 if (GET_MODE_CLASS (cmp_mode
) == MODE_CC
4669 trueop0
= avoid_constant_pool_reference (op0
);
4670 trueop1
= avoid_constant_pool_reference (op1
);
4671 return simplify_relational_operation_1 (code
, mode
, cmp_mode
,
4675 /* This part of simplify_relational_operation is only used when CMP_MODE
4676 is not in class MODE_CC (i.e. it is a real comparison).
4678 MODE is the mode of the result, while CMP_MODE specifies in which
4679 mode the comparison is done in, so it is the mode of the operands. */
4682 simplify_relational_operation_1 (enum rtx_code code
, machine_mode mode
,
4683 machine_mode cmp_mode
, rtx op0
, rtx op1
)
4685 enum rtx_code op0code
= GET_CODE (op0
);
4687 if (op1
== const0_rtx
&& COMPARISON_P (op0
))
4689 /* If op0 is a comparison, extract the comparison arguments
4693 if (GET_MODE (op0
) == mode
)
4694 return simplify_rtx (op0
);
4696 return simplify_gen_relational (GET_CODE (op0
), mode
, VOIDmode
,
4697 XEXP (op0
, 0), XEXP (op0
, 1));
4699 else if (code
== EQ
)
4701 enum rtx_code new_code
= reversed_comparison_code (op0
, NULL
);
4702 if (new_code
!= UNKNOWN
)
4703 return simplify_gen_relational (new_code
, mode
, VOIDmode
,
4704 XEXP (op0
, 0), XEXP (op0
, 1));
4708 /* (LTU/GEU (PLUS a C) C), where C is constant, can be simplified to
4709 (GEU/LTU a -C). Likewise for (LTU/GEU (PLUS a C) a). */
4710 if ((code
== LTU
|| code
== GEU
)
4711 && GET_CODE (op0
) == PLUS
4712 && CONST_INT_P (XEXP (op0
, 1))
4713 && (rtx_equal_p (op1
, XEXP (op0
, 0))
4714 || rtx_equal_p (op1
, XEXP (op0
, 1)))
4715 /* (LTU/GEU (PLUS a 0) 0) is not the same as (GEU/LTU a 0). */
4716 && XEXP (op0
, 1) != const0_rtx
)
4719 = simplify_gen_unary (NEG
, cmp_mode
, XEXP (op0
, 1), cmp_mode
);
4720 return simplify_gen_relational ((code
== LTU
? GEU
: LTU
), mode
,
4721 cmp_mode
, XEXP (op0
, 0), new_cmp
);
4724 /* (GTU (PLUS a C) (C - 1)) where C is a non-zero constant can be
4725 transformed into (LTU a -C). */
4726 if (code
== GTU
&& GET_CODE (op0
) == PLUS
&& CONST_INT_P (op1
)
4727 && CONST_INT_P (XEXP (op0
, 1))
4728 && (UINTVAL (op1
) == UINTVAL (XEXP (op0
, 1)) - 1)
4729 && XEXP (op0
, 1) != const0_rtx
)
4732 = simplify_gen_unary (NEG
, cmp_mode
, XEXP (op0
, 1), cmp_mode
);
4733 return simplify_gen_relational (LTU
, mode
, cmp_mode
,
4734 XEXP (op0
, 0), new_cmp
);
4737 /* Canonicalize (LTU/GEU (PLUS a b) b) as (LTU/GEU (PLUS a b) a). */
4738 if ((code
== LTU
|| code
== GEU
)
4739 && GET_CODE (op0
) == PLUS
4740 && rtx_equal_p (op1
, XEXP (op0
, 1))
4741 /* Don't recurse "infinitely" for (LTU/GEU (PLUS b b) b). */
4742 && !rtx_equal_p (op1
, XEXP (op0
, 0)))
4743 return simplify_gen_relational (code
, mode
, cmp_mode
, op0
,
4744 copy_rtx (XEXP (op0
, 0)));
4746 if (op1
== const0_rtx
)
4748 /* Canonicalize (GTU x 0) as (NE x 0). */
4750 return simplify_gen_relational (NE
, mode
, cmp_mode
, op0
, op1
);
4751 /* Canonicalize (LEU x 0) as (EQ x 0). */
4753 return simplify_gen_relational (EQ
, mode
, cmp_mode
, op0
, op1
);
4755 else if (op1
== const1_rtx
)
4760 /* Canonicalize (GE x 1) as (GT x 0). */
4761 return simplify_gen_relational (GT
, mode
, cmp_mode
,
4764 /* Canonicalize (GEU x 1) as (NE x 0). */
4765 return simplify_gen_relational (NE
, mode
, cmp_mode
,
4768 /* Canonicalize (LT x 1) as (LE x 0). */
4769 return simplify_gen_relational (LE
, mode
, cmp_mode
,
4772 /* Canonicalize (LTU x 1) as (EQ x 0). */
4773 return simplify_gen_relational (EQ
, mode
, cmp_mode
,
4779 else if (op1
== constm1_rtx
)
4781 /* Canonicalize (LE x -1) as (LT x 0). */
4783 return simplify_gen_relational (LT
, mode
, cmp_mode
, op0
, const0_rtx
);
4784 /* Canonicalize (GT x -1) as (GE x 0). */
4786 return simplify_gen_relational (GE
, mode
, cmp_mode
, op0
, const0_rtx
);
4789 /* (eq/ne (plus x cst1) cst2) simplifies to (eq/ne x (cst2 - cst1)) */
4790 if ((code
== EQ
|| code
== NE
)
4791 && (op0code
== PLUS
|| op0code
== MINUS
)
4793 && CONSTANT_P (XEXP (op0
, 1))
4794 && (INTEGRAL_MODE_P (cmp_mode
) || flag_unsafe_math_optimizations
))
4796 rtx x
= XEXP (op0
, 0);
4797 rtx c
= XEXP (op0
, 1);
4798 enum rtx_code invcode
= op0code
== PLUS
? MINUS
: PLUS
;
4799 rtx tem
= simplify_gen_binary (invcode
, cmp_mode
, op1
, c
);
4801 /* Detect an infinite recursive condition, where we oscillate at this
4802 simplification case between:
4803 A + B == C <---> C - B == A,
4804 where A, B, and C are all constants with non-simplifiable expressions,
4805 usually SYMBOL_REFs. */
4806 if (GET_CODE (tem
) == invcode
4808 && rtx_equal_p (c
, XEXP (tem
, 1)))
4811 return simplify_gen_relational (code
, mode
, cmp_mode
, x
, tem
);
4814 /* (ne:SI (zero_extract:SI FOO (const_int 1) BAR) (const_int 0))) is
4815 the same as (zero_extract:SI FOO (const_int 1) BAR). */
4817 && op1
== const0_rtx
4818 && GET_MODE_CLASS (mode
) == MODE_INT
4819 && cmp_mode
!= VOIDmode
4820 /* ??? Work-around BImode bugs in the ia64 backend. */
4822 && cmp_mode
!= BImode
4823 && nonzero_bits (op0
, cmp_mode
) == 1
4824 && STORE_FLAG_VALUE
== 1)
4825 return GET_MODE_SIZE (mode
) > GET_MODE_SIZE (cmp_mode
)
4826 ? simplify_gen_unary (ZERO_EXTEND
, mode
, op0
, cmp_mode
)
4827 : lowpart_subreg (mode
, op0
, cmp_mode
);
4829 /* (eq/ne (xor x y) 0) simplifies to (eq/ne x y). */
4830 if ((code
== EQ
|| code
== NE
)
4831 && op1
== const0_rtx
4833 return simplify_gen_relational (code
, mode
, cmp_mode
,
4834 XEXP (op0
, 0), XEXP (op0
, 1));
4836 /* (eq/ne (xor x y) x) simplifies to (eq/ne y 0). */
4837 if ((code
== EQ
|| code
== NE
)
4839 && rtx_equal_p (XEXP (op0
, 0), op1
)
4840 && !side_effects_p (XEXP (op0
, 0)))
4841 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 1),
4844 /* Likewise (eq/ne (xor x y) y) simplifies to (eq/ne x 0). */
4845 if ((code
== EQ
|| code
== NE
)
4847 && rtx_equal_p (XEXP (op0
, 1), op1
)
4848 && !side_effects_p (XEXP (op0
, 1)))
4849 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4852 /* (eq/ne (xor x C1) C2) simplifies to (eq/ne x (C1^C2)). */
4853 if ((code
== EQ
|| code
== NE
)
4855 && CONST_SCALAR_INT_P (op1
)
4856 && CONST_SCALAR_INT_P (XEXP (op0
, 1)))
4857 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4858 simplify_gen_binary (XOR
, cmp_mode
,
4859 XEXP (op0
, 1), op1
));
4861 /* (eq/ne (and x y) x) simplifies to (eq/ne (and (not y) x) 0), which
4862 can be implemented with a BICS instruction on some targets, or
4863 constant-folded if y is a constant. */
4864 if ((code
== EQ
|| code
== NE
)
4866 && rtx_equal_p (XEXP (op0
, 0), op1
)
4867 && !side_effects_p (op1
)
4868 && op1
!= CONST0_RTX (cmp_mode
))
4870 rtx not_y
= simplify_gen_unary (NOT
, cmp_mode
, XEXP (op0
, 1), cmp_mode
);
4871 rtx lhs
= simplify_gen_binary (AND
, cmp_mode
, not_y
, XEXP (op0
, 0));
4873 return simplify_gen_relational (code
, mode
, cmp_mode
, lhs
,
4874 CONST0_RTX (cmp_mode
));
4877 /* Likewise for (eq/ne (and x y) y). */
4878 if ((code
== EQ
|| code
== NE
)
4880 && rtx_equal_p (XEXP (op0
, 1), op1
)
4881 && !side_effects_p (op1
)
4882 && op1
!= CONST0_RTX (cmp_mode
))
4884 rtx not_x
= simplify_gen_unary (NOT
, cmp_mode
, XEXP (op0
, 0), cmp_mode
);
4885 rtx lhs
= simplify_gen_binary (AND
, cmp_mode
, not_x
, XEXP (op0
, 1));
4887 return simplify_gen_relational (code
, mode
, cmp_mode
, lhs
,
4888 CONST0_RTX (cmp_mode
));
4891 /* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped. */
4892 if ((code
== EQ
|| code
== NE
)
4893 && GET_CODE (op0
) == BSWAP
4894 && CONST_SCALAR_INT_P (op1
))
4895 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4896 simplify_gen_unary (BSWAP
, cmp_mode
,
4899 /* (eq/ne (bswap x) (bswap y)) simplifies to (eq/ne x y). */
4900 if ((code
== EQ
|| code
== NE
)
4901 && GET_CODE (op0
) == BSWAP
4902 && GET_CODE (op1
) == BSWAP
)
4903 return simplify_gen_relational (code
, mode
, cmp_mode
,
4904 XEXP (op0
, 0), XEXP (op1
, 0));
4906 if (op0code
== POPCOUNT
&& op1
== const0_rtx
)
4912 /* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)). */
4913 return simplify_gen_relational (EQ
, mode
, GET_MODE (XEXP (op0
, 0)),
4914 XEXP (op0
, 0), const0_rtx
);
4919 /* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)). */
4920 return simplify_gen_relational (NE
, mode
, GET_MODE (XEXP (op0
, 0)),
4921 XEXP (op0
, 0), const0_rtx
);
4940 /* Convert the known results for EQ, LT, GT, LTU, GTU contained in
4941 KNOWN_RESULT to a CONST_INT, based on the requested comparison CODE
4942 For KNOWN_RESULT to make sense it should be either CMP_EQ, or the
4943 logical OR of one of (CMP_LT, CMP_GT) and one of (CMP_LTU, CMP_GTU).
4944 For floating-point comparisons, assume that the operands were ordered. */
4947 comparison_result (enum rtx_code code
, int known_results
)
4953 return (known_results
& CMP_EQ
) ? const_true_rtx
: const0_rtx
;
4956 return (known_results
& CMP_EQ
) ? const0_rtx
: const_true_rtx
;
4960 return (known_results
& CMP_LT
) ? const_true_rtx
: const0_rtx
;
4963 return (known_results
& CMP_LT
) ? const0_rtx
: const_true_rtx
;
4967 return (known_results
& CMP_GT
) ? const_true_rtx
: const0_rtx
;
4970 return (known_results
& CMP_GT
) ? const0_rtx
: const_true_rtx
;
4973 return (known_results
& CMP_LTU
) ? const_true_rtx
: const0_rtx
;
4975 return (known_results
& CMP_LTU
) ? const0_rtx
: const_true_rtx
;
4978 return (known_results
& CMP_GTU
) ? const_true_rtx
: const0_rtx
;
4980 return (known_results
& CMP_GTU
) ? const0_rtx
: const_true_rtx
;
4983 return const_true_rtx
;
4991 /* Check if the given comparison (done in the given MODE) is actually
4992 a tautology or a contradiction. If the mode is VOID_mode, the
4993 comparison is done in "infinite precision". If no simplification
4994 is possible, this function returns zero. Otherwise, it returns
4995 either const_true_rtx or const0_rtx. */
4998 simplify_const_relational_operation (enum rtx_code code
,
5006 gcc_assert (mode
!= VOIDmode
5007 || (GET_MODE (op0
) == VOIDmode
5008 && GET_MODE (op1
) == VOIDmode
));
5010 /* If op0 is a compare, extract the comparison arguments from it. */
5011 if (GET_CODE (op0
) == COMPARE
&& op1
== const0_rtx
)
5013 op1
= XEXP (op0
, 1);
5014 op0
= XEXP (op0
, 0);
5016 if (GET_MODE (op0
) != VOIDmode
)
5017 mode
= GET_MODE (op0
);
5018 else if (GET_MODE (op1
) != VOIDmode
)
5019 mode
= GET_MODE (op1
);
5024 /* We can't simplify MODE_CC values since we don't know what the
5025 actual comparison is. */
5026 if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
|| CC0_P (op0
))
5029 /* Make sure the constant is second. */
5030 if (swap_commutative_operands_p (op0
, op1
))
5032 std::swap (op0
, op1
);
5033 code
= swap_condition (code
);
5036 trueop0
= avoid_constant_pool_reference (op0
);
5037 trueop1
= avoid_constant_pool_reference (op1
);
5039 /* For integer comparisons of A and B maybe we can simplify A - B and can
5040 then simplify a comparison of that with zero. If A and B are both either
5041 a register or a CONST_INT, this can't help; testing for these cases will
5042 prevent infinite recursion here and speed things up.
5044 We can only do this for EQ and NE comparisons as otherwise we may
5045 lose or introduce overflow which we cannot disregard as undefined as
5046 we do not know the signedness of the operation on either the left or
5047 the right hand side of the comparison. */
5049 if (INTEGRAL_MODE_P (mode
) && trueop1
!= const0_rtx
5050 && (code
== EQ
|| code
== NE
)
5051 && ! ((REG_P (op0
) || CONST_INT_P (trueop0
))
5052 && (REG_P (op1
) || CONST_INT_P (trueop1
)))
5053 && 0 != (tem
= simplify_binary_operation (MINUS
, mode
, op0
, op1
))
5054 /* We cannot do this if tem is a nonzero address. */
5055 && ! nonzero_address_p (tem
))
5056 return simplify_const_relational_operation (signed_condition (code
),
5057 mode
, tem
, const0_rtx
);
5059 if (! HONOR_NANS (mode
) && code
== ORDERED
)
5060 return const_true_rtx
;
5062 if (! HONOR_NANS (mode
) && code
== UNORDERED
)
5065 /* For modes without NaNs, if the two operands are equal, we know the
5066 result except if they have side-effects. Even with NaNs we know
5067 the result of unordered comparisons and, if signaling NaNs are
5068 irrelevant, also the result of LT/GT/LTGT. */
5069 if ((! HONOR_NANS (trueop0
)
5070 || code
== UNEQ
|| code
== UNLE
|| code
== UNGE
5071 || ((code
== LT
|| code
== GT
|| code
== LTGT
)
5072 && ! HONOR_SNANS (trueop0
)))
5073 && rtx_equal_p (trueop0
, trueop1
)
5074 && ! side_effects_p (trueop0
))
5075 return comparison_result (code
, CMP_EQ
);
5077 /* If the operands are floating-point constants, see if we can fold
5079 if (CONST_DOUBLE_AS_FLOAT_P (trueop0
)
5080 && CONST_DOUBLE_AS_FLOAT_P (trueop1
)
5081 && SCALAR_FLOAT_MODE_P (GET_MODE (trueop0
)))
5083 const REAL_VALUE_TYPE
*d0
= CONST_DOUBLE_REAL_VALUE (trueop0
);
5084 const REAL_VALUE_TYPE
*d1
= CONST_DOUBLE_REAL_VALUE (trueop1
);
5086 /* Comparisons are unordered iff at least one of the values is NaN. */
5087 if (REAL_VALUE_ISNAN (*d0
) || REAL_VALUE_ISNAN (*d1
))
5097 return const_true_rtx
;
5110 return comparison_result (code
,
5111 (real_equal (d0
, d1
) ? CMP_EQ
:
5112 real_less (d0
, d1
) ? CMP_LT
: CMP_GT
));
5115 /* Otherwise, see if the operands are both integers. */
5116 if ((GET_MODE_CLASS (mode
) == MODE_INT
|| mode
== VOIDmode
)
5117 && CONST_SCALAR_INT_P (trueop0
) && CONST_SCALAR_INT_P (trueop1
))
5119 /* It would be nice if we really had a mode here. However, the
5120 largest int representable on the target is as good as
5122 machine_mode cmode
= (mode
== VOIDmode
) ? MAX_MODE_INT
: mode
;
5123 rtx_mode_t ptrueop0
= rtx_mode_t (trueop0
, cmode
);
5124 rtx_mode_t ptrueop1
= rtx_mode_t (trueop1
, cmode
);
5126 if (wi::eq_p (ptrueop0
, ptrueop1
))
5127 return comparison_result (code
, CMP_EQ
);
5130 int cr
= wi::lts_p (ptrueop0
, ptrueop1
) ? CMP_LT
: CMP_GT
;
5131 cr
|= wi::ltu_p (ptrueop0
, ptrueop1
) ? CMP_LTU
: CMP_GTU
;
5132 return comparison_result (code
, cr
);
5136 /* Optimize comparisons with upper and lower bounds. */
5137 if (HWI_COMPUTABLE_MODE_P (mode
)
5138 && CONST_INT_P (trueop1
)
5139 && !side_effects_p (trueop0
))
5142 unsigned HOST_WIDE_INT nonzero
= nonzero_bits (trueop0
, mode
);
5143 HOST_WIDE_INT val
= INTVAL (trueop1
);
5144 HOST_WIDE_INT mmin
, mmax
;
5154 /* Get a reduced range if the sign bit is zero. */
5155 if (nonzero
<= (GET_MODE_MASK (mode
) >> 1))
5162 rtx mmin_rtx
, mmax_rtx
;
5163 get_mode_bounds (mode
, sign
, mode
, &mmin_rtx
, &mmax_rtx
);
5165 mmin
= INTVAL (mmin_rtx
);
5166 mmax
= INTVAL (mmax_rtx
);
5169 unsigned int sign_copies
= num_sign_bit_copies (trueop0
, mode
);
5171 mmin
>>= (sign_copies
- 1);
5172 mmax
>>= (sign_copies
- 1);
5178 /* x >= y is always true for y <= mmin, always false for y > mmax. */
5180 if ((unsigned HOST_WIDE_INT
) val
<= (unsigned HOST_WIDE_INT
) mmin
)
5181 return const_true_rtx
;
5182 if ((unsigned HOST_WIDE_INT
) val
> (unsigned HOST_WIDE_INT
) mmax
)
5187 return const_true_rtx
;
5192 /* x <= y is always true for y >= mmax, always false for y < mmin. */
5194 if ((unsigned HOST_WIDE_INT
) val
>= (unsigned HOST_WIDE_INT
) mmax
)
5195 return const_true_rtx
;
5196 if ((unsigned HOST_WIDE_INT
) val
< (unsigned HOST_WIDE_INT
) mmin
)
5201 return const_true_rtx
;
5207 /* x == y is always false for y out of range. */
5208 if (val
< mmin
|| val
> mmax
)
5212 /* x > y is always false for y >= mmax, always true for y < mmin. */
5214 if ((unsigned HOST_WIDE_INT
) val
>= (unsigned HOST_WIDE_INT
) mmax
)
5216 if ((unsigned HOST_WIDE_INT
) val
< (unsigned HOST_WIDE_INT
) mmin
)
5217 return const_true_rtx
;
5223 return const_true_rtx
;
5226 /* x < y is always false for y <= mmin, always true for y > mmax. */
5228 if ((unsigned HOST_WIDE_INT
) val
<= (unsigned HOST_WIDE_INT
) mmin
)
5230 if ((unsigned HOST_WIDE_INT
) val
> (unsigned HOST_WIDE_INT
) mmax
)
5231 return const_true_rtx
;
5237 return const_true_rtx
;
5241 /* x != y is always true for y out of range. */
5242 if (val
< mmin
|| val
> mmax
)
5243 return const_true_rtx
;
5251 /* Optimize integer comparisons with zero. */
5252 if (trueop1
== const0_rtx
&& !side_effects_p (trueop0
))
5254 /* Some addresses are known to be nonzero. We don't know
5255 their sign, but equality comparisons are known. */
5256 if (nonzero_address_p (trueop0
))
5258 if (code
== EQ
|| code
== LEU
)
5260 if (code
== NE
|| code
== GTU
)
5261 return const_true_rtx
;
5264 /* See if the first operand is an IOR with a constant. If so, we
5265 may be able to determine the result of this comparison. */
5266 if (GET_CODE (op0
) == IOR
)
5268 rtx inner_const
= avoid_constant_pool_reference (XEXP (op0
, 1));
5269 if (CONST_INT_P (inner_const
) && inner_const
!= const0_rtx
)
5271 int sign_bitnum
= GET_MODE_PRECISION (mode
) - 1;
5272 int has_sign
= (HOST_BITS_PER_WIDE_INT
>= sign_bitnum
5273 && (UINTVAL (inner_const
)
5284 return const_true_rtx
;
5288 return const_true_rtx
;
5302 /* Optimize comparison of ABS with zero. */
5303 if (trueop1
== CONST0_RTX (mode
) && !side_effects_p (trueop0
)
5304 && (GET_CODE (trueop0
) == ABS
5305 || (GET_CODE (trueop0
) == FLOAT_EXTEND
5306 && GET_CODE (XEXP (trueop0
, 0)) == ABS
)))
5311 /* Optimize abs(x) < 0.0. */
5312 if (!HONOR_SNANS (mode
)
5313 && (!INTEGRAL_MODE_P (mode
)
5314 || (!flag_wrapv
&& !flag_trapv
&& flag_strict_overflow
)))
5316 if (INTEGRAL_MODE_P (mode
)
5317 && (issue_strict_overflow_warning
5318 (WARN_STRICT_OVERFLOW_CONDITIONAL
)))
5319 warning (OPT_Wstrict_overflow
,
5320 ("assuming signed overflow does not occur when "
5321 "assuming abs (x) < 0 is false"));
5327 /* Optimize abs(x) >= 0.0. */
5328 if (!HONOR_NANS (mode
)
5329 && (!INTEGRAL_MODE_P (mode
)
5330 || (!flag_wrapv
&& !flag_trapv
&& flag_strict_overflow
)))
5332 if (INTEGRAL_MODE_P (mode
)
5333 && (issue_strict_overflow_warning
5334 (WARN_STRICT_OVERFLOW_CONDITIONAL
)))
5335 warning (OPT_Wstrict_overflow
,
5336 ("assuming signed overflow does not occur when "
5337 "assuming abs (x) >= 0 is true"));
5338 return const_true_rtx
;
5343 /* Optimize ! (abs(x) < 0.0). */
5344 return const_true_rtx
;
5354 /* Recognize expressions of the form (X CMP 0) ? VAL : OP (X)
5355 where OP is CLZ or CTZ and VAL is the value from CLZ_DEFINED_VALUE_AT_ZERO
5356 or CTZ_DEFINED_VALUE_AT_ZERO respectively and return OP (X) if the expression
5357 can be simplified to that or NULL_RTX if not.
5358 Assume X is compared against zero with CMP_CODE and the true
5359 arm is TRUE_VAL and the false arm is FALSE_VAL. */
5362 simplify_cond_clz_ctz (rtx x
, rtx_code cmp_code
, rtx true_val
, rtx false_val
)
5364 if (cmp_code
!= EQ
&& cmp_code
!= NE
)
5367 /* Result on X == 0 and X !=0 respectively. */
5368 rtx on_zero
, on_nonzero
;
5372 on_nonzero
= false_val
;
5376 on_zero
= false_val
;
5377 on_nonzero
= true_val
;
5380 rtx_code op_code
= GET_CODE (on_nonzero
);
5381 if ((op_code
!= CLZ
&& op_code
!= CTZ
)
5382 || !rtx_equal_p (XEXP (on_nonzero
, 0), x
)
5383 || !CONST_INT_P (on_zero
))
5386 HOST_WIDE_INT op_val
;
5387 if (((op_code
== CLZ
5388 && CLZ_DEFINED_VALUE_AT_ZERO (GET_MODE (on_nonzero
), op_val
))
5390 && CTZ_DEFINED_VALUE_AT_ZERO (GET_MODE (on_nonzero
), op_val
)))
5391 && op_val
== INTVAL (on_zero
))
5398 /* Simplify CODE, an operation with result mode MODE and three operands,
5399 OP0, OP1, and OP2. OP0_MODE was the mode of OP0 before it became
5400 a constant. Return 0 if no simplifications is possible. */
5403 simplify_ternary_operation (enum rtx_code code
, machine_mode mode
,
5404 machine_mode op0_mode
, rtx op0
, rtx op1
,
5407 unsigned int width
= GET_MODE_PRECISION (mode
);
5408 bool any_change
= false;
5411 /* VOIDmode means "infinite" precision. */
5413 width
= HOST_BITS_PER_WIDE_INT
;
5418 /* Simplify negations around the multiplication. */
5419 /* -a * -b + c => a * b + c. */
5420 if (GET_CODE (op0
) == NEG
)
5422 tem
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
5424 op1
= tem
, op0
= XEXP (op0
, 0), any_change
= true;
5426 else if (GET_CODE (op1
) == NEG
)
5428 tem
= simplify_unary_operation (NEG
, mode
, op0
, mode
);
5430 op0
= tem
, op1
= XEXP (op1
, 0), any_change
= true;
5433 /* Canonicalize the two multiplication operands. */
5434 /* a * -b + c => -b * a + c. */
5435 if (swap_commutative_operands_p (op0
, op1
))
5436 std::swap (op0
, op1
), any_change
= true;
5439 return gen_rtx_FMA (mode
, op0
, op1
, op2
);
5444 if (CONST_INT_P (op0
)
5445 && CONST_INT_P (op1
)
5446 && CONST_INT_P (op2
)
5447 && ((unsigned) INTVAL (op1
) + (unsigned) INTVAL (op2
) <= width
)
5448 && width
<= (unsigned) HOST_BITS_PER_WIDE_INT
)
5450 /* Extracting a bit-field from a constant */
5451 unsigned HOST_WIDE_INT val
= UINTVAL (op0
);
5452 HOST_WIDE_INT op1val
= INTVAL (op1
);
5453 HOST_WIDE_INT op2val
= INTVAL (op2
);
5454 if (BITS_BIG_ENDIAN
)
5455 val
>>= GET_MODE_PRECISION (op0_mode
) - op2val
- op1val
;
5459 if (HOST_BITS_PER_WIDE_INT
!= op1val
)
5461 /* First zero-extend. */
5462 val
&= (HOST_WIDE_INT_1U
<< op1val
) - 1;
5463 /* If desired, propagate sign bit. */
5464 if (code
== SIGN_EXTRACT
5465 && (val
& (HOST_WIDE_INT_1U
<< (op1val
- 1)))
5467 val
|= ~ ((HOST_WIDE_INT_1U
<< op1val
) - 1);
5470 return gen_int_mode (val
, mode
);
5475 if (CONST_INT_P (op0
))
5476 return op0
!= const0_rtx
? op1
: op2
;
5478 /* Convert c ? a : a into "a". */
5479 if (rtx_equal_p (op1
, op2
) && ! side_effects_p (op0
))
5482 /* Convert a != b ? a : b into "a". */
5483 if (GET_CODE (op0
) == NE
5484 && ! side_effects_p (op0
)
5485 && ! HONOR_NANS (mode
)
5486 && ! HONOR_SIGNED_ZEROS (mode
)
5487 && ((rtx_equal_p (XEXP (op0
, 0), op1
)
5488 && rtx_equal_p (XEXP (op0
, 1), op2
))
5489 || (rtx_equal_p (XEXP (op0
, 0), op2
)
5490 && rtx_equal_p (XEXP (op0
, 1), op1
))))
5493 /* Convert a == b ? a : b into "b". */
5494 if (GET_CODE (op0
) == EQ
5495 && ! side_effects_p (op0
)
5496 && ! HONOR_NANS (mode
)
5497 && ! HONOR_SIGNED_ZEROS (mode
)
5498 && ((rtx_equal_p (XEXP (op0
, 0), op1
)
5499 && rtx_equal_p (XEXP (op0
, 1), op2
))
5500 || (rtx_equal_p (XEXP (op0
, 0), op2
)
5501 && rtx_equal_p (XEXP (op0
, 1), op1
))))
5504 /* Convert (!c) != {0,...,0} ? a : b into
5505 c != {0,...,0} ? b : a for vector modes. */
5506 if (VECTOR_MODE_P (GET_MODE (op1
))
5507 && GET_CODE (op0
) == NE
5508 && GET_CODE (XEXP (op0
, 0)) == NOT
5509 && GET_CODE (XEXP (op0
, 1)) == CONST_VECTOR
)
5511 rtx cv
= XEXP (op0
, 1);
5512 int nunits
= CONST_VECTOR_NUNITS (cv
);
5514 for (int i
= 0; i
< nunits
; ++i
)
5515 if (CONST_VECTOR_ELT (cv
, i
) != const0_rtx
)
5522 rtx new_op0
= gen_rtx_NE (GET_MODE (op0
),
5523 XEXP (XEXP (op0
, 0), 0),
5525 rtx retval
= gen_rtx_IF_THEN_ELSE (mode
, new_op0
, op2
, op1
);
5530 /* Convert x == 0 ? N : clz (x) into clz (x) when
5531 CLZ_DEFINED_VALUE_AT_ZERO is defined to N for the mode of x.
5532 Similarly for ctz (x). */
5533 if (COMPARISON_P (op0
) && !side_effects_p (op0
)
5534 && XEXP (op0
, 1) == const0_rtx
)
5537 = simplify_cond_clz_ctz (XEXP (op0
, 0), GET_CODE (op0
),
5543 if (COMPARISON_P (op0
) && ! side_effects_p (op0
))
5545 machine_mode cmp_mode
= (GET_MODE (XEXP (op0
, 0)) == VOIDmode
5546 ? GET_MODE (XEXP (op0
, 1))
5547 : GET_MODE (XEXP (op0
, 0)));
5550 /* Look for happy constants in op1 and op2. */
5551 if (CONST_INT_P (op1
) && CONST_INT_P (op2
))
5553 HOST_WIDE_INT t
= INTVAL (op1
);
5554 HOST_WIDE_INT f
= INTVAL (op2
);
5556 if (t
== STORE_FLAG_VALUE
&& f
== 0)
5557 code
= GET_CODE (op0
);
5558 else if (t
== 0 && f
== STORE_FLAG_VALUE
)
5561 tmp
= reversed_comparison_code (op0
, NULL
);
5569 return simplify_gen_relational (code
, mode
, cmp_mode
,
5570 XEXP (op0
, 0), XEXP (op0
, 1));
5573 if (cmp_mode
== VOIDmode
)
5574 cmp_mode
= op0_mode
;
5575 temp
= simplify_relational_operation (GET_CODE (op0
), op0_mode
,
5576 cmp_mode
, XEXP (op0
, 0),
5579 /* See if any simplifications were possible. */
5582 if (CONST_INT_P (temp
))
5583 return temp
== const0_rtx
? op2
: op1
;
5585 return gen_rtx_IF_THEN_ELSE (mode
, temp
, op1
, op2
);
5591 gcc_assert (GET_MODE (op0
) == mode
);
5592 gcc_assert (GET_MODE (op1
) == mode
);
5593 gcc_assert (VECTOR_MODE_P (mode
));
5594 trueop2
= avoid_constant_pool_reference (op2
);
5595 if (CONST_INT_P (trueop2
))
5597 int elt_size
= GET_MODE_UNIT_SIZE (mode
);
5598 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
5599 unsigned HOST_WIDE_INT sel
= UINTVAL (trueop2
);
5600 unsigned HOST_WIDE_INT mask
;
5601 if (n_elts
== HOST_BITS_PER_WIDE_INT
)
5604 mask
= (HOST_WIDE_INT_1U
<< n_elts
) - 1;
5606 if (!(sel
& mask
) && !side_effects_p (op0
))
5608 if ((sel
& mask
) == mask
&& !side_effects_p (op1
))
5611 rtx trueop0
= avoid_constant_pool_reference (op0
);
5612 rtx trueop1
= avoid_constant_pool_reference (op1
);
5613 if (GET_CODE (trueop0
) == CONST_VECTOR
5614 && GET_CODE (trueop1
) == CONST_VECTOR
)
5616 rtvec v
= rtvec_alloc (n_elts
);
5619 for (i
= 0; i
< n_elts
; i
++)
5620 RTVEC_ELT (v
, i
) = ((sel
& (HOST_WIDE_INT_1U
<< i
))
5621 ? CONST_VECTOR_ELT (trueop0
, i
)
5622 : CONST_VECTOR_ELT (trueop1
, i
));
5623 return gen_rtx_CONST_VECTOR (mode
, v
);
5626 /* Replace (vec_merge (vec_merge a b m) c n) with (vec_merge b c n)
5627 if no element from a appears in the result. */
5628 if (GET_CODE (op0
) == VEC_MERGE
)
5630 tem
= avoid_constant_pool_reference (XEXP (op0
, 2));
5631 if (CONST_INT_P (tem
))
5633 unsigned HOST_WIDE_INT sel0
= UINTVAL (tem
);
5634 if (!(sel
& sel0
& mask
) && !side_effects_p (XEXP (op0
, 0)))
5635 return simplify_gen_ternary (code
, mode
, mode
,
5636 XEXP (op0
, 1), op1
, op2
);
5637 if (!(sel
& ~sel0
& mask
) && !side_effects_p (XEXP (op0
, 1)))
5638 return simplify_gen_ternary (code
, mode
, mode
,
5639 XEXP (op0
, 0), op1
, op2
);
5642 if (GET_CODE (op1
) == VEC_MERGE
)
5644 tem
= avoid_constant_pool_reference (XEXP (op1
, 2));
5645 if (CONST_INT_P (tem
))
5647 unsigned HOST_WIDE_INT sel1
= UINTVAL (tem
);
5648 if (!(~sel
& sel1
& mask
) && !side_effects_p (XEXP (op1
, 0)))
5649 return simplify_gen_ternary (code
, mode
, mode
,
5650 op0
, XEXP (op1
, 1), op2
);
5651 if (!(~sel
& ~sel1
& mask
) && !side_effects_p (XEXP (op1
, 1)))
5652 return simplify_gen_ternary (code
, mode
, mode
,
5653 op0
, XEXP (op1
, 0), op2
);
5657 /* Replace (vec_merge (vec_duplicate (vec_select a parallel (i))) a 1 << i)
5659 if (GET_CODE (op0
) == VEC_DUPLICATE
5660 && GET_CODE (XEXP (op0
, 0)) == VEC_SELECT
5661 && GET_CODE (XEXP (XEXP (op0
, 0), 1)) == PARALLEL
5662 && mode_nunits
[GET_MODE (XEXP (op0
, 0))] == 1)
5664 tem
= XVECEXP ((XEXP (XEXP (op0
, 0), 1)), 0, 0);
5665 if (CONST_INT_P (tem
) && CONST_INT_P (op2
))
5667 if (XEXP (XEXP (op0
, 0), 0) == op1
5668 && UINTVAL (op2
) == HOST_WIDE_INT_1U
<< UINTVAL (tem
))
5674 if (rtx_equal_p (op0
, op1
)
5675 && !side_effects_p (op2
) && !side_effects_p (op1
))
5687 /* Evaluate a SUBREG of a CONST_INT or CONST_WIDE_INT or CONST_DOUBLE
5688 or CONST_FIXED or CONST_VECTOR, returning another CONST_INT or
5689 CONST_WIDE_INT or CONST_DOUBLE or CONST_FIXED or CONST_VECTOR.
5691 Works by unpacking OP into a collection of 8-bit values
5692 represented as a little-endian array of 'unsigned char', selecting by BYTE,
5693 and then repacking them again for OUTERMODE. */
5696 simplify_immed_subreg (machine_mode outermode
, rtx op
,
5697 machine_mode innermode
, unsigned int byte
)
5701 value_mask
= (1 << value_bit
) - 1
5703 unsigned char value
[MAX_BITSIZE_MODE_ANY_MODE
/ value_bit
];
5712 rtvec result_v
= NULL
;
5713 enum mode_class outer_class
;
5714 machine_mode outer_submode
;
5717 /* Some ports misuse CCmode. */
5718 if (GET_MODE_CLASS (outermode
) == MODE_CC
&& CONST_INT_P (op
))
5721 /* We have no way to represent a complex constant at the rtl level. */
5722 if (COMPLEX_MODE_P (outermode
))
5725 /* We support any size mode. */
5726 max_bitsize
= MAX (GET_MODE_BITSIZE (outermode
),
5727 GET_MODE_BITSIZE (innermode
));
5729 /* Unpack the value. */
5731 if (GET_CODE (op
) == CONST_VECTOR
)
5733 num_elem
= CONST_VECTOR_NUNITS (op
);
5734 elems
= &CONST_VECTOR_ELT (op
, 0);
5735 elem_bitsize
= GET_MODE_UNIT_BITSIZE (innermode
);
5741 elem_bitsize
= max_bitsize
;
5743 /* If this asserts, it is too complicated; reducing value_bit may help. */
5744 gcc_assert (BITS_PER_UNIT
% value_bit
== 0);
5745 /* I don't know how to handle endianness of sub-units. */
5746 gcc_assert (elem_bitsize
% BITS_PER_UNIT
== 0);
5748 for (elem
= 0; elem
< num_elem
; elem
++)
5751 rtx el
= elems
[elem
];
5753 /* Vectors are kept in target memory order. (This is probably
5756 unsigned byte
= (elem
* elem_bitsize
) / BITS_PER_UNIT
;
5757 unsigned ibyte
= (((num_elem
- 1 - elem
) * elem_bitsize
)
5759 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5760 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5761 unsigned bytele
= (subword_byte
% UNITS_PER_WORD
5762 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5763 vp
= value
+ (bytele
* BITS_PER_UNIT
) / value_bit
;
5766 switch (GET_CODE (el
))
5770 i
< HOST_BITS_PER_WIDE_INT
&& i
< elem_bitsize
;
5772 *vp
++ = INTVAL (el
) >> i
;
5773 /* CONST_INTs are always logically sign-extended. */
5774 for (; i
< elem_bitsize
; i
+= value_bit
)
5775 *vp
++ = INTVAL (el
) < 0 ? -1 : 0;
5778 case CONST_WIDE_INT
:
5780 rtx_mode_t val
= rtx_mode_t (el
, innermode
);
5781 unsigned char extend
= wi::sign_mask (val
);
5782 int prec
= wi::get_precision (val
);
5784 for (i
= 0; i
< prec
&& i
< elem_bitsize
; i
+= value_bit
)
5785 *vp
++ = wi::extract_uhwi (val
, i
, value_bit
);
5786 for (; i
< elem_bitsize
; i
+= value_bit
)
5792 if (TARGET_SUPPORTS_WIDE_INT
== 0 && GET_MODE (el
) == VOIDmode
)
5794 unsigned char extend
= 0;
5795 /* If this triggers, someone should have generated a
5796 CONST_INT instead. */
5797 gcc_assert (elem_bitsize
> HOST_BITS_PER_WIDE_INT
);
5799 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
+= value_bit
)
5800 *vp
++ = CONST_DOUBLE_LOW (el
) >> i
;
5801 while (i
< HOST_BITS_PER_DOUBLE_INT
&& i
< elem_bitsize
)
5804 = CONST_DOUBLE_HIGH (el
) >> (i
- HOST_BITS_PER_WIDE_INT
);
5808 if (CONST_DOUBLE_HIGH (el
) >> (HOST_BITS_PER_WIDE_INT
- 1))
5810 for (; i
< elem_bitsize
; i
+= value_bit
)
5815 /* This is big enough for anything on the platform. */
5816 long tmp
[MAX_BITSIZE_MODE_ANY_MODE
/ 32];
5817 int bitsize
= GET_MODE_BITSIZE (GET_MODE (el
));
5819 gcc_assert (SCALAR_FLOAT_MODE_P (GET_MODE (el
)));
5820 gcc_assert (bitsize
<= elem_bitsize
);
5821 gcc_assert (bitsize
% value_bit
== 0);
5823 real_to_target (tmp
, CONST_DOUBLE_REAL_VALUE (el
),
5826 /* real_to_target produces its result in words affected by
5827 FLOAT_WORDS_BIG_ENDIAN. However, we ignore this,
5828 and use WORDS_BIG_ENDIAN instead; see the documentation
5829 of SUBREG in rtl.texi. */
5830 for (i
= 0; i
< bitsize
; i
+= value_bit
)
5833 if (WORDS_BIG_ENDIAN
)
5834 ibase
= bitsize
- 1 - i
;
5837 *vp
++ = tmp
[ibase
/ 32] >> i
% 32;
5840 /* It shouldn't matter what's done here, so fill it with
5842 for (; i
< elem_bitsize
; i
+= value_bit
)
5848 if (elem_bitsize
<= HOST_BITS_PER_WIDE_INT
)
5850 for (i
= 0; i
< elem_bitsize
; i
+= value_bit
)
5851 *vp
++ = CONST_FIXED_VALUE_LOW (el
) >> i
;
5855 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
+= value_bit
)
5856 *vp
++ = CONST_FIXED_VALUE_LOW (el
) >> i
;
5857 for (; i
< HOST_BITS_PER_DOUBLE_INT
&& i
< elem_bitsize
;
5859 *vp
++ = CONST_FIXED_VALUE_HIGH (el
)
5860 >> (i
- HOST_BITS_PER_WIDE_INT
);
5861 for (; i
< elem_bitsize
; i
+= value_bit
)
5871 /* Now, pick the right byte to start with. */
5872 /* Renumber BYTE so that the least-significant byte is byte 0. A special
5873 case is paradoxical SUBREGs, which shouldn't be adjusted since they
5874 will already have offset 0. */
5875 if (GET_MODE_SIZE (innermode
) >= GET_MODE_SIZE (outermode
))
5877 unsigned ibyte
= (GET_MODE_SIZE (innermode
) - GET_MODE_SIZE (outermode
)
5879 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5880 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5881 byte
= (subword_byte
% UNITS_PER_WORD
5882 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5885 /* BYTE should still be inside OP. (Note that BYTE is unsigned,
5886 so if it's become negative it will instead be very large.) */
5887 gcc_assert (byte
< GET_MODE_SIZE (innermode
));
5889 /* Convert from bytes to chunks of size value_bit. */
5890 value_start
= byte
* (BITS_PER_UNIT
/ value_bit
);
5892 /* Re-pack the value. */
5893 num_elem
= GET_MODE_NUNITS (outermode
);
5895 if (VECTOR_MODE_P (outermode
))
5897 result_v
= rtvec_alloc (num_elem
);
5898 elems
= &RTVEC_ELT (result_v
, 0);
5903 outer_submode
= GET_MODE_INNER (outermode
);
5904 outer_class
= GET_MODE_CLASS (outer_submode
);
5905 elem_bitsize
= GET_MODE_BITSIZE (outer_submode
);
5907 gcc_assert (elem_bitsize
% value_bit
== 0);
5908 gcc_assert (elem_bitsize
+ value_start
* value_bit
<= max_bitsize
);
5910 for (elem
= 0; elem
< num_elem
; elem
++)
5914 /* Vectors are stored in target memory order. (This is probably
5917 unsigned byte
= (elem
* elem_bitsize
) / BITS_PER_UNIT
;
5918 unsigned ibyte
= (((num_elem
- 1 - elem
) * elem_bitsize
)
5920 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5921 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5922 unsigned bytele
= (subword_byte
% UNITS_PER_WORD
5923 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5924 vp
= value
+ value_start
+ (bytele
* BITS_PER_UNIT
) / value_bit
;
5927 switch (outer_class
)
5930 case MODE_PARTIAL_INT
:
5935 = (GET_MODE_BITSIZE (outer_submode
) + HOST_BITS_PER_WIDE_INT
- 1)
5936 / HOST_BITS_PER_WIDE_INT
;
5937 HOST_WIDE_INT tmp
[MAX_BITSIZE_MODE_ANY_INT
/ HOST_BITS_PER_WIDE_INT
];
5940 if (GET_MODE_PRECISION (outer_submode
) > MAX_BITSIZE_MODE_ANY_INT
)
5942 for (u
= 0; u
< units
; u
++)
5944 unsigned HOST_WIDE_INT buf
= 0;
5946 i
< HOST_BITS_PER_WIDE_INT
&& base
+ i
< elem_bitsize
;
5948 buf
|= (unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
) << i
;
5951 base
+= HOST_BITS_PER_WIDE_INT
;
5953 r
= wide_int::from_array (tmp
, units
,
5954 GET_MODE_PRECISION (outer_submode
));
5955 #if TARGET_SUPPORTS_WIDE_INT == 0
5956 /* Make sure r will fit into CONST_INT or CONST_DOUBLE. */
5957 if (wi::min_precision (r
, SIGNED
) > HOST_BITS_PER_DOUBLE_INT
)
5960 elems
[elem
] = immed_wide_int_const (r
, outer_submode
);
5965 case MODE_DECIMAL_FLOAT
:
5968 long tmp
[MAX_BITSIZE_MODE_ANY_MODE
/ 32] = { 0 };
5970 /* real_from_target wants its input in words affected by
5971 FLOAT_WORDS_BIG_ENDIAN. However, we ignore this,
5972 and use WORDS_BIG_ENDIAN instead; see the documentation
5973 of SUBREG in rtl.texi. */
5974 for (i
= 0; i
< elem_bitsize
; i
+= value_bit
)
5977 if (WORDS_BIG_ENDIAN
)
5978 ibase
= elem_bitsize
- 1 - i
;
5981 tmp
[ibase
/ 32] |= (*vp
++ & value_mask
) << i
% 32;
5984 real_from_target (&r
, tmp
, outer_submode
);
5985 elems
[elem
] = const_double_from_real_value (r
, outer_submode
);
5997 f
.mode
= outer_submode
;
6000 i
< HOST_BITS_PER_WIDE_INT
&& i
< elem_bitsize
;
6002 f
.data
.low
|= (unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
) << i
;
6003 for (; i
< elem_bitsize
; i
+= value_bit
)
6004 f
.data
.high
|= ((unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
)
6005 << (i
- HOST_BITS_PER_WIDE_INT
));
6007 elems
[elem
] = CONST_FIXED_FROM_FIXED_VALUE (f
, outer_submode
);
6015 if (VECTOR_MODE_P (outermode
))
6016 return gen_rtx_CONST_VECTOR (outermode
, result_v
);
6021 /* Simplify SUBREG:OUTERMODE(OP:INNERMODE, BYTE)
6022 Return 0 if no simplifications are possible. */
6024 simplify_subreg (machine_mode outermode
, rtx op
,
6025 machine_mode innermode
, unsigned int byte
)
6027 /* Little bit of sanity checking. */
6028 gcc_assert (innermode
!= VOIDmode
);
6029 gcc_assert (outermode
!= VOIDmode
);
6030 gcc_assert (innermode
!= BLKmode
);
6031 gcc_assert (outermode
!= BLKmode
);
6033 gcc_assert (GET_MODE (op
) == innermode
6034 || GET_MODE (op
) == VOIDmode
);
6036 if ((byte
% GET_MODE_SIZE (outermode
)) != 0)
6039 if (byte
>= GET_MODE_SIZE (innermode
))
6042 if (outermode
== innermode
&& !byte
)
6045 if (CONST_SCALAR_INT_P (op
)
6046 || CONST_DOUBLE_AS_FLOAT_P (op
)
6047 || GET_CODE (op
) == CONST_FIXED
6048 || GET_CODE (op
) == CONST_VECTOR
)
6049 return simplify_immed_subreg (outermode
, op
, innermode
, byte
);
6051 /* Changing mode twice with SUBREG => just change it once,
6052 or not at all if changing back op starting mode. */
6053 if (GET_CODE (op
) == SUBREG
)
6055 machine_mode innermostmode
= GET_MODE (SUBREG_REG (op
));
6056 int final_offset
= byte
+ SUBREG_BYTE (op
);
6059 if (outermode
== innermostmode
6060 && byte
== 0 && SUBREG_BYTE (op
) == 0)
6061 return SUBREG_REG (op
);
6063 /* The SUBREG_BYTE represents offset, as if the value were stored
6064 in memory. Irritating exception is paradoxical subreg, where
6065 we define SUBREG_BYTE to be 0. On big endian machines, this
6066 value should be negative. For a moment, undo this exception. */
6067 if (byte
== 0 && GET_MODE_SIZE (innermode
) < GET_MODE_SIZE (outermode
))
6069 int difference
= (GET_MODE_SIZE (innermode
) - GET_MODE_SIZE (outermode
));
6070 if (WORDS_BIG_ENDIAN
)
6071 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
6072 if (BYTES_BIG_ENDIAN
)
6073 final_offset
+= difference
% UNITS_PER_WORD
;
6075 if (SUBREG_BYTE (op
) == 0
6076 && GET_MODE_SIZE (innermostmode
) < GET_MODE_SIZE (innermode
))
6078 int difference
= (GET_MODE_SIZE (innermostmode
) - GET_MODE_SIZE (innermode
));
6079 if (WORDS_BIG_ENDIAN
)
6080 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
6081 if (BYTES_BIG_ENDIAN
)
6082 final_offset
+= difference
% UNITS_PER_WORD
;
6085 /* See whether resulting subreg will be paradoxical. */
6086 if (GET_MODE_SIZE (innermostmode
) > GET_MODE_SIZE (outermode
))
6088 /* In nonparadoxical subregs we can't handle negative offsets. */
6089 if (final_offset
< 0)
6091 /* Bail out in case resulting subreg would be incorrect. */
6092 if (final_offset
% GET_MODE_SIZE (outermode
)
6093 || (unsigned) final_offset
>= GET_MODE_SIZE (innermostmode
))
6099 int difference
= (GET_MODE_SIZE (innermostmode
) - GET_MODE_SIZE (outermode
));
6101 /* In paradoxical subreg, see if we are still looking on lower part.
6102 If so, our SUBREG_BYTE will be 0. */
6103 if (WORDS_BIG_ENDIAN
)
6104 offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
6105 if (BYTES_BIG_ENDIAN
)
6106 offset
+= difference
% UNITS_PER_WORD
;
6107 if (offset
== final_offset
)
6113 /* Recurse for further possible simplifications. */
6114 newx
= simplify_subreg (outermode
, SUBREG_REG (op
), innermostmode
,
6118 if (validate_subreg (outermode
, innermostmode
,
6119 SUBREG_REG (op
), final_offset
))
6121 newx
= gen_rtx_SUBREG (outermode
, SUBREG_REG (op
), final_offset
);
6122 if (SUBREG_PROMOTED_VAR_P (op
)
6123 && SUBREG_PROMOTED_SIGN (op
) >= 0
6124 && GET_MODE_CLASS (outermode
) == MODE_INT
6125 && IN_RANGE (GET_MODE_SIZE (outermode
),
6126 GET_MODE_SIZE (innermode
),
6127 GET_MODE_SIZE (innermostmode
))
6128 && subreg_lowpart_p (newx
))
6130 SUBREG_PROMOTED_VAR_P (newx
) = 1;
6131 SUBREG_PROMOTED_SET (newx
, SUBREG_PROMOTED_GET (op
));
6138 /* SUBREG of a hard register => just change the register number
6139 and/or mode. If the hard register is not valid in that mode,
6140 suppress this simplification. If the hard register is the stack,
6141 frame, or argument pointer, leave this as a SUBREG. */
6143 if (REG_P (op
) && HARD_REGISTER_P (op
))
6145 unsigned int regno
, final_regno
;
6148 final_regno
= simplify_subreg_regno (regno
, innermode
, byte
, outermode
);
6149 if (HARD_REGISTER_NUM_P (final_regno
))
6152 int final_offset
= byte
;
6154 /* Adjust offset for paradoxical subregs. */
6156 && GET_MODE_SIZE (innermode
) < GET_MODE_SIZE (outermode
))
6158 int difference
= (GET_MODE_SIZE (innermode
)
6159 - GET_MODE_SIZE (outermode
));
6160 if (WORDS_BIG_ENDIAN
)
6161 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
6162 if (BYTES_BIG_ENDIAN
)
6163 final_offset
+= difference
% UNITS_PER_WORD
;
6166 x
= gen_rtx_REG_offset (op
, outermode
, final_regno
, final_offset
);
6168 /* Propagate original regno. We don't have any way to specify
6169 the offset inside original regno, so do so only for lowpart.
6170 The information is used only by alias analysis that can not
6171 grog partial register anyway. */
6173 if (subreg_lowpart_offset (outermode
, innermode
) == byte
)
6174 ORIGINAL_REGNO (x
) = ORIGINAL_REGNO (op
);
6179 /* If we have a SUBREG of a register that we are replacing and we are
6180 replacing it with a MEM, make a new MEM and try replacing the
6181 SUBREG with it. Don't do this if the MEM has a mode-dependent address
6182 or if we would be widening it. */
6185 && ! mode_dependent_address_p (XEXP (op
, 0), MEM_ADDR_SPACE (op
))
6186 /* Allow splitting of volatile memory references in case we don't
6187 have instruction to move the whole thing. */
6188 && (! MEM_VOLATILE_P (op
)
6189 || ! have_insn_for (SET
, innermode
))
6190 && GET_MODE_SIZE (outermode
) <= GET_MODE_SIZE (GET_MODE (op
)))
6191 return adjust_address_nv (op
, outermode
, byte
);
6193 /* Handle complex or vector values represented as CONCAT or VEC_CONCAT
6195 if (GET_CODE (op
) == CONCAT
6196 || GET_CODE (op
) == VEC_CONCAT
)
6198 unsigned int part_size
, final_offset
;
6201 enum machine_mode part_mode
= GET_MODE (XEXP (op
, 0));
6202 if (part_mode
== VOIDmode
)
6203 part_mode
= GET_MODE_INNER (GET_MODE (op
));
6204 part_size
= GET_MODE_SIZE (part_mode
);
6205 if (byte
< part_size
)
6207 part
= XEXP (op
, 0);
6208 final_offset
= byte
;
6212 part
= XEXP (op
, 1);
6213 final_offset
= byte
- part_size
;
6216 if (final_offset
+ GET_MODE_SIZE (outermode
) > part_size
)
6219 part_mode
= GET_MODE (part
);
6220 if (part_mode
== VOIDmode
)
6221 part_mode
= GET_MODE_INNER (GET_MODE (op
));
6222 res
= simplify_subreg (outermode
, part
, part_mode
, final_offset
);
6225 if (validate_subreg (outermode
, part_mode
, part
, final_offset
))
6226 return gen_rtx_SUBREG (outermode
, part
, final_offset
);
6230 /* A SUBREG resulting from a zero extension may fold to zero if
6231 it extracts higher bits that the ZERO_EXTEND's source bits. */
6232 if (GET_CODE (op
) == ZERO_EXTEND
&& SCALAR_INT_MODE_P (innermode
))
6234 unsigned int bitpos
= subreg_lsb_1 (outermode
, innermode
, byte
);
6235 if (bitpos
>= GET_MODE_PRECISION (GET_MODE (XEXP (op
, 0))))
6236 return CONST0_RTX (outermode
);
6239 if (SCALAR_INT_MODE_P (outermode
)
6240 && SCALAR_INT_MODE_P (innermode
)
6241 && GET_MODE_PRECISION (outermode
) < GET_MODE_PRECISION (innermode
)
6242 && byte
== subreg_lowpart_offset (outermode
, innermode
))
6244 rtx tem
= simplify_truncation (outermode
, op
, innermode
);
6252 /* Make a SUBREG operation or equivalent if it folds. */
6255 simplify_gen_subreg (machine_mode outermode
, rtx op
,
6256 machine_mode innermode
, unsigned int byte
)
6260 newx
= simplify_subreg (outermode
, op
, innermode
, byte
);
6264 if (GET_CODE (op
) == SUBREG
6265 || GET_CODE (op
) == CONCAT
6266 || GET_MODE (op
) == VOIDmode
)
6269 if (validate_subreg (outermode
, innermode
, op
, byte
))
6270 return gen_rtx_SUBREG (outermode
, op
, byte
);
6275 /* Generates a subreg to get the least significant part of EXPR (in mode
6276 INNER_MODE) to OUTER_MODE. */
6279 lowpart_subreg (machine_mode outer_mode
, rtx expr
,
6280 machine_mode inner_mode
)
6282 return simplify_gen_subreg (outer_mode
, expr
, inner_mode
,
6283 subreg_lowpart_offset (outer_mode
, inner_mode
));
6286 /* Simplify X, an rtx expression.
6288 Return the simplified expression or NULL if no simplifications
6291 This is the preferred entry point into the simplification routines;
6292 however, we still allow passes to call the more specific routines.
6294 Right now GCC has three (yes, three) major bodies of RTL simplification
6295 code that need to be unified.
6297 1. fold_rtx in cse.c. This code uses various CSE specific
6298 information to aid in RTL simplification.
6300 2. simplify_rtx in combine.c. Similar to fold_rtx, except that
6301 it uses combine specific information to aid in RTL
6304 3. The routines in this file.
6307 Long term we want to only have one body of simplification code; to
6308 get to that state I recommend the following steps:
6310 1. Pour over fold_rtx & simplify_rtx and move any simplifications
6311 which are not pass dependent state into these routines.
6313 2. As code is moved by #1, change fold_rtx & simplify_rtx to
6314 use this routine whenever possible.
6316 3. Allow for pass dependent state to be provided to these
6317 routines and add simplifications based on the pass dependent
6318 state. Remove code from cse.c & combine.c that becomes
6321 It will take time, but ultimately the compiler will be easier to
6322 maintain and improve. It's totally silly that when we add a
6323 simplification that it needs to be added to 4 places (3 for RTL
6324 simplification and 1 for tree simplification. */
6327 simplify_rtx (const_rtx x
)
6329 const enum rtx_code code
= GET_CODE (x
);
6330 const machine_mode mode
= GET_MODE (x
);
6332 switch (GET_RTX_CLASS (code
))
6335 return simplify_unary_operation (code
, mode
,
6336 XEXP (x
, 0), GET_MODE (XEXP (x
, 0)));
6337 case RTX_COMM_ARITH
:
6338 if (swap_commutative_operands_p (XEXP (x
, 0), XEXP (x
, 1)))
6339 return simplify_gen_binary (code
, mode
, XEXP (x
, 1), XEXP (x
, 0));
6344 return simplify_binary_operation (code
, mode
, XEXP (x
, 0), XEXP (x
, 1));
6347 case RTX_BITFIELD_OPS
:
6348 return simplify_ternary_operation (code
, mode
, GET_MODE (XEXP (x
, 0)),
6349 XEXP (x
, 0), XEXP (x
, 1),
6353 case RTX_COMM_COMPARE
:
6354 return simplify_relational_operation (code
, mode
,
6355 ((GET_MODE (XEXP (x
, 0))
6357 ? GET_MODE (XEXP (x
, 0))
6358 : GET_MODE (XEXP (x
, 1))),
6364 return simplify_subreg (mode
, SUBREG_REG (x
),
6365 GET_MODE (SUBREG_REG (x
)),
6372 /* Convert (lo_sum (high FOO) FOO) to FOO. */
6373 if (GET_CODE (XEXP (x
, 0)) == HIGH
6374 && rtx_equal_p (XEXP (XEXP (x
, 0), 0), XEXP (x
, 1)))