1 /* RTL simplification functions for GNU compiler.
2 Copyright (C) 1987-2015 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"
29 #include "fold-const.h"
33 #include "hard-reg-set.h"
35 #include "insn-config.h"
38 #include "insn-codes.h"
47 #include "diagnostic-core.h"
51 /* Simplification and canonicalization of RTL. */
53 /* Much code operates on (low, high) pairs; the low value is an
54 unsigned wide int, the high value a signed wide int. We
55 occasionally need to sign extend from low to high as if low were a
57 #define HWI_SIGN_EXTEND(low) \
58 ((((HOST_WIDE_INT) low) < 0) ? ((HOST_WIDE_INT) -1) : ((HOST_WIDE_INT) 0))
60 static rtx
neg_const_int (machine_mode
, const_rtx
);
61 static bool plus_minus_operand_p (const_rtx
);
62 static rtx
simplify_plus_minus (enum rtx_code
, machine_mode
, rtx
, rtx
);
63 static rtx
simplify_immed_subreg (machine_mode
, rtx
, machine_mode
,
65 static rtx
simplify_associative_operation (enum rtx_code
, machine_mode
,
67 static rtx
simplify_relational_operation_1 (enum rtx_code
, machine_mode
,
68 machine_mode
, rtx
, rtx
);
69 static rtx
simplify_unary_operation_1 (enum rtx_code
, machine_mode
, rtx
);
70 static rtx
simplify_binary_operation_1 (enum rtx_code
, machine_mode
,
73 /* Negate a CONST_INT rtx, truncating (because a conversion from a
74 maximally negative number can overflow). */
76 neg_const_int (machine_mode mode
, const_rtx i
)
78 return gen_int_mode (-(unsigned HOST_WIDE_INT
) INTVAL (i
), mode
);
81 /* Test whether expression, X, is an immediate constant that represents
82 the most significant bit of machine mode MODE. */
85 mode_signbit_p (machine_mode mode
, const_rtx x
)
87 unsigned HOST_WIDE_INT val
;
90 if (GET_MODE_CLASS (mode
) != MODE_INT
)
93 width
= GET_MODE_PRECISION (mode
);
97 if (width
<= HOST_BITS_PER_WIDE_INT
100 #if TARGET_SUPPORTS_WIDE_INT
101 else if (CONST_WIDE_INT_P (x
))
104 unsigned int elts
= CONST_WIDE_INT_NUNITS (x
);
105 if (elts
!= (width
+ HOST_BITS_PER_WIDE_INT
- 1) / HOST_BITS_PER_WIDE_INT
)
107 for (i
= 0; i
< elts
- 1; i
++)
108 if (CONST_WIDE_INT_ELT (x
, i
) != 0)
110 val
= CONST_WIDE_INT_ELT (x
, elts
- 1);
111 width
%= HOST_BITS_PER_WIDE_INT
;
113 width
= HOST_BITS_PER_WIDE_INT
;
116 else if (width
<= HOST_BITS_PER_DOUBLE_INT
117 && CONST_DOUBLE_AS_INT_P (x
)
118 && CONST_DOUBLE_LOW (x
) == 0)
120 val
= CONST_DOUBLE_HIGH (x
);
121 width
-= HOST_BITS_PER_WIDE_INT
;
125 /* X is not an integer constant. */
128 if (width
< HOST_BITS_PER_WIDE_INT
)
129 val
&= ((unsigned HOST_WIDE_INT
) 1 << width
) - 1;
130 return val
== ((unsigned HOST_WIDE_INT
) 1 << (width
- 1));
133 /* Test whether VAL is equal to the most significant bit of mode MODE
134 (after masking with the mode mask of MODE). Returns false if the
135 precision of MODE is too large to handle. */
138 val_signbit_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
142 if (GET_MODE_CLASS (mode
) != MODE_INT
)
145 width
= GET_MODE_PRECISION (mode
);
146 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
149 val
&= GET_MODE_MASK (mode
);
150 return val
== ((unsigned HOST_WIDE_INT
) 1 << (width
- 1));
153 /* Test whether the most significant bit of mode MODE is set in VAL.
154 Returns false if the precision of MODE is too large to handle. */
156 val_signbit_known_set_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
160 if (GET_MODE_CLASS (mode
) != MODE_INT
)
163 width
= GET_MODE_PRECISION (mode
);
164 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
167 val
&= (unsigned HOST_WIDE_INT
) 1 << (width
- 1);
171 /* Test whether the most significant bit of mode MODE is clear in VAL.
172 Returns false if the precision of MODE is too large to handle. */
174 val_signbit_known_clear_p (machine_mode mode
, unsigned HOST_WIDE_INT val
)
178 if (GET_MODE_CLASS (mode
) != MODE_INT
)
181 width
= GET_MODE_PRECISION (mode
);
182 if (width
== 0 || width
> HOST_BITS_PER_WIDE_INT
)
185 val
&= (unsigned HOST_WIDE_INT
) 1 << (width
- 1);
189 /* Make a binary operation by properly ordering the operands and
190 seeing if the expression folds. */
193 simplify_gen_binary (enum rtx_code code
, machine_mode mode
, rtx op0
,
198 /* If this simplifies, do it. */
199 tem
= simplify_binary_operation (code
, mode
, op0
, op1
);
203 /* Put complex operands first and constants second if commutative. */
204 if (GET_RTX_CLASS (code
) == RTX_COMM_ARITH
205 && swap_commutative_operands_p (op0
, op1
))
206 std::swap (op0
, op1
);
208 return gen_rtx_fmt_ee (code
, mode
, op0
, op1
);
211 /* If X is a MEM referencing the constant pool, return the real value.
212 Otherwise return X. */
214 avoid_constant_pool_reference (rtx x
)
218 HOST_WIDE_INT offset
= 0;
220 switch (GET_CODE (x
))
226 /* Handle float extensions of constant pool references. */
228 c
= avoid_constant_pool_reference (tmp
);
229 if (c
!= tmp
&& CONST_DOUBLE_AS_FLOAT_P (c
))
233 REAL_VALUE_FROM_CONST_DOUBLE (d
, c
);
234 return CONST_DOUBLE_FROM_REAL_VALUE (d
, GET_MODE (x
));
242 if (GET_MODE (x
) == BLKmode
)
247 /* Call target hook to avoid the effects of -fpic etc.... */
248 addr
= targetm
.delegitimize_address (addr
);
250 /* Split the address into a base and integer offset. */
251 if (GET_CODE (addr
) == CONST
252 && GET_CODE (XEXP (addr
, 0)) == PLUS
253 && CONST_INT_P (XEXP (XEXP (addr
, 0), 1)))
255 offset
= INTVAL (XEXP (XEXP (addr
, 0), 1));
256 addr
= XEXP (XEXP (addr
, 0), 0);
259 if (GET_CODE (addr
) == LO_SUM
)
260 addr
= XEXP (addr
, 1);
262 /* If this is a constant pool reference, we can turn it into its
263 constant and hope that simplifications happen. */
264 if (GET_CODE (addr
) == SYMBOL_REF
265 && CONSTANT_POOL_ADDRESS_P (addr
))
267 c
= get_pool_constant (addr
);
268 cmode
= get_pool_mode (addr
);
270 /* If we're accessing the constant in a different mode than it was
271 originally stored, attempt to fix that up via subreg simplifications.
272 If that fails we have no choice but to return the original memory. */
273 if ((offset
!= 0 || cmode
!= GET_MODE (x
))
274 && offset
>= 0 && offset
< GET_MODE_SIZE (cmode
))
276 rtx tem
= simplify_subreg (GET_MODE (x
), c
, cmode
, offset
);
277 if (tem
&& CONSTANT_P (tem
))
287 /* Simplify a MEM based on its attributes. This is the default
288 delegitimize_address target hook, and it's recommended that every
289 overrider call it. */
292 delegitimize_mem_from_attrs (rtx x
)
294 /* MEMs without MEM_OFFSETs may have been offset, so we can't just
295 use their base addresses as equivalent. */
298 && MEM_OFFSET_KNOWN_P (x
))
300 tree decl
= MEM_EXPR (x
);
301 machine_mode mode
= GET_MODE (x
);
302 HOST_WIDE_INT offset
= 0;
304 switch (TREE_CODE (decl
))
314 case ARRAY_RANGE_REF
:
319 case VIEW_CONVERT_EXPR
:
321 HOST_WIDE_INT bitsize
, bitpos
;
323 int unsignedp
, volatilep
= 0;
325 decl
= get_inner_reference (decl
, &bitsize
, &bitpos
, &toffset
,
326 &mode
, &unsignedp
, &volatilep
, false);
327 if (bitsize
!= GET_MODE_BITSIZE (mode
)
328 || (bitpos
% BITS_PER_UNIT
)
329 || (toffset
&& !tree_fits_shwi_p (toffset
)))
333 offset
+= bitpos
/ BITS_PER_UNIT
;
335 offset
+= tree_to_shwi (toffset
);
342 && mode
== GET_MODE (x
)
343 && TREE_CODE (decl
) == VAR_DECL
344 && (TREE_STATIC (decl
)
345 || DECL_THREAD_LOCAL_P (decl
))
346 && DECL_RTL_SET_P (decl
)
347 && MEM_P (DECL_RTL (decl
)))
351 offset
+= MEM_OFFSET (x
);
353 newx
= DECL_RTL (decl
);
357 rtx n
= XEXP (newx
, 0), o
= XEXP (x
, 0);
359 /* Avoid creating a new MEM needlessly if we already had
360 the same address. We do if there's no OFFSET and the
361 old address X is identical to NEWX, or if X is of the
362 form (plus NEWX OFFSET), or the NEWX is of the form
363 (plus Y (const_int Z)) and X is that with the offset
364 added: (plus Y (const_int Z+OFFSET)). */
366 || (GET_CODE (o
) == PLUS
367 && GET_CODE (XEXP (o
, 1)) == CONST_INT
368 && (offset
== INTVAL (XEXP (o
, 1))
369 || (GET_CODE (n
) == PLUS
370 && GET_CODE (XEXP (n
, 1)) == CONST_INT
371 && (INTVAL (XEXP (n
, 1)) + offset
372 == INTVAL (XEXP (o
, 1)))
373 && (n
= XEXP (n
, 0))))
374 && (o
= XEXP (o
, 0))))
375 && rtx_equal_p (o
, n
)))
376 x
= adjust_address_nv (newx
, mode
, offset
);
378 else if (GET_MODE (x
) == GET_MODE (newx
)
387 /* Make a unary operation by first seeing if it folds and otherwise making
388 the specified operation. */
391 simplify_gen_unary (enum rtx_code code
, machine_mode mode
, rtx op
,
392 machine_mode op_mode
)
396 /* If this simplifies, use it. */
397 if ((tem
= simplify_unary_operation (code
, mode
, op
, op_mode
)) != 0)
400 return gen_rtx_fmt_e (code
, mode
, op
);
403 /* Likewise for ternary operations. */
406 simplify_gen_ternary (enum rtx_code code
, machine_mode mode
,
407 machine_mode op0_mode
, rtx op0
, rtx op1
, rtx op2
)
411 /* If this simplifies, use it. */
412 if (0 != (tem
= simplify_ternary_operation (code
, mode
, op0_mode
,
416 return gen_rtx_fmt_eee (code
, mode
, op0
, op1
, op2
);
419 /* Likewise, for relational operations.
420 CMP_MODE specifies mode comparison is done in. */
423 simplify_gen_relational (enum rtx_code code
, machine_mode mode
,
424 machine_mode cmp_mode
, rtx op0
, rtx op1
)
428 if (0 != (tem
= simplify_relational_operation (code
, mode
, cmp_mode
,
432 return gen_rtx_fmt_ee (code
, mode
, op0
, op1
);
435 /* If FN is NULL, replace all occurrences of OLD_RTX in X with copy_rtx (DATA)
436 and simplify the result. If FN is non-NULL, call this callback on each
437 X, if it returns non-NULL, replace X with its return value and simplify the
441 simplify_replace_fn_rtx (rtx x
, const_rtx old_rtx
,
442 rtx (*fn
) (rtx
, const_rtx
, void *), void *data
)
444 enum rtx_code code
= GET_CODE (x
);
445 machine_mode mode
= GET_MODE (x
);
446 machine_mode op_mode
;
448 rtx op0
, op1
, op2
, newx
, op
;
452 if (__builtin_expect (fn
!= NULL
, 0))
454 newx
= fn (x
, old_rtx
, data
);
458 else if (rtx_equal_p (x
, old_rtx
))
459 return copy_rtx ((rtx
) data
);
461 switch (GET_RTX_CLASS (code
))
465 op_mode
= GET_MODE (op0
);
466 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
467 if (op0
== XEXP (x
, 0))
469 return simplify_gen_unary (code
, mode
, op0
, op_mode
);
473 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
474 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
475 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
477 return simplify_gen_binary (code
, mode
, op0
, op1
);
480 case RTX_COMM_COMPARE
:
483 op_mode
= GET_MODE (op0
) != VOIDmode
? GET_MODE (op0
) : GET_MODE (op1
);
484 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
485 op1
= simplify_replace_fn_rtx (op1
, old_rtx
, fn
, data
);
486 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
488 return simplify_gen_relational (code
, mode
, op_mode
, op0
, op1
);
491 case RTX_BITFIELD_OPS
:
493 op_mode
= GET_MODE (op0
);
494 op0
= simplify_replace_fn_rtx (op0
, old_rtx
, fn
, data
);
495 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
496 op2
= simplify_replace_fn_rtx (XEXP (x
, 2), old_rtx
, fn
, data
);
497 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1) && op2
== XEXP (x
, 2))
499 if (op_mode
== VOIDmode
)
500 op_mode
= GET_MODE (op0
);
501 return simplify_gen_ternary (code
, mode
, op_mode
, op0
, op1
, op2
);
506 op0
= simplify_replace_fn_rtx (SUBREG_REG (x
), old_rtx
, fn
, data
);
507 if (op0
== SUBREG_REG (x
))
509 op0
= simplify_gen_subreg (GET_MODE (x
), op0
,
510 GET_MODE (SUBREG_REG (x
)),
512 return op0
? op0
: x
;
519 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
520 if (op0
== XEXP (x
, 0))
522 return replace_equiv_address_nv (x
, op0
);
524 else if (code
== LO_SUM
)
526 op0
= simplify_replace_fn_rtx (XEXP (x
, 0), old_rtx
, fn
, data
);
527 op1
= simplify_replace_fn_rtx (XEXP (x
, 1), old_rtx
, fn
, data
);
529 /* (lo_sum (high x) y) -> y where x and y have the same base. */
530 if (GET_CODE (op0
) == HIGH
)
532 rtx base0
, base1
, offset0
, offset1
;
533 split_const (XEXP (op0
, 0), &base0
, &offset0
);
534 split_const (op1
, &base1
, &offset1
);
535 if (rtx_equal_p (base0
, base1
))
539 if (op0
== XEXP (x
, 0) && op1
== XEXP (x
, 1))
541 return gen_rtx_LO_SUM (mode
, op0
, op1
);
550 fmt
= GET_RTX_FORMAT (code
);
551 for (i
= 0; fmt
[i
]; i
++)
556 newvec
= XVEC (newx
, i
);
557 for (j
= 0; j
< GET_NUM_ELEM (vec
); j
++)
559 op
= simplify_replace_fn_rtx (RTVEC_ELT (vec
, j
),
561 if (op
!= RTVEC_ELT (vec
, j
))
565 newvec
= shallow_copy_rtvec (vec
);
567 newx
= shallow_copy_rtx (x
);
568 XVEC (newx
, i
) = newvec
;
570 RTVEC_ELT (newvec
, j
) = op
;
578 op
= simplify_replace_fn_rtx (XEXP (x
, i
), old_rtx
, fn
, data
);
579 if (op
!= XEXP (x
, i
))
582 newx
= shallow_copy_rtx (x
);
591 /* Replace all occurrences of OLD_RTX in X with NEW_RTX and try to simplify the
592 resulting RTX. Return a new RTX which is as simplified as possible. */
595 simplify_replace_rtx (rtx x
, const_rtx old_rtx
, rtx new_rtx
)
597 return simplify_replace_fn_rtx (x
, old_rtx
, 0, new_rtx
);
600 /* Try to simplify a MODE truncation of OP, which has OP_MODE.
601 Only handle cases where the truncated value is inherently an rvalue.
603 RTL provides two ways of truncating a value:
605 1. a lowpart subreg. This form is only a truncation when both
606 the outer and inner modes (here MODE and OP_MODE respectively)
607 are scalar integers, and only then when the subreg is used as
610 It is only valid to form such truncating subregs if the
611 truncation requires no action by the target. The onus for
612 proving this is on the creator of the subreg -- e.g. the
613 caller to simplify_subreg or simplify_gen_subreg -- and typically
614 involves either TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode.
616 2. a TRUNCATE. This form handles both scalar and compound integers.
618 The first form is preferred where valid. However, the TRUNCATE
619 handling in simplify_unary_operation turns the second form into the
620 first form when TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode allow,
621 so it is generally safe to form rvalue truncations using:
623 simplify_gen_unary (TRUNCATE, ...)
625 and leave simplify_unary_operation to work out which representation
628 Because of the proof requirements on (1), simplify_truncation must
629 also use simplify_gen_unary (TRUNCATE, ...) to truncate parts of OP,
630 regardless of whether the outer truncation came from a SUBREG or a
631 TRUNCATE. For example, if the caller has proven that an SImode
636 is a no-op and can be represented as a subreg, it does not follow
637 that SImode truncations of X and Y are also no-ops. On a target
638 like 64-bit MIPS that requires SImode values to be stored in
639 sign-extended form, an SImode truncation of:
641 (and:DI (reg:DI X) (const_int 63))
643 is trivially a no-op because only the lower 6 bits can be set.
644 However, X is still an arbitrary 64-bit number and so we cannot
645 assume that truncating it too is a no-op. */
648 simplify_truncation (machine_mode mode
, rtx op
,
649 machine_mode op_mode
)
651 unsigned int precision
= GET_MODE_UNIT_PRECISION (mode
);
652 unsigned int op_precision
= GET_MODE_UNIT_PRECISION (op_mode
);
653 gcc_assert (precision
<= op_precision
);
655 /* Optimize truncations of zero and sign extended values. */
656 if (GET_CODE (op
) == ZERO_EXTEND
657 || GET_CODE (op
) == SIGN_EXTEND
)
659 /* There are three possibilities. If MODE is the same as the
660 origmode, we can omit both the extension and the subreg.
661 If MODE is not larger than the origmode, we can apply the
662 truncation without the extension. Finally, if the outermode
663 is larger than the origmode, we can just extend to the appropriate
665 machine_mode origmode
= GET_MODE (XEXP (op
, 0));
666 if (mode
== origmode
)
668 else if (precision
<= GET_MODE_UNIT_PRECISION (origmode
))
669 return simplify_gen_unary (TRUNCATE
, mode
,
670 XEXP (op
, 0), origmode
);
672 return simplify_gen_unary (GET_CODE (op
), mode
,
673 XEXP (op
, 0), origmode
);
676 /* If the machine can perform operations in the truncated mode, distribute
677 the truncation, i.e. simplify (truncate:QI (op:SI (x:SI) (y:SI))) into
678 (op:QI (truncate:QI (x:SI)) (truncate:QI (y:SI))). */
680 #ifdef WORD_REGISTER_OPERATIONS
681 && precision
>= BITS_PER_WORD
683 && (GET_CODE (op
) == PLUS
684 || GET_CODE (op
) == MINUS
685 || GET_CODE (op
) == MULT
))
687 rtx op0
= simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 0), op_mode
);
690 rtx op1
= simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 1), op_mode
);
692 return simplify_gen_binary (GET_CODE (op
), mode
, op0
, op1
);
696 /* Simplify (truncate:QI (lshiftrt:SI (sign_extend:SI (x:QI)) C)) into
697 to (ashiftrt:QI (x:QI) C), where C is a suitable small constant and
698 the outer subreg is effectively a truncation to the original mode. */
699 if ((GET_CODE (op
) == LSHIFTRT
700 || GET_CODE (op
) == ASHIFTRT
)
701 /* Ensure that OP_MODE is at least twice as wide as MODE
702 to avoid the possibility that an outer LSHIFTRT shifts by more
703 than the sign extension's sign_bit_copies and introduces zeros
704 into the high bits of the result. */
705 && 2 * precision
<= op_precision
706 && CONST_INT_P (XEXP (op
, 1))
707 && GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
708 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
709 && UINTVAL (XEXP (op
, 1)) < precision
)
710 return simplify_gen_binary (ASHIFTRT
, mode
,
711 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
713 /* Likewise (truncate:QI (lshiftrt:SI (zero_extend:SI (x:QI)) C)) into
714 to (lshiftrt:QI (x:QI) C), where C is a suitable small constant and
715 the outer subreg is effectively a truncation to the original mode. */
716 if ((GET_CODE (op
) == LSHIFTRT
717 || GET_CODE (op
) == ASHIFTRT
)
718 && CONST_INT_P (XEXP (op
, 1))
719 && GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
720 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
721 && UINTVAL (XEXP (op
, 1)) < precision
)
722 return simplify_gen_binary (LSHIFTRT
, mode
,
723 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
725 /* Likewise (truncate:QI (ashift:SI (zero_extend:SI (x:QI)) C)) into
726 to (ashift:QI (x:QI) C), where C is a suitable small constant and
727 the outer subreg is effectively a truncation to the original mode. */
728 if (GET_CODE (op
) == ASHIFT
729 && CONST_INT_P (XEXP (op
, 1))
730 && (GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
731 || GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
)
732 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
733 && UINTVAL (XEXP (op
, 1)) < precision
)
734 return simplify_gen_binary (ASHIFT
, mode
,
735 XEXP (XEXP (op
, 0), 0), XEXP (op
, 1));
737 /* Recognize a word extraction from a multi-word subreg. */
738 if ((GET_CODE (op
) == LSHIFTRT
739 || GET_CODE (op
) == ASHIFTRT
)
740 && SCALAR_INT_MODE_P (mode
)
741 && SCALAR_INT_MODE_P (op_mode
)
742 && precision
>= BITS_PER_WORD
743 && 2 * precision
<= op_precision
744 && CONST_INT_P (XEXP (op
, 1))
745 && (INTVAL (XEXP (op
, 1)) & (precision
- 1)) == 0
746 && UINTVAL (XEXP (op
, 1)) < op_precision
)
748 int byte
= subreg_lowpart_offset (mode
, op_mode
);
749 int shifted_bytes
= INTVAL (XEXP (op
, 1)) / BITS_PER_UNIT
;
750 return simplify_gen_subreg (mode
, XEXP (op
, 0), op_mode
,
752 ? byte
- shifted_bytes
753 : byte
+ shifted_bytes
));
756 /* If we have a TRUNCATE of a right shift of MEM, make a new MEM
757 and try replacing the TRUNCATE and shift with it. Don't do this
758 if the MEM has a mode-dependent address. */
759 if ((GET_CODE (op
) == LSHIFTRT
760 || GET_CODE (op
) == ASHIFTRT
)
761 && SCALAR_INT_MODE_P (op_mode
)
762 && MEM_P (XEXP (op
, 0))
763 && CONST_INT_P (XEXP (op
, 1))
764 && (INTVAL (XEXP (op
, 1)) % GET_MODE_BITSIZE (mode
)) == 0
765 && INTVAL (XEXP (op
, 1)) > 0
766 && INTVAL (XEXP (op
, 1)) < GET_MODE_BITSIZE (op_mode
)
767 && ! mode_dependent_address_p (XEXP (XEXP (op
, 0), 0),
768 MEM_ADDR_SPACE (XEXP (op
, 0)))
769 && ! MEM_VOLATILE_P (XEXP (op
, 0))
770 && (GET_MODE_SIZE (mode
) >= UNITS_PER_WORD
771 || WORDS_BIG_ENDIAN
== BYTES_BIG_ENDIAN
))
773 int byte
= subreg_lowpart_offset (mode
, op_mode
);
774 int shifted_bytes
= INTVAL (XEXP (op
, 1)) / BITS_PER_UNIT
;
775 return adjust_address_nv (XEXP (op
, 0), mode
,
777 ? byte
- shifted_bytes
778 : byte
+ shifted_bytes
));
781 /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
782 (OP:SI foo:SI) if OP is NEG or ABS. */
783 if ((GET_CODE (op
) == ABS
784 || GET_CODE (op
) == NEG
)
785 && (GET_CODE (XEXP (op
, 0)) == SIGN_EXTEND
786 || GET_CODE (XEXP (op
, 0)) == ZERO_EXTEND
)
787 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
)
788 return simplify_gen_unary (GET_CODE (op
), mode
,
789 XEXP (XEXP (op
, 0), 0), mode
);
791 /* (truncate:A (subreg:B (truncate:C X) 0)) is
793 if (GET_CODE (op
) == SUBREG
794 && SCALAR_INT_MODE_P (mode
)
795 && SCALAR_INT_MODE_P (op_mode
)
796 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (op
)))
797 && GET_CODE (SUBREG_REG (op
)) == TRUNCATE
798 && subreg_lowpart_p (op
))
800 rtx inner
= XEXP (SUBREG_REG (op
), 0);
801 if (GET_MODE_PRECISION (mode
)
802 <= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
))))
803 return simplify_gen_unary (TRUNCATE
, mode
, inner
, GET_MODE (inner
));
805 /* If subreg above is paradoxical and C is narrower
806 than A, return (subreg:A (truncate:C X) 0). */
807 return simplify_gen_subreg (mode
, SUBREG_REG (op
),
808 GET_MODE (SUBREG_REG (op
)), 0);
811 /* (truncate:A (truncate:B X)) is (truncate:A X). */
812 if (GET_CODE (op
) == TRUNCATE
)
813 return simplify_gen_unary (TRUNCATE
, mode
, XEXP (op
, 0),
814 GET_MODE (XEXP (op
, 0)));
819 /* Try to simplify a unary operation CODE whose output mode is to be
820 MODE with input operand OP whose mode was originally OP_MODE.
821 Return zero if no simplification can be made. */
823 simplify_unary_operation (enum rtx_code code
, machine_mode mode
,
824 rtx op
, machine_mode op_mode
)
828 trueop
= avoid_constant_pool_reference (op
);
830 tem
= simplify_const_unary_operation (code
, mode
, trueop
, op_mode
);
834 return simplify_unary_operation_1 (code
, mode
, op
);
837 /* Perform some simplifications we can do even if the operands
840 simplify_unary_operation_1 (enum rtx_code code
, machine_mode mode
, rtx op
)
842 enum rtx_code reversed
;
848 /* (not (not X)) == X. */
849 if (GET_CODE (op
) == NOT
)
852 /* (not (eq X Y)) == (ne X Y), etc. if BImode or the result of the
853 comparison is all ones. */
854 if (COMPARISON_P (op
)
855 && (mode
== BImode
|| STORE_FLAG_VALUE
== -1)
856 && ((reversed
= reversed_comparison_code (op
, NULL_RTX
)) != UNKNOWN
))
857 return simplify_gen_relational (reversed
, mode
, VOIDmode
,
858 XEXP (op
, 0), XEXP (op
, 1));
860 /* (not (plus X -1)) can become (neg X). */
861 if (GET_CODE (op
) == PLUS
862 && XEXP (op
, 1) == constm1_rtx
)
863 return simplify_gen_unary (NEG
, mode
, XEXP (op
, 0), mode
);
865 /* Similarly, (not (neg X)) is (plus X -1). */
866 if (GET_CODE (op
) == NEG
)
867 return simplify_gen_binary (PLUS
, mode
, XEXP (op
, 0),
870 /* (not (xor X C)) for C constant is (xor X D) with D = ~C. */
871 if (GET_CODE (op
) == XOR
872 && CONST_INT_P (XEXP (op
, 1))
873 && (temp
= simplify_unary_operation (NOT
, mode
,
874 XEXP (op
, 1), mode
)) != 0)
875 return simplify_gen_binary (XOR
, mode
, XEXP (op
, 0), temp
);
877 /* (not (plus X C)) for signbit C is (xor X D) with D = ~C. */
878 if (GET_CODE (op
) == PLUS
879 && CONST_INT_P (XEXP (op
, 1))
880 && mode_signbit_p (mode
, XEXP (op
, 1))
881 && (temp
= simplify_unary_operation (NOT
, mode
,
882 XEXP (op
, 1), mode
)) != 0)
883 return simplify_gen_binary (XOR
, mode
, XEXP (op
, 0), temp
);
886 /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for
887 operands other than 1, but that is not valid. We could do a
888 similar simplification for (not (lshiftrt C X)) where C is
889 just the sign bit, but this doesn't seem common enough to
891 if (GET_CODE (op
) == ASHIFT
892 && XEXP (op
, 0) == const1_rtx
)
894 temp
= simplify_gen_unary (NOT
, mode
, const1_rtx
, mode
);
895 return simplify_gen_binary (ROTATE
, mode
, temp
, XEXP (op
, 1));
898 /* (not (ashiftrt foo C)) where C is the number of bits in FOO
899 minus 1 is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1,
900 so we can perform the above simplification. */
901 if (STORE_FLAG_VALUE
== -1
902 && GET_CODE (op
) == ASHIFTRT
903 && CONST_INT_P (XEXP (op
, 1))
904 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
905 return simplify_gen_relational (GE
, mode
, VOIDmode
,
906 XEXP (op
, 0), const0_rtx
);
909 if (GET_CODE (op
) == SUBREG
910 && subreg_lowpart_p (op
)
911 && (GET_MODE_SIZE (GET_MODE (op
))
912 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op
))))
913 && GET_CODE (SUBREG_REG (op
)) == ASHIFT
914 && XEXP (SUBREG_REG (op
), 0) == const1_rtx
)
916 machine_mode inner_mode
= GET_MODE (SUBREG_REG (op
));
919 x
= gen_rtx_ROTATE (inner_mode
,
920 simplify_gen_unary (NOT
, inner_mode
, const1_rtx
,
922 XEXP (SUBREG_REG (op
), 1));
923 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, x
);
928 /* Apply De Morgan's laws to reduce number of patterns for machines
929 with negating logical insns (and-not, nand, etc.). If result has
930 only one NOT, put it first, since that is how the patterns are
932 if (GET_CODE (op
) == IOR
|| GET_CODE (op
) == AND
)
934 rtx in1
= XEXP (op
, 0), in2
= XEXP (op
, 1);
935 machine_mode op_mode
;
937 op_mode
= GET_MODE (in1
);
938 in1
= simplify_gen_unary (NOT
, op_mode
, in1
, op_mode
);
940 op_mode
= GET_MODE (in2
);
941 if (op_mode
== VOIDmode
)
943 in2
= simplify_gen_unary (NOT
, op_mode
, in2
, op_mode
);
945 if (GET_CODE (in2
) == NOT
&& GET_CODE (in1
) != NOT
)
946 std::swap (in1
, in2
);
948 return gen_rtx_fmt_ee (GET_CODE (op
) == IOR
? AND
: IOR
,
952 /* (not (bswap x)) -> (bswap (not x)). */
953 if (GET_CODE (op
) == BSWAP
)
955 rtx x
= simplify_gen_unary (NOT
, mode
, XEXP (op
, 0), mode
);
956 return simplify_gen_unary (BSWAP
, mode
, x
, mode
);
961 /* (neg (neg X)) == X. */
962 if (GET_CODE (op
) == NEG
)
965 /* (neg (plus X 1)) can become (not X). */
966 if (GET_CODE (op
) == PLUS
967 && XEXP (op
, 1) == const1_rtx
)
968 return simplify_gen_unary (NOT
, mode
, XEXP (op
, 0), mode
);
970 /* Similarly, (neg (not X)) is (plus X 1). */
971 if (GET_CODE (op
) == NOT
)
972 return simplify_gen_binary (PLUS
, mode
, XEXP (op
, 0),
975 /* (neg (minus X Y)) can become (minus Y X). This transformation
976 isn't safe for modes with signed zeros, since if X and Y are
977 both +0, (minus Y X) is the same as (minus X Y). If the
978 rounding mode is towards +infinity (or -infinity) then the two
979 expressions will be rounded differently. */
980 if (GET_CODE (op
) == MINUS
981 && !HONOR_SIGNED_ZEROS (mode
)
982 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
983 return simplify_gen_binary (MINUS
, mode
, XEXP (op
, 1), XEXP (op
, 0));
985 if (GET_CODE (op
) == PLUS
986 && !HONOR_SIGNED_ZEROS (mode
)
987 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
989 /* (neg (plus A C)) is simplified to (minus -C A). */
990 if (CONST_SCALAR_INT_P (XEXP (op
, 1))
991 || CONST_DOUBLE_AS_FLOAT_P (XEXP (op
, 1)))
993 temp
= simplify_unary_operation (NEG
, mode
, XEXP (op
, 1), mode
);
995 return simplify_gen_binary (MINUS
, mode
, temp
, XEXP (op
, 0));
998 /* (neg (plus A B)) is canonicalized to (minus (neg A) B). */
999 temp
= simplify_gen_unary (NEG
, mode
, XEXP (op
, 0), mode
);
1000 return simplify_gen_binary (MINUS
, mode
, temp
, XEXP (op
, 1));
1003 /* (neg (mult A B)) becomes (mult A (neg B)).
1004 This works even for floating-point values. */
1005 if (GET_CODE (op
) == MULT
1006 && !HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
1008 temp
= simplify_gen_unary (NEG
, mode
, XEXP (op
, 1), mode
);
1009 return simplify_gen_binary (MULT
, mode
, XEXP (op
, 0), temp
);
1012 /* NEG commutes with ASHIFT since it is multiplication. Only do
1013 this if we can then eliminate the NEG (e.g., if the operand
1015 if (GET_CODE (op
) == ASHIFT
)
1017 temp
= simplify_unary_operation (NEG
, mode
, XEXP (op
, 0), mode
);
1019 return simplify_gen_binary (ASHIFT
, mode
, temp
, XEXP (op
, 1));
1022 /* (neg (ashiftrt X C)) can be replaced by (lshiftrt X C) when
1023 C is equal to the width of MODE minus 1. */
1024 if (GET_CODE (op
) == ASHIFTRT
1025 && CONST_INT_P (XEXP (op
, 1))
1026 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
1027 return simplify_gen_binary (LSHIFTRT
, mode
,
1028 XEXP (op
, 0), XEXP (op
, 1));
1030 /* (neg (lshiftrt X C)) can be replaced by (ashiftrt X C) when
1031 C is equal to the width of MODE minus 1. */
1032 if (GET_CODE (op
) == LSHIFTRT
1033 && CONST_INT_P (XEXP (op
, 1))
1034 && INTVAL (XEXP (op
, 1)) == GET_MODE_PRECISION (mode
) - 1)
1035 return simplify_gen_binary (ASHIFTRT
, mode
,
1036 XEXP (op
, 0), XEXP (op
, 1));
1038 /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
1039 if (GET_CODE (op
) == XOR
1040 && XEXP (op
, 1) == const1_rtx
1041 && nonzero_bits (XEXP (op
, 0), mode
) == 1)
1042 return plus_constant (mode
, XEXP (op
, 0), -1);
1044 /* (neg (lt x 0)) is (ashiftrt X C) if STORE_FLAG_VALUE is 1. */
1045 /* (neg (lt x 0)) is (lshiftrt X C) if STORE_FLAG_VALUE is -1. */
1046 if (GET_CODE (op
) == LT
1047 && XEXP (op
, 1) == const0_rtx
1048 && SCALAR_INT_MODE_P (GET_MODE (XEXP (op
, 0))))
1050 machine_mode inner
= GET_MODE (XEXP (op
, 0));
1051 int isize
= GET_MODE_PRECISION (inner
);
1052 if (STORE_FLAG_VALUE
== 1)
1054 temp
= simplify_gen_binary (ASHIFTRT
, inner
, XEXP (op
, 0),
1055 GEN_INT (isize
- 1));
1058 if (GET_MODE_PRECISION (mode
) > isize
)
1059 return simplify_gen_unary (SIGN_EXTEND
, mode
, temp
, inner
);
1060 return simplify_gen_unary (TRUNCATE
, mode
, temp
, inner
);
1062 else if (STORE_FLAG_VALUE
== -1)
1064 temp
= simplify_gen_binary (LSHIFTRT
, inner
, XEXP (op
, 0),
1065 GEN_INT (isize
- 1));
1068 if (GET_MODE_PRECISION (mode
) > isize
)
1069 return simplify_gen_unary (ZERO_EXTEND
, mode
, temp
, inner
);
1070 return simplify_gen_unary (TRUNCATE
, mode
, temp
, inner
);
1076 /* Don't optimize (lshiftrt (mult ...)) as it would interfere
1077 with the umulXi3_highpart patterns. */
1078 if (GET_CODE (op
) == LSHIFTRT
1079 && GET_CODE (XEXP (op
, 0)) == MULT
)
1082 if (GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
1084 if (TRULY_NOOP_TRUNCATION_MODES_P (mode
, GET_MODE (op
)))
1086 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1090 /* We can't handle truncation to a partial integer mode here
1091 because we don't know the real bitsize of the partial
1096 if (GET_MODE (op
) != VOIDmode
)
1098 temp
= simplify_truncation (mode
, op
, GET_MODE (op
));
1103 /* If we know that the value is already truncated, we can
1104 replace the TRUNCATE with a SUBREG. */
1105 if (GET_MODE_NUNITS (mode
) == 1
1106 && (TRULY_NOOP_TRUNCATION_MODES_P (mode
, GET_MODE (op
))
1107 || truncated_to_mode (mode
, op
)))
1109 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1114 /* A truncate of a comparison can be replaced with a subreg if
1115 STORE_FLAG_VALUE permits. This is like the previous test,
1116 but it works even if the comparison is done in a mode larger
1117 than HOST_BITS_PER_WIDE_INT. */
1118 if (HWI_COMPUTABLE_MODE_P (mode
)
1119 && COMPARISON_P (op
)
1120 && (STORE_FLAG_VALUE
& ~GET_MODE_MASK (mode
)) == 0)
1122 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1127 /* A truncate of a memory is just loading the low part of the memory
1128 if we are not changing the meaning of the address. */
1129 if (GET_CODE (op
) == MEM
1130 && !VECTOR_MODE_P (mode
)
1131 && !MEM_VOLATILE_P (op
)
1132 && !mode_dependent_address_p (XEXP (op
, 0), MEM_ADDR_SPACE (op
)))
1134 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1141 case FLOAT_TRUNCATE
:
1142 if (DECIMAL_FLOAT_MODE_P (mode
))
1145 /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */
1146 if (GET_CODE (op
) == FLOAT_EXTEND
1147 && GET_MODE (XEXP (op
, 0)) == mode
)
1148 return XEXP (op
, 0);
1150 /* (float_truncate:SF (float_truncate:DF foo:XF))
1151 = (float_truncate:SF foo:XF).
1152 This may eliminate double rounding, so it is unsafe.
1154 (float_truncate:SF (float_extend:XF foo:DF))
1155 = (float_truncate:SF foo:DF).
1157 (float_truncate:DF (float_extend:XF foo:SF))
1158 = (float_extend:DF foo:SF). */
1159 if ((GET_CODE (op
) == FLOAT_TRUNCATE
1160 && flag_unsafe_math_optimizations
)
1161 || GET_CODE (op
) == FLOAT_EXTEND
)
1162 return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (op
,
1164 > GET_MODE_SIZE (mode
)
1165 ? FLOAT_TRUNCATE
: FLOAT_EXTEND
,
1167 XEXP (op
, 0), mode
);
1169 /* (float_truncate (float x)) is (float x) */
1170 if ((GET_CODE (op
) == FLOAT
|| GET_CODE (op
) == UNSIGNED_FLOAT
)
1171 && (flag_unsafe_math_optimizations
1172 || (SCALAR_FLOAT_MODE_P (GET_MODE (op
))
1173 && ((unsigned)significand_size (GET_MODE (op
))
1174 >= (GET_MODE_PRECISION (GET_MODE (XEXP (op
, 0)))
1175 - num_sign_bit_copies (XEXP (op
, 0),
1176 GET_MODE (XEXP (op
, 0))))))))
1177 return simplify_gen_unary (GET_CODE (op
), mode
,
1179 GET_MODE (XEXP (op
, 0)));
1181 /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
1182 (OP:SF foo:SF) if OP is NEG or ABS. */
1183 if ((GET_CODE (op
) == ABS
1184 || GET_CODE (op
) == NEG
)
1185 && GET_CODE (XEXP (op
, 0)) == FLOAT_EXTEND
1186 && GET_MODE (XEXP (XEXP (op
, 0), 0)) == mode
)
1187 return simplify_gen_unary (GET_CODE (op
), mode
,
1188 XEXP (XEXP (op
, 0), 0), mode
);
1190 /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
1191 is (float_truncate:SF x). */
1192 if (GET_CODE (op
) == SUBREG
1193 && subreg_lowpart_p (op
)
1194 && GET_CODE (SUBREG_REG (op
)) == FLOAT_TRUNCATE
)
1195 return SUBREG_REG (op
);
1199 if (DECIMAL_FLOAT_MODE_P (mode
))
1202 /* (float_extend (float_extend x)) is (float_extend x)
1204 (float_extend (float x)) is (float x) assuming that double
1205 rounding can't happen.
1207 if (GET_CODE (op
) == FLOAT_EXTEND
1208 || ((GET_CODE (op
) == FLOAT
|| GET_CODE (op
) == UNSIGNED_FLOAT
)
1209 && SCALAR_FLOAT_MODE_P (GET_MODE (op
))
1210 && ((unsigned)significand_size (GET_MODE (op
))
1211 >= (GET_MODE_PRECISION (GET_MODE (XEXP (op
, 0)))
1212 - num_sign_bit_copies (XEXP (op
, 0),
1213 GET_MODE (XEXP (op
, 0)))))))
1214 return simplify_gen_unary (GET_CODE (op
), mode
,
1216 GET_MODE (XEXP (op
, 0)));
1221 /* (abs (neg <foo>)) -> (abs <foo>) */
1222 if (GET_CODE (op
) == NEG
)
1223 return simplify_gen_unary (ABS
, mode
, XEXP (op
, 0),
1224 GET_MODE (XEXP (op
, 0)));
1226 /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
1228 if (GET_MODE (op
) == VOIDmode
)
1231 /* If operand is something known to be positive, ignore the ABS. */
1232 if (GET_CODE (op
) == FFS
|| GET_CODE (op
) == ABS
1233 || val_signbit_known_clear_p (GET_MODE (op
),
1234 nonzero_bits (op
, GET_MODE (op
))))
1237 /* If operand is known to be only -1 or 0, convert ABS to NEG. */
1238 if (num_sign_bit_copies (op
, mode
) == GET_MODE_PRECISION (mode
))
1239 return gen_rtx_NEG (mode
, op
);
1244 /* (ffs (*_extend <X>)) = (ffs <X>) */
1245 if (GET_CODE (op
) == SIGN_EXTEND
1246 || GET_CODE (op
) == ZERO_EXTEND
)
1247 return simplify_gen_unary (FFS
, mode
, XEXP (op
, 0),
1248 GET_MODE (XEXP (op
, 0)));
1252 switch (GET_CODE (op
))
1256 /* (popcount (zero_extend <X>)) = (popcount <X>) */
1257 return simplify_gen_unary (POPCOUNT
, mode
, XEXP (op
, 0),
1258 GET_MODE (XEXP (op
, 0)));
1262 /* Rotations don't affect popcount. */
1263 if (!side_effects_p (XEXP (op
, 1)))
1264 return simplify_gen_unary (POPCOUNT
, mode
, XEXP (op
, 0),
1265 GET_MODE (XEXP (op
, 0)));
1274 switch (GET_CODE (op
))
1280 return simplify_gen_unary (PARITY
, mode
, XEXP (op
, 0),
1281 GET_MODE (XEXP (op
, 0)));
1285 /* Rotations don't affect parity. */
1286 if (!side_effects_p (XEXP (op
, 1)))
1287 return simplify_gen_unary (PARITY
, mode
, XEXP (op
, 0),
1288 GET_MODE (XEXP (op
, 0)));
1297 /* (bswap (bswap x)) -> x. */
1298 if (GET_CODE (op
) == BSWAP
)
1299 return XEXP (op
, 0);
1303 /* (float (sign_extend <X>)) = (float <X>). */
1304 if (GET_CODE (op
) == SIGN_EXTEND
)
1305 return simplify_gen_unary (FLOAT
, mode
, XEXP (op
, 0),
1306 GET_MODE (XEXP (op
, 0)));
1310 /* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
1311 becomes just the MINUS if its mode is MODE. This allows
1312 folding switch statements on machines using casesi (such as
1314 if (GET_CODE (op
) == TRUNCATE
1315 && GET_MODE (XEXP (op
, 0)) == mode
1316 && GET_CODE (XEXP (op
, 0)) == MINUS
1317 && GET_CODE (XEXP (XEXP (op
, 0), 0)) == LABEL_REF
1318 && GET_CODE (XEXP (XEXP (op
, 0), 1)) == LABEL_REF
)
1319 return XEXP (op
, 0);
1321 /* Extending a widening multiplication should be canonicalized to
1322 a wider widening multiplication. */
1323 if (GET_CODE (op
) == MULT
)
1325 rtx lhs
= XEXP (op
, 0);
1326 rtx rhs
= XEXP (op
, 1);
1327 enum rtx_code lcode
= GET_CODE (lhs
);
1328 enum rtx_code rcode
= GET_CODE (rhs
);
1330 /* Widening multiplies usually extend both operands, but sometimes
1331 they use a shift to extract a portion of a register. */
1332 if ((lcode
== SIGN_EXTEND
1333 || (lcode
== ASHIFTRT
&& CONST_INT_P (XEXP (lhs
, 1))))
1334 && (rcode
== SIGN_EXTEND
1335 || (rcode
== ASHIFTRT
&& CONST_INT_P (XEXP (rhs
, 1)))))
1337 machine_mode lmode
= GET_MODE (lhs
);
1338 machine_mode rmode
= GET_MODE (rhs
);
1341 if (lcode
== ASHIFTRT
)
1342 /* Number of bits not shifted off the end. */
1343 bits
= GET_MODE_PRECISION (lmode
) - INTVAL (XEXP (lhs
, 1));
1344 else /* lcode == SIGN_EXTEND */
1345 /* Size of inner mode. */
1346 bits
= GET_MODE_PRECISION (GET_MODE (XEXP (lhs
, 0)));
1348 if (rcode
== ASHIFTRT
)
1349 bits
+= GET_MODE_PRECISION (rmode
) - INTVAL (XEXP (rhs
, 1));
1350 else /* rcode == SIGN_EXTEND */
1351 bits
+= GET_MODE_PRECISION (GET_MODE (XEXP (rhs
, 0)));
1353 /* We can only widen multiplies if the result is mathematiclly
1354 equivalent. I.e. if overflow was impossible. */
1355 if (bits
<= GET_MODE_PRECISION (GET_MODE (op
)))
1356 return simplify_gen_binary
1358 simplify_gen_unary (SIGN_EXTEND
, mode
, lhs
, lmode
),
1359 simplify_gen_unary (SIGN_EXTEND
, mode
, rhs
, rmode
));
1363 /* Check for a sign extension of a subreg of a promoted
1364 variable, where the promotion is sign-extended, and the
1365 target mode is the same as the variable's promotion. */
1366 if (GET_CODE (op
) == SUBREG
1367 && SUBREG_PROMOTED_VAR_P (op
)
1368 && SUBREG_PROMOTED_SIGNED_P (op
)
1369 && GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (GET_MODE (XEXP (op
, 0))))
1371 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1376 /* (sign_extend:M (sign_extend:N <X>)) is (sign_extend:M <X>).
1377 (sign_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>). */
1378 if (GET_CODE (op
) == SIGN_EXTEND
|| GET_CODE (op
) == ZERO_EXTEND
)
1380 gcc_assert (GET_MODE_PRECISION (mode
)
1381 > GET_MODE_PRECISION (GET_MODE (op
)));
1382 return simplify_gen_unary (GET_CODE (op
), mode
, XEXP (op
, 0),
1383 GET_MODE (XEXP (op
, 0)));
1386 /* (sign_extend:M (ashiftrt:N (ashift <X> (const_int I)) (const_int I)))
1387 is (sign_extend:M (subreg:O <X>)) if there is mode with
1388 GET_MODE_BITSIZE (N) - I bits.
1389 (sign_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1390 is similarly (zero_extend:M (subreg:O <X>)). */
1391 if ((GET_CODE (op
) == ASHIFTRT
|| GET_CODE (op
) == LSHIFTRT
)
1392 && GET_CODE (XEXP (op
, 0)) == ASHIFT
1393 && CONST_INT_P (XEXP (op
, 1))
1394 && XEXP (XEXP (op
, 0), 1) == XEXP (op
, 1)
1395 && GET_MODE_BITSIZE (GET_MODE (op
)) > INTVAL (XEXP (op
, 1)))
1398 = mode_for_size (GET_MODE_BITSIZE (GET_MODE (op
))
1399 - INTVAL (XEXP (op
, 1)), MODE_INT
, 1);
1400 gcc_assert (GET_MODE_BITSIZE (mode
)
1401 > GET_MODE_BITSIZE (GET_MODE (op
)));
1402 if (tmode
!= BLKmode
)
1405 rtl_hooks
.gen_lowpart_no_emit (tmode
, XEXP (XEXP (op
, 0), 0));
1407 return simplify_gen_unary (GET_CODE (op
) == ASHIFTRT
1408 ? SIGN_EXTEND
: ZERO_EXTEND
,
1409 mode
, inner
, tmode
);
1413 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
1414 /* As we do not know which address space the pointer is referring to,
1415 we can do this only if the target does not support different pointer
1416 or address modes depending on the address space. */
1417 if (target_default_pointer_address_modes_p ()
1418 && ! POINTERS_EXTEND_UNSIGNED
1419 && mode
== Pmode
&& GET_MODE (op
) == ptr_mode
1421 || (GET_CODE (op
) == SUBREG
1422 && REG_P (SUBREG_REG (op
))
1423 && REG_POINTER (SUBREG_REG (op
))
1424 && GET_MODE (SUBREG_REG (op
)) == Pmode
)))
1425 return convert_memory_address (Pmode
, op
);
1430 /* Check for a zero extension of a subreg of a promoted
1431 variable, where the promotion is zero-extended, and the
1432 target mode is the same as the variable's promotion. */
1433 if (GET_CODE (op
) == SUBREG
1434 && SUBREG_PROMOTED_VAR_P (op
)
1435 && SUBREG_PROMOTED_UNSIGNED_P (op
)
1436 && GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (GET_MODE (XEXP (op
, 0))))
1438 temp
= rtl_hooks
.gen_lowpart_no_emit (mode
, op
);
1443 /* Extending a widening multiplication should be canonicalized to
1444 a wider widening multiplication. */
1445 if (GET_CODE (op
) == MULT
)
1447 rtx lhs
= XEXP (op
, 0);
1448 rtx rhs
= XEXP (op
, 1);
1449 enum rtx_code lcode
= GET_CODE (lhs
);
1450 enum rtx_code rcode
= GET_CODE (rhs
);
1452 /* Widening multiplies usually extend both operands, but sometimes
1453 they use a shift to extract a portion of a register. */
1454 if ((lcode
== ZERO_EXTEND
1455 || (lcode
== LSHIFTRT
&& CONST_INT_P (XEXP (lhs
, 1))))
1456 && (rcode
== ZERO_EXTEND
1457 || (rcode
== LSHIFTRT
&& CONST_INT_P (XEXP (rhs
, 1)))))
1459 machine_mode lmode
= GET_MODE (lhs
);
1460 machine_mode rmode
= GET_MODE (rhs
);
1463 if (lcode
== LSHIFTRT
)
1464 /* Number of bits not shifted off the end. */
1465 bits
= GET_MODE_PRECISION (lmode
) - INTVAL (XEXP (lhs
, 1));
1466 else /* lcode == ZERO_EXTEND */
1467 /* Size of inner mode. */
1468 bits
= GET_MODE_PRECISION (GET_MODE (XEXP (lhs
, 0)));
1470 if (rcode
== LSHIFTRT
)
1471 bits
+= GET_MODE_PRECISION (rmode
) - INTVAL (XEXP (rhs
, 1));
1472 else /* rcode == ZERO_EXTEND */
1473 bits
+= GET_MODE_PRECISION (GET_MODE (XEXP (rhs
, 0)));
1475 /* We can only widen multiplies if the result is mathematiclly
1476 equivalent. I.e. if overflow was impossible. */
1477 if (bits
<= GET_MODE_PRECISION (GET_MODE (op
)))
1478 return simplify_gen_binary
1480 simplify_gen_unary (ZERO_EXTEND
, mode
, lhs
, lmode
),
1481 simplify_gen_unary (ZERO_EXTEND
, mode
, rhs
, rmode
));
1485 /* (zero_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>). */
1486 if (GET_CODE (op
) == ZERO_EXTEND
)
1487 return simplify_gen_unary (ZERO_EXTEND
, mode
, XEXP (op
, 0),
1488 GET_MODE (XEXP (op
, 0)));
1490 /* (zero_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1491 is (zero_extend:M (subreg:O <X>)) if there is mode with
1492 GET_MODE_PRECISION (N) - I bits. */
1493 if (GET_CODE (op
) == LSHIFTRT
1494 && GET_CODE (XEXP (op
, 0)) == ASHIFT
1495 && CONST_INT_P (XEXP (op
, 1))
1496 && XEXP (XEXP (op
, 0), 1) == XEXP (op
, 1)
1497 && GET_MODE_PRECISION (GET_MODE (op
)) > INTVAL (XEXP (op
, 1)))
1500 = mode_for_size (GET_MODE_PRECISION (GET_MODE (op
))
1501 - INTVAL (XEXP (op
, 1)), MODE_INT
, 1);
1502 if (tmode
!= BLKmode
)
1505 rtl_hooks
.gen_lowpart_no_emit (tmode
, XEXP (XEXP (op
, 0), 0));
1507 return simplify_gen_unary (ZERO_EXTEND
, mode
, inner
, tmode
);
1511 /* (zero_extend:M (subreg:N <X:O>)) is <X:O> (for M == O) or
1512 (zero_extend:M <X:O>), if X doesn't have any non-zero bits outside
1514 (zero_extend:SI (subreg:QI (and:SI (reg:SI) (const_int 63)) 0)) is
1515 (and:SI (reg:SI) (const_int 63)). */
1516 if (GET_CODE (op
) == SUBREG
1517 && GET_MODE_PRECISION (GET_MODE (op
))
1518 < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1519 && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1520 <= HOST_BITS_PER_WIDE_INT
1521 && GET_MODE_PRECISION (mode
)
1522 >= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
)))
1523 && subreg_lowpart_p (op
)
1524 && (nonzero_bits (SUBREG_REG (op
), GET_MODE (SUBREG_REG (op
)))
1525 & ~GET_MODE_MASK (GET_MODE (op
))) == 0)
1527 if (GET_MODE_PRECISION (mode
)
1528 == GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op
))))
1529 return SUBREG_REG (op
);
1530 return simplify_gen_unary (ZERO_EXTEND
, mode
, SUBREG_REG (op
),
1531 GET_MODE (SUBREG_REG (op
)));
1534 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
1535 /* As we do not know which address space the pointer is referring to,
1536 we can do this only if the target does not support different pointer
1537 or address modes depending on the address space. */
1538 if (target_default_pointer_address_modes_p ()
1539 && POINTERS_EXTEND_UNSIGNED
> 0
1540 && mode
== Pmode
&& GET_MODE (op
) == ptr_mode
1542 || (GET_CODE (op
) == SUBREG
1543 && REG_P (SUBREG_REG (op
))
1544 && REG_POINTER (SUBREG_REG (op
))
1545 && GET_MODE (SUBREG_REG (op
)) == Pmode
)))
1546 return convert_memory_address (Pmode
, op
);
1557 /* Try to compute the value of a unary operation CODE whose output mode is to
1558 be MODE with input operand OP whose mode was originally OP_MODE.
1559 Return zero if the value cannot be computed. */
1561 simplify_const_unary_operation (enum rtx_code code
, machine_mode mode
,
1562 rtx op
, machine_mode op_mode
)
1564 unsigned int width
= GET_MODE_PRECISION (mode
);
1566 if (code
== VEC_DUPLICATE
)
1568 gcc_assert (VECTOR_MODE_P (mode
));
1569 if (GET_MODE (op
) != VOIDmode
)
1571 if (!VECTOR_MODE_P (GET_MODE (op
)))
1572 gcc_assert (GET_MODE_INNER (mode
) == GET_MODE (op
));
1574 gcc_assert (GET_MODE_INNER (mode
) == GET_MODE_INNER
1577 if (CONST_SCALAR_INT_P (op
) || CONST_DOUBLE_AS_FLOAT_P (op
)
1578 || GET_CODE (op
) == CONST_VECTOR
)
1580 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode
));
1581 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
1582 rtvec v
= rtvec_alloc (n_elts
);
1585 if (GET_CODE (op
) != CONST_VECTOR
)
1586 for (i
= 0; i
< n_elts
; i
++)
1587 RTVEC_ELT (v
, i
) = op
;
1590 machine_mode inmode
= GET_MODE (op
);
1591 int in_elt_size
= GET_MODE_SIZE (GET_MODE_INNER (inmode
));
1592 unsigned in_n_elts
= (GET_MODE_SIZE (inmode
) / in_elt_size
);
1594 gcc_assert (in_n_elts
< n_elts
);
1595 gcc_assert ((n_elts
% in_n_elts
) == 0);
1596 for (i
= 0; i
< n_elts
; i
++)
1597 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (op
, i
% in_n_elts
);
1599 return gen_rtx_CONST_VECTOR (mode
, v
);
1603 if (VECTOR_MODE_P (mode
) && GET_CODE (op
) == CONST_VECTOR
)
1605 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode
));
1606 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
1607 machine_mode opmode
= GET_MODE (op
);
1608 int op_elt_size
= GET_MODE_SIZE (GET_MODE_INNER (opmode
));
1609 unsigned op_n_elts
= (GET_MODE_SIZE (opmode
) / op_elt_size
);
1610 rtvec v
= rtvec_alloc (n_elts
);
1613 gcc_assert (op_n_elts
== n_elts
);
1614 for (i
= 0; i
< n_elts
; i
++)
1616 rtx x
= simplify_unary_operation (code
, GET_MODE_INNER (mode
),
1617 CONST_VECTOR_ELT (op
, i
),
1618 GET_MODE_INNER (opmode
));
1621 RTVEC_ELT (v
, i
) = x
;
1623 return gen_rtx_CONST_VECTOR (mode
, v
);
1626 /* The order of these tests is critical so that, for example, we don't
1627 check the wrong mode (input vs. output) for a conversion operation,
1628 such as FIX. At some point, this should be simplified. */
1630 if (code
== FLOAT
&& CONST_SCALAR_INT_P (op
))
1634 if (op_mode
== VOIDmode
)
1636 /* CONST_INT have VOIDmode as the mode. We assume that all
1637 the bits of the constant are significant, though, this is
1638 a dangerous assumption as many times CONST_INTs are
1639 created and used with garbage in the bits outside of the
1640 precision of the implied mode of the const_int. */
1641 op_mode
= MAX_MODE_INT
;
1644 real_from_integer (&d
, mode
, std::make_pair (op
, op_mode
), SIGNED
);
1645 d
= real_value_truncate (mode
, d
);
1646 return CONST_DOUBLE_FROM_REAL_VALUE (d
, mode
);
1648 else if (code
== UNSIGNED_FLOAT
&& CONST_SCALAR_INT_P (op
))
1652 if (op_mode
== VOIDmode
)
1654 /* CONST_INT have VOIDmode as the mode. We assume that all
1655 the bits of the constant are significant, though, this is
1656 a dangerous assumption as many times CONST_INTs are
1657 created and used with garbage in the bits outside of the
1658 precision of the implied mode of the const_int. */
1659 op_mode
= MAX_MODE_INT
;
1662 real_from_integer (&d
, mode
, std::make_pair (op
, op_mode
), UNSIGNED
);
1663 d
= real_value_truncate (mode
, d
);
1664 return CONST_DOUBLE_FROM_REAL_VALUE (d
, mode
);
1667 if (CONST_SCALAR_INT_P (op
) && width
> 0)
1670 machine_mode imode
= op_mode
== VOIDmode
? mode
: op_mode
;
1671 rtx_mode_t op0
= std::make_pair (op
, imode
);
1674 #if TARGET_SUPPORTS_WIDE_INT == 0
1675 /* This assert keeps the simplification from producing a result
1676 that cannot be represented in a CONST_DOUBLE but a lot of
1677 upstream callers expect that this function never fails to
1678 simplify something and so you if you added this to the test
1679 above the code would die later anyway. If this assert
1680 happens, you just need to make the port support wide int. */
1681 gcc_assert (width
<= HOST_BITS_PER_DOUBLE_INT
);
1687 result
= wi::bit_not (op0
);
1691 result
= wi::neg (op0
);
1695 result
= wi::abs (op0
);
1699 result
= wi::shwi (wi::ffs (op0
), mode
);
1703 if (wi::ne_p (op0
, 0))
1704 int_value
= wi::clz (op0
);
1705 else if (! CLZ_DEFINED_VALUE_AT_ZERO (mode
, int_value
))
1706 int_value
= GET_MODE_PRECISION (mode
);
1707 result
= wi::shwi (int_value
, mode
);
1711 result
= wi::shwi (wi::clrsb (op0
), mode
);
1715 if (wi::ne_p (op0
, 0))
1716 int_value
= wi::ctz (op0
);
1717 else if (! CTZ_DEFINED_VALUE_AT_ZERO (mode
, int_value
))
1718 int_value
= GET_MODE_PRECISION (mode
);
1719 result
= wi::shwi (int_value
, mode
);
1723 result
= wi::shwi (wi::popcount (op0
), mode
);
1727 result
= wi::shwi (wi::parity (op0
), mode
);
1731 result
= wide_int (op0
).bswap ();
1736 result
= wide_int::from (op0
, width
, UNSIGNED
);
1740 result
= wide_int::from (op0
, width
, SIGNED
);
1748 return immed_wide_int_const (result
, mode
);
1751 else if (CONST_DOUBLE_AS_FLOAT_P (op
)
1752 && SCALAR_FLOAT_MODE_P (mode
)
1753 && SCALAR_FLOAT_MODE_P (GET_MODE (op
)))
1756 REAL_VALUE_FROM_CONST_DOUBLE (d
, op
);
1763 d
= real_value_abs (&d
);
1766 d
= real_value_negate (&d
);
1768 case FLOAT_TRUNCATE
:
1769 d
= real_value_truncate (mode
, d
);
1772 /* All this does is change the mode, unless changing
1774 if (GET_MODE_CLASS (mode
) != GET_MODE_CLASS (GET_MODE (op
)))
1775 real_convert (&d
, mode
, &d
);
1778 real_arithmetic (&d
, FIX_TRUNC_EXPR
, &d
, NULL
);
1785 real_to_target (tmp
, &d
, GET_MODE (op
));
1786 for (i
= 0; i
< 4; i
++)
1788 real_from_target (&d
, tmp
, mode
);
1794 return CONST_DOUBLE_FROM_REAL_VALUE (d
, mode
);
1796 else if (CONST_DOUBLE_AS_FLOAT_P (op
)
1797 && SCALAR_FLOAT_MODE_P (GET_MODE (op
))
1798 && GET_MODE_CLASS (mode
) == MODE_INT
1801 /* Although the overflow semantics of RTL's FIX and UNSIGNED_FIX
1802 operators are intentionally left unspecified (to ease implementation
1803 by target backends), for consistency, this routine implements the
1804 same semantics for constant folding as used by the middle-end. */
1806 /* This was formerly used only for non-IEEE float.
1807 eggert@twinsun.com says it is safe for IEEE also. */
1808 REAL_VALUE_TYPE x
, t
;
1809 REAL_VALUE_FROM_CONST_DOUBLE (x
, op
);
1810 wide_int wmax
, wmin
;
1811 /* This is part of the abi to real_to_integer, but we check
1812 things before making this call. */
1818 if (REAL_VALUE_ISNAN (x
))
1821 /* Test against the signed upper bound. */
1822 wmax
= wi::max_value (width
, SIGNED
);
1823 real_from_integer (&t
, VOIDmode
, wmax
, SIGNED
);
1824 if (REAL_VALUES_LESS (t
, x
))
1825 return immed_wide_int_const (wmax
, mode
);
1827 /* Test against the signed lower bound. */
1828 wmin
= wi::min_value (width
, SIGNED
);
1829 real_from_integer (&t
, VOIDmode
, wmin
, SIGNED
);
1830 if (REAL_VALUES_LESS (x
, t
))
1831 return immed_wide_int_const (wmin
, mode
);
1833 return immed_wide_int_const (real_to_integer (&x
, &fail
, width
), mode
);
1837 if (REAL_VALUE_ISNAN (x
) || REAL_VALUE_NEGATIVE (x
))
1840 /* Test against the unsigned upper bound. */
1841 wmax
= wi::max_value (width
, UNSIGNED
);
1842 real_from_integer (&t
, VOIDmode
, wmax
, UNSIGNED
);
1843 if (REAL_VALUES_LESS (t
, x
))
1844 return immed_wide_int_const (wmax
, mode
);
1846 return immed_wide_int_const (real_to_integer (&x
, &fail
, width
),
1858 /* Subroutine of simplify_binary_operation to simplify a binary operation
1859 CODE that can commute with byte swapping, with result mode MODE and
1860 operating on OP0 and OP1. CODE is currently one of AND, IOR or XOR.
1861 Return zero if no simplification or canonicalization is possible. */
1864 simplify_byte_swapping_operation (enum rtx_code code
, machine_mode mode
,
1869 /* (op (bswap x) C1)) -> (bswap (op x C2)) with C2 swapped. */
1870 if (GET_CODE (op0
) == BSWAP
&& CONST_SCALAR_INT_P (op1
))
1872 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0),
1873 simplify_gen_unary (BSWAP
, mode
, op1
, mode
));
1874 return simplify_gen_unary (BSWAP
, mode
, tem
, mode
);
1877 /* (op (bswap x) (bswap y)) -> (bswap (op x y)). */
1878 if (GET_CODE (op0
) == BSWAP
&& GET_CODE (op1
) == BSWAP
)
1880 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
1881 return simplify_gen_unary (BSWAP
, mode
, tem
, mode
);
1887 /* Subroutine of simplify_binary_operation to simplify a commutative,
1888 associative binary operation CODE with result mode MODE, operating
1889 on OP0 and OP1. CODE is currently one of PLUS, MULT, AND, IOR, XOR,
1890 SMIN, SMAX, UMIN or UMAX. Return zero if no simplification or
1891 canonicalization is possible. */
1894 simplify_associative_operation (enum rtx_code code
, machine_mode mode
,
1899 /* Linearize the operator to the left. */
1900 if (GET_CODE (op1
) == code
)
1902 /* "(a op b) op (c op d)" becomes "((a op b) op c) op d)". */
1903 if (GET_CODE (op0
) == code
)
1905 tem
= simplify_gen_binary (code
, mode
, op0
, XEXP (op1
, 0));
1906 return simplify_gen_binary (code
, mode
, tem
, XEXP (op1
, 1));
1909 /* "a op (b op c)" becomes "(b op c) op a". */
1910 if (! swap_commutative_operands_p (op1
, op0
))
1911 return simplify_gen_binary (code
, mode
, op1
, op0
);
1913 std::swap (op0
, op1
);
1916 if (GET_CODE (op0
) == code
)
1918 /* Canonicalize "(x op c) op y" as "(x op y) op c". */
1919 if (swap_commutative_operands_p (XEXP (op0
, 1), op1
))
1921 tem
= simplify_gen_binary (code
, mode
, XEXP (op0
, 0), op1
);
1922 return simplify_gen_binary (code
, mode
, tem
, XEXP (op0
, 1));
1925 /* Attempt to simplify "(a op b) op c" as "a op (b op c)". */
1926 tem
= simplify_binary_operation (code
, mode
, XEXP (op0
, 1), op1
);
1928 return simplify_gen_binary (code
, mode
, XEXP (op0
, 0), tem
);
1930 /* Attempt to simplify "(a op b) op c" as "(a op c) op b". */
1931 tem
= simplify_binary_operation (code
, mode
, XEXP (op0
, 0), op1
);
1933 return simplify_gen_binary (code
, mode
, tem
, XEXP (op0
, 1));
1940 /* Simplify a binary operation CODE with result mode MODE, operating on OP0
1941 and OP1. Return 0 if no simplification is possible.
1943 Don't use this for relational operations such as EQ or LT.
1944 Use simplify_relational_operation instead. */
1946 simplify_binary_operation (enum rtx_code code
, machine_mode mode
,
1949 rtx trueop0
, trueop1
;
1952 /* Relational operations don't work here. We must know the mode
1953 of the operands in order to do the comparison correctly.
1954 Assuming a full word can give incorrect results.
1955 Consider comparing 128 with -128 in QImode. */
1956 gcc_assert (GET_RTX_CLASS (code
) != RTX_COMPARE
);
1957 gcc_assert (GET_RTX_CLASS (code
) != RTX_COMM_COMPARE
);
1959 /* Make sure the constant is second. */
1960 if (GET_RTX_CLASS (code
) == RTX_COMM_ARITH
1961 && swap_commutative_operands_p (op0
, op1
))
1962 std::swap (op0
, op1
);
1964 trueop0
= avoid_constant_pool_reference (op0
);
1965 trueop1
= avoid_constant_pool_reference (op1
);
1967 tem
= simplify_const_binary_operation (code
, mode
, trueop0
, trueop1
);
1970 return simplify_binary_operation_1 (code
, mode
, op0
, op1
, trueop0
, trueop1
);
1973 /* Subroutine of simplify_binary_operation. Simplify a binary operation
1974 CODE with result mode MODE, operating on OP0 and OP1. If OP0 and/or
1975 OP1 are constant pool references, TRUEOP0 and TRUEOP1 represent the
1976 actual constants. */
1979 simplify_binary_operation_1 (enum rtx_code code
, machine_mode mode
,
1980 rtx op0
, rtx op1
, rtx trueop0
, rtx trueop1
)
1982 rtx tem
, reversed
, opleft
, opright
;
1984 unsigned int width
= GET_MODE_PRECISION (mode
);
1986 /* Even if we can't compute a constant result,
1987 there are some cases worth simplifying. */
1992 /* Maybe simplify x + 0 to x. The two expressions are equivalent
1993 when x is NaN, infinite, or finite and nonzero. They aren't
1994 when x is -0 and the rounding mode is not towards -infinity,
1995 since (-0) + 0 is then 0. */
1996 if (!HONOR_SIGNED_ZEROS (mode
) && trueop1
== CONST0_RTX (mode
))
1999 /* ((-a) + b) -> (b - a) and similarly for (a + (-b)). These
2000 transformations are safe even for IEEE. */
2001 if (GET_CODE (op0
) == NEG
)
2002 return simplify_gen_binary (MINUS
, mode
, op1
, XEXP (op0
, 0));
2003 else if (GET_CODE (op1
) == NEG
)
2004 return simplify_gen_binary (MINUS
, mode
, op0
, XEXP (op1
, 0));
2006 /* (~a) + 1 -> -a */
2007 if (INTEGRAL_MODE_P (mode
)
2008 && GET_CODE (op0
) == NOT
2009 && trueop1
== const1_rtx
)
2010 return simplify_gen_unary (NEG
, mode
, XEXP (op0
, 0), mode
);
2012 /* Handle both-operands-constant cases. We can only add
2013 CONST_INTs to constants since the sum of relocatable symbols
2014 can't be handled by most assemblers. Don't add CONST_INT
2015 to CONST_INT since overflow won't be computed properly if wider
2016 than HOST_BITS_PER_WIDE_INT. */
2018 if ((GET_CODE (op0
) == CONST
2019 || GET_CODE (op0
) == SYMBOL_REF
2020 || GET_CODE (op0
) == LABEL_REF
)
2021 && CONST_INT_P (op1
))
2022 return plus_constant (mode
, op0
, INTVAL (op1
));
2023 else if ((GET_CODE (op1
) == CONST
2024 || GET_CODE (op1
) == SYMBOL_REF
2025 || GET_CODE (op1
) == LABEL_REF
)
2026 && CONST_INT_P (op0
))
2027 return plus_constant (mode
, op1
, INTVAL (op0
));
2029 /* See if this is something like X * C - X or vice versa or
2030 if the multiplication is written as a shift. If so, we can
2031 distribute and make a new multiply, shift, or maybe just
2032 have X (if C is 2 in the example above). But don't make
2033 something more expensive than we had before. */
2035 if (SCALAR_INT_MODE_P (mode
))
2037 rtx lhs
= op0
, rhs
= op1
;
2039 wide_int coeff0
= wi::one (GET_MODE_PRECISION (mode
));
2040 wide_int coeff1
= wi::one (GET_MODE_PRECISION (mode
));
2042 if (GET_CODE (lhs
) == NEG
)
2044 coeff0
= wi::minus_one (GET_MODE_PRECISION (mode
));
2045 lhs
= XEXP (lhs
, 0);
2047 else if (GET_CODE (lhs
) == MULT
2048 && CONST_SCALAR_INT_P (XEXP (lhs
, 1)))
2050 coeff0
= std::make_pair (XEXP (lhs
, 1), mode
);
2051 lhs
= XEXP (lhs
, 0);
2053 else if (GET_CODE (lhs
) == ASHIFT
2054 && CONST_INT_P (XEXP (lhs
, 1))
2055 && INTVAL (XEXP (lhs
, 1)) >= 0
2056 && INTVAL (XEXP (lhs
, 1)) < GET_MODE_PRECISION (mode
))
2058 coeff0
= wi::set_bit_in_zero (INTVAL (XEXP (lhs
, 1)),
2059 GET_MODE_PRECISION (mode
));
2060 lhs
= XEXP (lhs
, 0);
2063 if (GET_CODE (rhs
) == NEG
)
2065 coeff1
= wi::minus_one (GET_MODE_PRECISION (mode
));
2066 rhs
= XEXP (rhs
, 0);
2068 else if (GET_CODE (rhs
) == MULT
2069 && CONST_INT_P (XEXP (rhs
, 1)))
2071 coeff1
= std::make_pair (XEXP (rhs
, 1), mode
);
2072 rhs
= XEXP (rhs
, 0);
2074 else if (GET_CODE (rhs
) == ASHIFT
2075 && CONST_INT_P (XEXP (rhs
, 1))
2076 && INTVAL (XEXP (rhs
, 1)) >= 0
2077 && INTVAL (XEXP (rhs
, 1)) < GET_MODE_PRECISION (mode
))
2079 coeff1
= wi::set_bit_in_zero (INTVAL (XEXP (rhs
, 1)),
2080 GET_MODE_PRECISION (mode
));
2081 rhs
= XEXP (rhs
, 0);
2084 if (rtx_equal_p (lhs
, rhs
))
2086 rtx orig
= gen_rtx_PLUS (mode
, op0
, op1
);
2088 bool speed
= optimize_function_for_speed_p (cfun
);
2090 coeff
= immed_wide_int_const (coeff0
+ coeff1
, mode
);
2092 tem
= simplify_gen_binary (MULT
, mode
, lhs
, coeff
);
2093 return set_src_cost (tem
, speed
) <= set_src_cost (orig
, speed
)
2098 /* (plus (xor X C1) C2) is (xor X (C1^C2)) if C2 is signbit. */
2099 if (CONST_SCALAR_INT_P (op1
)
2100 && GET_CODE (op0
) == XOR
2101 && CONST_SCALAR_INT_P (XEXP (op0
, 1))
2102 && mode_signbit_p (mode
, op1
))
2103 return simplify_gen_binary (XOR
, mode
, XEXP (op0
, 0),
2104 simplify_gen_binary (XOR
, mode
, op1
,
2107 /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)). */
2108 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2109 && GET_CODE (op0
) == MULT
2110 && GET_CODE (XEXP (op0
, 0)) == NEG
)
2114 in1
= XEXP (XEXP (op0
, 0), 0);
2115 in2
= XEXP (op0
, 1);
2116 return simplify_gen_binary (MINUS
, mode
, op1
,
2117 simplify_gen_binary (MULT
, mode
,
2121 /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
2122 C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
2124 if (COMPARISON_P (op0
)
2125 && ((STORE_FLAG_VALUE
== -1 && trueop1
== const1_rtx
)
2126 || (STORE_FLAG_VALUE
== 1 && trueop1
== constm1_rtx
))
2127 && (reversed
= reversed_comparison (op0
, mode
)))
2129 simplify_gen_unary (NEG
, mode
, reversed
, mode
);
2131 /* If one of the operands is a PLUS or a MINUS, see if we can
2132 simplify this by the associative law.
2133 Don't use the associative law for floating point.
2134 The inaccuracy makes it nonassociative,
2135 and subtle programs can break if operations are associated. */
2137 if (INTEGRAL_MODE_P (mode
)
2138 && (plus_minus_operand_p (op0
)
2139 || plus_minus_operand_p (op1
))
2140 && (tem
= simplify_plus_minus (code
, mode
, op0
, op1
)) != 0)
2143 /* Reassociate floating point addition only when the user
2144 specifies associative math operations. */
2145 if (FLOAT_MODE_P (mode
)
2146 && flag_associative_math
)
2148 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2155 /* Convert (compare (gt (flags) 0) (lt (flags) 0)) to (flags). */
2156 if (((GET_CODE (op0
) == GT
&& GET_CODE (op1
) == LT
)
2157 || (GET_CODE (op0
) == GTU
&& GET_CODE (op1
) == LTU
))
2158 && XEXP (op0
, 1) == const0_rtx
&& XEXP (op1
, 1) == const0_rtx
)
2160 rtx xop00
= XEXP (op0
, 0);
2161 rtx xop10
= XEXP (op1
, 0);
2163 if (GET_CODE (xop00
) == CC0
&& GET_CODE (xop10
) == CC0
)
2166 if (REG_P (xop00
) && REG_P (xop10
)
2167 && GET_MODE (xop00
) == GET_MODE (xop10
)
2168 && REGNO (xop00
) == REGNO (xop10
)
2169 && GET_MODE_CLASS (GET_MODE (xop00
)) == MODE_CC
2170 && GET_MODE_CLASS (GET_MODE (xop10
)) == MODE_CC
)
2176 /* We can't assume x-x is 0 even with non-IEEE floating point,
2177 but since it is zero except in very strange circumstances, we
2178 will treat it as zero with -ffinite-math-only. */
2179 if (rtx_equal_p (trueop0
, trueop1
)
2180 && ! side_effects_p (op0
)
2181 && (!FLOAT_MODE_P (mode
) || !HONOR_NANS (mode
)))
2182 return CONST0_RTX (mode
);
2184 /* Change subtraction from zero into negation. (0 - x) is the
2185 same as -x when x is NaN, infinite, or finite and nonzero.
2186 But if the mode has signed zeros, and does not round towards
2187 -infinity, then 0 - 0 is 0, not -0. */
2188 if (!HONOR_SIGNED_ZEROS (mode
) && trueop0
== CONST0_RTX (mode
))
2189 return simplify_gen_unary (NEG
, mode
, op1
, mode
);
2191 /* (-1 - a) is ~a. */
2192 if (trueop0
== constm1_rtx
)
2193 return simplify_gen_unary (NOT
, mode
, op1
, mode
);
2195 /* Subtracting 0 has no effect unless the mode has signed zeros
2196 and supports rounding towards -infinity. In such a case,
2198 if (!(HONOR_SIGNED_ZEROS (mode
)
2199 && HONOR_SIGN_DEPENDENT_ROUNDING (mode
))
2200 && trueop1
== CONST0_RTX (mode
))
2203 /* See if this is something like X * C - X or vice versa or
2204 if the multiplication is written as a shift. If so, we can
2205 distribute and make a new multiply, shift, or maybe just
2206 have X (if C is 2 in the example above). But don't make
2207 something more expensive than we had before. */
2209 if (SCALAR_INT_MODE_P (mode
))
2211 rtx lhs
= op0
, rhs
= op1
;
2213 wide_int coeff0
= wi::one (GET_MODE_PRECISION (mode
));
2214 wide_int negcoeff1
= wi::minus_one (GET_MODE_PRECISION (mode
));
2216 if (GET_CODE (lhs
) == NEG
)
2218 coeff0
= wi::minus_one (GET_MODE_PRECISION (mode
));
2219 lhs
= XEXP (lhs
, 0);
2221 else if (GET_CODE (lhs
) == MULT
2222 && CONST_SCALAR_INT_P (XEXP (lhs
, 1)))
2224 coeff0
= std::make_pair (XEXP (lhs
, 1), mode
);
2225 lhs
= XEXP (lhs
, 0);
2227 else if (GET_CODE (lhs
) == ASHIFT
2228 && CONST_INT_P (XEXP (lhs
, 1))
2229 && INTVAL (XEXP (lhs
, 1)) >= 0
2230 && INTVAL (XEXP (lhs
, 1)) < GET_MODE_PRECISION (mode
))
2232 coeff0
= wi::set_bit_in_zero (INTVAL (XEXP (lhs
, 1)),
2233 GET_MODE_PRECISION (mode
));
2234 lhs
= XEXP (lhs
, 0);
2237 if (GET_CODE (rhs
) == NEG
)
2239 negcoeff1
= wi::one (GET_MODE_PRECISION (mode
));
2240 rhs
= XEXP (rhs
, 0);
2242 else if (GET_CODE (rhs
) == MULT
2243 && CONST_INT_P (XEXP (rhs
, 1)))
2245 negcoeff1
= wi::neg (std::make_pair (XEXP (rhs
, 1), mode
));
2246 rhs
= XEXP (rhs
, 0);
2248 else if (GET_CODE (rhs
) == ASHIFT
2249 && CONST_INT_P (XEXP (rhs
, 1))
2250 && INTVAL (XEXP (rhs
, 1)) >= 0
2251 && INTVAL (XEXP (rhs
, 1)) < GET_MODE_PRECISION (mode
))
2253 negcoeff1
= wi::set_bit_in_zero (INTVAL (XEXP (rhs
, 1)),
2254 GET_MODE_PRECISION (mode
));
2255 negcoeff1
= -negcoeff1
;
2256 rhs
= XEXP (rhs
, 0);
2259 if (rtx_equal_p (lhs
, rhs
))
2261 rtx orig
= gen_rtx_MINUS (mode
, op0
, op1
);
2263 bool speed
= optimize_function_for_speed_p (cfun
);
2265 coeff
= immed_wide_int_const (coeff0
+ negcoeff1
, mode
);
2267 tem
= simplify_gen_binary (MULT
, mode
, lhs
, coeff
);
2268 return set_src_cost (tem
, speed
) <= set_src_cost (orig
, speed
)
2273 /* (a - (-b)) -> (a + b). True even for IEEE. */
2274 if (GET_CODE (op1
) == NEG
)
2275 return simplify_gen_binary (PLUS
, mode
, op0
, XEXP (op1
, 0));
2277 /* (-x - c) may be simplified as (-c - x). */
2278 if (GET_CODE (op0
) == NEG
2279 && (CONST_SCALAR_INT_P (op1
) || CONST_DOUBLE_AS_FLOAT_P (op1
)))
2281 tem
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
2283 return simplify_gen_binary (MINUS
, mode
, tem
, XEXP (op0
, 0));
2286 /* Don't let a relocatable value get a negative coeff. */
2287 if (CONST_INT_P (op1
) && GET_MODE (op0
) != VOIDmode
)
2288 return simplify_gen_binary (PLUS
, mode
,
2290 neg_const_int (mode
, op1
));
2292 /* (x - (x & y)) -> (x & ~y) */
2293 if (INTEGRAL_MODE_P (mode
) && GET_CODE (op1
) == AND
)
2295 if (rtx_equal_p (op0
, XEXP (op1
, 0)))
2297 tem
= simplify_gen_unary (NOT
, mode
, XEXP (op1
, 1),
2298 GET_MODE (XEXP (op1
, 1)));
2299 return simplify_gen_binary (AND
, mode
, op0
, tem
);
2301 if (rtx_equal_p (op0
, XEXP (op1
, 1)))
2303 tem
= simplify_gen_unary (NOT
, mode
, XEXP (op1
, 0),
2304 GET_MODE (XEXP (op1
, 0)));
2305 return simplify_gen_binary (AND
, mode
, op0
, tem
);
2309 /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
2310 by reversing the comparison code if valid. */
2311 if (STORE_FLAG_VALUE
== 1
2312 && trueop0
== const1_rtx
2313 && COMPARISON_P (op1
)
2314 && (reversed
= reversed_comparison (op1
, mode
)))
2317 /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A). */
2318 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2319 && GET_CODE (op1
) == MULT
2320 && GET_CODE (XEXP (op1
, 0)) == NEG
)
2324 in1
= XEXP (XEXP (op1
, 0), 0);
2325 in2
= XEXP (op1
, 1);
2326 return simplify_gen_binary (PLUS
, mode
,
2327 simplify_gen_binary (MULT
, mode
,
2332 /* Canonicalize (minus (neg A) (mult B C)) to
2333 (minus (mult (neg B) C) A). */
2334 if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode
)
2335 && GET_CODE (op1
) == MULT
2336 && GET_CODE (op0
) == NEG
)
2340 in1
= simplify_gen_unary (NEG
, mode
, XEXP (op1
, 0), mode
);
2341 in2
= XEXP (op1
, 1);
2342 return simplify_gen_binary (MINUS
, mode
,
2343 simplify_gen_binary (MULT
, mode
,
2348 /* If one of the operands is a PLUS or a MINUS, see if we can
2349 simplify this by the associative law. This will, for example,
2350 canonicalize (minus A (plus B C)) to (minus (minus A B) C).
2351 Don't use the associative law for floating point.
2352 The inaccuracy makes it nonassociative,
2353 and subtle programs can break if operations are associated. */
2355 if (INTEGRAL_MODE_P (mode
)
2356 && (plus_minus_operand_p (op0
)
2357 || plus_minus_operand_p (op1
))
2358 && (tem
= simplify_plus_minus (code
, mode
, op0
, op1
)) != 0)
2363 if (trueop1
== constm1_rtx
)
2364 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
2366 if (GET_CODE (op0
) == NEG
)
2368 rtx temp
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
2369 /* If op1 is a MULT as well and simplify_unary_operation
2370 just moved the NEG to the second operand, simplify_gen_binary
2371 below could through simplify_associative_operation move
2372 the NEG around again and recurse endlessly. */
2374 && GET_CODE (op1
) == MULT
2375 && GET_CODE (temp
) == MULT
2376 && XEXP (op1
, 0) == XEXP (temp
, 0)
2377 && GET_CODE (XEXP (temp
, 1)) == NEG
2378 && XEXP (op1
, 1) == XEXP (XEXP (temp
, 1), 0))
2381 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), temp
);
2383 if (GET_CODE (op1
) == NEG
)
2385 rtx temp
= simplify_unary_operation (NEG
, mode
, op0
, mode
);
2386 /* If op0 is a MULT as well and simplify_unary_operation
2387 just moved the NEG to the second operand, simplify_gen_binary
2388 below could through simplify_associative_operation move
2389 the NEG around again and recurse endlessly. */
2391 && GET_CODE (op0
) == MULT
2392 && GET_CODE (temp
) == MULT
2393 && XEXP (op0
, 0) == XEXP (temp
, 0)
2394 && GET_CODE (XEXP (temp
, 1)) == NEG
2395 && XEXP (op0
, 1) == XEXP (XEXP (temp
, 1), 0))
2398 return simplify_gen_binary (MULT
, mode
, temp
, XEXP (op1
, 0));
2401 /* Maybe simplify x * 0 to 0. The reduction is not valid if
2402 x is NaN, since x * 0 is then also NaN. Nor is it valid
2403 when the mode has signed zeros, since multiplying a negative
2404 number by 0 will give -0, not 0. */
2405 if (!HONOR_NANS (mode
)
2406 && !HONOR_SIGNED_ZEROS (mode
)
2407 && trueop1
== CONST0_RTX (mode
)
2408 && ! side_effects_p (op0
))
2411 /* In IEEE floating point, x*1 is not equivalent to x for
2413 if (!HONOR_SNANS (mode
)
2414 && trueop1
== CONST1_RTX (mode
))
2417 /* Convert multiply by constant power of two into shift. */
2418 if (CONST_SCALAR_INT_P (trueop1
))
2420 val
= wi::exact_log2 (std::make_pair (trueop1
, mode
));
2422 return simplify_gen_binary (ASHIFT
, mode
, op0
, GEN_INT (val
));
2425 /* x*2 is x+x and x*(-1) is -x */
2426 if (CONST_DOUBLE_AS_FLOAT_P (trueop1
)
2427 && SCALAR_FLOAT_MODE_P (GET_MODE (trueop1
))
2428 && !DECIMAL_FLOAT_MODE_P (GET_MODE (trueop1
))
2429 && GET_MODE (op0
) == mode
)
2432 REAL_VALUE_FROM_CONST_DOUBLE (d
, trueop1
);
2434 if (REAL_VALUES_EQUAL (d
, dconst2
))
2435 return simplify_gen_binary (PLUS
, mode
, op0
, copy_rtx (op0
));
2437 if (!HONOR_SNANS (mode
)
2438 && REAL_VALUES_EQUAL (d
, dconstm1
))
2439 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
2442 /* Optimize -x * -x as x * x. */
2443 if (FLOAT_MODE_P (mode
)
2444 && GET_CODE (op0
) == NEG
2445 && GET_CODE (op1
) == NEG
2446 && rtx_equal_p (XEXP (op0
, 0), XEXP (op1
, 0))
2447 && !side_effects_p (XEXP (op0
, 0)))
2448 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
2450 /* Likewise, optimize abs(x) * abs(x) as x * x. */
2451 if (SCALAR_FLOAT_MODE_P (mode
)
2452 && GET_CODE (op0
) == ABS
2453 && GET_CODE (op1
) == ABS
2454 && rtx_equal_p (XEXP (op0
, 0), XEXP (op1
, 0))
2455 && !side_effects_p (XEXP (op0
, 0)))
2456 return simplify_gen_binary (MULT
, mode
, XEXP (op0
, 0), XEXP (op1
, 0));
2458 /* Reassociate multiplication, but for floating point MULTs
2459 only when the user specifies unsafe math optimizations. */
2460 if (! FLOAT_MODE_P (mode
)
2461 || flag_unsafe_math_optimizations
)
2463 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2470 if (trueop1
== CONST0_RTX (mode
))
2472 if (INTEGRAL_MODE_P (mode
)
2473 && trueop1
== CONSTM1_RTX (mode
)
2474 && !side_effects_p (op0
))
2476 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
2478 /* A | (~A) -> -1 */
2479 if (((GET_CODE (op0
) == NOT
&& rtx_equal_p (XEXP (op0
, 0), op1
))
2480 || (GET_CODE (op1
) == NOT
&& rtx_equal_p (XEXP (op1
, 0), op0
)))
2481 && ! side_effects_p (op0
)
2482 && SCALAR_INT_MODE_P (mode
))
2485 /* (ior A C) is C if all bits of A that might be nonzero are on in C. */
2486 if (CONST_INT_P (op1
)
2487 && HWI_COMPUTABLE_MODE_P (mode
)
2488 && (nonzero_bits (op0
, mode
) & ~UINTVAL (op1
)) == 0
2489 && !side_effects_p (op0
))
2492 /* Canonicalize (X & C1) | C2. */
2493 if (GET_CODE (op0
) == AND
2494 && CONST_INT_P (trueop1
)
2495 && CONST_INT_P (XEXP (op0
, 1)))
2497 HOST_WIDE_INT mask
= GET_MODE_MASK (mode
);
2498 HOST_WIDE_INT c1
= INTVAL (XEXP (op0
, 1));
2499 HOST_WIDE_INT c2
= INTVAL (trueop1
);
2501 /* If (C1&C2) == C1, then (X&C1)|C2 becomes X. */
2503 && !side_effects_p (XEXP (op0
, 0)))
2506 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
2507 if (((c1
|c2
) & mask
) == mask
)
2508 return simplify_gen_binary (IOR
, mode
, XEXP (op0
, 0), op1
);
2510 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2. */
2511 if (((c1
& ~c2
) & mask
) != (c1
& mask
))
2513 tem
= simplify_gen_binary (AND
, mode
, XEXP (op0
, 0),
2514 gen_int_mode (c1
& ~c2
, mode
));
2515 return simplify_gen_binary (IOR
, mode
, tem
, op1
);
2519 /* Convert (A & B) | A to A. */
2520 if (GET_CODE (op0
) == AND
2521 && (rtx_equal_p (XEXP (op0
, 0), op1
)
2522 || rtx_equal_p (XEXP (op0
, 1), op1
))
2523 && ! side_effects_p (XEXP (op0
, 0))
2524 && ! side_effects_p (XEXP (op0
, 1)))
2527 /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
2528 mode size to (rotate A CX). */
2530 if (GET_CODE (op1
) == ASHIFT
2531 || GET_CODE (op1
) == SUBREG
)
2542 if (GET_CODE (opleft
) == ASHIFT
&& GET_CODE (opright
) == LSHIFTRT
2543 && rtx_equal_p (XEXP (opleft
, 0), XEXP (opright
, 0))
2544 && CONST_INT_P (XEXP (opleft
, 1))
2545 && CONST_INT_P (XEXP (opright
, 1))
2546 && (INTVAL (XEXP (opleft
, 1)) + INTVAL (XEXP (opright
, 1))
2547 == GET_MODE_PRECISION (mode
)))
2548 return gen_rtx_ROTATE (mode
, XEXP (opright
, 0), XEXP (opleft
, 1));
2550 /* Same, but for ashift that has been "simplified" to a wider mode
2551 by simplify_shift_const. */
2553 if (GET_CODE (opleft
) == SUBREG
2554 && GET_CODE (SUBREG_REG (opleft
)) == ASHIFT
2555 && GET_CODE (opright
) == LSHIFTRT
2556 && GET_CODE (XEXP (opright
, 0)) == SUBREG
2557 && GET_MODE (opleft
) == GET_MODE (XEXP (opright
, 0))
2558 && SUBREG_BYTE (opleft
) == SUBREG_BYTE (XEXP (opright
, 0))
2559 && (GET_MODE_SIZE (GET_MODE (opleft
))
2560 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (opleft
))))
2561 && rtx_equal_p (XEXP (SUBREG_REG (opleft
), 0),
2562 SUBREG_REG (XEXP (opright
, 0)))
2563 && CONST_INT_P (XEXP (SUBREG_REG (opleft
), 1))
2564 && CONST_INT_P (XEXP (opright
, 1))
2565 && (INTVAL (XEXP (SUBREG_REG (opleft
), 1)) + INTVAL (XEXP (opright
, 1))
2566 == GET_MODE_PRECISION (mode
)))
2567 return gen_rtx_ROTATE (mode
, XEXP (opright
, 0),
2568 XEXP (SUBREG_REG (opleft
), 1));
2570 /* If we have (ior (and (X C1) C2)), simplify this by making
2571 C1 as small as possible if C1 actually changes. */
2572 if (CONST_INT_P (op1
)
2573 && (HWI_COMPUTABLE_MODE_P (mode
)
2574 || INTVAL (op1
) > 0)
2575 && GET_CODE (op0
) == AND
2576 && CONST_INT_P (XEXP (op0
, 1))
2577 && CONST_INT_P (op1
)
2578 && (UINTVAL (XEXP (op0
, 1)) & UINTVAL (op1
)) != 0)
2580 rtx tmp
= simplify_gen_binary (AND
, mode
, XEXP (op0
, 0),
2581 gen_int_mode (UINTVAL (XEXP (op0
, 1))
2584 return simplify_gen_binary (IOR
, mode
, tmp
, op1
);
2587 /* If OP0 is (ashiftrt (plus ...) C), it might actually be
2588 a (sign_extend (plus ...)). Then check if OP1 is a CONST_INT and
2589 the PLUS does not affect any of the bits in OP1: then we can do
2590 the IOR as a PLUS and we can associate. This is valid if OP1
2591 can be safely shifted left C bits. */
2592 if (CONST_INT_P (trueop1
) && GET_CODE (op0
) == ASHIFTRT
2593 && GET_CODE (XEXP (op0
, 0)) == PLUS
2594 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1))
2595 && CONST_INT_P (XEXP (op0
, 1))
2596 && INTVAL (XEXP (op0
, 1)) < HOST_BITS_PER_WIDE_INT
)
2598 int count
= INTVAL (XEXP (op0
, 1));
2599 HOST_WIDE_INT mask
= INTVAL (trueop1
) << count
;
2601 if (mask
>> count
== INTVAL (trueop1
)
2602 && trunc_int_for_mode (mask
, mode
) == mask
2603 && (mask
& nonzero_bits (XEXP (op0
, 0), mode
)) == 0)
2604 return simplify_gen_binary (ASHIFTRT
, mode
,
2605 plus_constant (mode
, XEXP (op0
, 0),
2610 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
2614 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2620 if (trueop1
== CONST0_RTX (mode
))
2622 if (INTEGRAL_MODE_P (mode
) && trueop1
== CONSTM1_RTX (mode
))
2623 return simplify_gen_unary (NOT
, mode
, op0
, mode
);
2624 if (rtx_equal_p (trueop0
, trueop1
)
2625 && ! side_effects_p (op0
)
2626 && GET_MODE_CLASS (mode
) != MODE_CC
)
2627 return CONST0_RTX (mode
);
2629 /* Canonicalize XOR of the most significant bit to PLUS. */
2630 if (CONST_SCALAR_INT_P (op1
)
2631 && mode_signbit_p (mode
, op1
))
2632 return simplify_gen_binary (PLUS
, mode
, op0
, op1
);
2633 /* (xor (plus X C1) C2) is (xor X (C1^C2)) if C1 is signbit. */
2634 if (CONST_SCALAR_INT_P (op1
)
2635 && GET_CODE (op0
) == PLUS
2636 && CONST_SCALAR_INT_P (XEXP (op0
, 1))
2637 && mode_signbit_p (mode
, XEXP (op0
, 1)))
2638 return simplify_gen_binary (XOR
, mode
, XEXP (op0
, 0),
2639 simplify_gen_binary (XOR
, mode
, op1
,
2642 /* If we are XORing two things that have no bits in common,
2643 convert them into an IOR. This helps to detect rotation encoded
2644 using those methods and possibly other simplifications. */
2646 if (HWI_COMPUTABLE_MODE_P (mode
)
2647 && (nonzero_bits (op0
, mode
)
2648 & nonzero_bits (op1
, mode
)) == 0)
2649 return (simplify_gen_binary (IOR
, mode
, op0
, op1
));
2651 /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
2652 Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
2655 int num_negated
= 0;
2657 if (GET_CODE (op0
) == NOT
)
2658 num_negated
++, op0
= XEXP (op0
, 0);
2659 if (GET_CODE (op1
) == NOT
)
2660 num_negated
++, op1
= XEXP (op1
, 0);
2662 if (num_negated
== 2)
2663 return simplify_gen_binary (XOR
, mode
, op0
, op1
);
2664 else if (num_negated
== 1)
2665 return simplify_gen_unary (NOT
, mode
,
2666 simplify_gen_binary (XOR
, mode
, op0
, op1
),
2670 /* Convert (xor (and A B) B) to (and (not A) B). The latter may
2671 correspond to a machine insn or result in further simplifications
2672 if B is a constant. */
2674 if (GET_CODE (op0
) == AND
2675 && rtx_equal_p (XEXP (op0
, 1), op1
)
2676 && ! side_effects_p (op1
))
2677 return simplify_gen_binary (AND
, mode
,
2678 simplify_gen_unary (NOT
, mode
,
2679 XEXP (op0
, 0), mode
),
2682 else if (GET_CODE (op0
) == AND
2683 && rtx_equal_p (XEXP (op0
, 0), op1
)
2684 && ! side_effects_p (op1
))
2685 return simplify_gen_binary (AND
, mode
,
2686 simplify_gen_unary (NOT
, mode
,
2687 XEXP (op0
, 1), mode
),
2690 /* Given (xor (ior (xor A B) C) D), where B, C and D are
2691 constants, simplify to (xor (ior A C) (B&~C)^D), canceling
2692 out bits inverted twice and not set by C. Similarly, given
2693 (xor (and (xor A B) C) D), simplify without inverting C in
2694 the xor operand: (xor (and A C) (B&C)^D).
2696 else if ((GET_CODE (op0
) == IOR
|| GET_CODE (op0
) == AND
)
2697 && GET_CODE (XEXP (op0
, 0)) == XOR
2698 && CONST_INT_P (op1
)
2699 && CONST_INT_P (XEXP (op0
, 1))
2700 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1)))
2702 enum rtx_code op
= GET_CODE (op0
);
2703 rtx a
= XEXP (XEXP (op0
, 0), 0);
2704 rtx b
= XEXP (XEXP (op0
, 0), 1);
2705 rtx c
= XEXP (op0
, 1);
2707 HOST_WIDE_INT bval
= INTVAL (b
);
2708 HOST_WIDE_INT cval
= INTVAL (c
);
2709 HOST_WIDE_INT dval
= INTVAL (d
);
2710 HOST_WIDE_INT xcval
;
2717 return simplify_gen_binary (XOR
, mode
,
2718 simplify_gen_binary (op
, mode
, a
, c
),
2719 gen_int_mode ((bval
& xcval
) ^ dval
,
2723 /* Given (xor (and A B) C), using P^Q == (~P&Q) | (~Q&P),
2724 we can transform like this:
2725 (A&B)^C == ~(A&B)&C | ~C&(A&B)
2726 == (~A|~B)&C | ~C&(A&B) * DeMorgan's Law
2727 == ~A&C | ~B&C | A&(~C&B) * Distribute and re-order
2728 Attempt a few simplifications when B and C are both constants. */
2729 if (GET_CODE (op0
) == AND
2730 && CONST_INT_P (op1
)
2731 && CONST_INT_P (XEXP (op0
, 1)))
2733 rtx a
= XEXP (op0
, 0);
2734 rtx b
= XEXP (op0
, 1);
2736 HOST_WIDE_INT bval
= INTVAL (b
);
2737 HOST_WIDE_INT cval
= INTVAL (c
);
2739 /* Instead of computing ~A&C, we compute its negated value,
2740 ~(A|~C). If it yields -1, ~A&C is zero, so we can
2741 optimize for sure. If it does not simplify, we still try
2742 to compute ~A&C below, but since that always allocates
2743 RTL, we don't try that before committing to returning a
2744 simplified expression. */
2745 rtx n_na_c
= simplify_binary_operation (IOR
, mode
, a
,
2748 if ((~cval
& bval
) == 0)
2750 rtx na_c
= NULL_RTX
;
2752 na_c
= simplify_gen_unary (NOT
, mode
, n_na_c
, mode
);
2755 /* If ~A does not simplify, don't bother: we don't
2756 want to simplify 2 operations into 3, and if na_c
2757 were to simplify with na, n_na_c would have
2758 simplified as well. */
2759 rtx na
= simplify_unary_operation (NOT
, mode
, a
, mode
);
2761 na_c
= simplify_gen_binary (AND
, mode
, na
, c
);
2764 /* Try to simplify ~A&C | ~B&C. */
2765 if (na_c
!= NULL_RTX
)
2766 return simplify_gen_binary (IOR
, mode
, na_c
,
2767 gen_int_mode (~bval
& cval
, mode
));
2771 /* If ~A&C is zero, simplify A&(~C&B) | ~B&C. */
2772 if (n_na_c
== CONSTM1_RTX (mode
))
2774 rtx a_nc_b
= simplify_gen_binary (AND
, mode
, a
,
2775 gen_int_mode (~cval
& bval
,
2777 return simplify_gen_binary (IOR
, mode
, a_nc_b
,
2778 gen_int_mode (~bval
& cval
,
2784 /* (xor (comparison foo bar) (const_int 1)) can become the reversed
2785 comparison if STORE_FLAG_VALUE is 1. */
2786 if (STORE_FLAG_VALUE
== 1
2787 && trueop1
== const1_rtx
2788 && COMPARISON_P (op0
)
2789 && (reversed
= reversed_comparison (op0
, mode
)))
2792 /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
2793 is (lt foo (const_int 0)), so we can perform the above
2794 simplification if STORE_FLAG_VALUE is 1. */
2796 if (STORE_FLAG_VALUE
== 1
2797 && trueop1
== const1_rtx
2798 && GET_CODE (op0
) == LSHIFTRT
2799 && CONST_INT_P (XEXP (op0
, 1))
2800 && INTVAL (XEXP (op0
, 1)) == GET_MODE_PRECISION (mode
) - 1)
2801 return gen_rtx_GE (mode
, XEXP (op0
, 0), const0_rtx
);
2803 /* (xor (comparison foo bar) (const_int sign-bit))
2804 when STORE_FLAG_VALUE is the sign bit. */
2805 if (val_signbit_p (mode
, STORE_FLAG_VALUE
)
2806 && trueop1
== const_true_rtx
2807 && COMPARISON_P (op0
)
2808 && (reversed
= reversed_comparison (op0
, mode
)))
2811 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
2815 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
2821 if (trueop1
== CONST0_RTX (mode
) && ! side_effects_p (op0
))
2823 if (INTEGRAL_MODE_P (mode
) && trueop1
== CONSTM1_RTX (mode
))
2825 if (HWI_COMPUTABLE_MODE_P (mode
))
2827 HOST_WIDE_INT nzop0
= nonzero_bits (trueop0
, mode
);
2828 HOST_WIDE_INT nzop1
;
2829 if (CONST_INT_P (trueop1
))
2831 HOST_WIDE_INT val1
= INTVAL (trueop1
);
2832 /* If we are turning off bits already known off in OP0, we need
2834 if ((nzop0
& ~val1
) == 0)
2837 nzop1
= nonzero_bits (trueop1
, mode
);
2838 /* If we are clearing all the nonzero bits, the result is zero. */
2839 if ((nzop1
& nzop0
) == 0
2840 && !side_effects_p (op0
) && !side_effects_p (op1
))
2841 return CONST0_RTX (mode
);
2843 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
)
2844 && GET_MODE_CLASS (mode
) != MODE_CC
)
2847 if (((GET_CODE (op0
) == NOT
&& rtx_equal_p (XEXP (op0
, 0), op1
))
2848 || (GET_CODE (op1
) == NOT
&& rtx_equal_p (XEXP (op1
, 0), op0
)))
2849 && ! side_effects_p (op0
)
2850 && GET_MODE_CLASS (mode
) != MODE_CC
)
2851 return CONST0_RTX (mode
);
2853 /* Transform (and (extend X) C) into (zero_extend (and X C)) if
2854 there are no nonzero bits of C outside of X's mode. */
2855 if ((GET_CODE (op0
) == SIGN_EXTEND
2856 || GET_CODE (op0
) == ZERO_EXTEND
)
2857 && CONST_INT_P (trueop1
)
2858 && HWI_COMPUTABLE_MODE_P (mode
)
2859 && (~GET_MODE_MASK (GET_MODE (XEXP (op0
, 0)))
2860 & UINTVAL (trueop1
)) == 0)
2862 machine_mode imode
= GET_MODE (XEXP (op0
, 0));
2863 tem
= simplify_gen_binary (AND
, imode
, XEXP (op0
, 0),
2864 gen_int_mode (INTVAL (trueop1
),
2866 return simplify_gen_unary (ZERO_EXTEND
, mode
, tem
, imode
);
2869 /* Transform (and (truncate X) C) into (truncate (and X C)). This way
2870 we might be able to further simplify the AND with X and potentially
2871 remove the truncation altogether. */
2872 if (GET_CODE (op0
) == TRUNCATE
&& CONST_INT_P (trueop1
))
2874 rtx x
= XEXP (op0
, 0);
2875 machine_mode xmode
= GET_MODE (x
);
2876 tem
= simplify_gen_binary (AND
, xmode
, x
,
2877 gen_int_mode (INTVAL (trueop1
), xmode
));
2878 return simplify_gen_unary (TRUNCATE
, mode
, tem
, xmode
);
2881 /* Canonicalize (A | C1) & C2 as (A & C2) | (C1 & C2). */
2882 if (GET_CODE (op0
) == IOR
2883 && CONST_INT_P (trueop1
)
2884 && CONST_INT_P (XEXP (op0
, 1)))
2886 HOST_WIDE_INT tmp
= INTVAL (trueop1
) & INTVAL (XEXP (op0
, 1));
2887 return simplify_gen_binary (IOR
, mode
,
2888 simplify_gen_binary (AND
, mode
,
2889 XEXP (op0
, 0), op1
),
2890 gen_int_mode (tmp
, mode
));
2893 /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
2894 insn (and may simplify more). */
2895 if (GET_CODE (op0
) == XOR
2896 && rtx_equal_p (XEXP (op0
, 0), op1
)
2897 && ! side_effects_p (op1
))
2898 return simplify_gen_binary (AND
, mode
,
2899 simplify_gen_unary (NOT
, mode
,
2900 XEXP (op0
, 1), mode
),
2903 if (GET_CODE (op0
) == XOR
2904 && rtx_equal_p (XEXP (op0
, 1), op1
)
2905 && ! side_effects_p (op1
))
2906 return simplify_gen_binary (AND
, mode
,
2907 simplify_gen_unary (NOT
, mode
,
2908 XEXP (op0
, 0), mode
),
2911 /* Similarly for (~(A ^ B)) & A. */
2912 if (GET_CODE (op0
) == NOT
2913 && GET_CODE (XEXP (op0
, 0)) == XOR
2914 && rtx_equal_p (XEXP (XEXP (op0
, 0), 0), op1
)
2915 && ! side_effects_p (op1
))
2916 return simplify_gen_binary (AND
, mode
, XEXP (XEXP (op0
, 0), 1), op1
);
2918 if (GET_CODE (op0
) == NOT
2919 && GET_CODE (XEXP (op0
, 0)) == XOR
2920 && rtx_equal_p (XEXP (XEXP (op0
, 0), 1), op1
)
2921 && ! side_effects_p (op1
))
2922 return simplify_gen_binary (AND
, mode
, XEXP (XEXP (op0
, 0), 0), op1
);
2924 /* Convert (A | B) & A to A. */
2925 if (GET_CODE (op0
) == IOR
2926 && (rtx_equal_p (XEXP (op0
, 0), op1
)
2927 || rtx_equal_p (XEXP (op0
, 1), op1
))
2928 && ! side_effects_p (XEXP (op0
, 0))
2929 && ! side_effects_p (XEXP (op0
, 1)))
2932 /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
2933 ((A & N) + B) & M -> (A + B) & M
2934 Similarly if (N & M) == 0,
2935 ((A | N) + B) & M -> (A + B) & M
2936 and for - instead of + and/or ^ instead of |.
2937 Also, if (N & M) == 0, then
2938 (A +- N) & M -> A & M. */
2939 if (CONST_INT_P (trueop1
)
2940 && HWI_COMPUTABLE_MODE_P (mode
)
2941 && ~UINTVAL (trueop1
)
2942 && (UINTVAL (trueop1
) & (UINTVAL (trueop1
) + 1)) == 0
2943 && (GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
))
2948 pmop
[0] = XEXP (op0
, 0);
2949 pmop
[1] = XEXP (op0
, 1);
2951 if (CONST_INT_P (pmop
[1])
2952 && (UINTVAL (pmop
[1]) & UINTVAL (trueop1
)) == 0)
2953 return simplify_gen_binary (AND
, mode
, pmop
[0], op1
);
2955 for (which
= 0; which
< 2; which
++)
2958 switch (GET_CODE (tem
))
2961 if (CONST_INT_P (XEXP (tem
, 1))
2962 && (UINTVAL (XEXP (tem
, 1)) & UINTVAL (trueop1
))
2963 == UINTVAL (trueop1
))
2964 pmop
[which
] = XEXP (tem
, 0);
2968 if (CONST_INT_P (XEXP (tem
, 1))
2969 && (UINTVAL (XEXP (tem
, 1)) & UINTVAL (trueop1
)) == 0)
2970 pmop
[which
] = XEXP (tem
, 0);
2977 if (pmop
[0] != XEXP (op0
, 0) || pmop
[1] != XEXP (op0
, 1))
2979 tem
= simplify_gen_binary (GET_CODE (op0
), mode
,
2981 return simplify_gen_binary (code
, mode
, tem
, op1
);
2985 /* (and X (ior (not X) Y) -> (and X Y) */
2986 if (GET_CODE (op1
) == IOR
2987 && GET_CODE (XEXP (op1
, 0)) == NOT
2988 && rtx_equal_p (op0
, XEXP (XEXP (op1
, 0), 0)))
2989 return simplify_gen_binary (AND
, mode
, op0
, XEXP (op1
, 1));
2991 /* (and (ior (not X) Y) X) -> (and X Y) */
2992 if (GET_CODE (op0
) == IOR
2993 && GET_CODE (XEXP (op0
, 0)) == NOT
2994 && rtx_equal_p (op1
, XEXP (XEXP (op0
, 0), 0)))
2995 return simplify_gen_binary (AND
, mode
, op1
, XEXP (op0
, 1));
2997 /* (and X (ior Y (not X)) -> (and X Y) */
2998 if (GET_CODE (op1
) == IOR
2999 && GET_CODE (XEXP (op1
, 1)) == NOT
3000 && rtx_equal_p (op0
, XEXP (XEXP (op1
, 1), 0)))
3001 return simplify_gen_binary (AND
, mode
, op0
, XEXP (op1
, 0));
3003 /* (and (ior Y (not X)) X) -> (and X Y) */
3004 if (GET_CODE (op0
) == IOR
3005 && GET_CODE (XEXP (op0
, 1)) == NOT
3006 && rtx_equal_p (op1
, XEXP (XEXP (op0
, 1), 0)))
3007 return simplify_gen_binary (AND
, mode
, op1
, XEXP (op0
, 0));
3009 tem
= simplify_byte_swapping_operation (code
, mode
, op0
, op1
);
3013 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3019 /* 0/x is 0 (or x&0 if x has side-effects). */
3020 if (trueop0
== CONST0_RTX (mode
))
3022 if (side_effects_p (op1
))
3023 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3027 if (trueop1
== CONST1_RTX (mode
))
3029 tem
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3033 /* Convert divide by power of two into shift. */
3034 if (CONST_INT_P (trueop1
)
3035 && (val
= exact_log2 (UINTVAL (trueop1
))) > 0)
3036 return simplify_gen_binary (LSHIFTRT
, mode
, op0
, GEN_INT (val
));
3040 /* Handle floating point and integers separately. */
3041 if (SCALAR_FLOAT_MODE_P (mode
))
3043 /* Maybe change 0.0 / x to 0.0. This transformation isn't
3044 safe for modes with NaNs, since 0.0 / 0.0 will then be
3045 NaN rather than 0.0. Nor is it safe for modes with signed
3046 zeros, since dividing 0 by a negative number gives -0.0 */
3047 if (trueop0
== CONST0_RTX (mode
)
3048 && !HONOR_NANS (mode
)
3049 && !HONOR_SIGNED_ZEROS (mode
)
3050 && ! side_effects_p (op1
))
3053 if (trueop1
== CONST1_RTX (mode
)
3054 && !HONOR_SNANS (mode
))
3057 if (CONST_DOUBLE_AS_FLOAT_P (trueop1
)
3058 && trueop1
!= CONST0_RTX (mode
))
3061 REAL_VALUE_FROM_CONST_DOUBLE (d
, trueop1
);
3064 if (REAL_VALUES_EQUAL (d
, dconstm1
)
3065 && !HONOR_SNANS (mode
))
3066 return simplify_gen_unary (NEG
, mode
, op0
, mode
);
3068 /* Change FP division by a constant into multiplication.
3069 Only do this with -freciprocal-math. */
3070 if (flag_reciprocal_math
3071 && !REAL_VALUES_EQUAL (d
, dconst0
))
3073 REAL_ARITHMETIC (d
, RDIV_EXPR
, dconst1
, d
);
3074 tem
= CONST_DOUBLE_FROM_REAL_VALUE (d
, mode
);
3075 return simplify_gen_binary (MULT
, mode
, op0
, tem
);
3079 else if (SCALAR_INT_MODE_P (mode
))
3081 /* 0/x is 0 (or x&0 if x has side-effects). */
3082 if (trueop0
== CONST0_RTX (mode
)
3083 && !cfun
->can_throw_non_call_exceptions
)
3085 if (side_effects_p (op1
))
3086 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3090 if (trueop1
== CONST1_RTX (mode
))
3092 tem
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3097 if (trueop1
== constm1_rtx
)
3099 rtx x
= rtl_hooks
.gen_lowpart_no_emit (mode
, op0
);
3101 return simplify_gen_unary (NEG
, mode
, x
, mode
);
3107 /* 0%x is 0 (or x&0 if x has side-effects). */
3108 if (trueop0
== CONST0_RTX (mode
))
3110 if (side_effects_p (op1
))
3111 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3114 /* x%1 is 0 (of x&0 if x has side-effects). */
3115 if (trueop1
== CONST1_RTX (mode
))
3117 if (side_effects_p (op0
))
3118 return simplify_gen_binary (AND
, mode
, op0
, CONST0_RTX (mode
));
3119 return CONST0_RTX (mode
);
3121 /* Implement modulus by power of two as AND. */
3122 if (CONST_INT_P (trueop1
)
3123 && exact_log2 (UINTVAL (trueop1
)) > 0)
3124 return simplify_gen_binary (AND
, mode
, op0
,
3125 gen_int_mode (INTVAL (op1
) - 1, mode
));
3129 /* 0%x is 0 (or x&0 if x has side-effects). */
3130 if (trueop0
== CONST0_RTX (mode
))
3132 if (side_effects_p (op1
))
3133 return simplify_gen_binary (AND
, mode
, op1
, trueop0
);
3136 /* x%1 and x%-1 is 0 (or x&0 if x has side-effects). */
3137 if (trueop1
== CONST1_RTX (mode
) || trueop1
== constm1_rtx
)
3139 if (side_effects_p (op0
))
3140 return simplify_gen_binary (AND
, mode
, op0
, CONST0_RTX (mode
));
3141 return CONST0_RTX (mode
);
3147 /* Canonicalize rotates by constant amount. If op1 is bitsize / 2,
3148 prefer left rotation, if op1 is from bitsize / 2 + 1 to
3149 bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
3151 #if defined(HAVE_rotate) && defined(HAVE_rotatert)
3152 if (CONST_INT_P (trueop1
)
3153 && IN_RANGE (INTVAL (trueop1
),
3154 GET_MODE_PRECISION (mode
) / 2 + (code
== ROTATE
),
3155 GET_MODE_PRECISION (mode
) - 1))
3156 return simplify_gen_binary (code
== ROTATE
? ROTATERT
: ROTATE
,
3157 mode
, op0
, GEN_INT (GET_MODE_PRECISION (mode
)
3158 - INTVAL (trueop1
)));
3162 if (trueop1
== CONST0_RTX (mode
))
3164 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3166 /* Rotating ~0 always results in ~0. */
3167 if (CONST_INT_P (trueop0
) && width
<= HOST_BITS_PER_WIDE_INT
3168 && UINTVAL (trueop0
) == GET_MODE_MASK (mode
)
3169 && ! side_effects_p (op1
))
3173 scalar constants c1, c2
3174 size (M2) > size (M1)
3175 c1 == size (M2) - size (M1)
3177 (ashiftrt:M1 (subreg:M1 (lshiftrt:M2 (reg:M2) (const_int <c1>))
3181 (subreg:M1 (ashiftrt:M2 (reg:M2) (const_int <c1 + c2>))
3183 if (code
== ASHIFTRT
3184 && !VECTOR_MODE_P (mode
)
3186 && CONST_INT_P (op1
)
3187 && GET_CODE (SUBREG_REG (op0
)) == LSHIFTRT
3188 && !VECTOR_MODE_P (GET_MODE (SUBREG_REG (op0
)))
3189 && CONST_INT_P (XEXP (SUBREG_REG (op0
), 1))
3190 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0
)))
3191 > GET_MODE_BITSIZE (mode
))
3192 && (INTVAL (XEXP (SUBREG_REG (op0
), 1))
3193 == (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0
)))
3194 - GET_MODE_BITSIZE (mode
)))
3195 && subreg_lowpart_p (op0
))
3197 rtx tmp
= GEN_INT (INTVAL (XEXP (SUBREG_REG (op0
), 1))
3199 machine_mode inner_mode
= GET_MODE (SUBREG_REG (op0
));
3200 tmp
= simplify_gen_binary (ASHIFTRT
,
3201 GET_MODE (SUBREG_REG (op0
)),
3202 XEXP (SUBREG_REG (op0
), 0),
3204 return simplify_gen_subreg (mode
, tmp
, inner_mode
,
3205 subreg_lowpart_offset (mode
,
3209 if (SHIFT_COUNT_TRUNCATED
&& CONST_INT_P (op1
))
3211 val
= INTVAL (op1
) & (GET_MODE_PRECISION (mode
) - 1);
3212 if (val
!= INTVAL (op1
))
3213 return simplify_gen_binary (code
, mode
, op0
, GEN_INT (val
));
3220 if (trueop1
== CONST0_RTX (mode
))
3222 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3224 goto canonicalize_shift
;
3227 if (trueop1
== CONST0_RTX (mode
))
3229 if (trueop0
== CONST0_RTX (mode
) && ! side_effects_p (op1
))
3231 /* Optimize (lshiftrt (clz X) C) as (eq X 0). */
3232 if (GET_CODE (op0
) == CLZ
3233 && CONST_INT_P (trueop1
)
3234 && STORE_FLAG_VALUE
== 1
3235 && INTVAL (trueop1
) < (HOST_WIDE_INT
)width
)
3237 machine_mode imode
= GET_MODE (XEXP (op0
, 0));
3238 unsigned HOST_WIDE_INT zero_val
= 0;
3240 if (CLZ_DEFINED_VALUE_AT_ZERO (imode
, zero_val
)
3241 && zero_val
== GET_MODE_PRECISION (imode
)
3242 && INTVAL (trueop1
) == exact_log2 (zero_val
))
3243 return simplify_gen_relational (EQ
, mode
, imode
,
3244 XEXP (op0
, 0), const0_rtx
);
3246 goto canonicalize_shift
;
3249 if (width
<= HOST_BITS_PER_WIDE_INT
3250 && mode_signbit_p (mode
, trueop1
)
3251 && ! side_effects_p (op0
))
3253 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3255 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3261 if (width
<= HOST_BITS_PER_WIDE_INT
3262 && CONST_INT_P (trueop1
)
3263 && (UINTVAL (trueop1
) == GET_MODE_MASK (mode
) >> 1)
3264 && ! side_effects_p (op0
))
3266 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3268 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3274 if (trueop1
== CONST0_RTX (mode
) && ! side_effects_p (op0
))
3276 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3278 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3284 if (trueop1
== constm1_rtx
&& ! side_effects_p (op0
))
3286 if (rtx_equal_p (trueop0
, trueop1
) && ! side_effects_p (op0
))
3288 tem
= simplify_associative_operation (code
, mode
, op0
, op1
);
3301 /* ??? There are simplifications that can be done. */
3305 if (!VECTOR_MODE_P (mode
))
3307 gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0
)));
3308 gcc_assert (mode
== GET_MODE_INNER (GET_MODE (trueop0
)));
3309 gcc_assert (GET_CODE (trueop1
) == PARALLEL
);
3310 gcc_assert (XVECLEN (trueop1
, 0) == 1);
3311 gcc_assert (CONST_INT_P (XVECEXP (trueop1
, 0, 0)));
3313 if (GET_CODE (trueop0
) == CONST_VECTOR
)
3314 return CONST_VECTOR_ELT (trueop0
, INTVAL (XVECEXP
3317 /* Extract a scalar element from a nested VEC_SELECT expression
3318 (with optional nested VEC_CONCAT expression). Some targets
3319 (i386) extract scalar element from a vector using chain of
3320 nested VEC_SELECT expressions. When input operand is a memory
3321 operand, this operation can be simplified to a simple scalar
3322 load from an offseted memory address. */
3323 if (GET_CODE (trueop0
) == VEC_SELECT
)
3325 rtx op0
= XEXP (trueop0
, 0);
3326 rtx op1
= XEXP (trueop0
, 1);
3328 machine_mode opmode
= GET_MODE (op0
);
3329 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (opmode
));
3330 int n_elts
= GET_MODE_SIZE (opmode
) / elt_size
;
3332 int i
= INTVAL (XVECEXP (trueop1
, 0, 0));
3338 gcc_assert (GET_CODE (op1
) == PARALLEL
);
3339 gcc_assert (i
< n_elts
);
3341 /* Select element, pointed by nested selector. */
3342 elem
= INTVAL (XVECEXP (op1
, 0, i
));
3344 /* Handle the case when nested VEC_SELECT wraps VEC_CONCAT. */
3345 if (GET_CODE (op0
) == VEC_CONCAT
)
3347 rtx op00
= XEXP (op0
, 0);
3348 rtx op01
= XEXP (op0
, 1);
3350 machine_mode mode00
, mode01
;
3351 int n_elts00
, n_elts01
;
3353 mode00
= GET_MODE (op00
);
3354 mode01
= GET_MODE (op01
);
3356 /* Find out number of elements of each operand. */
3357 if (VECTOR_MODE_P (mode00
))
3359 elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode00
));
3360 n_elts00
= GET_MODE_SIZE (mode00
) / elt_size
;
3365 if (VECTOR_MODE_P (mode01
))
3367 elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode01
));
3368 n_elts01
= GET_MODE_SIZE (mode01
) / elt_size
;
3373 gcc_assert (n_elts
== n_elts00
+ n_elts01
);
3375 /* Select correct operand of VEC_CONCAT
3376 and adjust selector. */
3377 if (elem
< n_elts01
)
3388 vec
= rtvec_alloc (1);
3389 RTVEC_ELT (vec
, 0) = GEN_INT (elem
);
3391 tmp
= gen_rtx_fmt_ee (code
, mode
,
3392 tmp_op
, gen_rtx_PARALLEL (VOIDmode
, vec
));
3395 if (GET_CODE (trueop0
) == VEC_DUPLICATE
3396 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3397 return XEXP (trueop0
, 0);
3401 gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0
)));
3402 gcc_assert (GET_MODE_INNER (mode
)
3403 == GET_MODE_INNER (GET_MODE (trueop0
)));
3404 gcc_assert (GET_CODE (trueop1
) == PARALLEL
);
3406 if (GET_CODE (trueop0
) == CONST_VECTOR
)
3408 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode
));
3409 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
3410 rtvec v
= rtvec_alloc (n_elts
);
3413 gcc_assert (XVECLEN (trueop1
, 0) == (int) n_elts
);
3414 for (i
= 0; i
< n_elts
; i
++)
3416 rtx x
= XVECEXP (trueop1
, 0, i
);
3418 gcc_assert (CONST_INT_P (x
));
3419 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop0
,
3423 return gen_rtx_CONST_VECTOR (mode
, v
);
3426 /* Recognize the identity. */
3427 if (GET_MODE (trueop0
) == mode
)
3429 bool maybe_ident
= true;
3430 for (int i
= 0; i
< XVECLEN (trueop1
, 0); i
++)
3432 rtx j
= XVECEXP (trueop1
, 0, i
);
3433 if (!CONST_INT_P (j
) || INTVAL (j
) != i
)
3435 maybe_ident
= false;
3443 /* If we build {a,b} then permute it, build the result directly. */
3444 if (XVECLEN (trueop1
, 0) == 2
3445 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3446 && CONST_INT_P (XVECEXP (trueop1
, 0, 1))
3447 && GET_CODE (trueop0
) == VEC_CONCAT
3448 && GET_CODE (XEXP (trueop0
, 0)) == VEC_CONCAT
3449 && GET_MODE (XEXP (trueop0
, 0)) == mode
3450 && GET_CODE (XEXP (trueop0
, 1)) == VEC_CONCAT
3451 && GET_MODE (XEXP (trueop0
, 1)) == mode
)
3453 unsigned int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3454 unsigned int i1
= INTVAL (XVECEXP (trueop1
, 0, 1));
3457 gcc_assert (i0
< 4 && i1
< 4);
3458 subop0
= XEXP (XEXP (trueop0
, i0
/ 2), i0
% 2);
3459 subop1
= XEXP (XEXP (trueop0
, i1
/ 2), i1
% 2);
3461 return simplify_gen_binary (VEC_CONCAT
, mode
, subop0
, subop1
);
3464 if (XVECLEN (trueop1
, 0) == 2
3465 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3466 && CONST_INT_P (XVECEXP (trueop1
, 0, 1))
3467 && GET_CODE (trueop0
) == VEC_CONCAT
3468 && GET_MODE (trueop0
) == mode
)
3470 unsigned int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3471 unsigned int i1
= INTVAL (XVECEXP (trueop1
, 0, 1));
3474 gcc_assert (i0
< 2 && i1
< 2);
3475 subop0
= XEXP (trueop0
, i0
);
3476 subop1
= XEXP (trueop0
, i1
);
3478 return simplify_gen_binary (VEC_CONCAT
, mode
, subop0
, subop1
);
3481 /* If we select one half of a vec_concat, return that. */
3482 if (GET_CODE (trueop0
) == VEC_CONCAT
3483 && CONST_INT_P (XVECEXP (trueop1
, 0, 0)))
3485 rtx subop0
= XEXP (trueop0
, 0);
3486 rtx subop1
= XEXP (trueop0
, 1);
3487 machine_mode mode0
= GET_MODE (subop0
);
3488 machine_mode mode1
= GET_MODE (subop1
);
3489 int li
= GET_MODE_SIZE (GET_MODE_INNER (mode0
));
3490 int l0
= GET_MODE_SIZE (mode0
) / li
;
3491 int l1
= GET_MODE_SIZE (mode1
) / li
;
3492 int i0
= INTVAL (XVECEXP (trueop1
, 0, 0));
3493 if (i0
== 0 && !side_effects_p (op1
) && mode
== mode0
)
3495 bool success
= true;
3496 for (int i
= 1; i
< l0
; ++i
)
3498 rtx j
= XVECEXP (trueop1
, 0, i
);
3499 if (!CONST_INT_P (j
) || INTVAL (j
) != i
)
3508 if (i0
== l0
&& !side_effects_p (op0
) && mode
== mode1
)
3510 bool success
= true;
3511 for (int i
= 1; i
< l1
; ++i
)
3513 rtx j
= XVECEXP (trueop1
, 0, i
);
3514 if (!CONST_INT_P (j
) || INTVAL (j
) != i0
+ i
)
3526 if (XVECLEN (trueop1
, 0) == 1
3527 && CONST_INT_P (XVECEXP (trueop1
, 0, 0))
3528 && GET_CODE (trueop0
) == VEC_CONCAT
)
3531 int offset
= INTVAL (XVECEXP (trueop1
, 0, 0)) * GET_MODE_SIZE (mode
);
3533 /* Try to find the element in the VEC_CONCAT. */
3534 while (GET_MODE (vec
) != mode
3535 && GET_CODE (vec
) == VEC_CONCAT
)
3537 HOST_WIDE_INT vec_size
;
3539 if (CONST_INT_P (XEXP (vec
, 0)))
3541 /* vec_concat of two const_ints doesn't make sense with
3542 respect to modes. */
3543 if (CONST_INT_P (XEXP (vec
, 1)))
3546 vec_size
= GET_MODE_SIZE (GET_MODE (trueop0
))
3547 - GET_MODE_SIZE (GET_MODE (XEXP (vec
, 1)));
3550 vec_size
= GET_MODE_SIZE (GET_MODE (XEXP (vec
, 0)));
3552 if (offset
< vec_size
)
3553 vec
= XEXP (vec
, 0);
3557 vec
= XEXP (vec
, 1);
3559 vec
= avoid_constant_pool_reference (vec
);
3562 if (GET_MODE (vec
) == mode
)
3566 /* If we select elements in a vec_merge that all come from the same
3567 operand, select from that operand directly. */
3568 if (GET_CODE (op0
) == VEC_MERGE
)
3570 rtx trueop02
= avoid_constant_pool_reference (XEXP (op0
, 2));
3571 if (CONST_INT_P (trueop02
))
3573 unsigned HOST_WIDE_INT sel
= UINTVAL (trueop02
);
3574 bool all_operand0
= true;
3575 bool all_operand1
= true;
3576 for (int i
= 0; i
< XVECLEN (trueop1
, 0); i
++)
3578 rtx j
= XVECEXP (trueop1
, 0, i
);
3579 if (sel
& (1 << UINTVAL (j
)))
3580 all_operand1
= false;
3582 all_operand0
= false;
3584 if (all_operand0
&& !side_effects_p (XEXP (op0
, 1)))
3585 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (op0
, 0), op1
);
3586 if (all_operand1
&& !side_effects_p (XEXP (op0
, 0)))
3587 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (op0
, 1), op1
);
3591 /* If we have two nested selects that are inverses of each
3592 other, replace them with the source operand. */
3593 if (GET_CODE (trueop0
) == VEC_SELECT
3594 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3596 rtx op0_subop1
= XEXP (trueop0
, 1);
3597 gcc_assert (GET_CODE (op0_subop1
) == PARALLEL
);
3598 gcc_assert (XVECLEN (trueop1
, 0) == GET_MODE_NUNITS (mode
));
3600 /* Apply the outer ordering vector to the inner one. (The inner
3601 ordering vector is expressly permitted to be of a different
3602 length than the outer one.) If the result is { 0, 1, ..., n-1 }
3603 then the two VEC_SELECTs cancel. */
3604 for (int i
= 0; i
< XVECLEN (trueop1
, 0); ++i
)
3606 rtx x
= XVECEXP (trueop1
, 0, i
);
3607 if (!CONST_INT_P (x
))
3609 rtx y
= XVECEXP (op0_subop1
, 0, INTVAL (x
));
3610 if (!CONST_INT_P (y
) || i
!= INTVAL (y
))
3613 return XEXP (trueop0
, 0);
3619 machine_mode op0_mode
= (GET_MODE (trueop0
) != VOIDmode
3620 ? GET_MODE (trueop0
)
3621 : GET_MODE_INNER (mode
));
3622 machine_mode op1_mode
= (GET_MODE (trueop1
) != VOIDmode
3623 ? GET_MODE (trueop1
)
3624 : GET_MODE_INNER (mode
));
3626 gcc_assert (VECTOR_MODE_P (mode
));
3627 gcc_assert (GET_MODE_SIZE (op0_mode
) + GET_MODE_SIZE (op1_mode
)
3628 == GET_MODE_SIZE (mode
));
3630 if (VECTOR_MODE_P (op0_mode
))
3631 gcc_assert (GET_MODE_INNER (mode
)
3632 == GET_MODE_INNER (op0_mode
));
3634 gcc_assert (GET_MODE_INNER (mode
) == op0_mode
);
3636 if (VECTOR_MODE_P (op1_mode
))
3637 gcc_assert (GET_MODE_INNER (mode
)
3638 == GET_MODE_INNER (op1_mode
));
3640 gcc_assert (GET_MODE_INNER (mode
) == op1_mode
);
3642 if ((GET_CODE (trueop0
) == CONST_VECTOR
3643 || CONST_SCALAR_INT_P (trueop0
)
3644 || CONST_DOUBLE_AS_FLOAT_P (trueop0
))
3645 && (GET_CODE (trueop1
) == CONST_VECTOR
3646 || CONST_SCALAR_INT_P (trueop1
)
3647 || CONST_DOUBLE_AS_FLOAT_P (trueop1
)))
3649 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode
));
3650 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
3651 rtvec v
= rtvec_alloc (n_elts
);
3653 unsigned in_n_elts
= 1;
3655 if (VECTOR_MODE_P (op0_mode
))
3656 in_n_elts
= (GET_MODE_SIZE (op0_mode
) / elt_size
);
3657 for (i
= 0; i
< n_elts
; i
++)
3661 if (!VECTOR_MODE_P (op0_mode
))
3662 RTVEC_ELT (v
, i
) = trueop0
;
3664 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop0
, i
);
3668 if (!VECTOR_MODE_P (op1_mode
))
3669 RTVEC_ELT (v
, i
) = trueop1
;
3671 RTVEC_ELT (v
, i
) = CONST_VECTOR_ELT (trueop1
,
3676 return gen_rtx_CONST_VECTOR (mode
, v
);
3679 /* Try to merge two VEC_SELECTs from the same vector into a single one.
3680 Restrict the transformation to avoid generating a VEC_SELECT with a
3681 mode unrelated to its operand. */
3682 if (GET_CODE (trueop0
) == VEC_SELECT
3683 && GET_CODE (trueop1
) == VEC_SELECT
3684 && rtx_equal_p (XEXP (trueop0
, 0), XEXP (trueop1
, 0))
3685 && GET_MODE (XEXP (trueop0
, 0)) == mode
)
3687 rtx par0
= XEXP (trueop0
, 1);
3688 rtx par1
= XEXP (trueop1
, 1);
3689 int len0
= XVECLEN (par0
, 0);
3690 int len1
= XVECLEN (par1
, 0);
3691 rtvec vec
= rtvec_alloc (len0
+ len1
);
3692 for (int i
= 0; i
< len0
; i
++)
3693 RTVEC_ELT (vec
, i
) = XVECEXP (par0
, 0, i
);
3694 for (int i
= 0; i
< len1
; i
++)
3695 RTVEC_ELT (vec
, len0
+ i
) = XVECEXP (par1
, 0, i
);
3696 return simplify_gen_binary (VEC_SELECT
, mode
, XEXP (trueop0
, 0),
3697 gen_rtx_PARALLEL (VOIDmode
, vec
));
3710 simplify_const_binary_operation (enum rtx_code code
, machine_mode mode
,
3713 unsigned int width
= GET_MODE_PRECISION (mode
);
3715 if (VECTOR_MODE_P (mode
)
3716 && code
!= VEC_CONCAT
3717 && GET_CODE (op0
) == CONST_VECTOR
3718 && GET_CODE (op1
) == CONST_VECTOR
)
3720 unsigned n_elts
= GET_MODE_NUNITS (mode
);
3721 machine_mode op0mode
= GET_MODE (op0
);
3722 unsigned op0_n_elts
= GET_MODE_NUNITS (op0mode
);
3723 machine_mode op1mode
= GET_MODE (op1
);
3724 unsigned op1_n_elts
= GET_MODE_NUNITS (op1mode
);
3725 rtvec v
= rtvec_alloc (n_elts
);
3728 gcc_assert (op0_n_elts
== n_elts
);
3729 gcc_assert (op1_n_elts
== n_elts
);
3730 for (i
= 0; i
< n_elts
; i
++)
3732 rtx x
= simplify_binary_operation (code
, GET_MODE_INNER (mode
),
3733 CONST_VECTOR_ELT (op0
, i
),
3734 CONST_VECTOR_ELT (op1
, i
));
3737 RTVEC_ELT (v
, i
) = x
;
3740 return gen_rtx_CONST_VECTOR (mode
, v
);
3743 if (VECTOR_MODE_P (mode
)
3744 && code
== VEC_CONCAT
3745 && (CONST_SCALAR_INT_P (op0
)
3746 || GET_CODE (op0
) == CONST_FIXED
3747 || CONST_DOUBLE_AS_FLOAT_P (op0
))
3748 && (CONST_SCALAR_INT_P (op1
)
3749 || CONST_DOUBLE_AS_FLOAT_P (op1
)
3750 || GET_CODE (op1
) == CONST_FIXED
))
3752 unsigned n_elts
= GET_MODE_NUNITS (mode
);
3753 rtvec v
= rtvec_alloc (n_elts
);
3755 gcc_assert (n_elts
>= 2);
3758 gcc_assert (GET_CODE (op0
) != CONST_VECTOR
);
3759 gcc_assert (GET_CODE (op1
) != CONST_VECTOR
);
3761 RTVEC_ELT (v
, 0) = op0
;
3762 RTVEC_ELT (v
, 1) = op1
;
3766 unsigned op0_n_elts
= GET_MODE_NUNITS (GET_MODE (op0
));
3767 unsigned op1_n_elts
= GET_MODE_NUNITS (GET_MODE (op1
));
3770 gcc_assert (GET_CODE (op0
) == CONST_VECTOR
);
3771 gcc_assert (GET_CODE (op1
) == CONST_VECTOR
);
3772 gcc_assert (op0_n_elts
+ op1_n_elts
== n_elts
);
3774 for (i
= 0; i
< op0_n_elts
; ++i
)
3775 RTVEC_ELT (v
, i
) = XVECEXP (op0
, 0, i
);
3776 for (i
= 0; i
< op1_n_elts
; ++i
)
3777 RTVEC_ELT (v
, op0_n_elts
+i
) = XVECEXP (op1
, 0, i
);
3780 return gen_rtx_CONST_VECTOR (mode
, v
);
3783 if (SCALAR_FLOAT_MODE_P (mode
)
3784 && CONST_DOUBLE_AS_FLOAT_P (op0
)
3785 && CONST_DOUBLE_AS_FLOAT_P (op1
)
3786 && mode
== GET_MODE (op0
) && mode
== GET_MODE (op1
))
3797 real_to_target (tmp0
, CONST_DOUBLE_REAL_VALUE (op0
),
3799 real_to_target (tmp1
, CONST_DOUBLE_REAL_VALUE (op1
),
3801 for (i
= 0; i
< 4; i
++)
3818 real_from_target (&r
, tmp0
, mode
);
3819 return CONST_DOUBLE_FROM_REAL_VALUE (r
, mode
);
3823 REAL_VALUE_TYPE f0
, f1
, value
, result
;
3826 REAL_VALUE_FROM_CONST_DOUBLE (f0
, op0
);
3827 REAL_VALUE_FROM_CONST_DOUBLE (f1
, op1
);
3828 real_convert (&f0
, mode
, &f0
);
3829 real_convert (&f1
, mode
, &f1
);
3831 if (HONOR_SNANS (mode
)
3832 && (REAL_VALUE_ISNAN (f0
) || REAL_VALUE_ISNAN (f1
)))
3836 && REAL_VALUES_EQUAL (f1
, dconst0
)
3837 && (flag_trapping_math
|| ! MODE_HAS_INFINITIES (mode
)))
3840 if (MODE_HAS_INFINITIES (mode
) && HONOR_NANS (mode
)
3841 && flag_trapping_math
3842 && REAL_VALUE_ISINF (f0
) && REAL_VALUE_ISINF (f1
))
3844 int s0
= REAL_VALUE_NEGATIVE (f0
);
3845 int s1
= REAL_VALUE_NEGATIVE (f1
);
3850 /* Inf + -Inf = NaN plus exception. */
3855 /* Inf - Inf = NaN plus exception. */
3860 /* Inf / Inf = NaN plus exception. */
3867 if (code
== MULT
&& MODE_HAS_INFINITIES (mode
) && HONOR_NANS (mode
)
3868 && flag_trapping_math
3869 && ((REAL_VALUE_ISINF (f0
) && REAL_VALUES_EQUAL (f1
, dconst0
))
3870 || (REAL_VALUE_ISINF (f1
)
3871 && REAL_VALUES_EQUAL (f0
, dconst0
))))
3872 /* Inf * 0 = NaN plus exception. */
3875 inexact
= real_arithmetic (&value
, rtx_to_tree_code (code
),
3877 real_convert (&result
, mode
, &value
);
3879 /* Don't constant fold this floating point operation if
3880 the result has overflowed and flag_trapping_math. */
3882 if (flag_trapping_math
3883 && MODE_HAS_INFINITIES (mode
)
3884 && REAL_VALUE_ISINF (result
)
3885 && !REAL_VALUE_ISINF (f0
)
3886 && !REAL_VALUE_ISINF (f1
))
3887 /* Overflow plus exception. */
3890 /* Don't constant fold this floating point operation if the
3891 result may dependent upon the run-time rounding mode and
3892 flag_rounding_math is set, or if GCC's software emulation
3893 is unable to accurately represent the result. */
3895 if ((flag_rounding_math
3896 || (MODE_COMPOSITE_P (mode
) && !flag_unsafe_math_optimizations
))
3897 && (inexact
|| !real_identical (&result
, &value
)))
3900 return CONST_DOUBLE_FROM_REAL_VALUE (result
, mode
);
3904 /* We can fold some multi-word operations. */
3905 if ((GET_MODE_CLASS (mode
) == MODE_INT
3906 || GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
3907 && CONST_SCALAR_INT_P (op0
)
3908 && CONST_SCALAR_INT_P (op1
))
3912 rtx_mode_t pop0
= std::make_pair (op0
, mode
);
3913 rtx_mode_t pop1
= std::make_pair (op1
, mode
);
3915 #if TARGET_SUPPORTS_WIDE_INT == 0
3916 /* This assert keeps the simplification from producing a result
3917 that cannot be represented in a CONST_DOUBLE but a lot of
3918 upstream callers expect that this function never fails to
3919 simplify something and so you if you added this to the test
3920 above the code would die later anyway. If this assert
3921 happens, you just need to make the port support wide int. */
3922 gcc_assert (width
<= HOST_BITS_PER_DOUBLE_INT
);
3927 result
= wi::sub (pop0
, pop1
);
3931 result
= wi::add (pop0
, pop1
);
3935 result
= wi::mul (pop0
, pop1
);
3939 result
= wi::div_trunc (pop0
, pop1
, SIGNED
, &overflow
);
3945 result
= wi::mod_trunc (pop0
, pop1
, SIGNED
, &overflow
);
3951 result
= wi::div_trunc (pop0
, pop1
, UNSIGNED
, &overflow
);
3957 result
= wi::mod_trunc (pop0
, pop1
, UNSIGNED
, &overflow
);
3963 result
= wi::bit_and (pop0
, pop1
);
3967 result
= wi::bit_or (pop0
, pop1
);
3971 result
= wi::bit_xor (pop0
, pop1
);
3975 result
= wi::smin (pop0
, pop1
);
3979 result
= wi::smax (pop0
, pop1
);
3983 result
= wi::umin (pop0
, pop1
);
3987 result
= wi::umax (pop0
, pop1
);
3994 wide_int wop1
= pop1
;
3995 if (SHIFT_COUNT_TRUNCATED
)
3996 wop1
= wi::umod_trunc (wop1
, width
);
3997 else if (wi::geu_p (wop1
, width
))
4003 result
= wi::lrshift (pop0
, wop1
);
4007 result
= wi::arshift (pop0
, wop1
);
4011 result
= wi::lshift (pop0
, wop1
);
4022 if (wi::neg_p (pop1
))
4028 result
= wi::lrotate (pop0
, pop1
);
4032 result
= wi::rrotate (pop0
, pop1
);
4043 return immed_wide_int_const (result
, mode
);
4051 /* Return a positive integer if X should sort after Y. The value
4052 returned is 1 if and only if X and Y are both regs. */
4055 simplify_plus_minus_op_data_cmp (rtx x
, rtx y
)
4059 result
= (commutative_operand_precedence (y
)
4060 - commutative_operand_precedence (x
));
4062 return result
+ result
;
4064 /* Group together equal REGs to do more simplification. */
4065 if (REG_P (x
) && REG_P (y
))
4066 return REGNO (x
) > REGNO (y
);
4071 /* Simplify and canonicalize a PLUS or MINUS, at least one of whose
4072 operands may be another PLUS or MINUS.
4074 Rather than test for specific case, we do this by a brute-force method
4075 and do all possible simplifications until no more changes occur. Then
4076 we rebuild the operation.
4078 May return NULL_RTX when no changes were made. */
4081 simplify_plus_minus (enum rtx_code code
, machine_mode mode
, rtx op0
,
4084 struct simplify_plus_minus_op_data
4091 int changed
, n_constants
, canonicalized
= 0;
4094 memset (ops
, 0, sizeof ops
);
4096 /* Set up the two operands and then expand them until nothing has been
4097 changed. If we run out of room in our array, give up; this should
4098 almost never happen. */
4103 ops
[1].neg
= (code
== MINUS
);
4110 for (i
= 0; i
< n_ops
; i
++)
4112 rtx this_op
= ops
[i
].op
;
4113 int this_neg
= ops
[i
].neg
;
4114 enum rtx_code this_code
= GET_CODE (this_op
);
4120 if (n_ops
== ARRAY_SIZE (ops
))
4123 ops
[n_ops
].op
= XEXP (this_op
, 1);
4124 ops
[n_ops
].neg
= (this_code
== MINUS
) ^ this_neg
;
4127 ops
[i
].op
= XEXP (this_op
, 0);
4129 /* If this operand was negated then we will potentially
4130 canonicalize the expression. Similarly if we don't
4131 place the operands adjacent we're re-ordering the
4132 expression and thus might be performing a
4133 canonicalization. Ignore register re-ordering.
4134 ??? It might be better to shuffle the ops array here,
4135 but then (plus (plus (A, B), plus (C, D))) wouldn't
4136 be seen as non-canonical. */
4139 && !(REG_P (ops
[i
].op
) && REG_P (ops
[n_ops
- 1].op
))))
4144 ops
[i
].op
= XEXP (this_op
, 0);
4145 ops
[i
].neg
= ! this_neg
;
4151 if (n_ops
!= ARRAY_SIZE (ops
)
4152 && GET_CODE (XEXP (this_op
, 0)) == PLUS
4153 && CONSTANT_P (XEXP (XEXP (this_op
, 0), 0))
4154 && CONSTANT_P (XEXP (XEXP (this_op
, 0), 1)))
4156 ops
[i
].op
= XEXP (XEXP (this_op
, 0), 0);
4157 ops
[n_ops
].op
= XEXP (XEXP (this_op
, 0), 1);
4158 ops
[n_ops
].neg
= this_neg
;
4166 /* ~a -> (-a - 1) */
4167 if (n_ops
!= ARRAY_SIZE (ops
))
4169 ops
[n_ops
].op
= CONSTM1_RTX (mode
);
4170 ops
[n_ops
++].neg
= this_neg
;
4171 ops
[i
].op
= XEXP (this_op
, 0);
4172 ops
[i
].neg
= !this_neg
;
4182 ops
[i
].op
= neg_const_int (mode
, this_op
);
4196 if (n_constants
> 1)
4199 gcc_assert (n_ops
>= 2);
4201 /* If we only have two operands, we can avoid the loops. */
4204 enum rtx_code code
= ops
[0].neg
|| ops
[1].neg
? MINUS
: PLUS
;
4207 /* Get the two operands. Be careful with the order, especially for
4208 the cases where code == MINUS. */
4209 if (ops
[0].neg
&& ops
[1].neg
)
4211 lhs
= gen_rtx_NEG (mode
, ops
[0].op
);
4214 else if (ops
[0].neg
)
4225 return simplify_const_binary_operation (code
, mode
, lhs
, rhs
);
4228 /* Now simplify each pair of operands until nothing changes. */
4231 /* Insertion sort is good enough for a small array. */
4232 for (i
= 1; i
< n_ops
; i
++)
4234 struct simplify_plus_minus_op_data save
;
4238 cmp
= simplify_plus_minus_op_data_cmp (ops
[j
].op
, ops
[i
].op
);
4241 /* Just swapping registers doesn't count as canonicalization. */
4247 ops
[j
+ 1] = ops
[j
];
4249 && simplify_plus_minus_op_data_cmp (ops
[j
].op
, save
.op
) > 0);
4254 for (i
= n_ops
- 1; i
> 0; i
--)
4255 for (j
= i
- 1; j
>= 0; j
--)
4257 rtx lhs
= ops
[j
].op
, rhs
= ops
[i
].op
;
4258 int lneg
= ops
[j
].neg
, rneg
= ops
[i
].neg
;
4260 if (lhs
!= 0 && rhs
!= 0)
4262 enum rtx_code ncode
= PLUS
;
4268 std::swap (lhs
, rhs
);
4270 else if (swap_commutative_operands_p (lhs
, rhs
))
4271 std::swap (lhs
, rhs
);
4273 if ((GET_CODE (lhs
) == CONST
|| CONST_INT_P (lhs
))
4274 && (GET_CODE (rhs
) == CONST
|| CONST_INT_P (rhs
)))
4276 rtx tem_lhs
, tem_rhs
;
4278 tem_lhs
= GET_CODE (lhs
) == CONST
? XEXP (lhs
, 0) : lhs
;
4279 tem_rhs
= GET_CODE (rhs
) == CONST
? XEXP (rhs
, 0) : rhs
;
4280 tem
= simplify_binary_operation (ncode
, mode
, tem_lhs
,
4283 if (tem
&& !CONSTANT_P (tem
))
4284 tem
= gen_rtx_CONST (GET_MODE (tem
), tem
);
4287 tem
= simplify_binary_operation (ncode
, mode
, lhs
, rhs
);
4291 /* Reject "simplifications" that just wrap the two
4292 arguments in a CONST. Failure to do so can result
4293 in infinite recursion with simplify_binary_operation
4294 when it calls us to simplify CONST operations.
4295 Also, if we find such a simplification, don't try
4296 any more combinations with this rhs: We must have
4297 something like symbol+offset, ie. one of the
4298 trivial CONST expressions we handle later. */
4299 if (GET_CODE (tem
) == CONST
4300 && GET_CODE (XEXP (tem
, 0)) == ncode
4301 && XEXP (XEXP (tem
, 0), 0) == lhs
4302 && XEXP (XEXP (tem
, 0), 1) == rhs
)
4305 if (GET_CODE (tem
) == NEG
)
4306 tem
= XEXP (tem
, 0), lneg
= !lneg
;
4307 if (CONST_INT_P (tem
) && lneg
)
4308 tem
= neg_const_int (mode
, tem
), lneg
= 0;
4312 ops
[j
].op
= NULL_RTX
;
4322 /* Pack all the operands to the lower-numbered entries. */
4323 for (i
= 0, j
= 0; j
< n_ops
; j
++)
4332 /* If nothing changed, fail. */
4336 /* Create (minus -C X) instead of (neg (const (plus X C))). */
4338 && CONST_INT_P (ops
[1].op
)
4339 && CONSTANT_P (ops
[0].op
)
4341 return gen_rtx_fmt_ee (MINUS
, mode
, ops
[1].op
, ops
[0].op
);
4343 /* We suppressed creation of trivial CONST expressions in the
4344 combination loop to avoid recursion. Create one manually now.
4345 The combination loop should have ensured that there is exactly
4346 one CONST_INT, and the sort will have ensured that it is last
4347 in the array and that any other constant will be next-to-last. */
4350 && CONST_INT_P (ops
[n_ops
- 1].op
)
4351 && CONSTANT_P (ops
[n_ops
- 2].op
))
4353 rtx value
= ops
[n_ops
- 1].op
;
4354 if (ops
[n_ops
- 1].neg
^ ops
[n_ops
- 2].neg
)
4355 value
= neg_const_int (mode
, value
);
4356 ops
[n_ops
- 2].op
= plus_constant (mode
, ops
[n_ops
- 2].op
,
4361 /* Put a non-negated operand first, if possible. */
4363 for (i
= 0; i
< n_ops
&& ops
[i
].neg
; i
++)
4366 ops
[0].op
= gen_rtx_NEG (mode
, ops
[0].op
);
4375 /* Now make the result by performing the requested operations. */
4377 for (i
= 1; i
< n_ops
; i
++)
4378 result
= gen_rtx_fmt_ee (ops
[i
].neg
? MINUS
: PLUS
,
4379 mode
, result
, ops
[i
].op
);
4384 /* Check whether an operand is suitable for calling simplify_plus_minus. */
4386 plus_minus_operand_p (const_rtx x
)
4388 return GET_CODE (x
) == PLUS
4389 || GET_CODE (x
) == MINUS
4390 || (GET_CODE (x
) == CONST
4391 && GET_CODE (XEXP (x
, 0)) == PLUS
4392 && CONSTANT_P (XEXP (XEXP (x
, 0), 0))
4393 && CONSTANT_P (XEXP (XEXP (x
, 0), 1)));
4396 /* Like simplify_binary_operation except used for relational operators.
4397 MODE is the mode of the result. If MODE is VOIDmode, both operands must
4398 not also be VOIDmode.
4400 CMP_MODE specifies in which mode the comparison is done in, so it is
4401 the mode of the operands. If CMP_MODE is VOIDmode, it is taken from
4402 the operands or, if both are VOIDmode, the operands are compared in
4403 "infinite precision". */
4405 simplify_relational_operation (enum rtx_code code
, machine_mode mode
,
4406 machine_mode cmp_mode
, rtx op0
, rtx op1
)
4408 rtx tem
, trueop0
, trueop1
;
4410 if (cmp_mode
== VOIDmode
)
4411 cmp_mode
= GET_MODE (op0
);
4412 if (cmp_mode
== VOIDmode
)
4413 cmp_mode
= GET_MODE (op1
);
4415 tem
= simplify_const_relational_operation (code
, cmp_mode
, op0
, op1
);
4418 if (SCALAR_FLOAT_MODE_P (mode
))
4420 if (tem
== const0_rtx
)
4421 return CONST0_RTX (mode
);
4422 #ifdef FLOAT_STORE_FLAG_VALUE
4424 REAL_VALUE_TYPE val
;
4425 val
= FLOAT_STORE_FLAG_VALUE (mode
);
4426 return CONST_DOUBLE_FROM_REAL_VALUE (val
, mode
);
4432 if (VECTOR_MODE_P (mode
))
4434 if (tem
== const0_rtx
)
4435 return CONST0_RTX (mode
);
4436 #ifdef VECTOR_STORE_FLAG_VALUE
4441 rtx val
= VECTOR_STORE_FLAG_VALUE (mode
);
4442 if (val
== NULL_RTX
)
4444 if (val
== const1_rtx
)
4445 return CONST1_RTX (mode
);
4447 units
= GET_MODE_NUNITS (mode
);
4448 v
= rtvec_alloc (units
);
4449 for (i
= 0; i
< units
; i
++)
4450 RTVEC_ELT (v
, i
) = val
;
4451 return gen_rtx_raw_CONST_VECTOR (mode
, v
);
4461 /* For the following tests, ensure const0_rtx is op1. */
4462 if (swap_commutative_operands_p (op0
, op1
)
4463 || (op0
== const0_rtx
&& op1
!= const0_rtx
))
4464 std::swap (op0
, op1
), code
= swap_condition (code
);
4466 /* If op0 is a compare, extract the comparison arguments from it. */
4467 if (GET_CODE (op0
) == COMPARE
&& op1
== const0_rtx
)
4468 return simplify_gen_relational (code
, mode
, VOIDmode
,
4469 XEXP (op0
, 0), XEXP (op0
, 1));
4471 if (GET_MODE_CLASS (cmp_mode
) == MODE_CC
4475 trueop0
= avoid_constant_pool_reference (op0
);
4476 trueop1
= avoid_constant_pool_reference (op1
);
4477 return simplify_relational_operation_1 (code
, mode
, cmp_mode
,
4481 /* This part of simplify_relational_operation is only used when CMP_MODE
4482 is not in class MODE_CC (i.e. it is a real comparison).
4484 MODE is the mode of the result, while CMP_MODE specifies in which
4485 mode the comparison is done in, so it is the mode of the operands. */
4488 simplify_relational_operation_1 (enum rtx_code code
, machine_mode mode
,
4489 machine_mode cmp_mode
, rtx op0
, rtx op1
)
4491 enum rtx_code op0code
= GET_CODE (op0
);
4493 if (op1
== const0_rtx
&& COMPARISON_P (op0
))
4495 /* If op0 is a comparison, extract the comparison arguments
4499 if (GET_MODE (op0
) == mode
)
4500 return simplify_rtx (op0
);
4502 return simplify_gen_relational (GET_CODE (op0
), mode
, VOIDmode
,
4503 XEXP (op0
, 0), XEXP (op0
, 1));
4505 else if (code
== EQ
)
4507 enum rtx_code new_code
= reversed_comparison_code (op0
, NULL_RTX
);
4508 if (new_code
!= UNKNOWN
)
4509 return simplify_gen_relational (new_code
, mode
, VOIDmode
,
4510 XEXP (op0
, 0), XEXP (op0
, 1));
4514 /* (LTU/GEU (PLUS a C) C), where C is constant, can be simplified to
4515 (GEU/LTU a -C). Likewise for (LTU/GEU (PLUS a C) a). */
4516 if ((code
== LTU
|| code
== GEU
)
4517 && GET_CODE (op0
) == PLUS
4518 && CONST_INT_P (XEXP (op0
, 1))
4519 && (rtx_equal_p (op1
, XEXP (op0
, 0))
4520 || rtx_equal_p (op1
, XEXP (op0
, 1)))
4521 /* (LTU/GEU (PLUS a 0) 0) is not the same as (GEU/LTU a 0). */
4522 && XEXP (op0
, 1) != const0_rtx
)
4525 = simplify_gen_unary (NEG
, cmp_mode
, XEXP (op0
, 1), cmp_mode
);
4526 return simplify_gen_relational ((code
== LTU
? GEU
: LTU
), mode
,
4527 cmp_mode
, XEXP (op0
, 0), new_cmp
);
4530 /* Canonicalize (LTU/GEU (PLUS a b) b) as (LTU/GEU (PLUS a b) a). */
4531 if ((code
== LTU
|| code
== GEU
)
4532 && GET_CODE (op0
) == PLUS
4533 && rtx_equal_p (op1
, XEXP (op0
, 1))
4534 /* Don't recurse "infinitely" for (LTU/GEU (PLUS b b) b). */
4535 && !rtx_equal_p (op1
, XEXP (op0
, 0)))
4536 return simplify_gen_relational (code
, mode
, cmp_mode
, op0
,
4537 copy_rtx (XEXP (op0
, 0)));
4539 if (op1
== const0_rtx
)
4541 /* Canonicalize (GTU x 0) as (NE x 0). */
4543 return simplify_gen_relational (NE
, mode
, cmp_mode
, op0
, op1
);
4544 /* Canonicalize (LEU x 0) as (EQ x 0). */
4546 return simplify_gen_relational (EQ
, mode
, cmp_mode
, op0
, op1
);
4548 else if (op1
== const1_rtx
)
4553 /* Canonicalize (GE x 1) as (GT x 0). */
4554 return simplify_gen_relational (GT
, mode
, cmp_mode
,
4557 /* Canonicalize (GEU x 1) as (NE x 0). */
4558 return simplify_gen_relational (NE
, mode
, cmp_mode
,
4561 /* Canonicalize (LT x 1) as (LE x 0). */
4562 return simplify_gen_relational (LE
, mode
, cmp_mode
,
4565 /* Canonicalize (LTU x 1) as (EQ x 0). */
4566 return simplify_gen_relational (EQ
, mode
, cmp_mode
,
4572 else if (op1
== constm1_rtx
)
4574 /* Canonicalize (LE x -1) as (LT x 0). */
4576 return simplify_gen_relational (LT
, mode
, cmp_mode
, op0
, const0_rtx
);
4577 /* Canonicalize (GT x -1) as (GE x 0). */
4579 return simplify_gen_relational (GE
, mode
, cmp_mode
, op0
, const0_rtx
);
4582 /* (eq/ne (plus x cst1) cst2) simplifies to (eq/ne x (cst2 - cst1)) */
4583 if ((code
== EQ
|| code
== NE
)
4584 && (op0code
== PLUS
|| op0code
== MINUS
)
4586 && CONSTANT_P (XEXP (op0
, 1))
4587 && (INTEGRAL_MODE_P (cmp_mode
) || flag_unsafe_math_optimizations
))
4589 rtx x
= XEXP (op0
, 0);
4590 rtx c
= XEXP (op0
, 1);
4591 enum rtx_code invcode
= op0code
== PLUS
? MINUS
: PLUS
;
4592 rtx tem
= simplify_gen_binary (invcode
, cmp_mode
, op1
, c
);
4594 /* Detect an infinite recursive condition, where we oscillate at this
4595 simplification case between:
4596 A + B == C <---> C - B == A,
4597 where A, B, and C are all constants with non-simplifiable expressions,
4598 usually SYMBOL_REFs. */
4599 if (GET_CODE (tem
) == invcode
4601 && rtx_equal_p (c
, XEXP (tem
, 1)))
4604 return simplify_gen_relational (code
, mode
, cmp_mode
, x
, tem
);
4607 /* (ne:SI (zero_extract:SI FOO (const_int 1) BAR) (const_int 0))) is
4608 the same as (zero_extract:SI FOO (const_int 1) BAR). */
4610 && op1
== const0_rtx
4611 && GET_MODE_CLASS (mode
) == MODE_INT
4612 && cmp_mode
!= VOIDmode
4613 /* ??? Work-around BImode bugs in the ia64 backend. */
4615 && cmp_mode
!= BImode
4616 && nonzero_bits (op0
, cmp_mode
) == 1
4617 && STORE_FLAG_VALUE
== 1)
4618 return GET_MODE_SIZE (mode
) > GET_MODE_SIZE (cmp_mode
)
4619 ? simplify_gen_unary (ZERO_EXTEND
, mode
, op0
, cmp_mode
)
4620 : lowpart_subreg (mode
, op0
, cmp_mode
);
4622 /* (eq/ne (xor x y) 0) simplifies to (eq/ne x y). */
4623 if ((code
== EQ
|| code
== NE
)
4624 && op1
== const0_rtx
4626 return simplify_gen_relational (code
, mode
, cmp_mode
,
4627 XEXP (op0
, 0), XEXP (op0
, 1));
4629 /* (eq/ne (xor x y) x) simplifies to (eq/ne y 0). */
4630 if ((code
== EQ
|| code
== NE
)
4632 && rtx_equal_p (XEXP (op0
, 0), op1
)
4633 && !side_effects_p (XEXP (op0
, 0)))
4634 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 1),
4637 /* Likewise (eq/ne (xor x y) y) simplifies to (eq/ne x 0). */
4638 if ((code
== EQ
|| code
== NE
)
4640 && rtx_equal_p (XEXP (op0
, 1), op1
)
4641 && !side_effects_p (XEXP (op0
, 1)))
4642 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4645 /* (eq/ne (xor x C1) C2) simplifies to (eq/ne x (C1^C2)). */
4646 if ((code
== EQ
|| code
== NE
)
4648 && CONST_SCALAR_INT_P (op1
)
4649 && CONST_SCALAR_INT_P (XEXP (op0
, 1)))
4650 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4651 simplify_gen_binary (XOR
, cmp_mode
,
4652 XEXP (op0
, 1), op1
));
4654 /* (eq/ne (and x y) x) simplifies to (eq/ne (and (not y) x) 0), which
4655 can be implemented with a BICS instruction on some targets, or
4656 constant-folded if y is a constant. */
4657 if ((code
== EQ
|| code
== NE
)
4659 && rtx_equal_p (XEXP (op0
, 0), op1
)
4660 && !side_effects_p (op1
)
4661 && op1
!= CONST0_RTX (cmp_mode
))
4663 rtx not_y
= simplify_gen_unary (NOT
, cmp_mode
, XEXP (op0
, 1), cmp_mode
);
4664 rtx lhs
= simplify_gen_binary (AND
, cmp_mode
, not_y
, XEXP (op0
, 0));
4666 return simplify_gen_relational (code
, mode
, cmp_mode
, lhs
,
4667 CONST0_RTX (cmp_mode
));
4670 /* Likewise for (eq/ne (and x y) y). */
4671 if ((code
== EQ
|| code
== NE
)
4673 && rtx_equal_p (XEXP (op0
, 1), op1
)
4674 && !side_effects_p (op1
)
4675 && op1
!= CONST0_RTX (cmp_mode
))
4677 rtx not_x
= simplify_gen_unary (NOT
, cmp_mode
, XEXP (op0
, 0), cmp_mode
);
4678 rtx lhs
= simplify_gen_binary (AND
, cmp_mode
, not_x
, XEXP (op0
, 1));
4680 return simplify_gen_relational (code
, mode
, cmp_mode
, lhs
,
4681 CONST0_RTX (cmp_mode
));
4684 /* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped. */
4685 if ((code
== EQ
|| code
== NE
)
4686 && GET_CODE (op0
) == BSWAP
4687 && CONST_SCALAR_INT_P (op1
))
4688 return simplify_gen_relational (code
, mode
, cmp_mode
, XEXP (op0
, 0),
4689 simplify_gen_unary (BSWAP
, cmp_mode
,
4692 /* (eq/ne (bswap x) (bswap y)) simplifies to (eq/ne x y). */
4693 if ((code
== EQ
|| code
== NE
)
4694 && GET_CODE (op0
) == BSWAP
4695 && GET_CODE (op1
) == BSWAP
)
4696 return simplify_gen_relational (code
, mode
, cmp_mode
,
4697 XEXP (op0
, 0), XEXP (op1
, 0));
4699 if (op0code
== POPCOUNT
&& op1
== const0_rtx
)
4705 /* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)). */
4706 return simplify_gen_relational (EQ
, mode
, GET_MODE (XEXP (op0
, 0)),
4707 XEXP (op0
, 0), const0_rtx
);
4712 /* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)). */
4713 return simplify_gen_relational (NE
, mode
, GET_MODE (XEXP (op0
, 0)),
4714 XEXP (op0
, 0), const0_rtx
);
4733 /* Convert the known results for EQ, LT, GT, LTU, GTU contained in
4734 KNOWN_RESULT to a CONST_INT, based on the requested comparison CODE
4735 For KNOWN_RESULT to make sense it should be either CMP_EQ, or the
4736 logical OR of one of (CMP_LT, CMP_GT) and one of (CMP_LTU, CMP_GTU).
4737 For floating-point comparisons, assume that the operands were ordered. */
4740 comparison_result (enum rtx_code code
, int known_results
)
4746 return (known_results
& CMP_EQ
) ? const_true_rtx
: const0_rtx
;
4749 return (known_results
& CMP_EQ
) ? const0_rtx
: const_true_rtx
;
4753 return (known_results
& CMP_LT
) ? const_true_rtx
: const0_rtx
;
4756 return (known_results
& CMP_LT
) ? const0_rtx
: const_true_rtx
;
4760 return (known_results
& CMP_GT
) ? const_true_rtx
: const0_rtx
;
4763 return (known_results
& CMP_GT
) ? const0_rtx
: const_true_rtx
;
4766 return (known_results
& CMP_LTU
) ? const_true_rtx
: const0_rtx
;
4768 return (known_results
& CMP_LTU
) ? const0_rtx
: const_true_rtx
;
4771 return (known_results
& CMP_GTU
) ? const_true_rtx
: const0_rtx
;
4773 return (known_results
& CMP_GTU
) ? const0_rtx
: const_true_rtx
;
4776 return const_true_rtx
;
4784 /* Check if the given comparison (done in the given MODE) is actually
4785 a tautology or a contradiction. If the mode is VOID_mode, the
4786 comparison is done in "infinite precision". If no simplification
4787 is possible, this function returns zero. Otherwise, it returns
4788 either const_true_rtx or const0_rtx. */
4791 simplify_const_relational_operation (enum rtx_code code
,
4799 gcc_assert (mode
!= VOIDmode
4800 || (GET_MODE (op0
) == VOIDmode
4801 && GET_MODE (op1
) == VOIDmode
));
4803 /* If op0 is a compare, extract the comparison arguments from it. */
4804 if (GET_CODE (op0
) == COMPARE
&& op1
== const0_rtx
)
4806 op1
= XEXP (op0
, 1);
4807 op0
= XEXP (op0
, 0);
4809 if (GET_MODE (op0
) != VOIDmode
)
4810 mode
= GET_MODE (op0
);
4811 else if (GET_MODE (op1
) != VOIDmode
)
4812 mode
= GET_MODE (op1
);
4817 /* We can't simplify MODE_CC values since we don't know what the
4818 actual comparison is. */
4819 if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
|| CC0_P (op0
))
4822 /* Make sure the constant is second. */
4823 if (swap_commutative_operands_p (op0
, op1
))
4825 std::swap (op0
, op1
);
4826 code
= swap_condition (code
);
4829 trueop0
= avoid_constant_pool_reference (op0
);
4830 trueop1
= avoid_constant_pool_reference (op1
);
4832 /* For integer comparisons of A and B maybe we can simplify A - B and can
4833 then simplify a comparison of that with zero. If A and B are both either
4834 a register or a CONST_INT, this can't help; testing for these cases will
4835 prevent infinite recursion here and speed things up.
4837 We can only do this for EQ and NE comparisons as otherwise we may
4838 lose or introduce overflow which we cannot disregard as undefined as
4839 we do not know the signedness of the operation on either the left or
4840 the right hand side of the comparison. */
4842 if (INTEGRAL_MODE_P (mode
) && trueop1
!= const0_rtx
4843 && (code
== EQ
|| code
== NE
)
4844 && ! ((REG_P (op0
) || CONST_INT_P (trueop0
))
4845 && (REG_P (op1
) || CONST_INT_P (trueop1
)))
4846 && 0 != (tem
= simplify_binary_operation (MINUS
, mode
, op0
, op1
))
4847 /* We cannot do this if tem is a nonzero address. */
4848 && ! nonzero_address_p (tem
))
4849 return simplify_const_relational_operation (signed_condition (code
),
4850 mode
, tem
, const0_rtx
);
4852 if (! HONOR_NANS (mode
) && code
== ORDERED
)
4853 return const_true_rtx
;
4855 if (! HONOR_NANS (mode
) && code
== UNORDERED
)
4858 /* For modes without NaNs, if the two operands are equal, we know the
4859 result except if they have side-effects. Even with NaNs we know
4860 the result of unordered comparisons and, if signaling NaNs are
4861 irrelevant, also the result of LT/GT/LTGT. */
4862 if ((! HONOR_NANS (trueop0
)
4863 || code
== UNEQ
|| code
== UNLE
|| code
== UNGE
4864 || ((code
== LT
|| code
== GT
|| code
== LTGT
)
4865 && ! HONOR_SNANS (trueop0
)))
4866 && rtx_equal_p (trueop0
, trueop1
)
4867 && ! side_effects_p (trueop0
))
4868 return comparison_result (code
, CMP_EQ
);
4870 /* If the operands are floating-point constants, see if we can fold
4872 if (CONST_DOUBLE_AS_FLOAT_P (trueop0
)
4873 && CONST_DOUBLE_AS_FLOAT_P (trueop1
)
4874 && SCALAR_FLOAT_MODE_P (GET_MODE (trueop0
)))
4876 REAL_VALUE_TYPE d0
, d1
;
4878 REAL_VALUE_FROM_CONST_DOUBLE (d0
, trueop0
);
4879 REAL_VALUE_FROM_CONST_DOUBLE (d1
, trueop1
);
4881 /* Comparisons are unordered iff at least one of the values is NaN. */
4882 if (REAL_VALUE_ISNAN (d0
) || REAL_VALUE_ISNAN (d1
))
4892 return const_true_rtx
;
4905 return comparison_result (code
,
4906 (REAL_VALUES_EQUAL (d0
, d1
) ? CMP_EQ
:
4907 REAL_VALUES_LESS (d0
, d1
) ? CMP_LT
: CMP_GT
));
4910 /* Otherwise, see if the operands are both integers. */
4911 if ((GET_MODE_CLASS (mode
) == MODE_INT
|| mode
== VOIDmode
)
4912 && CONST_SCALAR_INT_P (trueop0
) && CONST_SCALAR_INT_P (trueop1
))
4914 /* It would be nice if we really had a mode here. However, the
4915 largest int representable on the target is as good as
4917 machine_mode cmode
= (mode
== VOIDmode
) ? MAX_MODE_INT
: mode
;
4918 rtx_mode_t ptrueop0
= std::make_pair (trueop0
, cmode
);
4919 rtx_mode_t ptrueop1
= std::make_pair (trueop1
, cmode
);
4921 if (wi::eq_p (ptrueop0
, ptrueop1
))
4922 return comparison_result (code
, CMP_EQ
);
4925 int cr
= wi::lts_p (ptrueop0
, ptrueop1
) ? CMP_LT
: CMP_GT
;
4926 cr
|= wi::ltu_p (ptrueop0
, ptrueop1
) ? CMP_LTU
: CMP_GTU
;
4927 return comparison_result (code
, cr
);
4931 /* Optimize comparisons with upper and lower bounds. */
4932 if (HWI_COMPUTABLE_MODE_P (mode
)
4933 && CONST_INT_P (trueop1
))
4936 unsigned HOST_WIDE_INT nonzero
= nonzero_bits (trueop0
, mode
);
4937 HOST_WIDE_INT val
= INTVAL (trueop1
);
4938 HOST_WIDE_INT mmin
, mmax
;
4948 /* Get a reduced range if the sign bit is zero. */
4949 if (nonzero
<= (GET_MODE_MASK (mode
) >> 1))
4956 rtx mmin_rtx
, mmax_rtx
;
4957 get_mode_bounds (mode
, sign
, mode
, &mmin_rtx
, &mmax_rtx
);
4959 mmin
= INTVAL (mmin_rtx
);
4960 mmax
= INTVAL (mmax_rtx
);
4963 unsigned int sign_copies
= num_sign_bit_copies (trueop0
, mode
);
4965 mmin
>>= (sign_copies
- 1);
4966 mmax
>>= (sign_copies
- 1);
4972 /* x >= y is always true for y <= mmin, always false for y > mmax. */
4974 if ((unsigned HOST_WIDE_INT
) val
<= (unsigned HOST_WIDE_INT
) mmin
)
4975 return const_true_rtx
;
4976 if ((unsigned HOST_WIDE_INT
) val
> (unsigned HOST_WIDE_INT
) mmax
)
4981 return const_true_rtx
;
4986 /* x <= y is always true for y >= mmax, always false for y < mmin. */
4988 if ((unsigned HOST_WIDE_INT
) val
>= (unsigned HOST_WIDE_INT
) mmax
)
4989 return const_true_rtx
;
4990 if ((unsigned HOST_WIDE_INT
) val
< (unsigned HOST_WIDE_INT
) mmin
)
4995 return const_true_rtx
;
5001 /* x == y is always false for y out of range. */
5002 if (val
< mmin
|| val
> mmax
)
5006 /* x > y is always false for y >= mmax, always true for y < mmin. */
5008 if ((unsigned HOST_WIDE_INT
) val
>= (unsigned HOST_WIDE_INT
) mmax
)
5010 if ((unsigned HOST_WIDE_INT
) val
< (unsigned HOST_WIDE_INT
) mmin
)
5011 return const_true_rtx
;
5017 return const_true_rtx
;
5020 /* x < y is always false for y <= mmin, always true for y > mmax. */
5022 if ((unsigned HOST_WIDE_INT
) val
<= (unsigned HOST_WIDE_INT
) mmin
)
5024 if ((unsigned HOST_WIDE_INT
) val
> (unsigned HOST_WIDE_INT
) mmax
)
5025 return const_true_rtx
;
5031 return const_true_rtx
;
5035 /* x != y is always true for y out of range. */
5036 if (val
< mmin
|| val
> mmax
)
5037 return const_true_rtx
;
5045 /* Optimize integer comparisons with zero. */
5046 if (trueop1
== const0_rtx
)
5048 /* Some addresses are known to be nonzero. We don't know
5049 their sign, but equality comparisons are known. */
5050 if (nonzero_address_p (trueop0
))
5052 if (code
== EQ
|| code
== LEU
)
5054 if (code
== NE
|| code
== GTU
)
5055 return const_true_rtx
;
5058 /* See if the first operand is an IOR with a constant. If so, we
5059 may be able to determine the result of this comparison. */
5060 if (GET_CODE (op0
) == IOR
)
5062 rtx inner_const
= avoid_constant_pool_reference (XEXP (op0
, 1));
5063 if (CONST_INT_P (inner_const
) && inner_const
!= const0_rtx
)
5065 int sign_bitnum
= GET_MODE_PRECISION (mode
) - 1;
5066 int has_sign
= (HOST_BITS_PER_WIDE_INT
>= sign_bitnum
5067 && (UINTVAL (inner_const
)
5068 & ((unsigned HOST_WIDE_INT
) 1
5078 return const_true_rtx
;
5082 return const_true_rtx
;
5096 /* Optimize comparison of ABS with zero. */
5097 if (trueop1
== CONST0_RTX (mode
)
5098 && (GET_CODE (trueop0
) == ABS
5099 || (GET_CODE (trueop0
) == FLOAT_EXTEND
5100 && GET_CODE (XEXP (trueop0
, 0)) == ABS
)))
5105 /* Optimize abs(x) < 0.0. */
5106 if (!HONOR_SNANS (mode
)
5107 && (!INTEGRAL_MODE_P (mode
)
5108 || (!flag_wrapv
&& !flag_trapv
&& flag_strict_overflow
)))
5110 if (INTEGRAL_MODE_P (mode
)
5111 && (issue_strict_overflow_warning
5112 (WARN_STRICT_OVERFLOW_CONDITIONAL
)))
5113 warning (OPT_Wstrict_overflow
,
5114 ("assuming signed overflow does not occur when "
5115 "assuming abs (x) < 0 is false"));
5121 /* Optimize abs(x) >= 0.0. */
5122 if (!HONOR_NANS (mode
)
5123 && (!INTEGRAL_MODE_P (mode
)
5124 || (!flag_wrapv
&& !flag_trapv
&& flag_strict_overflow
)))
5126 if (INTEGRAL_MODE_P (mode
)
5127 && (issue_strict_overflow_warning
5128 (WARN_STRICT_OVERFLOW_CONDITIONAL
)))
5129 warning (OPT_Wstrict_overflow
,
5130 ("assuming signed overflow does not occur when "
5131 "assuming abs (x) >= 0 is true"));
5132 return const_true_rtx
;
5137 /* Optimize ! (abs(x) < 0.0). */
5138 return const_true_rtx
;
5148 /* Simplify CODE, an operation with result mode MODE and three operands,
5149 OP0, OP1, and OP2. OP0_MODE was the mode of OP0 before it became
5150 a constant. Return 0 if no simplifications is possible. */
5153 simplify_ternary_operation (enum rtx_code code
, machine_mode mode
,
5154 machine_mode op0_mode
, rtx op0
, rtx op1
,
5157 unsigned int width
= GET_MODE_PRECISION (mode
);
5158 bool any_change
= false;
5161 /* VOIDmode means "infinite" precision. */
5163 width
= HOST_BITS_PER_WIDE_INT
;
5168 /* Simplify negations around the multiplication. */
5169 /* -a * -b + c => a * b + c. */
5170 if (GET_CODE (op0
) == NEG
)
5172 tem
= simplify_unary_operation (NEG
, mode
, op1
, mode
);
5174 op1
= tem
, op0
= XEXP (op0
, 0), any_change
= true;
5176 else if (GET_CODE (op1
) == NEG
)
5178 tem
= simplify_unary_operation (NEG
, mode
, op0
, mode
);
5180 op0
= tem
, op1
= XEXP (op1
, 0), any_change
= true;
5183 /* Canonicalize the two multiplication operands. */
5184 /* a * -b + c => -b * a + c. */
5185 if (swap_commutative_operands_p (op0
, op1
))
5186 std::swap (op0
, op1
), any_change
= true;
5189 return gen_rtx_FMA (mode
, op0
, op1
, op2
);
5194 if (CONST_INT_P (op0
)
5195 && CONST_INT_P (op1
)
5196 && CONST_INT_P (op2
)
5197 && ((unsigned) INTVAL (op1
) + (unsigned) INTVAL (op2
) <= width
)
5198 && width
<= (unsigned) HOST_BITS_PER_WIDE_INT
)
5200 /* Extracting a bit-field from a constant */
5201 unsigned HOST_WIDE_INT val
= UINTVAL (op0
);
5202 HOST_WIDE_INT op1val
= INTVAL (op1
);
5203 HOST_WIDE_INT op2val
= INTVAL (op2
);
5204 if (BITS_BIG_ENDIAN
)
5205 val
>>= GET_MODE_PRECISION (op0_mode
) - op2val
- op1val
;
5209 if (HOST_BITS_PER_WIDE_INT
!= op1val
)
5211 /* First zero-extend. */
5212 val
&= ((unsigned HOST_WIDE_INT
) 1 << op1val
) - 1;
5213 /* If desired, propagate sign bit. */
5214 if (code
== SIGN_EXTRACT
5215 && (val
& ((unsigned HOST_WIDE_INT
) 1 << (op1val
- 1)))
5217 val
|= ~ (((unsigned HOST_WIDE_INT
) 1 << op1val
) - 1);
5220 return gen_int_mode (val
, mode
);
5225 if (CONST_INT_P (op0
))
5226 return op0
!= const0_rtx
? op1
: op2
;
5228 /* Convert c ? a : a into "a". */
5229 if (rtx_equal_p (op1
, op2
) && ! side_effects_p (op0
))
5232 /* Convert a != b ? a : b into "a". */
5233 if (GET_CODE (op0
) == NE
5234 && ! side_effects_p (op0
)
5235 && ! HONOR_NANS (mode
)
5236 && ! HONOR_SIGNED_ZEROS (mode
)
5237 && ((rtx_equal_p (XEXP (op0
, 0), op1
)
5238 && rtx_equal_p (XEXP (op0
, 1), op2
))
5239 || (rtx_equal_p (XEXP (op0
, 0), op2
)
5240 && rtx_equal_p (XEXP (op0
, 1), op1
))))
5243 /* Convert a == b ? a : b into "b". */
5244 if (GET_CODE (op0
) == EQ
5245 && ! side_effects_p (op0
)
5246 && ! HONOR_NANS (mode
)
5247 && ! HONOR_SIGNED_ZEROS (mode
)
5248 && ((rtx_equal_p (XEXP (op0
, 0), op1
)
5249 && rtx_equal_p (XEXP (op0
, 1), op2
))
5250 || (rtx_equal_p (XEXP (op0
, 0), op2
)
5251 && rtx_equal_p (XEXP (op0
, 1), op1
))))
5254 if (COMPARISON_P (op0
) && ! side_effects_p (op0
))
5256 machine_mode cmp_mode
= (GET_MODE (XEXP (op0
, 0)) == VOIDmode
5257 ? GET_MODE (XEXP (op0
, 1))
5258 : GET_MODE (XEXP (op0
, 0)));
5261 /* Look for happy constants in op1 and op2. */
5262 if (CONST_INT_P (op1
) && CONST_INT_P (op2
))
5264 HOST_WIDE_INT t
= INTVAL (op1
);
5265 HOST_WIDE_INT f
= INTVAL (op2
);
5267 if (t
== STORE_FLAG_VALUE
&& f
== 0)
5268 code
= GET_CODE (op0
);
5269 else if (t
== 0 && f
== STORE_FLAG_VALUE
)
5272 tmp
= reversed_comparison_code (op0
, NULL_RTX
);
5280 return simplify_gen_relational (code
, mode
, cmp_mode
,
5281 XEXP (op0
, 0), XEXP (op0
, 1));
5284 if (cmp_mode
== VOIDmode
)
5285 cmp_mode
= op0_mode
;
5286 temp
= simplify_relational_operation (GET_CODE (op0
), op0_mode
,
5287 cmp_mode
, XEXP (op0
, 0),
5290 /* See if any simplifications were possible. */
5293 if (CONST_INT_P (temp
))
5294 return temp
== const0_rtx
? op2
: op1
;
5296 return gen_rtx_IF_THEN_ELSE (mode
, temp
, op1
, op2
);
5302 gcc_assert (GET_MODE (op0
) == mode
);
5303 gcc_assert (GET_MODE (op1
) == mode
);
5304 gcc_assert (VECTOR_MODE_P (mode
));
5305 trueop2
= avoid_constant_pool_reference (op2
);
5306 if (CONST_INT_P (trueop2
))
5308 int elt_size
= GET_MODE_SIZE (GET_MODE_INNER (mode
));
5309 unsigned n_elts
= (GET_MODE_SIZE (mode
) / elt_size
);
5310 unsigned HOST_WIDE_INT sel
= UINTVAL (trueop2
);
5311 unsigned HOST_WIDE_INT mask
;
5312 if (n_elts
== HOST_BITS_PER_WIDE_INT
)
5315 mask
= ((unsigned HOST_WIDE_INT
) 1 << n_elts
) - 1;
5317 if (!(sel
& mask
) && !side_effects_p (op0
))
5319 if ((sel
& mask
) == mask
&& !side_effects_p (op1
))
5322 rtx trueop0
= avoid_constant_pool_reference (op0
);
5323 rtx trueop1
= avoid_constant_pool_reference (op1
);
5324 if (GET_CODE (trueop0
) == CONST_VECTOR
5325 && GET_CODE (trueop1
) == CONST_VECTOR
)
5327 rtvec v
= rtvec_alloc (n_elts
);
5330 for (i
= 0; i
< n_elts
; i
++)
5331 RTVEC_ELT (v
, i
) = ((sel
& ((unsigned HOST_WIDE_INT
) 1 << i
))
5332 ? CONST_VECTOR_ELT (trueop0
, i
)
5333 : CONST_VECTOR_ELT (trueop1
, i
));
5334 return gen_rtx_CONST_VECTOR (mode
, v
);
5337 /* Replace (vec_merge (vec_merge a b m) c n) with (vec_merge b c n)
5338 if no element from a appears in the result. */
5339 if (GET_CODE (op0
) == VEC_MERGE
)
5341 tem
= avoid_constant_pool_reference (XEXP (op0
, 2));
5342 if (CONST_INT_P (tem
))
5344 unsigned HOST_WIDE_INT sel0
= UINTVAL (tem
);
5345 if (!(sel
& sel0
& mask
) && !side_effects_p (XEXP (op0
, 0)))
5346 return simplify_gen_ternary (code
, mode
, mode
,
5347 XEXP (op0
, 1), op1
, op2
);
5348 if (!(sel
& ~sel0
& mask
) && !side_effects_p (XEXP (op0
, 1)))
5349 return simplify_gen_ternary (code
, mode
, mode
,
5350 XEXP (op0
, 0), op1
, op2
);
5353 if (GET_CODE (op1
) == VEC_MERGE
)
5355 tem
= avoid_constant_pool_reference (XEXP (op1
, 2));
5356 if (CONST_INT_P (tem
))
5358 unsigned HOST_WIDE_INT sel1
= UINTVAL (tem
);
5359 if (!(~sel
& sel1
& mask
) && !side_effects_p (XEXP (op1
, 0)))
5360 return simplify_gen_ternary (code
, mode
, mode
,
5361 op0
, XEXP (op1
, 1), op2
);
5362 if (!(~sel
& ~sel1
& mask
) && !side_effects_p (XEXP (op1
, 1)))
5363 return simplify_gen_ternary (code
, mode
, mode
,
5364 op0
, XEXP (op1
, 0), op2
);
5368 /* Replace (vec_merge (vec_duplicate (vec_select a parallel (i))) a 1 << i)
5370 if (GET_CODE (op0
) == VEC_DUPLICATE
5371 && GET_CODE (XEXP (op0
, 0)) == VEC_SELECT
5372 && GET_CODE (XEXP (XEXP (op0
, 0), 1)) == PARALLEL
5373 && mode_nunits
[GET_MODE (XEXP (op0
, 0))] == 1)
5375 tem
= XVECEXP ((XEXP (XEXP (op0
, 0), 1)), 0, 0);
5376 if (CONST_INT_P (tem
) && CONST_INT_P (op2
))
5378 if (XEXP (XEXP (op0
, 0), 0) == op1
5379 && UINTVAL (op2
) == HOST_WIDE_INT_1U
<< UINTVAL (tem
))
5385 if (rtx_equal_p (op0
, op1
)
5386 && !side_effects_p (op2
) && !side_effects_p (op1
))
5398 /* Evaluate a SUBREG of a CONST_INT or CONST_WIDE_INT or CONST_DOUBLE
5399 or CONST_FIXED or CONST_VECTOR, returning another CONST_INT or
5400 CONST_WIDE_INT or CONST_DOUBLE or CONST_FIXED or CONST_VECTOR.
5402 Works by unpacking OP into a collection of 8-bit values
5403 represented as a little-endian array of 'unsigned char', selecting by BYTE,
5404 and then repacking them again for OUTERMODE. */
5407 simplify_immed_subreg (machine_mode outermode
, rtx op
,
5408 machine_mode innermode
, unsigned int byte
)
5412 value_mask
= (1 << value_bit
) - 1
5414 unsigned char value
[MAX_BITSIZE_MODE_ANY_MODE
/ value_bit
];
5423 rtvec result_v
= NULL
;
5424 enum mode_class outer_class
;
5425 machine_mode outer_submode
;
5428 /* Some ports misuse CCmode. */
5429 if (GET_MODE_CLASS (outermode
) == MODE_CC
&& CONST_INT_P (op
))
5432 /* We have no way to represent a complex constant at the rtl level. */
5433 if (COMPLEX_MODE_P (outermode
))
5436 /* We support any size mode. */
5437 max_bitsize
= MAX (GET_MODE_BITSIZE (outermode
),
5438 GET_MODE_BITSIZE (innermode
));
5440 /* Unpack the value. */
5442 if (GET_CODE (op
) == CONST_VECTOR
)
5444 num_elem
= CONST_VECTOR_NUNITS (op
);
5445 elems
= &CONST_VECTOR_ELT (op
, 0);
5446 elem_bitsize
= GET_MODE_BITSIZE (GET_MODE_INNER (innermode
));
5452 elem_bitsize
= max_bitsize
;
5454 /* If this asserts, it is too complicated; reducing value_bit may help. */
5455 gcc_assert (BITS_PER_UNIT
% value_bit
== 0);
5456 /* I don't know how to handle endianness of sub-units. */
5457 gcc_assert (elem_bitsize
% BITS_PER_UNIT
== 0);
5459 for (elem
= 0; elem
< num_elem
; elem
++)
5462 rtx el
= elems
[elem
];
5464 /* Vectors are kept in target memory order. (This is probably
5467 unsigned byte
= (elem
* elem_bitsize
) / BITS_PER_UNIT
;
5468 unsigned ibyte
= (((num_elem
- 1 - elem
) * elem_bitsize
)
5470 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5471 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5472 unsigned bytele
= (subword_byte
% UNITS_PER_WORD
5473 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5474 vp
= value
+ (bytele
* BITS_PER_UNIT
) / value_bit
;
5477 switch (GET_CODE (el
))
5481 i
< HOST_BITS_PER_WIDE_INT
&& i
< elem_bitsize
;
5483 *vp
++ = INTVAL (el
) >> i
;
5484 /* CONST_INTs are always logically sign-extended. */
5485 for (; i
< elem_bitsize
; i
+= value_bit
)
5486 *vp
++ = INTVAL (el
) < 0 ? -1 : 0;
5489 case CONST_WIDE_INT
:
5491 rtx_mode_t val
= std::make_pair (el
, innermode
);
5492 unsigned char extend
= wi::sign_mask (val
);
5494 for (i
= 0; i
< elem_bitsize
; i
+= value_bit
)
5495 *vp
++ = wi::extract_uhwi (val
, i
, value_bit
);
5496 for (; i
< elem_bitsize
; i
+= value_bit
)
5502 if (TARGET_SUPPORTS_WIDE_INT
== 0 && GET_MODE (el
) == VOIDmode
)
5504 unsigned char extend
= 0;
5505 /* If this triggers, someone should have generated a
5506 CONST_INT instead. */
5507 gcc_assert (elem_bitsize
> HOST_BITS_PER_WIDE_INT
);
5509 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
+= value_bit
)
5510 *vp
++ = CONST_DOUBLE_LOW (el
) >> i
;
5511 while (i
< HOST_BITS_PER_DOUBLE_INT
&& i
< elem_bitsize
)
5514 = CONST_DOUBLE_HIGH (el
) >> (i
- HOST_BITS_PER_WIDE_INT
);
5518 if (CONST_DOUBLE_HIGH (el
) >> (HOST_BITS_PER_WIDE_INT
- 1))
5520 for (; i
< elem_bitsize
; i
+= value_bit
)
5525 /* This is big enough for anything on the platform. */
5526 long tmp
[MAX_BITSIZE_MODE_ANY_MODE
/ 32];
5527 int bitsize
= GET_MODE_BITSIZE (GET_MODE (el
));
5529 gcc_assert (SCALAR_FLOAT_MODE_P (GET_MODE (el
)));
5530 gcc_assert (bitsize
<= elem_bitsize
);
5531 gcc_assert (bitsize
% value_bit
== 0);
5533 real_to_target (tmp
, CONST_DOUBLE_REAL_VALUE (el
),
5536 /* real_to_target produces its result in words affected by
5537 FLOAT_WORDS_BIG_ENDIAN. However, we ignore this,
5538 and use WORDS_BIG_ENDIAN instead; see the documentation
5539 of SUBREG in rtl.texi. */
5540 for (i
= 0; i
< bitsize
; i
+= value_bit
)
5543 if (WORDS_BIG_ENDIAN
)
5544 ibase
= bitsize
- 1 - i
;
5547 *vp
++ = tmp
[ibase
/ 32] >> i
% 32;
5550 /* It shouldn't matter what's done here, so fill it with
5552 for (; i
< elem_bitsize
; i
+= value_bit
)
5558 if (elem_bitsize
<= HOST_BITS_PER_WIDE_INT
)
5560 for (i
= 0; i
< elem_bitsize
; i
+= value_bit
)
5561 *vp
++ = CONST_FIXED_VALUE_LOW (el
) >> i
;
5565 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
+= value_bit
)
5566 *vp
++ = CONST_FIXED_VALUE_LOW (el
) >> i
;
5567 for (; i
< HOST_BITS_PER_DOUBLE_INT
&& i
< elem_bitsize
;
5569 *vp
++ = CONST_FIXED_VALUE_HIGH (el
)
5570 >> (i
- HOST_BITS_PER_WIDE_INT
);
5571 for (; i
< elem_bitsize
; i
+= value_bit
)
5581 /* Now, pick the right byte to start with. */
5582 /* Renumber BYTE so that the least-significant byte is byte 0. A special
5583 case is paradoxical SUBREGs, which shouldn't be adjusted since they
5584 will already have offset 0. */
5585 if (GET_MODE_SIZE (innermode
) >= GET_MODE_SIZE (outermode
))
5587 unsigned ibyte
= (GET_MODE_SIZE (innermode
) - GET_MODE_SIZE (outermode
)
5589 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5590 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5591 byte
= (subword_byte
% UNITS_PER_WORD
5592 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5595 /* BYTE should still be inside OP. (Note that BYTE is unsigned,
5596 so if it's become negative it will instead be very large.) */
5597 gcc_assert (byte
< GET_MODE_SIZE (innermode
));
5599 /* Convert from bytes to chunks of size value_bit. */
5600 value_start
= byte
* (BITS_PER_UNIT
/ value_bit
);
5602 /* Re-pack the value. */
5604 if (VECTOR_MODE_P (outermode
))
5606 num_elem
= GET_MODE_NUNITS (outermode
);
5607 result_v
= rtvec_alloc (num_elem
);
5608 elems
= &RTVEC_ELT (result_v
, 0);
5609 outer_submode
= GET_MODE_INNER (outermode
);
5615 outer_submode
= outermode
;
5618 outer_class
= GET_MODE_CLASS (outer_submode
);
5619 elem_bitsize
= GET_MODE_BITSIZE (outer_submode
);
5621 gcc_assert (elem_bitsize
% value_bit
== 0);
5622 gcc_assert (elem_bitsize
+ value_start
* value_bit
<= max_bitsize
);
5624 for (elem
= 0; elem
< num_elem
; elem
++)
5628 /* Vectors are stored in target memory order. (This is probably
5631 unsigned byte
= (elem
* elem_bitsize
) / BITS_PER_UNIT
;
5632 unsigned ibyte
= (((num_elem
- 1 - elem
) * elem_bitsize
)
5634 unsigned word_byte
= WORDS_BIG_ENDIAN
? ibyte
: byte
;
5635 unsigned subword_byte
= BYTES_BIG_ENDIAN
? ibyte
: byte
;
5636 unsigned bytele
= (subword_byte
% UNITS_PER_WORD
5637 + (word_byte
/ UNITS_PER_WORD
) * UNITS_PER_WORD
);
5638 vp
= value
+ value_start
+ (bytele
* BITS_PER_UNIT
) / value_bit
;
5641 switch (outer_class
)
5644 case MODE_PARTIAL_INT
:
5649 = (GET_MODE_BITSIZE (outer_submode
) + HOST_BITS_PER_WIDE_INT
- 1)
5650 / HOST_BITS_PER_WIDE_INT
;
5651 HOST_WIDE_INT tmp
[MAX_BITSIZE_MODE_ANY_INT
/ HOST_BITS_PER_WIDE_INT
];
5654 if (GET_MODE_PRECISION (outer_submode
) > MAX_BITSIZE_MODE_ANY_INT
)
5656 for (u
= 0; u
< units
; u
++)
5658 unsigned HOST_WIDE_INT buf
= 0;
5660 i
< HOST_BITS_PER_WIDE_INT
&& base
+ i
< elem_bitsize
;
5662 buf
|= (unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
) << i
;
5665 base
+= HOST_BITS_PER_WIDE_INT
;
5667 r
= wide_int::from_array (tmp
, units
,
5668 GET_MODE_PRECISION (outer_submode
));
5669 #if TARGET_SUPPORTS_WIDE_INT == 0
5670 /* Make sure r will fit into CONST_INT or CONST_DOUBLE. */
5671 if (wi::min_precision (r
, SIGNED
) > HOST_BITS_PER_DOUBLE_INT
)
5674 elems
[elem
] = immed_wide_int_const (r
, outer_submode
);
5679 case MODE_DECIMAL_FLOAT
:
5682 long tmp
[MAX_BITSIZE_MODE_ANY_MODE
/ 32];
5684 /* real_from_target wants its input in words affected by
5685 FLOAT_WORDS_BIG_ENDIAN. However, we ignore this,
5686 and use WORDS_BIG_ENDIAN instead; see the documentation
5687 of SUBREG in rtl.texi. */
5688 for (i
= 0; i
< max_bitsize
/ 32; i
++)
5690 for (i
= 0; i
< elem_bitsize
; i
+= value_bit
)
5693 if (WORDS_BIG_ENDIAN
)
5694 ibase
= elem_bitsize
- 1 - i
;
5697 tmp
[ibase
/ 32] |= (*vp
++ & value_mask
) << i
% 32;
5700 real_from_target (&r
, tmp
, outer_submode
);
5701 elems
[elem
] = CONST_DOUBLE_FROM_REAL_VALUE (r
, outer_submode
);
5713 f
.mode
= outer_submode
;
5716 i
< HOST_BITS_PER_WIDE_INT
&& i
< elem_bitsize
;
5718 f
.data
.low
|= (unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
) << i
;
5719 for (; i
< elem_bitsize
; i
+= value_bit
)
5720 f
.data
.high
|= ((unsigned HOST_WIDE_INT
)(*vp
++ & value_mask
)
5721 << (i
- HOST_BITS_PER_WIDE_INT
));
5723 elems
[elem
] = CONST_FIXED_FROM_FIXED_VALUE (f
, outer_submode
);
5731 if (VECTOR_MODE_P (outermode
))
5732 return gen_rtx_CONST_VECTOR (outermode
, result_v
);
5737 /* Simplify SUBREG:OUTERMODE(OP:INNERMODE, BYTE)
5738 Return 0 if no simplifications are possible. */
5740 simplify_subreg (machine_mode outermode
, rtx op
,
5741 machine_mode innermode
, unsigned int byte
)
5743 /* Little bit of sanity checking. */
5744 gcc_assert (innermode
!= VOIDmode
);
5745 gcc_assert (outermode
!= VOIDmode
);
5746 gcc_assert (innermode
!= BLKmode
);
5747 gcc_assert (outermode
!= BLKmode
);
5749 gcc_assert (GET_MODE (op
) == innermode
5750 || GET_MODE (op
) == VOIDmode
);
5752 if ((byte
% GET_MODE_SIZE (outermode
)) != 0)
5755 if (byte
>= GET_MODE_SIZE (innermode
))
5758 if (outermode
== innermode
&& !byte
)
5761 if (CONST_SCALAR_INT_P (op
)
5762 || CONST_DOUBLE_AS_FLOAT_P (op
)
5763 || GET_CODE (op
) == CONST_FIXED
5764 || GET_CODE (op
) == CONST_VECTOR
)
5765 return simplify_immed_subreg (outermode
, op
, innermode
, byte
);
5767 /* Changing mode twice with SUBREG => just change it once,
5768 or not at all if changing back op starting mode. */
5769 if (GET_CODE (op
) == SUBREG
)
5771 machine_mode innermostmode
= GET_MODE (SUBREG_REG (op
));
5772 int final_offset
= byte
+ SUBREG_BYTE (op
);
5775 if (outermode
== innermostmode
5776 && byte
== 0 && SUBREG_BYTE (op
) == 0)
5777 return SUBREG_REG (op
);
5779 /* The SUBREG_BYTE represents offset, as if the value were stored
5780 in memory. Irritating exception is paradoxical subreg, where
5781 we define SUBREG_BYTE to be 0. On big endian machines, this
5782 value should be negative. For a moment, undo this exception. */
5783 if (byte
== 0 && GET_MODE_SIZE (innermode
) < GET_MODE_SIZE (outermode
))
5785 int difference
= (GET_MODE_SIZE (innermode
) - GET_MODE_SIZE (outermode
));
5786 if (WORDS_BIG_ENDIAN
)
5787 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
5788 if (BYTES_BIG_ENDIAN
)
5789 final_offset
+= difference
% UNITS_PER_WORD
;
5791 if (SUBREG_BYTE (op
) == 0
5792 && GET_MODE_SIZE (innermostmode
) < GET_MODE_SIZE (innermode
))
5794 int difference
= (GET_MODE_SIZE (innermostmode
) - GET_MODE_SIZE (innermode
));
5795 if (WORDS_BIG_ENDIAN
)
5796 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
5797 if (BYTES_BIG_ENDIAN
)
5798 final_offset
+= difference
% UNITS_PER_WORD
;
5801 /* See whether resulting subreg will be paradoxical. */
5802 if (GET_MODE_SIZE (innermostmode
) > GET_MODE_SIZE (outermode
))
5804 /* In nonparadoxical subregs we can't handle negative offsets. */
5805 if (final_offset
< 0)
5807 /* Bail out in case resulting subreg would be incorrect. */
5808 if (final_offset
% GET_MODE_SIZE (outermode
)
5809 || (unsigned) final_offset
>= GET_MODE_SIZE (innermostmode
))
5815 int difference
= (GET_MODE_SIZE (innermostmode
) - GET_MODE_SIZE (outermode
));
5817 /* In paradoxical subreg, see if we are still looking on lower part.
5818 If so, our SUBREG_BYTE will be 0. */
5819 if (WORDS_BIG_ENDIAN
)
5820 offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
5821 if (BYTES_BIG_ENDIAN
)
5822 offset
+= difference
% UNITS_PER_WORD
;
5823 if (offset
== final_offset
)
5829 /* Recurse for further possible simplifications. */
5830 newx
= simplify_subreg (outermode
, SUBREG_REG (op
), innermostmode
,
5834 if (validate_subreg (outermode
, innermostmode
,
5835 SUBREG_REG (op
), final_offset
))
5837 newx
= gen_rtx_SUBREG (outermode
, SUBREG_REG (op
), final_offset
);
5838 if (SUBREG_PROMOTED_VAR_P (op
)
5839 && SUBREG_PROMOTED_SIGN (op
) >= 0
5840 && GET_MODE_CLASS (outermode
) == MODE_INT
5841 && IN_RANGE (GET_MODE_SIZE (outermode
),
5842 GET_MODE_SIZE (innermode
),
5843 GET_MODE_SIZE (innermostmode
))
5844 && subreg_lowpart_p (newx
))
5846 SUBREG_PROMOTED_VAR_P (newx
) = 1;
5847 SUBREG_PROMOTED_SET (newx
, SUBREG_PROMOTED_GET (op
));
5854 /* SUBREG of a hard register => just change the register number
5855 and/or mode. If the hard register is not valid in that mode,
5856 suppress this simplification. If the hard register is the stack,
5857 frame, or argument pointer, leave this as a SUBREG. */
5859 if (REG_P (op
) && HARD_REGISTER_P (op
))
5861 unsigned int regno
, final_regno
;
5864 final_regno
= simplify_subreg_regno (regno
, innermode
, byte
, outermode
);
5865 if (HARD_REGISTER_NUM_P (final_regno
))
5868 int final_offset
= byte
;
5870 /* Adjust offset for paradoxical subregs. */
5872 && GET_MODE_SIZE (innermode
) < GET_MODE_SIZE (outermode
))
5874 int difference
= (GET_MODE_SIZE (innermode
)
5875 - GET_MODE_SIZE (outermode
));
5876 if (WORDS_BIG_ENDIAN
)
5877 final_offset
+= (difference
/ UNITS_PER_WORD
) * UNITS_PER_WORD
;
5878 if (BYTES_BIG_ENDIAN
)
5879 final_offset
+= difference
% UNITS_PER_WORD
;
5882 x
= gen_rtx_REG_offset (op
, outermode
, final_regno
, final_offset
);
5884 /* Propagate original regno. We don't have any way to specify
5885 the offset inside original regno, so do so only for lowpart.
5886 The information is used only by alias analysis that can not
5887 grog partial register anyway. */
5889 if (subreg_lowpart_offset (outermode
, innermode
) == byte
)
5890 ORIGINAL_REGNO (x
) = ORIGINAL_REGNO (op
);
5895 /* If we have a SUBREG of a register that we are replacing and we are
5896 replacing it with a MEM, make a new MEM and try replacing the
5897 SUBREG with it. Don't do this if the MEM has a mode-dependent address
5898 or if we would be widening it. */
5901 && ! mode_dependent_address_p (XEXP (op
, 0), MEM_ADDR_SPACE (op
))
5902 /* Allow splitting of volatile memory references in case we don't
5903 have instruction to move the whole thing. */
5904 && (! MEM_VOLATILE_P (op
)
5905 || ! have_insn_for (SET
, innermode
))
5906 && GET_MODE_SIZE (outermode
) <= GET_MODE_SIZE (GET_MODE (op
)))
5907 return adjust_address_nv (op
, outermode
, byte
);
5909 /* Handle complex values represented as CONCAT
5910 of real and imaginary part. */
5911 if (GET_CODE (op
) == CONCAT
)
5913 unsigned int part_size
, final_offset
;
5916 part_size
= GET_MODE_UNIT_SIZE (GET_MODE (XEXP (op
, 0)));
5917 if (byte
< part_size
)
5919 part
= XEXP (op
, 0);
5920 final_offset
= byte
;
5924 part
= XEXP (op
, 1);
5925 final_offset
= byte
- part_size
;
5928 if (final_offset
+ GET_MODE_SIZE (outermode
) > part_size
)
5931 res
= simplify_subreg (outermode
, part
, GET_MODE (part
), final_offset
);
5934 if (validate_subreg (outermode
, GET_MODE (part
), part
, final_offset
))
5935 return gen_rtx_SUBREG (outermode
, part
, final_offset
);
5939 /* A SUBREG resulting from a zero extension may fold to zero if
5940 it extracts higher bits that the ZERO_EXTEND's source bits. */
5941 if (GET_CODE (op
) == ZERO_EXTEND
&& SCALAR_INT_MODE_P (innermode
))
5943 unsigned int bitpos
= subreg_lsb_1 (outermode
, innermode
, byte
);
5944 if (bitpos
>= GET_MODE_PRECISION (GET_MODE (XEXP (op
, 0))))
5945 return CONST0_RTX (outermode
);
5948 if (SCALAR_INT_MODE_P (outermode
)
5949 && SCALAR_INT_MODE_P (innermode
)
5950 && GET_MODE_PRECISION (outermode
) < GET_MODE_PRECISION (innermode
)
5951 && byte
== subreg_lowpart_offset (outermode
, innermode
))
5953 rtx tem
= simplify_truncation (outermode
, op
, innermode
);
5961 /* Make a SUBREG operation or equivalent if it folds. */
5964 simplify_gen_subreg (machine_mode outermode
, rtx op
,
5965 machine_mode innermode
, unsigned int byte
)
5969 newx
= simplify_subreg (outermode
, op
, innermode
, byte
);
5973 if (GET_CODE (op
) == SUBREG
5974 || GET_CODE (op
) == CONCAT
5975 || GET_MODE (op
) == VOIDmode
)
5978 if (validate_subreg (outermode
, innermode
, op
, byte
))
5979 return gen_rtx_SUBREG (outermode
, op
, byte
);
5984 /* Simplify X, an rtx expression.
5986 Return the simplified expression or NULL if no simplifications
5989 This is the preferred entry point into the simplification routines;
5990 however, we still allow passes to call the more specific routines.
5992 Right now GCC has three (yes, three) major bodies of RTL simplification
5993 code that need to be unified.
5995 1. fold_rtx in cse.c. This code uses various CSE specific
5996 information to aid in RTL simplification.
5998 2. simplify_rtx in combine.c. Similar to fold_rtx, except that
5999 it uses combine specific information to aid in RTL
6002 3. The routines in this file.
6005 Long term we want to only have one body of simplification code; to
6006 get to that state I recommend the following steps:
6008 1. Pour over fold_rtx & simplify_rtx and move any simplifications
6009 which are not pass dependent state into these routines.
6011 2. As code is moved by #1, change fold_rtx & simplify_rtx to
6012 use this routine whenever possible.
6014 3. Allow for pass dependent state to be provided to these
6015 routines and add simplifications based on the pass dependent
6016 state. Remove code from cse.c & combine.c that becomes
6019 It will take time, but ultimately the compiler will be easier to
6020 maintain and improve. It's totally silly that when we add a
6021 simplification that it needs to be added to 4 places (3 for RTL
6022 simplification and 1 for tree simplification. */
6025 simplify_rtx (const_rtx x
)
6027 const enum rtx_code code
= GET_CODE (x
);
6028 const machine_mode mode
= GET_MODE (x
);
6030 switch (GET_RTX_CLASS (code
))
6033 return simplify_unary_operation (code
, mode
,
6034 XEXP (x
, 0), GET_MODE (XEXP (x
, 0)));
6035 case RTX_COMM_ARITH
:
6036 if (swap_commutative_operands_p (XEXP (x
, 0), XEXP (x
, 1)))
6037 return simplify_gen_binary (code
, mode
, XEXP (x
, 1), XEXP (x
, 0));
6039 /* Fall through.... */
6042 return simplify_binary_operation (code
, mode
, XEXP (x
, 0), XEXP (x
, 1));
6045 case RTX_BITFIELD_OPS
:
6046 return simplify_ternary_operation (code
, mode
, GET_MODE (XEXP (x
, 0)),
6047 XEXP (x
, 0), XEXP (x
, 1),
6051 case RTX_COMM_COMPARE
:
6052 return simplify_relational_operation (code
, mode
,
6053 ((GET_MODE (XEXP (x
, 0))
6055 ? GET_MODE (XEXP (x
, 0))
6056 : GET_MODE (XEXP (x
, 1))),
6062 return simplify_subreg (mode
, SUBREG_REG (x
),
6063 GET_MODE (SUBREG_REG (x
)),
6070 /* Convert (lo_sum (high FOO) FOO) to FOO. */
6071 if (GET_CODE (XEXP (x
, 0)) == HIGH
6072 && rtx_equal_p (XEXP (XEXP (x
, 0), 0), XEXP (x
, 1)))