1/* RTL simplification functions for GNU compiler.
2   Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "rtl.h"
26#include "hash-set.h"
27#include "machmode.h"
28#include "vec.h"
29#include "double-int.h"
30#include "input.h"
31#include "alias.h"
32#include "symtab.h"
33#include "wide-int.h"
34#include "inchash.h"
35#include "tree.h"
36#include "fold-const.h"
37#include "varasm.h"
38#include "tm_p.h"
39#include "regs.h"
40#include "hard-reg-set.h"
41#include "flags.h"
42#include "insn-config.h"
43#include "recog.h"
44#include "function.h"
45#include "insn-codes.h"
46#include "optabs.h"
47#include "hashtab.h"
48#include "statistics.h"
49#include "real.h"
50#include "fixed-value.h"
51#include "expmed.h"
52#include "dojump.h"
53#include "explow.h"
54#include "calls.h"
55#include "emit-rtl.h"
56#include "stmt.h"
57#include "expr.h"
58#include "diagnostic-core.h"
59#include "ggc.h"
60#include "target.h"
61#include "predict.h"
62
63/* Simplification and canonicalization of RTL.  */
64
65/* Much code operates on (low, high) pairs; the low value is an
66   unsigned wide int, the high value a signed wide int.  We
67   occasionally need to sign extend from low to high as if low were a
68   signed wide int.  */
69#define HWI_SIGN_EXTEND(low) \
70 ((((HOST_WIDE_INT) low) < 0) ? ((HOST_WIDE_INT) -1) : ((HOST_WIDE_INT) 0))
71
72static rtx neg_const_int (machine_mode, const_rtx);
73static bool plus_minus_operand_p (const_rtx);
74static bool simplify_plus_minus_op_data_cmp (rtx, rtx);
75static rtx simplify_plus_minus (enum rtx_code, machine_mode, rtx, rtx);
76static rtx simplify_immed_subreg (machine_mode, rtx, machine_mode,
77				  unsigned int);
78static rtx simplify_associative_operation (enum rtx_code, machine_mode,
79					   rtx, rtx);
80static rtx simplify_relational_operation_1 (enum rtx_code, machine_mode,
81					    machine_mode, rtx, rtx);
82static rtx simplify_unary_operation_1 (enum rtx_code, machine_mode, rtx);
83static rtx simplify_binary_operation_1 (enum rtx_code, machine_mode,
84					rtx, rtx, rtx, rtx);
85
86/* Negate a CONST_INT rtx, truncating (because a conversion from a
87   maximally negative number can overflow).  */
88static rtx
89neg_const_int (machine_mode mode, const_rtx i)
90{
91  return gen_int_mode (-(unsigned HOST_WIDE_INT) INTVAL (i), mode);
92}
93
94/* Test whether expression, X, is an immediate constant that represents
95   the most significant bit of machine mode MODE.  */
96
97bool
98mode_signbit_p (machine_mode mode, const_rtx x)
99{
100  unsigned HOST_WIDE_INT val;
101  unsigned int width;
102
103  if (GET_MODE_CLASS (mode) != MODE_INT)
104    return false;
105
106  width = GET_MODE_PRECISION (mode);
107  if (width == 0)
108    return false;
109
110  if (width <= HOST_BITS_PER_WIDE_INT
111      && CONST_INT_P (x))
112    val = INTVAL (x);
113#if TARGET_SUPPORTS_WIDE_INT
114  else if (CONST_WIDE_INT_P (x))
115    {
116      unsigned int i;
117      unsigned int elts = CONST_WIDE_INT_NUNITS (x);
118      if (elts != (width + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT)
119	return false;
120      for (i = 0; i < elts - 1; i++)
121	if (CONST_WIDE_INT_ELT (x, i) != 0)
122	  return false;
123      val = CONST_WIDE_INT_ELT (x, elts - 1);
124      width %= HOST_BITS_PER_WIDE_INT;
125      if (width == 0)
126	width = HOST_BITS_PER_WIDE_INT;
127    }
128#else
129  else if (width <= HOST_BITS_PER_DOUBLE_INT
130	   && CONST_DOUBLE_AS_INT_P (x)
131	   && CONST_DOUBLE_LOW (x) == 0)
132    {
133      val = CONST_DOUBLE_HIGH (x);
134      width -= HOST_BITS_PER_WIDE_INT;
135    }
136#endif
137  else
138    /* X is not an integer constant.  */
139    return false;
140
141  if (width < HOST_BITS_PER_WIDE_INT)
142    val &= ((unsigned HOST_WIDE_INT) 1 << width) - 1;
143  return val == ((unsigned HOST_WIDE_INT) 1 << (width - 1));
144}
145
146/* Test whether VAL is equal to the most significant bit of mode MODE
147   (after masking with the mode mask of MODE).  Returns false if the
148   precision of MODE is too large to handle.  */
149
150bool
151val_signbit_p (machine_mode mode, unsigned HOST_WIDE_INT val)
152{
153  unsigned int width;
154
155  if (GET_MODE_CLASS (mode) != MODE_INT)
156    return false;
157
158  width = GET_MODE_PRECISION (mode);
159  if (width == 0 || width > HOST_BITS_PER_WIDE_INT)
160    return false;
161
162  val &= GET_MODE_MASK (mode);
163  return val == ((unsigned HOST_WIDE_INT) 1 << (width - 1));
164}
165
166/* Test whether the most significant bit of mode MODE is set in VAL.
167   Returns false if the precision of MODE is too large to handle.  */
168bool
169val_signbit_known_set_p (machine_mode mode, unsigned HOST_WIDE_INT val)
170{
171  unsigned int width;
172
173  if (GET_MODE_CLASS (mode) != MODE_INT)
174    return false;
175
176  width = GET_MODE_PRECISION (mode);
177  if (width == 0 || width > HOST_BITS_PER_WIDE_INT)
178    return false;
179
180  val &= (unsigned HOST_WIDE_INT) 1 << (width - 1);
181  return val != 0;
182}
183
184/* Test whether the most significant bit of mode MODE is clear in VAL.
185   Returns false if the precision of MODE is too large to handle.  */
186bool
187val_signbit_known_clear_p (machine_mode mode, unsigned HOST_WIDE_INT val)
188{
189  unsigned int width;
190
191  if (GET_MODE_CLASS (mode) != MODE_INT)
192    return false;
193
194  width = GET_MODE_PRECISION (mode);
195  if (width == 0 || width > HOST_BITS_PER_WIDE_INT)
196    return false;
197
198  val &= (unsigned HOST_WIDE_INT) 1 << (width - 1);
199  return val == 0;
200}
201
202/* Make a binary operation by properly ordering the operands and
203   seeing if the expression folds.  */
204
205rtx
206simplify_gen_binary (enum rtx_code code, machine_mode mode, rtx op0,
207		     rtx op1)
208{
209  rtx tem;
210
211  /* If this simplifies, do it.  */
212  tem = simplify_binary_operation (code, mode, op0, op1);
213  if (tem)
214    return tem;
215
216  /* Put complex operands first and constants second if commutative.  */
217  if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
218      && swap_commutative_operands_p (op0, op1))
219    tem = op0, op0 = op1, op1 = tem;
220
221  return gen_rtx_fmt_ee (code, mode, op0, op1);
222}
223
224/* If X is a MEM referencing the constant pool, return the real value.
225   Otherwise return X.  */
226rtx
227avoid_constant_pool_reference (rtx x)
228{
229  rtx c, tmp, addr;
230  machine_mode cmode;
231  HOST_WIDE_INT offset = 0;
232
233  switch (GET_CODE (x))
234    {
235    case MEM:
236      break;
237
238    case FLOAT_EXTEND:
239      /* Handle float extensions of constant pool references.  */
240      tmp = XEXP (x, 0);
241      c = avoid_constant_pool_reference (tmp);
242      if (c != tmp && CONST_DOUBLE_AS_FLOAT_P (c))
243	{
244	  REAL_VALUE_TYPE d;
245
246	  REAL_VALUE_FROM_CONST_DOUBLE (d, c);
247	  return CONST_DOUBLE_FROM_REAL_VALUE (d, GET_MODE (x));
248	}
249      return x;
250
251    default:
252      return x;
253    }
254
255  if (GET_MODE (x) == BLKmode)
256    return x;
257
258  addr = XEXP (x, 0);
259
260  /* Call target hook to avoid the effects of -fpic etc....  */
261  addr = targetm.delegitimize_address (addr);
262
263  /* Split the address into a base and integer offset.  */
264  if (GET_CODE (addr) == CONST
265      && GET_CODE (XEXP (addr, 0)) == PLUS
266      && CONST_INT_P (XEXP (XEXP (addr, 0), 1)))
267    {
268      offset = INTVAL (XEXP (XEXP (addr, 0), 1));
269      addr = XEXP (XEXP (addr, 0), 0);
270    }
271
272  if (GET_CODE (addr) == LO_SUM)
273    addr = XEXP (addr, 1);
274
275  /* If this is a constant pool reference, we can turn it into its
276     constant and hope that simplifications happen.  */
277  if (GET_CODE (addr) == SYMBOL_REF
278      && CONSTANT_POOL_ADDRESS_P (addr))
279    {
280      c = get_pool_constant (addr);
281      cmode = get_pool_mode (addr);
282
283      /* If we're accessing the constant in a different mode than it was
284         originally stored, attempt to fix that up via subreg simplifications.
285         If that fails we have no choice but to return the original memory.  */
286      if ((offset != 0 || cmode != GET_MODE (x))
287	  && offset >= 0 && offset < GET_MODE_SIZE (cmode))
288        {
289          rtx tem = simplify_subreg (GET_MODE (x), c, cmode, offset);
290          if (tem && CONSTANT_P (tem))
291            return tem;
292        }
293      else
294        return c;
295    }
296
297  return x;
298}
299
300/* Simplify a MEM based on its attributes.  This is the default
301   delegitimize_address target hook, and it's recommended that every
302   overrider call it.  */
303
304rtx
305delegitimize_mem_from_attrs (rtx x)
306{
307  /* MEMs without MEM_OFFSETs may have been offset, so we can't just
308     use their base addresses as equivalent.  */
309  if (MEM_P (x)
310      && MEM_EXPR (x)
311      && MEM_OFFSET_KNOWN_P (x))
312    {
313      tree decl = MEM_EXPR (x);
314      machine_mode mode = GET_MODE (x);
315      HOST_WIDE_INT offset = 0;
316
317      switch (TREE_CODE (decl))
318	{
319	default:
320	  decl = NULL;
321	  break;
322
323	case VAR_DECL:
324	  break;
325
326	case ARRAY_REF:
327	case ARRAY_RANGE_REF:
328	case COMPONENT_REF:
329	case BIT_FIELD_REF:
330	case REALPART_EXPR:
331	case IMAGPART_EXPR:
332	case VIEW_CONVERT_EXPR:
333	  {
334	    HOST_WIDE_INT bitsize, bitpos;
335	    tree toffset;
336	    int unsignedp, volatilep = 0;
337
338	    decl = get_inner_reference (decl, &bitsize, &bitpos, &toffset,
339					&mode, &unsignedp, &volatilep, false);
340	    if (bitsize != GET_MODE_BITSIZE (mode)
341		|| (bitpos % BITS_PER_UNIT)
342		|| (toffset && !tree_fits_shwi_p (toffset)))
343	      decl = NULL;
344	    else
345	      {
346		offset += bitpos / BITS_PER_UNIT;
347		if (toffset)
348		  offset += tree_to_shwi (toffset);
349	      }
350	    break;
351	  }
352	}
353
354      if (decl
355	  && mode == GET_MODE (x)
356	  && TREE_CODE (decl) == VAR_DECL
357	  && (TREE_STATIC (decl)
358	      || DECL_THREAD_LOCAL_P (decl))
359	  && DECL_RTL_SET_P (decl)
360	  && MEM_P (DECL_RTL (decl)))
361	{
362	  rtx newx;
363
364	  offset += MEM_OFFSET (x);
365
366	  newx = DECL_RTL (decl);
367
368	  if (MEM_P (newx))
369	    {
370	      rtx n = XEXP (newx, 0), o = XEXP (x, 0);
371
372	      /* Avoid creating a new MEM needlessly if we already had
373		 the same address.  We do if there's no OFFSET and the
374		 old address X is identical to NEWX, or if X is of the
375		 form (plus NEWX OFFSET), or the NEWX is of the form
376		 (plus Y (const_int Z)) and X is that with the offset
377		 added: (plus Y (const_int Z+OFFSET)).  */
378	      if (!((offset == 0
379		     || (GET_CODE (o) == PLUS
380			 && GET_CODE (XEXP (o, 1)) == CONST_INT
381			 && (offset == INTVAL (XEXP (o, 1))
382			     || (GET_CODE (n) == PLUS
383				 && GET_CODE (XEXP (n, 1)) == CONST_INT
384				 && (INTVAL (XEXP (n, 1)) + offset
385				     == INTVAL (XEXP (o, 1)))
386				 && (n = XEXP (n, 0))))
387			 && (o = XEXP (o, 0))))
388		    && rtx_equal_p (o, n)))
389		x = adjust_address_nv (newx, mode, offset);
390	    }
391	  else if (GET_MODE (x) == GET_MODE (newx)
392		   && offset == 0)
393	    x = newx;
394	}
395    }
396
397  return x;
398}
399
400/* Make a unary operation by first seeing if it folds and otherwise making
401   the specified operation.  */
402
403rtx
404simplify_gen_unary (enum rtx_code code, machine_mode mode, rtx op,
405		    machine_mode op_mode)
406{
407  rtx tem;
408
409  /* If this simplifies, use it.  */
410  if ((tem = simplify_unary_operation (code, mode, op, op_mode)) != 0)
411    return tem;
412
413  return gen_rtx_fmt_e (code, mode, op);
414}
415
416/* Likewise for ternary operations.  */
417
418rtx
419simplify_gen_ternary (enum rtx_code code, machine_mode mode,
420		      machine_mode op0_mode, rtx op0, rtx op1, rtx op2)
421{
422  rtx tem;
423
424  /* If this simplifies, use it.  */
425  if (0 != (tem = simplify_ternary_operation (code, mode, op0_mode,
426					      op0, op1, op2)))
427    return tem;
428
429  return gen_rtx_fmt_eee (code, mode, op0, op1, op2);
430}
431
432/* Likewise, for relational operations.
433   CMP_MODE specifies mode comparison is done in.  */
434
435rtx
436simplify_gen_relational (enum rtx_code code, machine_mode mode,
437			 machine_mode cmp_mode, rtx op0, rtx op1)
438{
439  rtx tem;
440
441  if (0 != (tem = simplify_relational_operation (code, mode, cmp_mode,
442						 op0, op1)))
443    return tem;
444
445  return gen_rtx_fmt_ee (code, mode, op0, op1);
446}
447
448/* If FN is NULL, replace all occurrences of OLD_RTX in X with copy_rtx (DATA)
449   and simplify the result.  If FN is non-NULL, call this callback on each
450   X, if it returns non-NULL, replace X with its return value and simplify the
451   result.  */
452
453rtx
454simplify_replace_fn_rtx (rtx x, const_rtx old_rtx,
455			 rtx (*fn) (rtx, const_rtx, void *), void *data)
456{
457  enum rtx_code code = GET_CODE (x);
458  machine_mode mode = GET_MODE (x);
459  machine_mode op_mode;
460  const char *fmt;
461  rtx op0, op1, op2, newx, op;
462  rtvec vec, newvec;
463  int i, j;
464
465  if (__builtin_expect (fn != NULL, 0))
466    {
467      newx = fn (x, old_rtx, data);
468      if (newx)
469	return newx;
470    }
471  else if (rtx_equal_p (x, old_rtx))
472    return copy_rtx ((rtx) data);
473
474  switch (GET_RTX_CLASS (code))
475    {
476    case RTX_UNARY:
477      op0 = XEXP (x, 0);
478      op_mode = GET_MODE (op0);
479      op0 = simplify_replace_fn_rtx (op0, old_rtx, fn, data);
480      if (op0 == XEXP (x, 0))
481	return x;
482      return simplify_gen_unary (code, mode, op0, op_mode);
483
484    case RTX_BIN_ARITH:
485    case RTX_COMM_ARITH:
486      op0 = simplify_replace_fn_rtx (XEXP (x, 0), old_rtx, fn, data);
487      op1 = simplify_replace_fn_rtx (XEXP (x, 1), old_rtx, fn, data);
488      if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
489	return x;
490      return simplify_gen_binary (code, mode, op0, op1);
491
492    case RTX_COMPARE:
493    case RTX_COMM_COMPARE:
494      op0 = XEXP (x, 0);
495      op1 = XEXP (x, 1);
496      op_mode = GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
497      op0 = simplify_replace_fn_rtx (op0, old_rtx, fn, data);
498      op1 = simplify_replace_fn_rtx (op1, old_rtx, fn, data);
499      if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
500	return x;
501      return simplify_gen_relational (code, mode, op_mode, op0, op1);
502
503    case RTX_TERNARY:
504    case RTX_BITFIELD_OPS:
505      op0 = XEXP (x, 0);
506      op_mode = GET_MODE (op0);
507      op0 = simplify_replace_fn_rtx (op0, old_rtx, fn, data);
508      op1 = simplify_replace_fn_rtx (XEXP (x, 1), old_rtx, fn, data);
509      op2 = simplify_replace_fn_rtx (XEXP (x, 2), old_rtx, fn, data);
510      if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1) && op2 == XEXP (x, 2))
511	return x;
512      if (op_mode == VOIDmode)
513	op_mode = GET_MODE (op0);
514      return simplify_gen_ternary (code, mode, op_mode, op0, op1, op2);
515
516    case RTX_EXTRA:
517      if (code == SUBREG)
518	{
519	  op0 = simplify_replace_fn_rtx (SUBREG_REG (x), old_rtx, fn, data);
520	  if (op0 == SUBREG_REG (x))
521	    return x;
522	  op0 = simplify_gen_subreg (GET_MODE (x), op0,
523				     GET_MODE (SUBREG_REG (x)),
524				     SUBREG_BYTE (x));
525	  return op0 ? op0 : x;
526	}
527      break;
528
529    case RTX_OBJ:
530      if (code == MEM)
531	{
532	  op0 = simplify_replace_fn_rtx (XEXP (x, 0), old_rtx, fn, data);
533	  if (op0 == XEXP (x, 0))
534	    return x;
535	  return replace_equiv_address_nv (x, op0);
536	}
537      else if (code == LO_SUM)
538	{
539	  op0 = simplify_replace_fn_rtx (XEXP (x, 0), old_rtx, fn, data);
540	  op1 = simplify_replace_fn_rtx (XEXP (x, 1), old_rtx, fn, data);
541
542	  /* (lo_sum (high x) y) -> y where x and y have the same base.  */
543	  if (GET_CODE (op0) == HIGH)
544	    {
545	      rtx base0, base1, offset0, offset1;
546	      split_const (XEXP (op0, 0), &base0, &offset0);
547	      split_const (op1, &base1, &offset1);
548	      if (rtx_equal_p (base0, base1))
549		return op1;
550	    }
551
552	  if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
553	    return x;
554	  return gen_rtx_LO_SUM (mode, op0, op1);
555	}
556      break;
557
558    default:
559      break;
560    }
561
562  newx = x;
563  fmt = GET_RTX_FORMAT (code);
564  for (i = 0; fmt[i]; i++)
565    switch (fmt[i])
566      {
567      case 'E':
568	vec = XVEC (x, i);
569	newvec = XVEC (newx, i);
570	for (j = 0; j < GET_NUM_ELEM (vec); j++)
571	  {
572	    op = simplify_replace_fn_rtx (RTVEC_ELT (vec, j),
573					  old_rtx, fn, data);
574	    if (op != RTVEC_ELT (vec, j))
575	      {
576		if (newvec == vec)
577		  {
578		    newvec = shallow_copy_rtvec (vec);
579		    if (x == newx)
580		      newx = shallow_copy_rtx (x);
581		    XVEC (newx, i) = newvec;
582		  }
583		RTVEC_ELT (newvec, j) = op;
584	      }
585	  }
586	break;
587
588      case 'e':
589	if (XEXP (x, i))
590	  {
591	    op = simplify_replace_fn_rtx (XEXP (x, i), old_rtx, fn, data);
592	    if (op != XEXP (x, i))
593	      {
594		if (x == newx)
595		  newx = shallow_copy_rtx (x);
596		XEXP (newx, i) = op;
597	      }
598	  }
599	break;
600      }
601  return newx;
602}
603
604/* Replace all occurrences of OLD_RTX in X with NEW_RTX and try to simplify the
605   resulting RTX.  Return a new RTX which is as simplified as possible.  */
606
607rtx
608simplify_replace_rtx (rtx x, const_rtx old_rtx, rtx new_rtx)
609{
610  return simplify_replace_fn_rtx (x, old_rtx, 0, new_rtx);
611}
612
613/* Try to simplify a MODE truncation of OP, which has OP_MODE.
614   Only handle cases where the truncated value is inherently an rvalue.
615
616   RTL provides two ways of truncating a value:
617
618   1. a lowpart subreg.  This form is only a truncation when both
619      the outer and inner modes (here MODE and OP_MODE respectively)
620      are scalar integers, and only then when the subreg is used as
621      an rvalue.
622
623      It is only valid to form such truncating subregs if the
624      truncation requires no action by the target.  The onus for
625      proving this is on the creator of the subreg -- e.g. the
626      caller to simplify_subreg or simplify_gen_subreg -- and typically
627      involves either TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode.
628
629   2. a TRUNCATE.  This form handles both scalar and compound integers.
630
631   The first form is preferred where valid.  However, the TRUNCATE
632   handling in simplify_unary_operation turns the second form into the
633   first form when TRULY_NOOP_TRUNCATION_MODES_P or truncated_to_mode allow,
634   so it is generally safe to form rvalue truncations using:
635
636      simplify_gen_unary (TRUNCATE, ...)
637
638   and leave simplify_unary_operation to work out which representation
639   should be used.
640
641   Because of the proof requirements on (1), simplify_truncation must
642   also use simplify_gen_unary (TRUNCATE, ...) to truncate parts of OP,
643   regardless of whether the outer truncation came from a SUBREG or a
644   TRUNCATE.  For example, if the caller has proven that an SImode
645   truncation of:
646
647      (and:DI X Y)
648
649   is a no-op and can be represented as a subreg, it does not follow
650   that SImode truncations of X and Y are also no-ops.  On a target
651   like 64-bit MIPS that requires SImode values to be stored in
652   sign-extended form, an SImode truncation of:
653
654      (and:DI (reg:DI X) (const_int 63))
655
656   is trivially a no-op because only the lower 6 bits can be set.
657   However, X is still an arbitrary 64-bit number and so we cannot
658   assume that truncating it too is a no-op.  */
659
660static rtx
661simplify_truncation (machine_mode mode, rtx op,
662		     machine_mode op_mode)
663{
664  unsigned int precision = GET_MODE_UNIT_PRECISION (mode);
665  unsigned int op_precision = GET_MODE_UNIT_PRECISION (op_mode);
666  gcc_assert (precision <= op_precision);
667
668  /* Optimize truncations of zero and sign extended values.  */
669  if (GET_CODE (op) == ZERO_EXTEND
670      || GET_CODE (op) == SIGN_EXTEND)
671    {
672      /* There are three possibilities.  If MODE is the same as the
673	 origmode, we can omit both the extension and the subreg.
674	 If MODE is not larger than the origmode, we can apply the
675	 truncation without the extension.  Finally, if the outermode
676	 is larger than the origmode, we can just extend to the appropriate
677	 mode.  */
678      machine_mode origmode = GET_MODE (XEXP (op, 0));
679      if (mode == origmode)
680	return XEXP (op, 0);
681      else if (precision <= GET_MODE_UNIT_PRECISION (origmode))
682	return simplify_gen_unary (TRUNCATE, mode,
683				   XEXP (op, 0), origmode);
684      else
685	return simplify_gen_unary (GET_CODE (op), mode,
686				   XEXP (op, 0), origmode);
687    }
688
689  /* If the machine can perform operations in the truncated mode, distribute
690     the truncation, i.e. simplify (truncate:QI (op:SI (x:SI) (y:SI))) into
691     (op:QI (truncate:QI (x:SI)) (truncate:QI (y:SI))).  */
692  if (1
693#ifdef WORD_REGISTER_OPERATIONS
694      && precision >= BITS_PER_WORD
695#endif
696      && (GET_CODE (op) == PLUS
697	  || GET_CODE (op) == MINUS
698	  || GET_CODE (op) == MULT))
699    {
700      rtx op0 = simplify_gen_unary (TRUNCATE, mode, XEXP (op, 0), op_mode);
701      if (op0)
702	{
703	  rtx op1 = simplify_gen_unary (TRUNCATE, mode, XEXP (op, 1), op_mode);
704	  if (op1)
705	    return simplify_gen_binary (GET_CODE (op), mode, op0, op1);
706	}
707    }
708
709  /* Simplify (truncate:QI (lshiftrt:SI (sign_extend:SI (x:QI)) C)) into
710     to (ashiftrt:QI (x:QI) C), where C is a suitable small constant and
711     the outer subreg is effectively a truncation to the original mode.  */
712  if ((GET_CODE (op) == LSHIFTRT
713       || GET_CODE (op) == ASHIFTRT)
714      /* Ensure that OP_MODE is at least twice as wide as MODE
715	 to avoid the possibility that an outer LSHIFTRT shifts by more
716	 than the sign extension's sign_bit_copies and introduces zeros
717	 into the high bits of the result.  */
718      && 2 * precision <= op_precision
719      && CONST_INT_P (XEXP (op, 1))
720      && GET_CODE (XEXP (op, 0)) == SIGN_EXTEND
721      && GET_MODE (XEXP (XEXP (op, 0), 0)) == mode
722      && UINTVAL (XEXP (op, 1)) < precision)
723    return simplify_gen_binary (ASHIFTRT, mode,
724				XEXP (XEXP (op, 0), 0), XEXP (op, 1));
725
726  /* Likewise (truncate:QI (lshiftrt:SI (zero_extend:SI (x:QI)) C)) into
727     to (lshiftrt:QI (x:QI) C), where C is a suitable small constant and
728     the outer subreg is effectively a truncation to the original mode.  */
729  if ((GET_CODE (op) == LSHIFTRT
730       || GET_CODE (op) == ASHIFTRT)
731      && CONST_INT_P (XEXP (op, 1))
732      && GET_CODE (XEXP (op, 0)) == ZERO_EXTEND
733      && GET_MODE (XEXP (XEXP (op, 0), 0)) == mode
734      && UINTVAL (XEXP (op, 1)) < precision)
735    return simplify_gen_binary (LSHIFTRT, mode,
736				XEXP (XEXP (op, 0), 0), XEXP (op, 1));
737
738  /* Likewise (truncate:QI (ashift:SI (zero_extend:SI (x:QI)) C)) into
739     to (ashift:QI (x:QI) C), where C is a suitable small constant and
740     the outer subreg is effectively a truncation to the original mode.  */
741  if (GET_CODE (op) == ASHIFT
742      && CONST_INT_P (XEXP (op, 1))
743      && (GET_CODE (XEXP (op, 0)) == ZERO_EXTEND
744	  || GET_CODE (XEXP (op, 0)) == SIGN_EXTEND)
745      && GET_MODE (XEXP (XEXP (op, 0), 0)) == mode
746      && UINTVAL (XEXP (op, 1)) < precision)
747    return simplify_gen_binary (ASHIFT, mode,
748				XEXP (XEXP (op, 0), 0), XEXP (op, 1));
749
750  /* Recognize a word extraction from a multi-word subreg.  */
751  if ((GET_CODE (op) == LSHIFTRT
752       || GET_CODE (op) == ASHIFTRT)
753      && SCALAR_INT_MODE_P (mode)
754      && SCALAR_INT_MODE_P (op_mode)
755      && precision >= BITS_PER_WORD
756      && 2 * precision <= op_precision
757      && CONST_INT_P (XEXP (op, 1))
758      && (INTVAL (XEXP (op, 1)) & (precision - 1)) == 0
759      && UINTVAL (XEXP (op, 1)) < op_precision)
760    {
761      int byte = subreg_lowpart_offset (mode, op_mode);
762      int shifted_bytes = INTVAL (XEXP (op, 1)) / BITS_PER_UNIT;
763      return simplify_gen_subreg (mode, XEXP (op, 0), op_mode,
764				  (WORDS_BIG_ENDIAN
765				   ? byte - shifted_bytes
766				   : byte + shifted_bytes));
767    }
768
769  /* If we have a TRUNCATE of a right shift of MEM, make a new MEM
770     and try replacing the TRUNCATE and shift with it.  Don't do this
771     if the MEM has a mode-dependent address.  */
772  if ((GET_CODE (op) == LSHIFTRT
773       || GET_CODE (op) == ASHIFTRT)
774      && SCALAR_INT_MODE_P (op_mode)
775      && MEM_P (XEXP (op, 0))
776      && CONST_INT_P (XEXP (op, 1))
777      && (INTVAL (XEXP (op, 1)) % GET_MODE_BITSIZE (mode)) == 0
778      && INTVAL (XEXP (op, 1)) > 0
779      && INTVAL (XEXP (op, 1)) < GET_MODE_BITSIZE (op_mode)
780      && ! mode_dependent_address_p (XEXP (XEXP (op, 0), 0),
781				     MEM_ADDR_SPACE (XEXP (op, 0)))
782      && ! MEM_VOLATILE_P (XEXP (op, 0))
783      && (GET_MODE_SIZE (mode) >= UNITS_PER_WORD
784	  || WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN))
785    {
786      int byte = subreg_lowpart_offset (mode, op_mode);
787      int shifted_bytes = INTVAL (XEXP (op, 1)) / BITS_PER_UNIT;
788      return adjust_address_nv (XEXP (op, 0), mode,
789				(WORDS_BIG_ENDIAN
790				 ? byte - shifted_bytes
791				 : byte + shifted_bytes));
792    }
793
794  /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
795     (OP:SI foo:SI) if OP is NEG or ABS.  */
796  if ((GET_CODE (op) == ABS
797       || GET_CODE (op) == NEG)
798      && (GET_CODE (XEXP (op, 0)) == SIGN_EXTEND
799	  || GET_CODE (XEXP (op, 0)) == ZERO_EXTEND)
800      && GET_MODE (XEXP (XEXP (op, 0), 0)) == mode)
801    return simplify_gen_unary (GET_CODE (op), mode,
802			       XEXP (XEXP (op, 0), 0), mode);
803
804  /* (truncate:A (subreg:B (truncate:C X) 0)) is
805     (truncate:A X).  */
806  if (GET_CODE (op) == SUBREG
807      && SCALAR_INT_MODE_P (mode)
808      && SCALAR_INT_MODE_P (op_mode)
809      && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (op)))
810      && GET_CODE (SUBREG_REG (op)) == TRUNCATE
811      && subreg_lowpart_p (op))
812    {
813      rtx inner = XEXP (SUBREG_REG (op), 0);
814      if (GET_MODE_PRECISION (mode)
815	  <= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op))))
816	return simplify_gen_unary (TRUNCATE, mode, inner, GET_MODE (inner));
817      else
818	/* If subreg above is paradoxical and C is narrower
819	   than A, return (subreg:A (truncate:C X) 0).  */
820	return simplify_gen_subreg (mode, SUBREG_REG (op),
821				    GET_MODE (SUBREG_REG (op)), 0);
822    }
823
824  /* (truncate:A (truncate:B X)) is (truncate:A X).  */
825  if (GET_CODE (op) == TRUNCATE)
826    return simplify_gen_unary (TRUNCATE, mode, XEXP (op, 0),
827			       GET_MODE (XEXP (op, 0)));
828
829  return NULL_RTX;
830}
831
832/* Try to simplify a unary operation CODE whose output mode is to be
833   MODE with input operand OP whose mode was originally OP_MODE.
834   Return zero if no simplification can be made.  */
835rtx
836simplify_unary_operation (enum rtx_code code, machine_mode mode,
837			  rtx op, machine_mode op_mode)
838{
839  rtx trueop, tem;
840
841  trueop = avoid_constant_pool_reference (op);
842
843  tem = simplify_const_unary_operation (code, mode, trueop, op_mode);
844  if (tem)
845    return tem;
846
847  return simplify_unary_operation_1 (code, mode, op);
848}
849
850/* Perform some simplifications we can do even if the operands
851   aren't constant.  */
852static rtx
853simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
854{
855  enum rtx_code reversed;
856  rtx temp;
857
858  switch (code)
859    {
860    case NOT:
861      /* (not (not X)) == X.  */
862      if (GET_CODE (op) == NOT)
863	return XEXP (op, 0);
864
865      /* (not (eq X Y)) == (ne X Y), etc. if BImode or the result of the
866	 comparison is all ones.   */
867      if (COMPARISON_P (op)
868	  && (mode == BImode || STORE_FLAG_VALUE == -1)
869	  && ((reversed = reversed_comparison_code (op, NULL_RTX)) != UNKNOWN))
870	return simplify_gen_relational (reversed, mode, VOIDmode,
871					XEXP (op, 0), XEXP (op, 1));
872
873      /* (not (plus X -1)) can become (neg X).  */
874      if (GET_CODE (op) == PLUS
875	  && XEXP (op, 1) == constm1_rtx)
876	return simplify_gen_unary (NEG, mode, XEXP (op, 0), mode);
877
878      /* Similarly, (not (neg X)) is (plus X -1).  */
879      if (GET_CODE (op) == NEG)
880	return simplify_gen_binary (PLUS, mode, XEXP (op, 0),
881				    CONSTM1_RTX (mode));
882
883      /* (not (xor X C)) for C constant is (xor X D) with D = ~C.  */
884      if (GET_CODE (op) == XOR
885	  && CONST_INT_P (XEXP (op, 1))
886	  && (temp = simplify_unary_operation (NOT, mode,
887					       XEXP (op, 1), mode)) != 0)
888	return simplify_gen_binary (XOR, mode, XEXP (op, 0), temp);
889
890      /* (not (plus X C)) for signbit C is (xor X D) with D = ~C.  */
891      if (GET_CODE (op) == PLUS
892	  && CONST_INT_P (XEXP (op, 1))
893	  && mode_signbit_p (mode, XEXP (op, 1))
894	  && (temp = simplify_unary_operation (NOT, mode,
895					       XEXP (op, 1), mode)) != 0)
896	return simplify_gen_binary (XOR, mode, XEXP (op, 0), temp);
897
898
899      /* (not (ashift 1 X)) is (rotate ~1 X).  We used to do this for
900	 operands other than 1, but that is not valid.  We could do a
901	 similar simplification for (not (lshiftrt C X)) where C is
902	 just the sign bit, but this doesn't seem common enough to
903	 bother with.  */
904      if (GET_CODE (op) == ASHIFT
905	  && XEXP (op, 0) == const1_rtx)
906	{
907	  temp = simplify_gen_unary (NOT, mode, const1_rtx, mode);
908	  return simplify_gen_binary (ROTATE, mode, temp, XEXP (op, 1));
909	}
910
911      /* (not (ashiftrt foo C)) where C is the number of bits in FOO
912	 minus 1 is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1,
913	 so we can perform the above simplification.  */
914      if (STORE_FLAG_VALUE == -1
915	  && GET_CODE (op) == ASHIFTRT
916	  && CONST_INT_P (XEXP (op, 1))
917	  && INTVAL (XEXP (op, 1)) == GET_MODE_PRECISION (mode) - 1)
918	return simplify_gen_relational (GE, mode, VOIDmode,
919					XEXP (op, 0), const0_rtx);
920
921
922      if (GET_CODE (op) == SUBREG
923	  && subreg_lowpart_p (op)
924	  && (GET_MODE_SIZE (GET_MODE (op))
925	      < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
926	  && GET_CODE (SUBREG_REG (op)) == ASHIFT
927	  && XEXP (SUBREG_REG (op), 0) == const1_rtx)
928	{
929	  machine_mode inner_mode = GET_MODE (SUBREG_REG (op));
930	  rtx x;
931
932	  x = gen_rtx_ROTATE (inner_mode,
933			      simplify_gen_unary (NOT, inner_mode, const1_rtx,
934						  inner_mode),
935			      XEXP (SUBREG_REG (op), 1));
936	  temp = rtl_hooks.gen_lowpart_no_emit (mode, x);
937	  if (temp)
938	    return temp;
939	}
940
941      /* Apply De Morgan's laws to reduce number of patterns for machines
942	 with negating logical insns (and-not, nand, etc.).  If result has
943	 only one NOT, put it first, since that is how the patterns are
944	 coded.  */
945      if (GET_CODE (op) == IOR || GET_CODE (op) == AND)
946	{
947	  rtx in1 = XEXP (op, 0), in2 = XEXP (op, 1);
948	  machine_mode op_mode;
949
950	  op_mode = GET_MODE (in1);
951	  in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
952
953	  op_mode = GET_MODE (in2);
954	  if (op_mode == VOIDmode)
955	    op_mode = mode;
956	  in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
957
958	  if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
959	    {
960	      rtx tem = in2;
961	      in2 = in1; in1 = tem;
962	    }
963
964	  return gen_rtx_fmt_ee (GET_CODE (op) == IOR ? AND : IOR,
965				 mode, in1, in2);
966	}
967
968      /* (not (bswap x)) -> (bswap (not x)).  */
969      if (GET_CODE (op) == BSWAP)
970	{
971	  rtx x = simplify_gen_unary (NOT, mode, XEXP (op, 0), mode);
972	  return simplify_gen_unary (BSWAP, mode, x, mode);
973	}
974      break;
975
976    case NEG:
977      /* (neg (neg X)) == X.  */
978      if (GET_CODE (op) == NEG)
979	return XEXP (op, 0);
980
981      /* (neg (plus X 1)) can become (not X).  */
982      if (GET_CODE (op) == PLUS
983	  && XEXP (op, 1) == const1_rtx)
984	return simplify_gen_unary (NOT, mode, XEXP (op, 0), mode);
985
986      /* Similarly, (neg (not X)) is (plus X 1).  */
987      if (GET_CODE (op) == NOT)
988	return simplify_gen_binary (PLUS, mode, XEXP (op, 0),
989				    CONST1_RTX (mode));
990
991      /* (neg (minus X Y)) can become (minus Y X).  This transformation
992	 isn't safe for modes with signed zeros, since if X and Y are
993	 both +0, (minus Y X) is the same as (minus X Y).  If the
994	 rounding mode is towards +infinity (or -infinity) then the two
995	 expressions will be rounded differently.  */
996      if (GET_CODE (op) == MINUS
997	  && !HONOR_SIGNED_ZEROS (mode)
998	  && !HONOR_SIGN_DEPENDENT_ROUNDING (mode))
999	return simplify_gen_binary (MINUS, mode, XEXP (op, 1), XEXP (op, 0));
1000
1001      if (GET_CODE (op) == PLUS
1002	  && !HONOR_SIGNED_ZEROS (mode)
1003	  && !HONOR_SIGN_DEPENDENT_ROUNDING (mode))
1004	{
1005	  /* (neg (plus A C)) is simplified to (minus -C A).  */
1006	  if (CONST_SCALAR_INT_P (XEXP (op, 1))
1007	      || CONST_DOUBLE_AS_FLOAT_P (XEXP (op, 1)))
1008	    {
1009	      temp = simplify_unary_operation (NEG, mode, XEXP (op, 1), mode);
1010	      if (temp)
1011		return simplify_gen_binary (MINUS, mode, temp, XEXP (op, 0));
1012	    }
1013
1014	  /* (neg (plus A B)) is canonicalized to (minus (neg A) B).  */
1015	  temp = simplify_gen_unary (NEG, mode, XEXP (op, 0), mode);
1016	  return simplify_gen_binary (MINUS, mode, temp, XEXP (op, 1));
1017	}
1018
1019      /* (neg (mult A B)) becomes (mult A (neg B)).
1020	 This works even for floating-point values.  */
1021      if (GET_CODE (op) == MULT
1022	  && !HONOR_SIGN_DEPENDENT_ROUNDING (mode))
1023	{
1024	  temp = simplify_gen_unary (NEG, mode, XEXP (op, 1), mode);
1025	  return simplify_gen_binary (MULT, mode, XEXP (op, 0), temp);
1026	}
1027
1028      /* NEG commutes with ASHIFT since it is multiplication.  Only do
1029	 this if we can then eliminate the NEG (e.g., if the operand
1030	 is a constant).  */
1031      if (GET_CODE (op) == ASHIFT)
1032	{
1033	  temp = simplify_unary_operation (NEG, mode, XEXP (op, 0), mode);
1034	  if (temp)
1035	    return simplify_gen_binary (ASHIFT, mode, temp, XEXP (op, 1));
1036	}
1037
1038      /* (neg (ashiftrt X C)) can be replaced by (lshiftrt X C) when
1039	 C is equal to the width of MODE minus 1.  */
1040      if (GET_CODE (op) == ASHIFTRT
1041	  && CONST_INT_P (XEXP (op, 1))
1042	  && INTVAL (XEXP (op, 1)) == GET_MODE_PRECISION (mode) - 1)
1043	return simplify_gen_binary (LSHIFTRT, mode,
1044				    XEXP (op, 0), XEXP (op, 1));
1045
1046      /* (neg (lshiftrt X C)) can be replaced by (ashiftrt X C) when
1047	 C is equal to the width of MODE minus 1.  */
1048      if (GET_CODE (op) == LSHIFTRT
1049	  && CONST_INT_P (XEXP (op, 1))
1050	  && INTVAL (XEXP (op, 1)) == GET_MODE_PRECISION (mode) - 1)
1051	return simplify_gen_binary (ASHIFTRT, mode,
1052				    XEXP (op, 0), XEXP (op, 1));
1053
1054      /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1.  */
1055      if (GET_CODE (op) == XOR
1056	  && XEXP (op, 1) == const1_rtx
1057	  && nonzero_bits (XEXP (op, 0), mode) == 1)
1058	return plus_constant (mode, XEXP (op, 0), -1);
1059
1060      /* (neg (lt x 0)) is (ashiftrt X C) if STORE_FLAG_VALUE is 1.  */
1061      /* (neg (lt x 0)) is (lshiftrt X C) if STORE_FLAG_VALUE is -1.  */
1062      if (GET_CODE (op) == LT
1063	  && XEXP (op, 1) == const0_rtx
1064	  && SCALAR_INT_MODE_P (GET_MODE (XEXP (op, 0))))
1065	{
1066	  machine_mode inner = GET_MODE (XEXP (op, 0));
1067	  int isize = GET_MODE_PRECISION (inner);
1068	  if (STORE_FLAG_VALUE == 1)
1069	    {
1070	      temp = simplify_gen_binary (ASHIFTRT, inner, XEXP (op, 0),
1071					  GEN_INT (isize - 1));
1072	      if (mode == inner)
1073		return temp;
1074	      if (GET_MODE_PRECISION (mode) > isize)
1075		return simplify_gen_unary (SIGN_EXTEND, mode, temp, inner);
1076	      return simplify_gen_unary (TRUNCATE, mode, temp, inner);
1077	    }
1078	  else if (STORE_FLAG_VALUE == -1)
1079	    {
1080	      temp = simplify_gen_binary (LSHIFTRT, inner, XEXP (op, 0),
1081					  GEN_INT (isize - 1));
1082	      if (mode == inner)
1083		return temp;
1084	      if (GET_MODE_PRECISION (mode) > isize)
1085		return simplify_gen_unary (ZERO_EXTEND, mode, temp, inner);
1086	      return simplify_gen_unary (TRUNCATE, mode, temp, inner);
1087	    }
1088	}
1089      break;
1090
1091    case TRUNCATE:
1092      /* Don't optimize (lshiftrt (mult ...)) as it would interfere
1093	 with the umulXi3_highpart patterns.  */
1094      if (GET_CODE (op) == LSHIFTRT
1095	  && GET_CODE (XEXP (op, 0)) == MULT)
1096	break;
1097
1098      if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
1099	{
1100	  if (TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (op)))
1101	    {
1102	      temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1103	      if (temp)
1104		return temp;
1105	    }
1106	  /* We can't handle truncation to a partial integer mode here
1107	     because we don't know the real bitsize of the partial
1108	     integer mode.  */
1109	  break;
1110	}
1111
1112      if (GET_MODE (op) != VOIDmode)
1113	{
1114	  temp = simplify_truncation (mode, op, GET_MODE (op));
1115	  if (temp)
1116	    return temp;
1117	}
1118
1119      /* If we know that the value is already truncated, we can
1120	 replace the TRUNCATE with a SUBREG.  */
1121      if (GET_MODE_NUNITS (mode) == 1
1122	  && (TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (op))
1123	      || truncated_to_mode (mode, op)))
1124	{
1125	  temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1126	  if (temp)
1127	    return temp;
1128	}
1129
1130      /* A truncate of a comparison can be replaced with a subreg if
1131         STORE_FLAG_VALUE permits.  This is like the previous test,
1132         but it works even if the comparison is done in a mode larger
1133         than HOST_BITS_PER_WIDE_INT.  */
1134      if (HWI_COMPUTABLE_MODE_P (mode)
1135	  && COMPARISON_P (op)
1136	  && (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
1137	{
1138	  temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1139	  if (temp)
1140	    return temp;
1141	}
1142
1143      /* A truncate of a memory is just loading the low part of the memory
1144	 if we are not changing the meaning of the address. */
1145      if (GET_CODE (op) == MEM
1146	  && !VECTOR_MODE_P (mode)
1147	  && !MEM_VOLATILE_P (op)
1148	  && !mode_dependent_address_p (XEXP (op, 0), MEM_ADDR_SPACE (op)))
1149	{
1150	  temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1151	  if (temp)
1152	    return temp;
1153	}
1154
1155      break;
1156
1157    case FLOAT_TRUNCATE:
1158      if (DECIMAL_FLOAT_MODE_P (mode))
1159	break;
1160
1161      /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
1162      if (GET_CODE (op) == FLOAT_EXTEND
1163	  && GET_MODE (XEXP (op, 0)) == mode)
1164	return XEXP (op, 0);
1165
1166      /* (float_truncate:SF (float_truncate:DF foo:XF))
1167         = (float_truncate:SF foo:XF).
1168	 This may eliminate double rounding, so it is unsafe.
1169
1170         (float_truncate:SF (float_extend:XF foo:DF))
1171         = (float_truncate:SF foo:DF).
1172
1173         (float_truncate:DF (float_extend:XF foo:SF))
1174         = (float_extend:SF foo:DF).  */
1175      if ((GET_CODE (op) == FLOAT_TRUNCATE
1176	   && flag_unsafe_math_optimizations)
1177	  || GET_CODE (op) == FLOAT_EXTEND)
1178	return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (op,
1179							    0)))
1180				   > GET_MODE_SIZE (mode)
1181				   ? FLOAT_TRUNCATE : FLOAT_EXTEND,
1182				   mode,
1183				   XEXP (op, 0), mode);
1184
1185      /*  (float_truncate (float x)) is (float x)  */
1186      if (GET_CODE (op) == FLOAT
1187	  && (flag_unsafe_math_optimizations
1188	      || (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1189		  && ((unsigned)significand_size (GET_MODE (op))
1190		      >= (GET_MODE_PRECISION (GET_MODE (XEXP (op, 0)))
1191			  - num_sign_bit_copies (XEXP (op, 0),
1192						 GET_MODE (XEXP (op, 0))))))))
1193	return simplify_gen_unary (FLOAT, mode,
1194				   XEXP (op, 0),
1195				   GET_MODE (XEXP (op, 0)));
1196
1197      /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
1198	 (OP:SF foo:SF) if OP is NEG or ABS.  */
1199      if ((GET_CODE (op) == ABS
1200	   || GET_CODE (op) == NEG)
1201	  && GET_CODE (XEXP (op, 0)) == FLOAT_EXTEND
1202	  && GET_MODE (XEXP (XEXP (op, 0), 0)) == mode)
1203	return simplify_gen_unary (GET_CODE (op), mode,
1204				   XEXP (XEXP (op, 0), 0), mode);
1205
1206      /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
1207	 is (float_truncate:SF x).  */
1208      if (GET_CODE (op) == SUBREG
1209	  && subreg_lowpart_p (op)
1210	  && GET_CODE (SUBREG_REG (op)) == FLOAT_TRUNCATE)
1211	return SUBREG_REG (op);
1212      break;
1213
1214    case FLOAT_EXTEND:
1215      if (DECIMAL_FLOAT_MODE_P (mode))
1216	break;
1217
1218      /*  (float_extend (float_extend x)) is (float_extend x)
1219
1220	  (float_extend (float x)) is (float x) assuming that double
1221	  rounding can't happen.
1222          */
1223      if (GET_CODE (op) == FLOAT_EXTEND
1224	  || (GET_CODE (op) == FLOAT
1225	      && SCALAR_FLOAT_MODE_P (GET_MODE (op))
1226	      && ((unsigned)significand_size (GET_MODE (op))
1227		  >= (GET_MODE_PRECISION (GET_MODE (XEXP (op, 0)))
1228		      - num_sign_bit_copies (XEXP (op, 0),
1229					     GET_MODE (XEXP (op, 0)))))))
1230	return simplify_gen_unary (GET_CODE (op), mode,
1231				   XEXP (op, 0),
1232				   GET_MODE (XEXP (op, 0)));
1233
1234      break;
1235
1236    case ABS:
1237      /* (abs (neg <foo>)) -> (abs <foo>) */
1238      if (GET_CODE (op) == NEG)
1239	return simplify_gen_unary (ABS, mode, XEXP (op, 0),
1240				   GET_MODE (XEXP (op, 0)));
1241
1242      /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
1243         do nothing.  */
1244      if (GET_MODE (op) == VOIDmode)
1245	break;
1246
1247      /* If operand is something known to be positive, ignore the ABS.  */
1248      if (GET_CODE (op) == FFS || GET_CODE (op) == ABS
1249	  || val_signbit_known_clear_p (GET_MODE (op),
1250					nonzero_bits (op, GET_MODE (op))))
1251	return op;
1252
1253      /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
1254      if (num_sign_bit_copies (op, mode) == GET_MODE_PRECISION (mode))
1255	return gen_rtx_NEG (mode, op);
1256
1257      break;
1258
1259    case FFS:
1260      /* (ffs (*_extend <X>)) = (ffs <X>) */
1261      if (GET_CODE (op) == SIGN_EXTEND
1262	  || GET_CODE (op) == ZERO_EXTEND)
1263	return simplify_gen_unary (FFS, mode, XEXP (op, 0),
1264				   GET_MODE (XEXP (op, 0)));
1265      break;
1266
1267    case POPCOUNT:
1268      switch (GET_CODE (op))
1269	{
1270	case BSWAP:
1271	case ZERO_EXTEND:
1272	  /* (popcount (zero_extend <X>)) = (popcount <X>) */
1273	  return simplify_gen_unary (POPCOUNT, mode, XEXP (op, 0),
1274				     GET_MODE (XEXP (op, 0)));
1275
1276	case ROTATE:
1277	case ROTATERT:
1278	  /* Rotations don't affect popcount.  */
1279	  if (!side_effects_p (XEXP (op, 1)))
1280	    return simplify_gen_unary (POPCOUNT, mode, XEXP (op, 0),
1281				       GET_MODE (XEXP (op, 0)));
1282	  break;
1283
1284	default:
1285	  break;
1286	}
1287      break;
1288
1289    case PARITY:
1290      switch (GET_CODE (op))
1291	{
1292	case NOT:
1293	case BSWAP:
1294	case ZERO_EXTEND:
1295	case SIGN_EXTEND:
1296	  return simplify_gen_unary (PARITY, mode, XEXP (op, 0),
1297				     GET_MODE (XEXP (op, 0)));
1298
1299	case ROTATE:
1300	case ROTATERT:
1301	  /* Rotations don't affect parity.  */
1302	  if (!side_effects_p (XEXP (op, 1)))
1303	    return simplify_gen_unary (PARITY, mode, XEXP (op, 0),
1304				       GET_MODE (XEXP (op, 0)));
1305	  break;
1306
1307	default:
1308	  break;
1309	}
1310      break;
1311
1312    case BSWAP:
1313      /* (bswap (bswap x)) -> x.  */
1314      if (GET_CODE (op) == BSWAP)
1315	return XEXP (op, 0);
1316      break;
1317
1318    case FLOAT:
1319      /* (float (sign_extend <X>)) = (float <X>).  */
1320      if (GET_CODE (op) == SIGN_EXTEND)
1321	return simplify_gen_unary (FLOAT, mode, XEXP (op, 0),
1322				   GET_MODE (XEXP (op, 0)));
1323      break;
1324
1325    case SIGN_EXTEND:
1326      /* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
1327	 becomes just the MINUS if its mode is MODE.  This allows
1328	 folding switch statements on machines using casesi (such as
1329	 the VAX).  */
1330      if (GET_CODE (op) == TRUNCATE
1331	  && GET_MODE (XEXP (op, 0)) == mode
1332	  && GET_CODE (XEXP (op, 0)) == MINUS
1333	  && GET_CODE (XEXP (XEXP (op, 0), 0)) == LABEL_REF
1334	  && GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF)
1335	return XEXP (op, 0);
1336
1337      /* Extending a widening multiplication should be canonicalized to
1338	 a wider widening multiplication.  */
1339      if (GET_CODE (op) == MULT)
1340	{
1341	  rtx lhs = XEXP (op, 0);
1342	  rtx rhs = XEXP (op, 1);
1343	  enum rtx_code lcode = GET_CODE (lhs);
1344	  enum rtx_code rcode = GET_CODE (rhs);
1345
1346	  /* Widening multiplies usually extend both operands, but sometimes
1347	     they use a shift to extract a portion of a register.  */
1348	  if ((lcode == SIGN_EXTEND
1349	       || (lcode == ASHIFTRT && CONST_INT_P (XEXP (lhs, 1))))
1350	      && (rcode == SIGN_EXTEND
1351		  || (rcode == ASHIFTRT && CONST_INT_P (XEXP (rhs, 1)))))
1352	    {
1353	      machine_mode lmode = GET_MODE (lhs);
1354	      machine_mode rmode = GET_MODE (rhs);
1355	      int bits;
1356
1357	      if (lcode == ASHIFTRT)
1358		/* Number of bits not shifted off the end.  */
1359		bits = GET_MODE_PRECISION (lmode) - INTVAL (XEXP (lhs, 1));
1360	      else /* lcode == SIGN_EXTEND */
1361		/* Size of inner mode.  */
1362		bits = GET_MODE_PRECISION (GET_MODE (XEXP (lhs, 0)));
1363
1364	      if (rcode == ASHIFTRT)
1365		bits += GET_MODE_PRECISION (rmode) - INTVAL (XEXP (rhs, 1));
1366	      else /* rcode == SIGN_EXTEND */
1367		bits += GET_MODE_PRECISION (GET_MODE (XEXP (rhs, 0)));
1368
1369	      /* We can only widen multiplies if the result is mathematiclly
1370		 equivalent.  I.e. if overflow was impossible.  */
1371	      if (bits <= GET_MODE_PRECISION (GET_MODE (op)))
1372		return simplify_gen_binary
1373			 (MULT, mode,
1374			  simplify_gen_unary (SIGN_EXTEND, mode, lhs, lmode),
1375			  simplify_gen_unary (SIGN_EXTEND, mode, rhs, rmode));
1376	    }
1377	}
1378
1379      /* Check for a sign extension of a subreg of a promoted
1380	 variable, where the promotion is sign-extended, and the
1381	 target mode is the same as the variable's promotion.  */
1382      if (GET_CODE (op) == SUBREG
1383	  && SUBREG_PROMOTED_VAR_P (op)
1384	  && SUBREG_PROMOTED_SIGNED_P (op)
1385	  && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
1386	{
1387	  temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1388	  if (temp)
1389	    return temp;
1390	}
1391
1392      /* (sign_extend:M (sign_extend:N <X>)) is (sign_extend:M <X>).
1393	 (sign_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>).  */
1394      if (GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND)
1395	{
1396	  gcc_assert (GET_MODE_PRECISION (mode)
1397		      > GET_MODE_PRECISION (GET_MODE (op)));
1398	  return simplify_gen_unary (GET_CODE (op), mode, XEXP (op, 0),
1399				     GET_MODE (XEXP (op, 0)));
1400	}
1401
1402      /* (sign_extend:M (ashiftrt:N (ashift <X> (const_int I)) (const_int I)))
1403	 is (sign_extend:M (subreg:O <X>)) if there is mode with
1404	 GET_MODE_BITSIZE (N) - I bits.
1405	 (sign_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1406	 is similarly (zero_extend:M (subreg:O <X>)).  */
1407      if ((GET_CODE (op) == ASHIFTRT || GET_CODE (op) == LSHIFTRT)
1408	  && GET_CODE (XEXP (op, 0)) == ASHIFT
1409	  && CONST_INT_P (XEXP (op, 1))
1410	  && XEXP (XEXP (op, 0), 1) == XEXP (op, 1)
1411	  && GET_MODE_BITSIZE (GET_MODE (op)) > INTVAL (XEXP (op, 1)))
1412	{
1413	  machine_mode tmode
1414	    = mode_for_size (GET_MODE_BITSIZE (GET_MODE (op))
1415			     - INTVAL (XEXP (op, 1)), MODE_INT, 1);
1416	  gcc_assert (GET_MODE_BITSIZE (mode)
1417		      > GET_MODE_BITSIZE (GET_MODE (op)));
1418	  if (tmode != BLKmode)
1419	    {
1420	      rtx inner =
1421		rtl_hooks.gen_lowpart_no_emit (tmode, XEXP (XEXP (op, 0), 0));
1422	      if (inner)
1423		return simplify_gen_unary (GET_CODE (op) == ASHIFTRT
1424					   ? SIGN_EXTEND : ZERO_EXTEND,
1425					   mode, inner, tmode);
1426	    }
1427	}
1428
1429#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
1430      /* As we do not know which address space the pointer is referring to,
1431	 we can do this only if the target does not support different pointer
1432	 or address modes depending on the address space.  */
1433      if (target_default_pointer_address_modes_p ()
1434	  && ! POINTERS_EXTEND_UNSIGNED
1435	  && mode == Pmode && GET_MODE (op) == ptr_mode
1436	  && (CONSTANT_P (op)
1437	      || (GET_CODE (op) == SUBREG
1438		  && REG_P (SUBREG_REG (op))
1439		  && REG_POINTER (SUBREG_REG (op))
1440		  && GET_MODE (SUBREG_REG (op)) == Pmode)))
1441	return convert_memory_address (Pmode, op);
1442#endif
1443      break;
1444
1445    case ZERO_EXTEND:
1446      /* Check for a zero extension of a subreg of a promoted
1447	 variable, where the promotion is zero-extended, and the
1448	 target mode is the same as the variable's promotion.  */
1449      if (GET_CODE (op) == SUBREG
1450	  && SUBREG_PROMOTED_VAR_P (op)
1451	  && SUBREG_PROMOTED_UNSIGNED_P (op)
1452	  && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
1453	{
1454	  temp = rtl_hooks.gen_lowpart_no_emit (mode, op);
1455	  if (temp)
1456	    return temp;
1457	}
1458
1459      /* Extending a widening multiplication should be canonicalized to
1460	 a wider widening multiplication.  */
1461      if (GET_CODE (op) == MULT)
1462	{
1463	  rtx lhs = XEXP (op, 0);
1464	  rtx rhs = XEXP (op, 1);
1465	  enum rtx_code lcode = GET_CODE (lhs);
1466	  enum rtx_code rcode = GET_CODE (rhs);
1467
1468	  /* Widening multiplies usually extend both operands, but sometimes
1469	     they use a shift to extract a portion of a register.  */
1470	  if ((lcode == ZERO_EXTEND
1471	       || (lcode == LSHIFTRT && CONST_INT_P (XEXP (lhs, 1))))
1472	      && (rcode == ZERO_EXTEND
1473		  || (rcode == LSHIFTRT && CONST_INT_P (XEXP (rhs, 1)))))
1474	    {
1475	      machine_mode lmode = GET_MODE (lhs);
1476	      machine_mode rmode = GET_MODE (rhs);
1477	      int bits;
1478
1479	      if (lcode == LSHIFTRT)
1480		/* Number of bits not shifted off the end.  */
1481		bits = GET_MODE_PRECISION (lmode) - INTVAL (XEXP (lhs, 1));
1482	      else /* lcode == ZERO_EXTEND */
1483		/* Size of inner mode.  */
1484		bits = GET_MODE_PRECISION (GET_MODE (XEXP (lhs, 0)));
1485
1486	      if (rcode == LSHIFTRT)
1487		bits += GET_MODE_PRECISION (rmode) - INTVAL (XEXP (rhs, 1));
1488	      else /* rcode == ZERO_EXTEND */
1489		bits += GET_MODE_PRECISION (GET_MODE (XEXP (rhs, 0)));
1490
1491	      /* We can only widen multiplies if the result is mathematiclly
1492		 equivalent.  I.e. if overflow was impossible.  */
1493	      if (bits <= GET_MODE_PRECISION (GET_MODE (op)))
1494		return simplify_gen_binary
1495			 (MULT, mode,
1496			  simplify_gen_unary (ZERO_EXTEND, mode, lhs, lmode),
1497			  simplify_gen_unary (ZERO_EXTEND, mode, rhs, rmode));
1498	    }
1499	}
1500
1501      /* (zero_extend:M (zero_extend:N <X>)) is (zero_extend:M <X>).  */
1502      if (GET_CODE (op) == ZERO_EXTEND)
1503	return simplify_gen_unary (ZERO_EXTEND, mode, XEXP (op, 0),
1504				   GET_MODE (XEXP (op, 0)));
1505
1506      /* (zero_extend:M (lshiftrt:N (ashift <X> (const_int I)) (const_int I)))
1507	 is (zero_extend:M (subreg:O <X>)) if there is mode with
1508	 GET_MODE_PRECISION (N) - I bits.  */
1509      if (GET_CODE (op) == LSHIFTRT
1510	  && GET_CODE (XEXP (op, 0)) == ASHIFT
1511	  && CONST_INT_P (XEXP (op, 1))
1512	  && XEXP (XEXP (op, 0), 1) == XEXP (op, 1)
1513	  && GET_MODE_PRECISION (GET_MODE (op)) > INTVAL (XEXP (op, 1)))
1514	{
1515	  machine_mode tmode
1516	    = mode_for_size (GET_MODE_PRECISION (GET_MODE (op))
1517			     - INTVAL (XEXP (op, 1)), MODE_INT, 1);
1518	  if (tmode != BLKmode)
1519	    {
1520	      rtx inner =
1521		rtl_hooks.gen_lowpart_no_emit (tmode, XEXP (XEXP (op, 0), 0));
1522	      if (inner)
1523		return simplify_gen_unary (ZERO_EXTEND, mode, inner, tmode);
1524	    }
1525	}
1526
1527      /* (zero_extend:M (subreg:N <X:O>)) is <X:O> (for M == O) or
1528	 (zero_extend:M <X:O>), if X doesn't have any non-zero bits outside
1529	 of mode N.  E.g.
1530	 (zero_extend:SI (subreg:QI (and:SI (reg:SI) (const_int 63)) 0)) is
1531	 (and:SI (reg:SI) (const_int 63)).  */
1532      if (GET_CODE (op) == SUBREG
1533	  && GET_MODE_PRECISION (GET_MODE (op))
1534	     < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op)))
1535	  && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op)))
1536	     <= HOST_BITS_PER_WIDE_INT
1537	  && GET_MODE_PRECISION (mode)
1538	     >= GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op)))
1539	  && subreg_lowpart_p (op)
1540	  && (nonzero_bits (SUBREG_REG (op), GET_MODE (SUBREG_REG (op)))
1541	      & ~GET_MODE_MASK (GET_MODE (op))) == 0)
1542	{
1543	  if (GET_MODE_PRECISION (mode)
1544	      == GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op))))
1545	    return SUBREG_REG (op);
1546	  return simplify_gen_unary (ZERO_EXTEND, mode, SUBREG_REG (op),
1547				     GET_MODE (SUBREG_REG (op)));
1548	}
1549
1550#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
1551      /* As we do not know which address space the pointer is referring to,
1552	 we can do this only if the target does not support different pointer
1553	 or address modes depending on the address space.  */
1554      if (target_default_pointer_address_modes_p ()
1555	  && POINTERS_EXTEND_UNSIGNED > 0
1556	  && mode == Pmode && GET_MODE (op) == ptr_mode
1557	  && (CONSTANT_P (op)
1558	      || (GET_CODE (op) == SUBREG
1559		  && REG_P (SUBREG_REG (op))
1560		  && REG_POINTER (SUBREG_REG (op))
1561		  && GET_MODE (SUBREG_REG (op)) == Pmode)))
1562	return convert_memory_address (Pmode, op);
1563#endif
1564      break;
1565
1566    default:
1567      break;
1568    }
1569
1570  return 0;
1571}
1572
1573/* Try to compute the value of a unary operation CODE whose output mode is to
1574   be MODE with input operand OP whose mode was originally OP_MODE.
1575   Return zero if the value cannot be computed.  */
1576rtx
1577simplify_const_unary_operation (enum rtx_code code, machine_mode mode,
1578				rtx op, machine_mode op_mode)
1579{
1580  unsigned int width = GET_MODE_PRECISION (mode);
1581
1582  if (code == VEC_DUPLICATE)
1583    {
1584      gcc_assert (VECTOR_MODE_P (mode));
1585      if (GET_MODE (op) != VOIDmode)
1586      {
1587	if (!VECTOR_MODE_P (GET_MODE (op)))
1588	  gcc_assert (GET_MODE_INNER (mode) == GET_MODE (op));
1589	else
1590	  gcc_assert (GET_MODE_INNER (mode) == GET_MODE_INNER
1591						(GET_MODE (op)));
1592      }
1593      if (CONST_SCALAR_INT_P (op) || CONST_DOUBLE_AS_FLOAT_P (op)
1594	  || GET_CODE (op) == CONST_VECTOR)
1595	{
1596          int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
1597          unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
1598	  rtvec v = rtvec_alloc (n_elts);
1599	  unsigned int i;
1600
1601	  if (GET_CODE (op) != CONST_VECTOR)
1602	    for (i = 0; i < n_elts; i++)
1603	      RTVEC_ELT (v, i) = op;
1604	  else
1605	    {
1606	      machine_mode inmode = GET_MODE (op);
1607              int in_elt_size = GET_MODE_SIZE (GET_MODE_INNER (inmode));
1608              unsigned in_n_elts = (GET_MODE_SIZE (inmode) / in_elt_size);
1609
1610	      gcc_assert (in_n_elts < n_elts);
1611	      gcc_assert ((n_elts % in_n_elts) == 0);
1612	      for (i = 0; i < n_elts; i++)
1613	        RTVEC_ELT (v, i) = CONST_VECTOR_ELT (op, i % in_n_elts);
1614	    }
1615	  return gen_rtx_CONST_VECTOR (mode, v);
1616	}
1617    }
1618
1619  if (VECTOR_MODE_P (mode) && GET_CODE (op) == CONST_VECTOR)
1620    {
1621      int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
1622      unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
1623      machine_mode opmode = GET_MODE (op);
1624      int op_elt_size = GET_MODE_SIZE (GET_MODE_INNER (opmode));
1625      unsigned op_n_elts = (GET_MODE_SIZE (opmode) / op_elt_size);
1626      rtvec v = rtvec_alloc (n_elts);
1627      unsigned int i;
1628
1629      gcc_assert (op_n_elts == n_elts);
1630      for (i = 0; i < n_elts; i++)
1631	{
1632	  rtx x = simplify_unary_operation (code, GET_MODE_INNER (mode),
1633					    CONST_VECTOR_ELT (op, i),
1634					    GET_MODE_INNER (opmode));
1635	  if (!x)
1636	    return 0;
1637	  RTVEC_ELT (v, i) = x;
1638	}
1639      return gen_rtx_CONST_VECTOR (mode, v);
1640    }
1641
1642  /* The order of these tests is critical so that, for example, we don't
1643     check the wrong mode (input vs. output) for a conversion operation,
1644     such as FIX.  At some point, this should be simplified.  */
1645
1646  if (code == FLOAT && CONST_SCALAR_INT_P (op))
1647    {
1648      REAL_VALUE_TYPE d;
1649
1650      if (op_mode == VOIDmode)
1651	{
1652	  /* CONST_INT have VOIDmode as the mode.  We assume that all
1653	     the bits of the constant are significant, though, this is
1654	     a dangerous assumption as many times CONST_INTs are
1655	     created and used with garbage in the bits outside of the
1656	     precision of the implied mode of the const_int.  */
1657	  op_mode = MAX_MODE_INT;
1658	}
1659
1660      real_from_integer (&d, mode, std::make_pair (op, op_mode), SIGNED);
1661      d = real_value_truncate (mode, d);
1662      return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
1663    }
1664  else if (code == UNSIGNED_FLOAT && CONST_SCALAR_INT_P (op))
1665    {
1666      REAL_VALUE_TYPE d;
1667
1668      if (op_mode == VOIDmode)
1669	{
1670	  /* CONST_INT have VOIDmode as the mode.  We assume that all
1671	     the bits of the constant are significant, though, this is
1672	     a dangerous assumption as many times CONST_INTs are
1673	     created and used with garbage in the bits outside of the
1674	     precision of the implied mode of the const_int.  */
1675	  op_mode = MAX_MODE_INT;
1676	}
1677
1678      real_from_integer (&d, mode, std::make_pair (op, op_mode), UNSIGNED);
1679      d = real_value_truncate (mode, d);
1680      return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
1681    }
1682
1683  if (CONST_SCALAR_INT_P (op) && width > 0)
1684    {
1685      wide_int result;
1686      machine_mode imode = op_mode == VOIDmode ? mode : op_mode;
1687      rtx_mode_t op0 = std::make_pair (op, imode);
1688      int int_value;
1689
1690#if TARGET_SUPPORTS_WIDE_INT == 0
1691      /* This assert keeps the simplification from producing a result
1692	 that cannot be represented in a CONST_DOUBLE but a lot of
1693	 upstream callers expect that this function never fails to
1694	 simplify something and so you if you added this to the test
1695	 above the code would die later anyway.  If this assert
1696	 happens, you just need to make the port support wide int.  */
1697      gcc_assert (width <= HOST_BITS_PER_DOUBLE_INT);
1698#endif
1699
1700      switch (code)
1701	{
1702	case NOT:
1703	  result = wi::bit_not (op0);
1704	  break;
1705
1706	case NEG:
1707	  result = wi::neg (op0);
1708	  break;
1709
1710	case ABS:
1711	  result = wi::abs (op0);
1712	  break;
1713
1714	case FFS:
1715	  result = wi::shwi (wi::ffs (op0), mode);
1716	  break;
1717
1718	case CLZ:
1719	  if (wi::ne_p (op0, 0))
1720	    int_value = wi::clz (op0);
1721	  else if (! CLZ_DEFINED_VALUE_AT_ZERO (mode, int_value))
1722	    int_value = GET_MODE_PRECISION (mode);
1723	  result = wi::shwi (int_value, mode);
1724	  break;
1725
1726	case CLRSB:
1727	  result = wi::shwi (wi::clrsb (op0), mode);
1728	  break;
1729
1730	case CTZ:
1731	  if (wi::ne_p (op0, 0))
1732	    int_value = wi::ctz (op0);
1733	  else if (! CTZ_DEFINED_VALUE_AT_ZERO (mode, int_value))
1734	    int_value = GET_MODE_PRECISION (mode);
1735	  result = wi::shwi (int_value, mode);
1736	  break;
1737
1738	case POPCOUNT:
1739	  result = wi::shwi (wi::popcount (op0), mode);
1740	  break;
1741
1742	case PARITY:
1743	  result = wi::shwi (wi::parity (op0), mode);
1744	  break;
1745
1746	case BSWAP:
1747	  result = wide_int (op0).bswap ();
1748	  break;
1749
1750	case TRUNCATE:
1751	case ZERO_EXTEND:
1752	  result = wide_int::from (op0, width, UNSIGNED);
1753	  break;
1754
1755	case SIGN_EXTEND:
1756	  result = wide_int::from (op0, width, SIGNED);
1757	  break;
1758
1759	case SQRT:
1760	default:
1761	  return 0;
1762	}
1763
1764      return immed_wide_int_const (result, mode);
1765    }
1766
1767  else if (CONST_DOUBLE_AS_FLOAT_P (op)
1768	   && SCALAR_FLOAT_MODE_P (mode)
1769	   && SCALAR_FLOAT_MODE_P (GET_MODE (op)))
1770    {
1771      REAL_VALUE_TYPE d;
1772      REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1773
1774      switch (code)
1775	{
1776	case SQRT:
1777	  return 0;
1778	case ABS:
1779	  d = real_value_abs (&d);
1780	  break;
1781	case NEG:
1782	  d = real_value_negate (&d);
1783	  break;
1784	case FLOAT_TRUNCATE:
1785	  d = real_value_truncate (mode, d);
1786	  break;
1787	case FLOAT_EXTEND:
1788	  /* All this does is change the mode, unless changing
1789	     mode class.  */
1790	  if (GET_MODE_CLASS (mode) != GET_MODE_CLASS (GET_MODE (op)))
1791	    real_convert (&d, mode, &d);
1792	  break;
1793	case FIX:
1794	  real_arithmetic (&d, FIX_TRUNC_EXPR, &d, NULL);
1795	  break;
1796	case NOT:
1797	  {
1798	    long tmp[4];
1799	    int i;
1800
1801	    real_to_target (tmp, &d, GET_MODE (op));
1802	    for (i = 0; i < 4; i++)
1803	      tmp[i] = ~tmp[i];
1804	    real_from_target (&d, tmp, mode);
1805	    break;
1806	  }
1807	default:
1808	  gcc_unreachable ();
1809	}
1810      return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
1811    }
1812  else if (CONST_DOUBLE_AS_FLOAT_P (op)
1813	   && SCALAR_FLOAT_MODE_P (GET_MODE (op))
1814	   && GET_MODE_CLASS (mode) == MODE_INT
1815	   && width > 0)
1816    {
1817      /* Although the overflow semantics of RTL's FIX and UNSIGNED_FIX
1818	 operators are intentionally left unspecified (to ease implementation
1819	 by target backends), for consistency, this routine implements the
1820	 same semantics for constant folding as used by the middle-end.  */
1821
1822      /* This was formerly used only for non-IEEE float.
1823	 eggert@twinsun.com says it is safe for IEEE also.  */
1824      REAL_VALUE_TYPE x, t;
1825      REAL_VALUE_FROM_CONST_DOUBLE (x, op);
1826      wide_int wmax, wmin;
1827      /* This is part of the abi to real_to_integer, but we check
1828	 things before making this call.  */
1829      bool fail;
1830
1831      switch (code)
1832	{
1833	case FIX:
1834	  if (REAL_VALUE_ISNAN (x))
1835	    return const0_rtx;
1836
1837	  /* Test against the signed upper bound.  */
1838	  wmax = wi::max_value (width, SIGNED);
1839	  real_from_integer (&t, VOIDmode, wmax, SIGNED);
1840	  if (REAL_VALUES_LESS (t, x))
1841	    return immed_wide_int_const (wmax, mode);
1842
1843	  /* Test against the signed lower bound.  */
1844	  wmin = wi::min_value (width, SIGNED);
1845	  real_from_integer (&t, VOIDmode, wmin, SIGNED);
1846	  if (REAL_VALUES_LESS (x, t))
1847	    return immed_wide_int_const (wmin, mode);
1848
1849	  return immed_wide_int_const (real_to_integer (&x, &fail, width), mode);
1850	  break;
1851
1852	case UNSIGNED_FIX:
1853	  if (REAL_VALUE_ISNAN (x) || REAL_VALUE_NEGATIVE (x))
1854	    return const0_rtx;
1855
1856	  /* Test against the unsigned upper bound.  */
1857	  wmax = wi::max_value (width, UNSIGNED);
1858	  real_from_integer (&t, VOIDmode, wmax, UNSIGNED);
1859	  if (REAL_VALUES_LESS (t, x))
1860	    return immed_wide_int_const (wmax, mode);
1861
1862	  return immed_wide_int_const (real_to_integer (&x, &fail, width),
1863				       mode);
1864	  break;
1865
1866	default:
1867	  gcc_unreachable ();
1868	}
1869    }
1870
1871  return NULL_RTX;
1872}
1873
1874/* Subroutine of simplify_binary_operation to simplify a binary operation
1875   CODE that can commute with byte swapping, with result mode MODE and
1876   operating on OP0 and OP1.  CODE is currently one of AND, IOR or XOR.
1877   Return zero if no simplification or canonicalization is possible.  */
1878
1879static rtx
1880simplify_byte_swapping_operation (enum rtx_code code, machine_mode mode,
1881				  rtx op0, rtx op1)
1882{
1883  rtx tem;
1884
1885  /* (op (bswap x) C1)) -> (bswap (op x C2)) with C2 swapped.  */
1886  if (GET_CODE (op0) == BSWAP && CONST_SCALAR_INT_P (op1))
1887    {
1888      tem = simplify_gen_binary (code, mode, XEXP (op0, 0),
1889				 simplify_gen_unary (BSWAP, mode, op1, mode));
1890      return simplify_gen_unary (BSWAP, mode, tem, mode);
1891    }
1892
1893  /* (op (bswap x) (bswap y)) -> (bswap (op x y)).  */
1894  if (GET_CODE (op0) == BSWAP && GET_CODE (op1) == BSWAP)
1895    {
1896      tem = simplify_gen_binary (code, mode, XEXP (op0, 0), XEXP (op1, 0));
1897      return simplify_gen_unary (BSWAP, mode, tem, mode);
1898    }
1899
1900  return NULL_RTX;
1901}
1902
1903/* Subroutine of simplify_binary_operation to simplify a commutative,
1904   associative binary operation CODE with result mode MODE, operating
1905   on OP0 and OP1.  CODE is currently one of PLUS, MULT, AND, IOR, XOR,
1906   SMIN, SMAX, UMIN or UMAX.  Return zero if no simplification or
1907   canonicalization is possible.  */
1908
1909static rtx
1910simplify_associative_operation (enum rtx_code code, machine_mode mode,
1911				rtx op0, rtx op1)
1912{
1913  rtx tem;
1914
1915  /* Linearize the operator to the left.  */
1916  if (GET_CODE (op1) == code)
1917    {
1918      /* "(a op b) op (c op d)" becomes "((a op b) op c) op d)".  */
1919      if (GET_CODE (op0) == code)
1920	{
1921	  tem = simplify_gen_binary (code, mode, op0, XEXP (op1, 0));
1922	  return simplify_gen_binary (code, mode, tem, XEXP (op1, 1));
1923	}
1924
1925      /* "a op (b op c)" becomes "(b op c) op a".  */
1926      if (! swap_commutative_operands_p (op1, op0))
1927	return simplify_gen_binary (code, mode, op1, op0);
1928
1929      tem = op0;
1930      op0 = op1;
1931      op1 = tem;
1932    }
1933
1934  if (GET_CODE (op0) == code)
1935    {
1936      /* Canonicalize "(x op c) op y" as "(x op y) op c".  */
1937      if (swap_commutative_operands_p (XEXP (op0, 1), op1))
1938	{
1939	  tem = simplify_gen_binary (code, mode, XEXP (op0, 0), op1);
1940	  return simplify_gen_binary (code, mode, tem, XEXP (op0, 1));
1941	}
1942
1943      /* Attempt to simplify "(a op b) op c" as "a op (b op c)".  */
1944      tem = simplify_binary_operation (code, mode, XEXP (op0, 1), op1);
1945      if (tem != 0)
1946        return simplify_gen_binary (code, mode, XEXP (op0, 0), tem);
1947
1948      /* Attempt to simplify "(a op b) op c" as "(a op c) op b".  */
1949      tem = simplify_binary_operation (code, mode, XEXP (op0, 0), op1);
1950      if (tem != 0)
1951        return simplify_gen_binary (code, mode, tem, XEXP (op0, 1));
1952    }
1953
1954  return 0;
1955}
1956
1957
1958/* Simplify a binary operation CODE with result mode MODE, operating on OP0
1959   and OP1.  Return 0 if no simplification is possible.
1960
1961   Don't use this for relational operations such as EQ or LT.
1962   Use simplify_relational_operation instead.  */
1963rtx
1964simplify_binary_operation (enum rtx_code code, machine_mode mode,
1965			   rtx op0, rtx op1)
1966{
1967  rtx trueop0, trueop1;
1968  rtx tem;
1969
1970  /* Relational operations don't work here.  We must know the mode
1971     of the operands in order to do the comparison correctly.
1972     Assuming a full word can give incorrect results.
1973     Consider comparing 128 with -128 in QImode.  */
1974  gcc_assert (GET_RTX_CLASS (code) != RTX_COMPARE);
1975  gcc_assert (GET_RTX_CLASS (code) != RTX_COMM_COMPARE);
1976
1977  /* Make sure the constant is second.  */
1978  if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
1979      && swap_commutative_operands_p (op0, op1))
1980    {
1981      tem = op0, op0 = op1, op1 = tem;
1982    }
1983
1984  trueop0 = avoid_constant_pool_reference (op0);
1985  trueop1 = avoid_constant_pool_reference (op1);
1986
1987  tem = simplify_const_binary_operation (code, mode, trueop0, trueop1);
1988  if (tem)
1989    return tem;
1990  return simplify_binary_operation_1 (code, mode, op0, op1, trueop0, trueop1);
1991}
1992
1993/* Subroutine of simplify_binary_operation.  Simplify a binary operation
1994   CODE with result mode MODE, operating on OP0 and OP1.  If OP0 and/or
1995   OP1 are constant pool references, TRUEOP0 and TRUEOP1 represent the
1996   actual constants.  */
1997
1998static rtx
1999simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
2000			     rtx op0, rtx op1, rtx trueop0, rtx trueop1)
2001{
2002  rtx tem, reversed, opleft, opright;
2003  HOST_WIDE_INT val;
2004  unsigned int width = GET_MODE_PRECISION (mode);
2005
2006  /* Even if we can't compute a constant result,
2007     there are some cases worth simplifying.  */
2008
2009  switch (code)
2010    {
2011    case PLUS:
2012      /* Maybe simplify x + 0 to x.  The two expressions are equivalent
2013	 when x is NaN, infinite, or finite and nonzero.  They aren't
2014	 when x is -0 and the rounding mode is not towards -infinity,
2015	 since (-0) + 0 is then 0.  */
2016      if (!HONOR_SIGNED_ZEROS (mode) && trueop1 == CONST0_RTX (mode))
2017	return op0;
2018
2019      /* ((-a) + b) -> (b - a) and similarly for (a + (-b)).  These
2020	 transformations are safe even for IEEE.  */
2021      if (GET_CODE (op0) == NEG)
2022	return simplify_gen_binary (MINUS, mode, op1, XEXP (op0, 0));
2023      else if (GET_CODE (op1) == NEG)
2024	return simplify_gen_binary (MINUS, mode, op0, XEXP (op1, 0));
2025
2026      /* (~a) + 1 -> -a */
2027      if (INTEGRAL_MODE_P (mode)
2028	  && GET_CODE (op0) == NOT
2029	  && trueop1 == const1_rtx)
2030	return simplify_gen_unary (NEG, mode, XEXP (op0, 0), mode);
2031
2032      /* Handle both-operands-constant cases.  We can only add
2033	 CONST_INTs to constants since the sum of relocatable symbols
2034	 can't be handled by most assemblers.  Don't add CONST_INT
2035	 to CONST_INT since overflow won't be computed properly if wider
2036	 than HOST_BITS_PER_WIDE_INT.  */
2037
2038      if ((GET_CODE (op0) == CONST
2039	   || GET_CODE (op0) == SYMBOL_REF
2040	   || GET_CODE (op0) == LABEL_REF)
2041	  && CONST_INT_P (op1))
2042	return plus_constant (mode, op0, INTVAL (op1));
2043      else if ((GET_CODE (op1) == CONST
2044		|| GET_CODE (op1) == SYMBOL_REF
2045		|| GET_CODE (op1) == LABEL_REF)
2046	       && CONST_INT_P (op0))
2047	return plus_constant (mode, op1, INTVAL (op0));
2048
2049      /* See if this is something like X * C - X or vice versa or
2050	 if the multiplication is written as a shift.  If so, we can
2051	 distribute and make a new multiply, shift, or maybe just
2052	 have X (if C is 2 in the example above).  But don't make
2053	 something more expensive than we had before.  */
2054
2055      if (SCALAR_INT_MODE_P (mode))
2056	{
2057	  rtx lhs = op0, rhs = op1;
2058
2059	  wide_int coeff0 = wi::one (GET_MODE_PRECISION (mode));
2060	  wide_int coeff1 = wi::one (GET_MODE_PRECISION (mode));
2061
2062	  if (GET_CODE (lhs) == NEG)
2063	    {
2064	      coeff0 = wi::minus_one (GET_MODE_PRECISION (mode));
2065	      lhs = XEXP (lhs, 0);
2066	    }
2067	  else if (GET_CODE (lhs) == MULT
2068		   && CONST_SCALAR_INT_P (XEXP (lhs, 1)))
2069	    {
2070	      coeff0 = std::make_pair (XEXP (lhs, 1), mode);
2071	      lhs = XEXP (lhs, 0);
2072	    }
2073	  else if (GET_CODE (lhs) == ASHIFT
2074		   && CONST_INT_P (XEXP (lhs, 1))
2075                   && INTVAL (XEXP (lhs, 1)) >= 0
2076		   && INTVAL (XEXP (lhs, 1)) < GET_MODE_PRECISION (mode))
2077	    {
2078	      coeff0 = wi::set_bit_in_zero (INTVAL (XEXP (lhs, 1)),
2079					    GET_MODE_PRECISION (mode));
2080	      lhs = XEXP (lhs, 0);
2081	    }
2082
2083	  if (GET_CODE (rhs) == NEG)
2084	    {
2085	      coeff1 = wi::minus_one (GET_MODE_PRECISION (mode));
2086	      rhs = XEXP (rhs, 0);
2087	    }
2088	  else if (GET_CODE (rhs) == MULT
2089		   && CONST_INT_P (XEXP (rhs, 1)))
2090	    {
2091	      coeff1 = std::make_pair (XEXP (rhs, 1), mode);
2092	      rhs = XEXP (rhs, 0);
2093	    }
2094	  else if (GET_CODE (rhs) == ASHIFT
2095		   && CONST_INT_P (XEXP (rhs, 1))
2096		   && INTVAL (XEXP (rhs, 1)) >= 0
2097		   && INTVAL (XEXP (rhs, 1)) < GET_MODE_PRECISION (mode))
2098	    {
2099	      coeff1 = wi::set_bit_in_zero (INTVAL (XEXP (rhs, 1)),
2100					    GET_MODE_PRECISION (mode));
2101	      rhs = XEXP (rhs, 0);
2102	    }
2103
2104	  if (rtx_equal_p (lhs, rhs))
2105	    {
2106	      rtx orig = gen_rtx_PLUS (mode, op0, op1);
2107	      rtx coeff;
2108	      bool speed = optimize_function_for_speed_p (cfun);
2109
2110	      coeff = immed_wide_int_const (coeff0 + coeff1, mode);
2111
2112	      tem = simplify_gen_binary (MULT, mode, lhs, coeff);
2113	      return set_src_cost (tem, speed) <= set_src_cost (orig, speed)
2114		? tem : 0;
2115	    }
2116	}
2117
2118      /* (plus (xor X C1) C2) is (xor X (C1^C2)) if C2 is signbit.  */
2119      if (CONST_SCALAR_INT_P (op1)
2120	  && GET_CODE (op0) == XOR
2121	  && CONST_SCALAR_INT_P (XEXP (op0, 1))
2122	  && mode_signbit_p (mode, op1))
2123	return simplify_gen_binary (XOR, mode, XEXP (op0, 0),
2124				    simplify_gen_binary (XOR, mode, op1,
2125							 XEXP (op0, 1)));
2126
2127      /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)).  */
2128      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
2129	  && GET_CODE (op0) == MULT
2130	  && GET_CODE (XEXP (op0, 0)) == NEG)
2131	{
2132	  rtx in1, in2;
2133
2134	  in1 = XEXP (XEXP (op0, 0), 0);
2135	  in2 = XEXP (op0, 1);
2136	  return simplify_gen_binary (MINUS, mode, op1,
2137				      simplify_gen_binary (MULT, mode,
2138							   in1, in2));
2139	}
2140
2141      /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
2142	 C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
2143	 is 1.  */
2144      if (COMPARISON_P (op0)
2145	  && ((STORE_FLAG_VALUE == -1 && trueop1 == const1_rtx)
2146	      || (STORE_FLAG_VALUE == 1 && trueop1 == constm1_rtx))
2147	  && (reversed = reversed_comparison (op0, mode)))
2148	return
2149	  simplify_gen_unary (NEG, mode, reversed, mode);
2150
2151      /* If one of the operands is a PLUS or a MINUS, see if we can
2152	 simplify this by the associative law.
2153	 Don't use the associative law for floating point.
2154	 The inaccuracy makes it nonassociative,
2155	 and subtle programs can break if operations are associated.  */
2156
2157      if (INTEGRAL_MODE_P (mode)
2158	  && (plus_minus_operand_p (op0)
2159	      || plus_minus_operand_p (op1))
2160	  && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
2161	return tem;
2162
2163      /* Reassociate floating point addition only when the user
2164	 specifies associative math operations.  */
2165      if (FLOAT_MODE_P (mode)
2166	  && flag_associative_math)
2167	{
2168	  tem = simplify_associative_operation (code, mode, op0, op1);
2169	  if (tem)
2170	    return tem;
2171	}
2172      break;
2173
2174    case COMPARE:
2175      /* Convert (compare (gt (flags) 0) (lt (flags) 0)) to (flags).  */
2176      if (((GET_CODE (op0) == GT && GET_CODE (op1) == LT)
2177	   || (GET_CODE (op0) == GTU && GET_CODE (op1) == LTU))
2178	  && XEXP (op0, 1) == const0_rtx && XEXP (op1, 1) == const0_rtx)
2179	{
2180	  rtx xop00 = XEXP (op0, 0);
2181	  rtx xop10 = XEXP (op1, 0);
2182
2183#ifdef HAVE_cc0
2184	  if (GET_CODE (xop00) == CC0 && GET_CODE (xop10) == CC0)
2185#else
2186	    if (REG_P (xop00) && REG_P (xop10)
2187		&& GET_MODE (xop00) == GET_MODE (xop10)
2188		&& REGNO (xop00) == REGNO (xop10)
2189		&& GET_MODE_CLASS (GET_MODE (xop00)) == MODE_CC
2190		&& GET_MODE_CLASS (GET_MODE (xop10)) == MODE_CC)
2191#endif
2192	      return xop00;
2193	}
2194      break;
2195
2196    case MINUS:
2197      /* We can't assume x-x is 0 even with non-IEEE floating point,
2198	 but since it is zero except in very strange circumstances, we
2199	 will treat it as zero with -ffinite-math-only.  */
2200      if (rtx_equal_p (trueop0, trueop1)
2201	  && ! side_effects_p (op0)
2202	  && (!FLOAT_MODE_P (mode) || !HONOR_NANS (mode)))
2203	return CONST0_RTX (mode);
2204
2205      /* Change subtraction from zero into negation.  (0 - x) is the
2206	 same as -x when x is NaN, infinite, or finite and nonzero.
2207	 But if the mode has signed zeros, and does not round towards
2208	 -infinity, then 0 - 0 is 0, not -0.  */
2209      if (!HONOR_SIGNED_ZEROS (mode) && trueop0 == CONST0_RTX (mode))
2210	return simplify_gen_unary (NEG, mode, op1, mode);
2211
2212      /* (-1 - a) is ~a.  */
2213      if (trueop0 == constm1_rtx)
2214	return simplify_gen_unary (NOT, mode, op1, mode);
2215
2216      /* Subtracting 0 has no effect unless the mode has signed zeros
2217	 and supports rounding towards -infinity.  In such a case,
2218	 0 - 0 is -0.  */
2219      if (!(HONOR_SIGNED_ZEROS (mode)
2220	    && HONOR_SIGN_DEPENDENT_ROUNDING (mode))
2221	  && trueop1 == CONST0_RTX (mode))
2222	return op0;
2223
2224      /* See if this is something like X * C - X or vice versa or
2225	 if the multiplication is written as a shift.  If so, we can
2226	 distribute and make a new multiply, shift, or maybe just
2227	 have X (if C is 2 in the example above).  But don't make
2228	 something more expensive than we had before.  */
2229
2230      if (SCALAR_INT_MODE_P (mode))
2231	{
2232	  rtx lhs = op0, rhs = op1;
2233
2234	  wide_int coeff0 = wi::one (GET_MODE_PRECISION (mode));
2235	  wide_int negcoeff1 = wi::minus_one (GET_MODE_PRECISION (mode));
2236
2237	  if (GET_CODE (lhs) == NEG)
2238	    {
2239	      coeff0 = wi::minus_one (GET_MODE_PRECISION (mode));
2240	      lhs = XEXP (lhs, 0);
2241	    }
2242	  else if (GET_CODE (lhs) == MULT
2243		   && CONST_SCALAR_INT_P (XEXP (lhs, 1)))
2244	    {
2245	      coeff0 = std::make_pair (XEXP (lhs, 1), mode);
2246	      lhs = XEXP (lhs, 0);
2247	    }
2248	  else if (GET_CODE (lhs) == ASHIFT
2249		   && CONST_INT_P (XEXP (lhs, 1))
2250		   && INTVAL (XEXP (lhs, 1)) >= 0
2251		   && INTVAL (XEXP (lhs, 1)) < GET_MODE_PRECISION (mode))
2252	    {
2253	      coeff0 = wi::set_bit_in_zero (INTVAL (XEXP (lhs, 1)),
2254					    GET_MODE_PRECISION (mode));
2255	      lhs = XEXP (lhs, 0);
2256	    }
2257
2258	  if (GET_CODE (rhs) == NEG)
2259	    {
2260	      negcoeff1 = wi::one (GET_MODE_PRECISION (mode));
2261	      rhs = XEXP (rhs, 0);
2262	    }
2263	  else if (GET_CODE (rhs) == MULT
2264		   && CONST_INT_P (XEXP (rhs, 1)))
2265	    {
2266	      negcoeff1 = wi::neg (std::make_pair (XEXP (rhs, 1), mode));
2267	      rhs = XEXP (rhs, 0);
2268	    }
2269	  else if (GET_CODE (rhs) == ASHIFT
2270		   && CONST_INT_P (XEXP (rhs, 1))
2271		   && INTVAL (XEXP (rhs, 1)) >= 0
2272		   && INTVAL (XEXP (rhs, 1)) < GET_MODE_PRECISION (mode))
2273	    {
2274	      negcoeff1 = wi::set_bit_in_zero (INTVAL (XEXP (rhs, 1)),
2275					       GET_MODE_PRECISION (mode));
2276	      negcoeff1 = -negcoeff1;
2277	      rhs = XEXP (rhs, 0);
2278	    }
2279
2280	  if (rtx_equal_p (lhs, rhs))
2281	    {
2282	      rtx orig = gen_rtx_MINUS (mode, op0, op1);
2283	      rtx coeff;
2284	      bool speed = optimize_function_for_speed_p (cfun);
2285
2286	      coeff = immed_wide_int_const (coeff0 + negcoeff1, mode);
2287
2288	      tem = simplify_gen_binary (MULT, mode, lhs, coeff);
2289	      return set_src_cost (tem, speed) <= set_src_cost (orig, speed)
2290		? tem : 0;
2291	    }
2292	}
2293
2294      /* (a - (-b)) -> (a + b).  True even for IEEE.  */
2295      if (GET_CODE (op1) == NEG)
2296	return simplify_gen_binary (PLUS, mode, op0, XEXP (op1, 0));
2297
2298      /* (-x - c) may be simplified as (-c - x).  */
2299      if (GET_CODE (op0) == NEG
2300	  && (CONST_SCALAR_INT_P (op1) || CONST_DOUBLE_AS_FLOAT_P (op1)))
2301	{
2302	  tem = simplify_unary_operation (NEG, mode, op1, mode);
2303	  if (tem)
2304	    return simplify_gen_binary (MINUS, mode, tem, XEXP (op0, 0));
2305	}
2306
2307      /* Don't let a relocatable value get a negative coeff.  */
2308      if (CONST_INT_P (op1) && GET_MODE (op0) != VOIDmode)
2309	return simplify_gen_binary (PLUS, mode,
2310				    op0,
2311				    neg_const_int (mode, op1));
2312
2313      /* (x - (x & y)) -> (x & ~y) */
2314      if (INTEGRAL_MODE_P (mode) && GET_CODE (op1) == AND)
2315	{
2316	  if (rtx_equal_p (op0, XEXP (op1, 0)))
2317	    {
2318	      tem = simplify_gen_unary (NOT, mode, XEXP (op1, 1),
2319					GET_MODE (XEXP (op1, 1)));
2320	      return simplify_gen_binary (AND, mode, op0, tem);
2321	    }
2322	  if (rtx_equal_p (op0, XEXP (op1, 1)))
2323	    {
2324	      tem = simplify_gen_unary (NOT, mode, XEXP (op1, 0),
2325					GET_MODE (XEXP (op1, 0)));
2326	      return simplify_gen_binary (AND, mode, op0, tem);
2327	    }
2328	}
2329
2330      /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
2331	 by reversing the comparison code if valid.  */
2332      if (STORE_FLAG_VALUE == 1
2333	  && trueop0 == const1_rtx
2334	  && COMPARISON_P (op1)
2335	  && (reversed = reversed_comparison (op1, mode)))
2336	return reversed;
2337
2338      /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A).  */
2339      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
2340	  && GET_CODE (op1) == MULT
2341	  && GET_CODE (XEXP (op1, 0)) == NEG)
2342	{
2343	  rtx in1, in2;
2344
2345	  in1 = XEXP (XEXP (op1, 0), 0);
2346	  in2 = XEXP (op1, 1);
2347	  return simplify_gen_binary (PLUS, mode,
2348				      simplify_gen_binary (MULT, mode,
2349							   in1, in2),
2350				      op0);
2351	}
2352
2353      /* Canonicalize (minus (neg A) (mult B C)) to
2354	 (minus (mult (neg B) C) A).  */
2355      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
2356	  && GET_CODE (op1) == MULT
2357	  && GET_CODE (op0) == NEG)
2358	{
2359	  rtx in1, in2;
2360
2361	  in1 = simplify_gen_unary (NEG, mode, XEXP (op1, 0), mode);
2362	  in2 = XEXP (op1, 1);
2363	  return simplify_gen_binary (MINUS, mode,
2364				      simplify_gen_binary (MULT, mode,
2365							   in1, in2),
2366				      XEXP (op0, 0));
2367	}
2368
2369      /* If one of the operands is a PLUS or a MINUS, see if we can
2370	 simplify this by the associative law.  This will, for example,
2371         canonicalize (minus A (plus B C)) to (minus (minus A B) C).
2372	 Don't use the associative law for floating point.
2373	 The inaccuracy makes it nonassociative,
2374	 and subtle programs can break if operations are associated.  */
2375
2376      if (INTEGRAL_MODE_P (mode)
2377	  && (plus_minus_operand_p (op0)
2378	      || plus_minus_operand_p (op1))
2379	  && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
2380	return tem;
2381      break;
2382
2383    case MULT:
2384      if (trueop1 == constm1_rtx)
2385	return simplify_gen_unary (NEG, mode, op0, mode);
2386
2387      if (GET_CODE (op0) == NEG)
2388	{
2389	  rtx temp = simplify_unary_operation (NEG, mode, op1, mode);
2390	  /* If op1 is a MULT as well and simplify_unary_operation
2391	     just moved the NEG to the second operand, simplify_gen_binary
2392	     below could through simplify_associative_operation move
2393	     the NEG around again and recurse endlessly.  */
2394	  if (temp
2395	      && GET_CODE (op1) == MULT
2396	      && GET_CODE (temp) == MULT
2397	      && XEXP (op1, 0) == XEXP (temp, 0)
2398	      && GET_CODE (XEXP (temp, 1)) == NEG
2399	      && XEXP (op1, 1) == XEXP (XEXP (temp, 1), 0))
2400	    temp = NULL_RTX;
2401	  if (temp)
2402	    return simplify_gen_binary (MULT, mode, XEXP (op0, 0), temp);
2403	}
2404      if (GET_CODE (op1) == NEG)
2405	{
2406	  rtx temp = simplify_unary_operation (NEG, mode, op0, mode);
2407	  /* If op0 is a MULT as well and simplify_unary_operation
2408	     just moved the NEG to the second operand, simplify_gen_binary
2409	     below could through simplify_associative_operation move
2410	     the NEG around again and recurse endlessly.  */
2411	  if (temp
2412	      && GET_CODE (op0) == MULT
2413	      && GET_CODE (temp) == MULT
2414	      && XEXP (op0, 0) == XEXP (temp, 0)
2415	      && GET_CODE (XEXP (temp, 1)) == NEG
2416	      && XEXP (op0, 1) == XEXP (XEXP (temp, 1), 0))
2417	    temp = NULL_RTX;
2418	  if (temp)
2419	    return simplify_gen_binary (MULT, mode, temp, XEXP (op1, 0));
2420	}
2421
2422      /* Maybe simplify x * 0 to 0.  The reduction is not valid if
2423	 x is NaN, since x * 0 is then also NaN.  Nor is it valid
2424	 when the mode has signed zeros, since multiplying a negative
2425	 number by 0 will give -0, not 0.  */
2426      if (!HONOR_NANS (mode)
2427	  && !HONOR_SIGNED_ZEROS (mode)
2428	  && trueop1 == CONST0_RTX (mode)
2429	  && ! side_effects_p (op0))
2430	return op1;
2431
2432      /* In IEEE floating point, x*1 is not equivalent to x for
2433	 signalling NaNs.  */
2434      if (!HONOR_SNANS (mode)
2435	  && trueop1 == CONST1_RTX (mode))
2436	return op0;
2437
2438      /* Convert multiply by constant power of two into shift.  */
2439      if (CONST_SCALAR_INT_P (trueop1))
2440	{
2441	  val = wi::exact_log2 (std::make_pair (trueop1, mode));
2442	  if (val >= 0)
2443	    return simplify_gen_binary (ASHIFT, mode, op0, GEN_INT (val));
2444	}
2445
2446      /* x*2 is x+x and x*(-1) is -x */
2447      if (CONST_DOUBLE_AS_FLOAT_P (trueop1)
2448	  && SCALAR_FLOAT_MODE_P (GET_MODE (trueop1))
2449	  && !DECIMAL_FLOAT_MODE_P (GET_MODE (trueop1))
2450	  && GET_MODE (op0) == mode)
2451	{
2452	  REAL_VALUE_TYPE d;
2453	  REAL_VALUE_FROM_CONST_DOUBLE (d, trueop1);
2454
2455	  if (REAL_VALUES_EQUAL (d, dconst2))
2456	    return simplify_gen_binary (PLUS, mode, op0, copy_rtx (op0));
2457
2458	  if (!HONOR_SNANS (mode)
2459	      && REAL_VALUES_EQUAL (d, dconstm1))
2460	    return simplify_gen_unary (NEG, mode, op0, mode);
2461	}
2462
2463      /* Optimize -x * -x as x * x.  */
2464      if (FLOAT_MODE_P (mode)
2465	  && GET_CODE (op0) == NEG
2466	  && GET_CODE (op1) == NEG
2467	  && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
2468	  && !side_effects_p (XEXP (op0, 0)))
2469	return simplify_gen_binary (MULT, mode, XEXP (op0, 0), XEXP (op1, 0));
2470
2471      /* Likewise, optimize abs(x) * abs(x) as x * x.  */
2472      if (SCALAR_FLOAT_MODE_P (mode)
2473	  && GET_CODE (op0) == ABS
2474	  && GET_CODE (op1) == ABS
2475	  && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
2476	  && !side_effects_p (XEXP (op0, 0)))
2477	return simplify_gen_binary (MULT, mode, XEXP (op0, 0), XEXP (op1, 0));
2478
2479      /* Reassociate multiplication, but for floating point MULTs
2480	 only when the user specifies unsafe math optimizations.  */
2481      if (! FLOAT_MODE_P (mode)
2482	  || flag_unsafe_math_optimizations)
2483	{
2484	  tem = simplify_associative_operation (code, mode, op0, op1);
2485	  if (tem)
2486	    return tem;
2487	}
2488      break;
2489
2490    case IOR:
2491      if (trueop1 == CONST0_RTX (mode))
2492	return op0;
2493      if (INTEGRAL_MODE_P (mode)
2494	  && trueop1 == CONSTM1_RTX (mode)
2495	  && !side_effects_p (op0))
2496	return op1;
2497      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
2498	return op0;
2499      /* A | (~A) -> -1 */
2500      if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
2501	   || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
2502	  && ! side_effects_p (op0)
2503	  && SCALAR_INT_MODE_P (mode))
2504	return constm1_rtx;
2505
2506      /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
2507      if (CONST_INT_P (op1)
2508	  && HWI_COMPUTABLE_MODE_P (mode)
2509	  && (nonzero_bits (op0, mode) & ~UINTVAL (op1)) == 0
2510	  && !side_effects_p (op0))
2511	return op1;
2512
2513      /* Canonicalize (X & C1) | C2.  */
2514      if (GET_CODE (op0) == AND
2515	  && CONST_INT_P (trueop1)
2516	  && CONST_INT_P (XEXP (op0, 1)))
2517	{
2518	  HOST_WIDE_INT mask = GET_MODE_MASK (mode);
2519	  HOST_WIDE_INT c1 = INTVAL (XEXP (op0, 1));
2520	  HOST_WIDE_INT c2 = INTVAL (trueop1);
2521
2522	  /* If (C1&C2) == C1, then (X&C1)|C2 becomes X.  */
2523	  if ((c1 & c2) == c1
2524	      && !side_effects_p (XEXP (op0, 0)))
2525	    return trueop1;
2526
2527	  /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
2528	  if (((c1|c2) & mask) == mask)
2529	    return simplify_gen_binary (IOR, mode, XEXP (op0, 0), op1);
2530
2531	  /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2.  */
2532	  if (((c1 & ~c2) & mask) != (c1 & mask))
2533	    {
2534	      tem = simplify_gen_binary (AND, mode, XEXP (op0, 0),
2535					 gen_int_mode (c1 & ~c2, mode));
2536	      return simplify_gen_binary (IOR, mode, tem, op1);
2537	    }
2538	}
2539
2540      /* Convert (A & B) | A to A.  */
2541      if (GET_CODE (op0) == AND
2542	  && (rtx_equal_p (XEXP (op0, 0), op1)
2543	      || rtx_equal_p (XEXP (op0, 1), op1))
2544	  && ! side_effects_p (XEXP (op0, 0))
2545	  && ! side_effects_p (XEXP (op0, 1)))
2546	return op1;
2547
2548      /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
2549         mode size to (rotate A CX).  */
2550
2551      if (GET_CODE (op1) == ASHIFT
2552          || GET_CODE (op1) == SUBREG)
2553        {
2554	  opleft = op1;
2555	  opright = op0;
2556	}
2557      else
2558        {
2559	  opright = op1;
2560	  opleft = op0;
2561	}
2562
2563      if (GET_CODE (opleft) == ASHIFT && GET_CODE (opright) == LSHIFTRT
2564          && rtx_equal_p (XEXP (opleft, 0), XEXP (opright, 0))
2565          && CONST_INT_P (XEXP (opleft, 1))
2566          && CONST_INT_P (XEXP (opright, 1))
2567          && (INTVAL (XEXP (opleft, 1)) + INTVAL (XEXP (opright, 1))
2568              == GET_MODE_PRECISION (mode)))
2569        return gen_rtx_ROTATE (mode, XEXP (opright, 0), XEXP (opleft, 1));
2570
2571      /* Same, but for ashift that has been "simplified" to a wider mode
2572        by simplify_shift_const.  */
2573
2574      if (GET_CODE (opleft) == SUBREG
2575          && GET_CODE (SUBREG_REG (opleft)) == ASHIFT
2576          && GET_CODE (opright) == LSHIFTRT
2577          && GET_CODE (XEXP (opright, 0)) == SUBREG
2578          && GET_MODE (opleft) == GET_MODE (XEXP (opright, 0))
2579          && SUBREG_BYTE (opleft) == SUBREG_BYTE (XEXP (opright, 0))
2580          && (GET_MODE_SIZE (GET_MODE (opleft))
2581              < GET_MODE_SIZE (GET_MODE (SUBREG_REG (opleft))))
2582          && rtx_equal_p (XEXP (SUBREG_REG (opleft), 0),
2583                          SUBREG_REG (XEXP (opright, 0)))
2584          && CONST_INT_P (XEXP (SUBREG_REG (opleft), 1))
2585          && CONST_INT_P (XEXP (opright, 1))
2586          && (INTVAL (XEXP (SUBREG_REG (opleft), 1)) + INTVAL (XEXP (opright, 1))
2587              == GET_MODE_PRECISION (mode)))
2588        return gen_rtx_ROTATE (mode, XEXP (opright, 0),
2589                               XEXP (SUBREG_REG (opleft), 1));
2590
2591      /* If we have (ior (and (X C1) C2)), simplify this by making
2592	 C1 as small as possible if C1 actually changes.  */
2593      if (CONST_INT_P (op1)
2594	  && (HWI_COMPUTABLE_MODE_P (mode)
2595	      || INTVAL (op1) > 0)
2596	  && GET_CODE (op0) == AND
2597	  && CONST_INT_P (XEXP (op0, 1))
2598	  && CONST_INT_P (op1)
2599	  && (UINTVAL (XEXP (op0, 1)) & UINTVAL (op1)) != 0)
2600	{
2601	  rtx tmp = simplify_gen_binary (AND, mode, XEXP (op0, 0),
2602					 gen_int_mode (UINTVAL (XEXP (op0, 1))
2603						       & ~UINTVAL (op1),
2604						       mode));
2605	  return simplify_gen_binary (IOR, mode, tmp, op1);
2606	}
2607
2608      /* If OP0 is (ashiftrt (plus ...) C), it might actually be
2609         a (sign_extend (plus ...)).  Then check if OP1 is a CONST_INT and
2610	 the PLUS does not affect any of the bits in OP1: then we can do
2611	 the IOR as a PLUS and we can associate.  This is valid if OP1
2612         can be safely shifted left C bits.  */
2613      if (CONST_INT_P (trueop1) && GET_CODE (op0) == ASHIFTRT
2614          && GET_CODE (XEXP (op0, 0)) == PLUS
2615          && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
2616          && CONST_INT_P (XEXP (op0, 1))
2617          && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
2618        {
2619          int count = INTVAL (XEXP (op0, 1));
2620          HOST_WIDE_INT mask = INTVAL (trueop1) << count;
2621
2622          if (mask >> count == INTVAL (trueop1)
2623	      && trunc_int_for_mode (mask, mode) == mask
2624              && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
2625	    return simplify_gen_binary (ASHIFTRT, mode,
2626					plus_constant (mode, XEXP (op0, 0),
2627						       mask),
2628					XEXP (op0, 1));
2629        }
2630
2631      tem = simplify_byte_swapping_operation (code, mode, op0, op1);
2632      if (tem)
2633	return tem;
2634
2635      tem = simplify_associative_operation (code, mode, op0, op1);
2636      if (tem)
2637	return tem;
2638      break;
2639
2640    case XOR:
2641      if (trueop1 == CONST0_RTX (mode))
2642	return op0;
2643      if (INTEGRAL_MODE_P (mode) && trueop1 == CONSTM1_RTX (mode))
2644	return simplify_gen_unary (NOT, mode, op0, mode);
2645      if (rtx_equal_p (trueop0, trueop1)
2646	  && ! side_effects_p (op0)
2647	  && GET_MODE_CLASS (mode) != MODE_CC)
2648	 return CONST0_RTX (mode);
2649
2650      /* Canonicalize XOR of the most significant bit to PLUS.  */
2651      if (CONST_SCALAR_INT_P (op1)
2652	  && mode_signbit_p (mode, op1))
2653	return simplify_gen_binary (PLUS, mode, op0, op1);
2654      /* (xor (plus X C1) C2) is (xor X (C1^C2)) if C1 is signbit.  */
2655      if (CONST_SCALAR_INT_P (op1)
2656	  && GET_CODE (op0) == PLUS
2657	  && CONST_SCALAR_INT_P (XEXP (op0, 1))
2658	  && mode_signbit_p (mode, XEXP (op0, 1)))
2659	return simplify_gen_binary (XOR, mode, XEXP (op0, 0),
2660				    simplify_gen_binary (XOR, mode, op1,
2661							 XEXP (op0, 1)));
2662
2663      /* If we are XORing two things that have no bits in common,
2664	 convert them into an IOR.  This helps to detect rotation encoded
2665	 using those methods and possibly other simplifications.  */
2666
2667      if (HWI_COMPUTABLE_MODE_P (mode)
2668	  && (nonzero_bits (op0, mode)
2669	      & nonzero_bits (op1, mode)) == 0)
2670	return (simplify_gen_binary (IOR, mode, op0, op1));
2671
2672      /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
2673	 Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
2674	 (NOT y).  */
2675      {
2676	int num_negated = 0;
2677
2678	if (GET_CODE (op0) == NOT)
2679	  num_negated++, op0 = XEXP (op0, 0);
2680	if (GET_CODE (op1) == NOT)
2681	  num_negated++, op1 = XEXP (op1, 0);
2682
2683	if (num_negated == 2)
2684	  return simplify_gen_binary (XOR, mode, op0, op1);
2685	else if (num_negated == 1)
2686	  return simplify_gen_unary (NOT, mode,
2687				     simplify_gen_binary (XOR, mode, op0, op1),
2688				     mode);
2689      }
2690
2691      /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
2692	 correspond to a machine insn or result in further simplifications
2693	 if B is a constant.  */
2694
2695      if (GET_CODE (op0) == AND
2696	  && rtx_equal_p (XEXP (op0, 1), op1)
2697	  && ! side_effects_p (op1))
2698	return simplify_gen_binary (AND, mode,
2699				    simplify_gen_unary (NOT, mode,
2700							XEXP (op0, 0), mode),
2701				    op1);
2702
2703      else if (GET_CODE (op0) == AND
2704	       && rtx_equal_p (XEXP (op0, 0), op1)
2705	       && ! side_effects_p (op1))
2706	return simplify_gen_binary (AND, mode,
2707				    simplify_gen_unary (NOT, mode,
2708							XEXP (op0, 1), mode),
2709				    op1);
2710
2711      /* Given (xor (ior (xor A B) C) D), where B, C and D are
2712	 constants, simplify to (xor (ior A C) (B&~C)^D), canceling
2713	 out bits inverted twice and not set by C.  Similarly, given
2714	 (xor (and (xor A B) C) D), simplify without inverting C in
2715	 the xor operand: (xor (and A C) (B&C)^D).
2716      */
2717      else if ((GET_CODE (op0) == IOR || GET_CODE (op0) == AND)
2718	       && GET_CODE (XEXP (op0, 0)) == XOR
2719	       && CONST_INT_P (op1)
2720	       && CONST_INT_P (XEXP (op0, 1))
2721	       && CONST_INT_P (XEXP (XEXP (op0, 0), 1)))
2722	{
2723	  enum rtx_code op = GET_CODE (op0);
2724	  rtx a = XEXP (XEXP (op0, 0), 0);
2725	  rtx b = XEXP (XEXP (op0, 0), 1);
2726	  rtx c = XEXP (op0, 1);
2727	  rtx d = op1;
2728	  HOST_WIDE_INT bval = INTVAL (b);
2729	  HOST_WIDE_INT cval = INTVAL (c);
2730	  HOST_WIDE_INT dval = INTVAL (d);
2731	  HOST_WIDE_INT xcval;
2732
2733	  if (op == IOR)
2734	    xcval = ~cval;
2735	  else
2736	    xcval = cval;
2737
2738	  return simplify_gen_binary (XOR, mode,
2739				      simplify_gen_binary (op, mode, a, c),
2740				      gen_int_mode ((bval & xcval) ^ dval,
2741						    mode));
2742	}
2743
2744      /* Given (xor (and A B) C), using P^Q == (~P&Q) | (~Q&P),
2745	 we can transform like this:
2746            (A&B)^C == ~(A&B)&C | ~C&(A&B)
2747                    == (~A|~B)&C | ~C&(A&B)    * DeMorgan's Law
2748                    == ~A&C | ~B&C | A&(~C&B)  * Distribute and re-order
2749	 Attempt a few simplifications when B and C are both constants.  */
2750      if (GET_CODE (op0) == AND
2751	  && CONST_INT_P (op1)
2752	  && CONST_INT_P (XEXP (op0, 1)))
2753	{
2754	  rtx a = XEXP (op0, 0);
2755	  rtx b = XEXP (op0, 1);
2756	  rtx c = op1;
2757	  HOST_WIDE_INT bval = INTVAL (b);
2758	  HOST_WIDE_INT cval = INTVAL (c);
2759
2760	  /* Instead of computing ~A&C, we compute its negated value,
2761	     ~(A|~C).  If it yields -1, ~A&C is zero, so we can
2762	     optimize for sure.  If it does not simplify, we still try
2763	     to compute ~A&C below, but since that always allocates
2764	     RTL, we don't try that before committing to returning a
2765	     simplified expression.  */
2766	  rtx n_na_c = simplify_binary_operation (IOR, mode, a,
2767						  GEN_INT (~cval));
2768
2769	  if ((~cval & bval) == 0)
2770	    {
2771	      rtx na_c = NULL_RTX;
2772	      if (n_na_c)
2773		na_c = simplify_gen_unary (NOT, mode, n_na_c, mode);
2774	      else
2775		{
2776		  /* If ~A does not simplify, don't bother: we don't
2777		     want to simplify 2 operations into 3, and if na_c
2778		     were to simplify with na, n_na_c would have
2779		     simplified as well.  */
2780		  rtx na = simplify_unary_operation (NOT, mode, a, mode);
2781		  if (na)
2782		    na_c = simplify_gen_binary (AND, mode, na, c);
2783		}
2784
2785	      /* Try to simplify ~A&C | ~B&C.  */
2786	      if (na_c != NULL_RTX)
2787		return simplify_gen_binary (IOR, mode, na_c,
2788					    gen_int_mode (~bval & cval, mode));
2789	    }
2790	  else
2791	    {
2792	      /* If ~A&C is zero, simplify A&(~C&B) | ~B&C.  */
2793	      if (n_na_c == CONSTM1_RTX (mode))
2794		{
2795		  rtx a_nc_b = simplify_gen_binary (AND, mode, a,
2796						    gen_int_mode (~cval & bval,
2797								  mode));
2798		  return simplify_gen_binary (IOR, mode, a_nc_b,
2799					      gen_int_mode (~bval & cval,
2800							    mode));
2801		}
2802	    }
2803	}
2804
2805      /* (xor (comparison foo bar) (const_int 1)) can become the reversed
2806	 comparison if STORE_FLAG_VALUE is 1.  */
2807      if (STORE_FLAG_VALUE == 1
2808	  && trueop1 == const1_rtx
2809	  && COMPARISON_P (op0)
2810	  && (reversed = reversed_comparison (op0, mode)))
2811	return reversed;
2812
2813      /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
2814	 is (lt foo (const_int 0)), so we can perform the above
2815	 simplification if STORE_FLAG_VALUE is 1.  */
2816
2817      if (STORE_FLAG_VALUE == 1
2818	  && trueop1 == const1_rtx
2819	  && GET_CODE (op0) == LSHIFTRT
2820	  && CONST_INT_P (XEXP (op0, 1))
2821	  && INTVAL (XEXP (op0, 1)) == GET_MODE_PRECISION (mode) - 1)
2822	return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
2823
2824      /* (xor (comparison foo bar) (const_int sign-bit))
2825	 when STORE_FLAG_VALUE is the sign bit.  */
2826      if (val_signbit_p (mode, STORE_FLAG_VALUE)
2827	  && trueop1 == const_true_rtx
2828	  && COMPARISON_P (op0)
2829	  && (reversed = reversed_comparison (op0, mode)))
2830	return reversed;
2831
2832      tem = simplify_byte_swapping_operation (code, mode, op0, op1);
2833      if (tem)
2834	return tem;
2835
2836      tem = simplify_associative_operation (code, mode, op0, op1);
2837      if (tem)
2838	return tem;
2839      break;
2840
2841    case AND:
2842      if (trueop1 == CONST0_RTX (mode) && ! side_effects_p (op0))
2843	return trueop1;
2844      if (INTEGRAL_MODE_P (mode) && trueop1 == CONSTM1_RTX (mode))
2845	return op0;
2846      if (HWI_COMPUTABLE_MODE_P (mode))
2847	{
2848	  HOST_WIDE_INT nzop0 = nonzero_bits (trueop0, mode);
2849	  HOST_WIDE_INT nzop1;
2850	  if (CONST_INT_P (trueop1))
2851	    {
2852	      HOST_WIDE_INT val1 = INTVAL (trueop1);
2853	      /* If we are turning off bits already known off in OP0, we need
2854		 not do an AND.  */
2855	      if ((nzop0 & ~val1) == 0)
2856		return op0;
2857	    }
2858	  nzop1 = nonzero_bits (trueop1, mode);
2859	  /* If we are clearing all the nonzero bits, the result is zero.  */
2860	  if ((nzop1 & nzop0) == 0
2861	      && !side_effects_p (op0) && !side_effects_p (op1))
2862	    return CONST0_RTX (mode);
2863	}
2864      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0)
2865	  && GET_MODE_CLASS (mode) != MODE_CC)
2866	return op0;
2867      /* A & (~A) -> 0 */
2868      if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
2869	   || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
2870	  && ! side_effects_p (op0)
2871	  && GET_MODE_CLASS (mode) != MODE_CC)
2872	return CONST0_RTX (mode);
2873
2874      /* Transform (and (extend X) C) into (zero_extend (and X C)) if
2875	 there are no nonzero bits of C outside of X's mode.  */
2876      if ((GET_CODE (op0) == SIGN_EXTEND
2877	   || GET_CODE (op0) == ZERO_EXTEND)
2878	  && CONST_INT_P (trueop1)
2879	  && HWI_COMPUTABLE_MODE_P (mode)
2880	  && (~GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))
2881	      & UINTVAL (trueop1)) == 0)
2882	{
2883	  machine_mode imode = GET_MODE (XEXP (op0, 0));
2884	  tem = simplify_gen_binary (AND, imode, XEXP (op0, 0),
2885				     gen_int_mode (INTVAL (trueop1),
2886						   imode));
2887	  return simplify_gen_unary (ZERO_EXTEND, mode, tem, imode);
2888	}
2889
2890      /* Transform (and (truncate X) C) into (truncate (and X C)).  This way
2891	 we might be able to further simplify the AND with X and potentially
2892	 remove the truncation altogether.  */
2893      if (GET_CODE (op0) == TRUNCATE && CONST_INT_P (trueop1))
2894	{
2895	  rtx x = XEXP (op0, 0);
2896	  machine_mode xmode = GET_MODE (x);
2897	  tem = simplify_gen_binary (AND, xmode, x,
2898				     gen_int_mode (INTVAL (trueop1), xmode));
2899	  return simplify_gen_unary (TRUNCATE, mode, tem, xmode);
2900	}
2901
2902      /* Canonicalize (A | C1) & C2 as (A & C2) | (C1 & C2).  */
2903      if (GET_CODE (op0) == IOR
2904	  && CONST_INT_P (trueop1)
2905	  && CONST_INT_P (XEXP (op0, 1)))
2906	{
2907	  HOST_WIDE_INT tmp = INTVAL (trueop1) & INTVAL (XEXP (op0, 1));
2908	  return simplify_gen_binary (IOR, mode,
2909				      simplify_gen_binary (AND, mode,
2910							   XEXP (op0, 0), op1),
2911				      gen_int_mode (tmp, mode));
2912	}
2913
2914      /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
2915	 insn (and may simplify more).  */
2916      if (GET_CODE (op0) == XOR
2917	  && rtx_equal_p (XEXP (op0, 0), op1)
2918	  && ! side_effects_p (op1))
2919	return simplify_gen_binary (AND, mode,
2920				    simplify_gen_unary (NOT, mode,
2921							XEXP (op0, 1), mode),
2922				    op1);
2923
2924      if (GET_CODE (op0) == XOR
2925	  && rtx_equal_p (XEXP (op0, 1), op1)
2926	  && ! side_effects_p (op1))
2927	return simplify_gen_binary (AND, mode,
2928				    simplify_gen_unary (NOT, mode,
2929							XEXP (op0, 0), mode),
2930				    op1);
2931
2932      /* Similarly for (~(A ^ B)) & A.  */
2933      if (GET_CODE (op0) == NOT
2934	  && GET_CODE (XEXP (op0, 0)) == XOR
2935	  && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
2936	  && ! side_effects_p (op1))
2937	return simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
2938
2939      if (GET_CODE (op0) == NOT
2940	  && GET_CODE (XEXP (op0, 0)) == XOR
2941	  && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
2942	  && ! side_effects_p (op1))
2943	return simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
2944
2945      /* Convert (A | B) & A to A.  */
2946      if (GET_CODE (op0) == IOR
2947	  && (rtx_equal_p (XEXP (op0, 0), op1)
2948	      || rtx_equal_p (XEXP (op0, 1), op1))
2949	  && ! side_effects_p (XEXP (op0, 0))
2950	  && ! side_effects_p (XEXP (op0, 1)))
2951	return op1;
2952
2953      /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
2954	 ((A & N) + B) & M -> (A + B) & M
2955	 Similarly if (N & M) == 0,
2956	 ((A | N) + B) & M -> (A + B) & M
2957	 and for - instead of + and/or ^ instead of |.
2958         Also, if (N & M) == 0, then
2959	 (A +- N) & M -> A & M.  */
2960      if (CONST_INT_P (trueop1)
2961	  && HWI_COMPUTABLE_MODE_P (mode)
2962	  && ~UINTVAL (trueop1)
2963	  && (UINTVAL (trueop1) & (UINTVAL (trueop1) + 1)) == 0
2964	  && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS))
2965	{
2966	  rtx pmop[2];
2967	  int which;
2968
2969	  pmop[0] = XEXP (op0, 0);
2970	  pmop[1] = XEXP (op0, 1);
2971
2972	  if (CONST_INT_P (pmop[1])
2973	      && (UINTVAL (pmop[1]) & UINTVAL (trueop1)) == 0)
2974	    return simplify_gen_binary (AND, mode, pmop[0], op1);
2975
2976	  for (which = 0; which < 2; which++)
2977	    {
2978	      tem = pmop[which];
2979	      switch (GET_CODE (tem))
2980		{
2981		case AND:
2982		  if (CONST_INT_P (XEXP (tem, 1))
2983		      && (UINTVAL (XEXP (tem, 1)) & UINTVAL (trueop1))
2984		      == UINTVAL (trueop1))
2985		    pmop[which] = XEXP (tem, 0);
2986		  break;
2987		case IOR:
2988		case XOR:
2989		  if (CONST_INT_P (XEXP (tem, 1))
2990		      && (UINTVAL (XEXP (tem, 1)) & UINTVAL (trueop1)) == 0)
2991		    pmop[which] = XEXP (tem, 0);
2992		  break;
2993		default:
2994		  break;
2995		}
2996	    }
2997
2998	  if (pmop[0] != XEXP (op0, 0) || pmop[1] != XEXP (op0, 1))
2999	    {
3000	      tem = simplify_gen_binary (GET_CODE (op0), mode,
3001					 pmop[0], pmop[1]);
3002	      return simplify_gen_binary (code, mode, tem, op1);
3003	    }
3004	}
3005
3006      /* (and X (ior (not X) Y) -> (and X Y) */
3007      if (GET_CODE (op1) == IOR
3008	  && GET_CODE (XEXP (op1, 0)) == NOT
3009	  && rtx_equal_p (op0, XEXP (XEXP (op1, 0), 0)))
3010       return simplify_gen_binary (AND, mode, op0, XEXP (op1, 1));
3011
3012      /* (and (ior (not X) Y) X) -> (and X Y) */
3013      if (GET_CODE (op0) == IOR
3014	  && GET_CODE (XEXP (op0, 0)) == NOT
3015	  && rtx_equal_p (op1, XEXP (XEXP (op0, 0), 0)))
3016	return simplify_gen_binary (AND, mode, op1, XEXP (op0, 1));
3017
3018      /* (and X (ior Y (not X)) -> (and X Y) */
3019      if (GET_CODE (op1) == IOR
3020	  && GET_CODE (XEXP (op1, 1)) == NOT
3021	  && rtx_equal_p (op0, XEXP (XEXP (op1, 1), 0)))
3022       return simplify_gen_binary (AND, mode, op0, XEXP (op1, 0));
3023
3024      /* (and (ior Y (not X)) X) -> (and X Y) */
3025      if (GET_CODE (op0) == IOR
3026	  && GET_CODE (XEXP (op0, 1)) == NOT
3027	  && rtx_equal_p (op1, XEXP (XEXP (op0, 1), 0)))
3028	return simplify_gen_binary (AND, mode, op1, XEXP (op0, 0));
3029
3030      tem = simplify_byte_swapping_operation (code, mode, op0, op1);
3031      if (tem)
3032	return tem;
3033
3034      tem = simplify_associative_operation (code, mode, op0, op1);
3035      if (tem)
3036	return tem;
3037      break;
3038
3039    case UDIV:
3040      /* 0/x is 0 (or x&0 if x has side-effects).  */
3041      if (trueop0 == CONST0_RTX (mode))
3042	{
3043	  if (side_effects_p (op1))
3044	    return simplify_gen_binary (AND, mode, op1, trueop0);
3045	  return trueop0;
3046	}
3047      /* x/1 is x.  */
3048      if (trueop1 == CONST1_RTX (mode))
3049	{
3050	  tem = rtl_hooks.gen_lowpart_no_emit (mode, op0);
3051	  if (tem)
3052	    return tem;
3053	}
3054      /* Convert divide by power of two into shift.  */
3055      if (CONST_INT_P (trueop1)
3056	  && (val = exact_log2 (UINTVAL (trueop1))) > 0)
3057	return simplify_gen_binary (LSHIFTRT, mode, op0, GEN_INT (val));
3058      break;
3059
3060    case DIV:
3061      /* Handle floating point and integers separately.  */
3062      if (SCALAR_FLOAT_MODE_P (mode))
3063	{
3064	  /* Maybe change 0.0 / x to 0.0.  This transformation isn't
3065	     safe for modes with NaNs, since 0.0 / 0.0 will then be
3066	     NaN rather than 0.0.  Nor is it safe for modes with signed
3067	     zeros, since dividing 0 by a negative number gives -0.0  */
3068	  if (trueop0 == CONST0_RTX (mode)
3069	      && !HONOR_NANS (mode)
3070	      && !HONOR_SIGNED_ZEROS (mode)
3071	      && ! side_effects_p (op1))
3072	    return op0;
3073	  /* x/1.0 is x.  */
3074	  if (trueop1 == CONST1_RTX (mode)
3075	      && !HONOR_SNANS (mode))
3076	    return op0;
3077
3078	  if (CONST_DOUBLE_AS_FLOAT_P (trueop1)
3079	      && trueop1 != CONST0_RTX (mode))
3080	    {
3081	      REAL_VALUE_TYPE d;
3082	      REAL_VALUE_FROM_CONST_DOUBLE (d, trueop1);
3083
3084	      /* x/-1.0 is -x.  */
3085	      if (REAL_VALUES_EQUAL (d, dconstm1)
3086		  && !HONOR_SNANS (mode))
3087		return simplify_gen_unary (NEG, mode, op0, mode);
3088
3089	      /* Change FP division by a constant into multiplication.
3090		 Only do this with -freciprocal-math.  */
3091	      if (flag_reciprocal_math
3092		  && !REAL_VALUES_EQUAL (d, dconst0))
3093		{
3094		  REAL_ARITHMETIC (d, RDIV_EXPR, dconst1, d);
3095		  tem = CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
3096		  return simplify_gen_binary (MULT, mode, op0, tem);
3097		}
3098	    }
3099	}
3100      else if (SCALAR_INT_MODE_P (mode))
3101	{
3102	  /* 0/x is 0 (or x&0 if x has side-effects).  */
3103	  if (trueop0 == CONST0_RTX (mode)
3104	      && !cfun->can_throw_non_call_exceptions)
3105	    {
3106	      if (side_effects_p (op1))
3107		return simplify_gen_binary (AND, mode, op1, trueop0);
3108	      return trueop0;
3109	    }
3110	  /* x/1 is x.  */
3111	  if (trueop1 == CONST1_RTX (mode))
3112	    {
3113	      tem = rtl_hooks.gen_lowpart_no_emit (mode, op0);
3114	      if (tem)
3115		return tem;
3116	    }
3117	  /* x/-1 is -x.  */
3118	  if (trueop1 == constm1_rtx)
3119	    {
3120	      rtx x = rtl_hooks.gen_lowpart_no_emit (mode, op0);
3121	      if (x)
3122		return simplify_gen_unary (NEG, mode, x, mode);
3123	    }
3124	}
3125      break;
3126
3127    case UMOD:
3128      /* 0%x is 0 (or x&0 if x has side-effects).  */
3129      if (trueop0 == CONST0_RTX (mode))
3130	{
3131	  if (side_effects_p (op1))
3132	    return simplify_gen_binary (AND, mode, op1, trueop0);
3133	  return trueop0;
3134	}
3135      /* x%1 is 0 (of x&0 if x has side-effects).  */
3136      if (trueop1 == CONST1_RTX (mode))
3137	{
3138	  if (side_effects_p (op0))
3139	    return simplify_gen_binary (AND, mode, op0, CONST0_RTX (mode));
3140	  return CONST0_RTX (mode);
3141	}
3142      /* Implement modulus by power of two as AND.  */
3143      if (CONST_INT_P (trueop1)
3144	  && exact_log2 (UINTVAL (trueop1)) > 0)
3145	return simplify_gen_binary (AND, mode, op0,
3146				    gen_int_mode (INTVAL (op1) - 1, mode));
3147      break;
3148
3149    case MOD:
3150      /* 0%x is 0 (or x&0 if x has side-effects).  */
3151      if (trueop0 == CONST0_RTX (mode))
3152	{
3153	  if (side_effects_p (op1))
3154	    return simplify_gen_binary (AND, mode, op1, trueop0);
3155	  return trueop0;
3156	}
3157      /* x%1 and x%-1 is 0 (or x&0 if x has side-effects).  */
3158      if (trueop1 == CONST1_RTX (mode) || trueop1 == constm1_rtx)
3159	{
3160	  if (side_effects_p (op0))
3161	    return simplify_gen_binary (AND, mode, op0, CONST0_RTX (mode));
3162	  return CONST0_RTX (mode);
3163	}
3164      break;
3165
3166    case ROTATERT:
3167    case ROTATE:
3168      /* Canonicalize rotates by constant amount.  If op1 is bitsize / 2,
3169	 prefer left rotation, if op1 is from bitsize / 2 + 1 to
3170	 bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
3171	 amount instead.  */
3172#if defined(HAVE_rotate) && defined(HAVE_rotatert)
3173      if (CONST_INT_P (trueop1)
3174	  && IN_RANGE (INTVAL (trueop1),
3175		       GET_MODE_PRECISION (mode) / 2 + (code == ROTATE),
3176		       GET_MODE_PRECISION (mode) - 1))
3177	return simplify_gen_binary (code == ROTATE ? ROTATERT : ROTATE,
3178				    mode, op0, GEN_INT (GET_MODE_PRECISION (mode)
3179							- INTVAL (trueop1)));
3180#endif
3181      /* FALLTHRU */
3182    case ASHIFTRT:
3183      if (trueop1 == CONST0_RTX (mode))
3184	return op0;
3185      if (trueop0 == CONST0_RTX (mode) && ! side_effects_p (op1))
3186	return op0;
3187      /* Rotating ~0 always results in ~0.  */
3188      if (CONST_INT_P (trueop0) && width <= HOST_BITS_PER_WIDE_INT
3189	  && UINTVAL (trueop0) == GET_MODE_MASK (mode)
3190	  && ! side_effects_p (op1))
3191	return op0;
3192      /* Given:
3193	 scalar modes M1, M2
3194	 scalar constants c1, c2
3195	 size (M2) > size (M1)
3196	 c1 == size (M2) - size (M1)
3197	 optimize:
3198	 (ashiftrt:M1 (subreg:M1 (lshiftrt:M2 (reg:M2) (const_int <c1>))
3199				 <low_part>)
3200		      (const_int <c2>))
3201	 to:
3202	 (subreg:M1 (ashiftrt:M2 (reg:M2) (const_int <c1 + c2>))
3203		    <low_part>).  */
3204      if (code == ASHIFTRT
3205	  && !VECTOR_MODE_P (mode)
3206	  && SUBREG_P (op0)
3207	  && CONST_INT_P (op1)
3208	  && GET_CODE (SUBREG_REG (op0)) == LSHIFTRT
3209	  && !VECTOR_MODE_P (GET_MODE (SUBREG_REG (op0)))
3210	  && CONST_INT_P (XEXP (SUBREG_REG (op0), 1))
3211	  && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
3212	      > GET_MODE_BITSIZE (mode))
3213	  && (INTVAL (XEXP (SUBREG_REG (op0), 1))
3214	      == (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
3215		  - GET_MODE_BITSIZE (mode)))
3216	  && subreg_lowpart_p (op0))
3217	{
3218	  rtx tmp = GEN_INT (INTVAL (XEXP (SUBREG_REG (op0), 1))
3219			     + INTVAL (op1));
3220	  machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3221	  tmp = simplify_gen_binary (ASHIFTRT,
3222				     GET_MODE (SUBREG_REG (op0)),
3223				     XEXP (SUBREG_REG (op0), 0),
3224				     tmp);
3225	  return simplify_gen_subreg (mode, tmp, inner_mode,
3226				      subreg_lowpart_offset (mode,
3227							     inner_mode));
3228	}
3229    canonicalize_shift:
3230      if (SHIFT_COUNT_TRUNCATED && CONST_INT_P (op1))
3231	{
3232	  val = INTVAL (op1) & (GET_MODE_PRECISION (mode) - 1);
3233	  if (val != INTVAL (op1))
3234	    return simplify_gen_binary (code, mode, op0, GEN_INT (val));
3235	}
3236      break;
3237
3238    case ASHIFT:
3239    case SS_ASHIFT:
3240    case US_ASHIFT:
3241      if (trueop1 == CONST0_RTX (mode))
3242	return op0;
3243      if (trueop0 == CONST0_RTX (mode) && ! side_effects_p (op1))
3244	return op0;
3245      goto canonicalize_shift;
3246
3247    case LSHIFTRT:
3248      if (trueop1 == CONST0_RTX (mode))
3249	return op0;
3250      if (trueop0 == CONST0_RTX (mode) && ! side_effects_p (op1))
3251	return op0;
3252      /* Optimize (lshiftrt (clz X) C) as (eq X 0).  */
3253      if (GET_CODE (op0) == CLZ
3254	  && CONST_INT_P (trueop1)
3255	  && STORE_FLAG_VALUE == 1
3256	  && INTVAL (trueop1) < (HOST_WIDE_INT)width)
3257	{
3258	  machine_mode imode = GET_MODE (XEXP (op0, 0));
3259	  unsigned HOST_WIDE_INT zero_val = 0;
3260
3261	  if (CLZ_DEFINED_VALUE_AT_ZERO (imode, zero_val)
3262	      && zero_val == GET_MODE_PRECISION (imode)
3263	      && INTVAL (trueop1) == exact_log2 (zero_val))
3264	    return simplify_gen_relational (EQ, mode, imode,
3265					    XEXP (op0, 0), const0_rtx);
3266	}
3267      goto canonicalize_shift;
3268
3269    case SMIN:
3270      if (width <= HOST_BITS_PER_WIDE_INT
3271	  && mode_signbit_p (mode, trueop1)
3272	  && ! side_effects_p (op0))
3273	return op1;
3274      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
3275	return op0;
3276      tem = simplify_associative_operation (code, mode, op0, op1);
3277      if (tem)
3278	return tem;
3279      break;
3280
3281    case SMAX:
3282      if (width <= HOST_BITS_PER_WIDE_INT
3283	  && CONST_INT_P (trueop1)
3284	  && (UINTVAL (trueop1) == GET_MODE_MASK (mode) >> 1)
3285	  && ! side_effects_p (op0))
3286	return op1;
3287      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
3288	return op0;
3289      tem = simplify_associative_operation (code, mode, op0, op1);
3290      if (tem)
3291	return tem;
3292      break;
3293
3294    case UMIN:
3295      if (trueop1 == CONST0_RTX (mode) && ! side_effects_p (op0))
3296	return op1;
3297      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
3298	return op0;
3299      tem = simplify_associative_operation (code, mode, op0, op1);
3300      if (tem)
3301	return tem;
3302      break;
3303
3304    case UMAX:
3305      if (trueop1 == constm1_rtx && ! side_effects_p (op0))
3306	return op1;
3307      if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
3308	return op0;
3309      tem = simplify_associative_operation (code, mode, op0, op1);
3310      if (tem)
3311	return tem;
3312      break;
3313
3314    case SS_PLUS:
3315    case US_PLUS:
3316    case SS_MINUS:
3317    case US_MINUS:
3318    case SS_MULT:
3319    case US_MULT:
3320    case SS_DIV:
3321    case US_DIV:
3322      /* ??? There are simplifications that can be done.  */
3323      return 0;
3324
3325    case VEC_SELECT:
3326      if (!VECTOR_MODE_P (mode))
3327	{
3328	  gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0)));
3329	  gcc_assert (mode == GET_MODE_INNER (GET_MODE (trueop0)));
3330	  gcc_assert (GET_CODE (trueop1) == PARALLEL);
3331	  gcc_assert (XVECLEN (trueop1, 0) == 1);
3332	  gcc_assert (CONST_INT_P (XVECEXP (trueop1, 0, 0)));
3333
3334	  if (GET_CODE (trueop0) == CONST_VECTOR)
3335	    return CONST_VECTOR_ELT (trueop0, INTVAL (XVECEXP
3336						      (trueop1, 0, 0)));
3337
3338	  /* Extract a scalar element from a nested VEC_SELECT expression
3339	     (with optional nested VEC_CONCAT expression).  Some targets
3340	     (i386) extract scalar element from a vector using chain of
3341	     nested VEC_SELECT expressions.  When input operand is a memory
3342	     operand, this operation can be simplified to a simple scalar
3343	     load from an offseted memory address.  */
3344	  if (GET_CODE (trueop0) == VEC_SELECT)
3345	    {
3346	      rtx op0 = XEXP (trueop0, 0);
3347	      rtx op1 = XEXP (trueop0, 1);
3348
3349	      machine_mode opmode = GET_MODE (op0);
3350	      int elt_size = GET_MODE_SIZE (GET_MODE_INNER (opmode));
3351	      int n_elts = GET_MODE_SIZE (opmode) / elt_size;
3352
3353	      int i = INTVAL (XVECEXP (trueop1, 0, 0));
3354	      int elem;
3355
3356	      rtvec vec;
3357	      rtx tmp_op, tmp;
3358
3359	      gcc_assert (GET_CODE (op1) == PARALLEL);
3360	      gcc_assert (i < n_elts);
3361
3362	      /* Select element, pointed by nested selector.  */
3363	      elem = INTVAL (XVECEXP (op1, 0, i));
3364
3365	      /* Handle the case when nested VEC_SELECT wraps VEC_CONCAT.  */
3366	      if (GET_CODE (op0) == VEC_CONCAT)
3367		{
3368		  rtx op00 = XEXP (op0, 0);
3369		  rtx op01 = XEXP (op0, 1);
3370
3371		  machine_mode mode00, mode01;
3372		  int n_elts00, n_elts01;
3373
3374		  mode00 = GET_MODE (op00);
3375		  mode01 = GET_MODE (op01);
3376
3377		  /* Find out number of elements of each operand.  */
3378		  if (VECTOR_MODE_P (mode00))
3379		    {
3380		      elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode00));
3381		      n_elts00 = GET_MODE_SIZE (mode00) / elt_size;
3382		    }
3383		  else
3384		    n_elts00 = 1;
3385
3386		  if (VECTOR_MODE_P (mode01))
3387		    {
3388		      elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode01));
3389		      n_elts01 = GET_MODE_SIZE (mode01) / elt_size;
3390		    }
3391		  else
3392		    n_elts01 = 1;
3393
3394		  gcc_assert (n_elts == n_elts00 + n_elts01);
3395
3396		  /* Select correct operand of VEC_CONCAT
3397		     and adjust selector. */
3398		  if (elem < n_elts01)
3399		    tmp_op = op00;
3400		  else
3401		    {
3402		      tmp_op = op01;
3403		      elem -= n_elts00;
3404		    }
3405		}
3406	      else
3407		tmp_op = op0;
3408
3409	      vec = rtvec_alloc (1);
3410	      RTVEC_ELT (vec, 0) = GEN_INT (elem);
3411
3412	      tmp = gen_rtx_fmt_ee (code, mode,
3413				    tmp_op, gen_rtx_PARALLEL (VOIDmode, vec));
3414	      return tmp;
3415	    }
3416	  if (GET_CODE (trueop0) == VEC_DUPLICATE
3417	      && GET_MODE (XEXP (trueop0, 0)) == mode)
3418	    return XEXP (trueop0, 0);
3419	}
3420      else
3421	{
3422	  gcc_assert (VECTOR_MODE_P (GET_MODE (trueop0)));
3423	  gcc_assert (GET_MODE_INNER (mode)
3424		      == GET_MODE_INNER (GET_MODE (trueop0)));
3425	  gcc_assert (GET_CODE (trueop1) == PARALLEL);
3426
3427	  if (GET_CODE (trueop0) == CONST_VECTOR)
3428	    {
3429	      int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
3430	      unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
3431	      rtvec v = rtvec_alloc (n_elts);
3432	      unsigned int i;
3433
3434	      gcc_assert (XVECLEN (trueop1, 0) == (int) n_elts);
3435	      for (i = 0; i < n_elts; i++)
3436		{
3437		  rtx x = XVECEXP (trueop1, 0, i);
3438
3439		  gcc_assert (CONST_INT_P (x));
3440		  RTVEC_ELT (v, i) = CONST_VECTOR_ELT (trueop0,
3441						       INTVAL (x));
3442		}
3443
3444	      return gen_rtx_CONST_VECTOR (mode, v);
3445	    }
3446
3447	  /* Recognize the identity.  */
3448	  if (GET_MODE (trueop0) == mode)
3449	    {
3450	      bool maybe_ident = true;
3451	      for (int i = 0; i < XVECLEN (trueop1, 0); i++)
3452		{
3453		  rtx j = XVECEXP (trueop1, 0, i);
3454		  if (!CONST_INT_P (j) || INTVAL (j) != i)
3455		    {
3456		      maybe_ident = false;
3457		      break;
3458		    }
3459		}
3460	      if (maybe_ident)
3461		return trueop0;
3462	    }
3463
3464	  /* If we build {a,b} then permute it, build the result directly.  */
3465	  if (XVECLEN (trueop1, 0) == 2
3466	      && CONST_INT_P (XVECEXP (trueop1, 0, 0))
3467	      && CONST_INT_P (XVECEXP (trueop1, 0, 1))
3468	      && GET_CODE (trueop0) == VEC_CONCAT
3469	      && GET_CODE (XEXP (trueop0, 0)) == VEC_CONCAT
3470	      && GET_MODE (XEXP (trueop0, 0)) == mode
3471	      && GET_CODE (XEXP (trueop0, 1)) == VEC_CONCAT
3472	      && GET_MODE (XEXP (trueop0, 1)) == mode)
3473	    {
3474	      unsigned int i0 = INTVAL (XVECEXP (trueop1, 0, 0));
3475	      unsigned int i1 = INTVAL (XVECEXP (trueop1, 0, 1));
3476	      rtx subop0, subop1;
3477
3478	      gcc_assert (i0 < 4 && i1 < 4);
3479	      subop0 = XEXP (XEXP (trueop0, i0 / 2), i0 % 2);
3480	      subop1 = XEXP (XEXP (trueop0, i1 / 2), i1 % 2);
3481
3482	      return simplify_gen_binary (VEC_CONCAT, mode, subop0, subop1);
3483	    }
3484
3485	  if (XVECLEN (trueop1, 0) == 2
3486	      && CONST_INT_P (XVECEXP (trueop1, 0, 0))
3487	      && CONST_INT_P (XVECEXP (trueop1, 0, 1))
3488	      && GET_CODE (trueop0) == VEC_CONCAT
3489	      && GET_MODE (trueop0) == mode)
3490	    {
3491	      unsigned int i0 = INTVAL (XVECEXP (trueop1, 0, 0));
3492	      unsigned int i1 = INTVAL (XVECEXP (trueop1, 0, 1));
3493	      rtx subop0, subop1;
3494
3495	      gcc_assert (i0 < 2 && i1 < 2);
3496	      subop0 = XEXP (trueop0, i0);
3497	      subop1 = XEXP (trueop0, i1);
3498
3499	      return simplify_gen_binary (VEC_CONCAT, mode, subop0, subop1);
3500	    }
3501
3502	  /* If we select one half of a vec_concat, return that.  */
3503	  if (GET_CODE (trueop0) == VEC_CONCAT
3504	      && CONST_INT_P (XVECEXP (trueop1, 0, 0)))
3505	    {
3506	      rtx subop0 = XEXP (trueop0, 0);
3507	      rtx subop1 = XEXP (trueop0, 1);
3508	      machine_mode mode0 = GET_MODE (subop0);
3509	      machine_mode mode1 = GET_MODE (subop1);
3510	      int li = GET_MODE_SIZE (GET_MODE_INNER (mode0));
3511	      int l0 = GET_MODE_SIZE (mode0) / li;
3512	      int l1 = GET_MODE_SIZE (mode1) / li;
3513	      int i0 = INTVAL (XVECEXP (trueop1, 0, 0));
3514	      if (i0 == 0 && !side_effects_p (op1) && mode == mode0)
3515		{
3516		  bool success = true;
3517		  for (int i = 1; i < l0; ++i)
3518		    {
3519		      rtx j = XVECEXP (trueop1, 0, i);
3520		      if (!CONST_INT_P (j) || INTVAL (j) != i)
3521			{
3522			  success = false;
3523			  break;
3524			}
3525		    }
3526		  if (success)
3527		    return subop0;
3528		}
3529	      if (i0 == l0 && !side_effects_p (op0) && mode == mode1)
3530		{
3531		  bool success = true;
3532		  for (int i = 1; i < l1; ++i)
3533		    {
3534		      rtx j = XVECEXP (trueop1, 0, i);
3535		      if (!CONST_INT_P (j) || INTVAL (j) != i0 + i)
3536			{
3537			  success = false;
3538			  break;
3539			}
3540		    }
3541		  if (success)
3542		    return subop1;
3543		}
3544	    }
3545	}
3546
3547      if (XVECLEN (trueop1, 0) == 1
3548	  && CONST_INT_P (XVECEXP (trueop1, 0, 0))
3549	  && GET_CODE (trueop0) == VEC_CONCAT)
3550	{
3551	  rtx vec = trueop0;
3552	  int offset = INTVAL (XVECEXP (trueop1, 0, 0)) * GET_MODE_SIZE (mode);
3553
3554	  /* Try to find the element in the VEC_CONCAT.  */
3555	  while (GET_MODE (vec) != mode
3556		 && GET_CODE (vec) == VEC_CONCAT)
3557	    {
3558	      HOST_WIDE_INT vec_size;
3559
3560	      if (CONST_INT_P (XEXP (vec, 0)))
3561	        {
3562	          /* vec_concat of two const_ints doesn't make sense with
3563	             respect to modes.  */
3564	          if (CONST_INT_P (XEXP (vec, 1)))
3565	            return 0;
3566
3567	          vec_size = GET_MODE_SIZE (GET_MODE (trueop0))
3568	                     - GET_MODE_SIZE (GET_MODE (XEXP (vec, 1)));
3569	        }
3570	      else
3571	        vec_size = GET_MODE_SIZE (GET_MODE (XEXP (vec, 0)));
3572
3573	      if (offset < vec_size)
3574		vec = XEXP (vec, 0);
3575	      else
3576		{
3577		  offset -= vec_size;
3578		  vec = XEXP (vec, 1);
3579		}
3580	      vec = avoid_constant_pool_reference (vec);
3581	    }
3582
3583	  if (GET_MODE (vec) == mode)
3584	    return vec;
3585	}
3586
3587      /* If we select elements in a vec_merge that all come from the same
3588	 operand, select from that operand directly.  */
3589      if (GET_CODE (op0) == VEC_MERGE)
3590	{
3591	  rtx trueop02 = avoid_constant_pool_reference (XEXP (op0, 2));
3592	  if (CONST_INT_P (trueop02))
3593	    {
3594	      unsigned HOST_WIDE_INT sel = UINTVAL (trueop02);
3595	      bool all_operand0 = true;
3596	      bool all_operand1 = true;
3597	      for (int i = 0; i < XVECLEN (trueop1, 0); i++)
3598		{
3599		  rtx j = XVECEXP (trueop1, 0, i);
3600		  if (sel & (1 << UINTVAL (j)))
3601		    all_operand1 = false;
3602		  else
3603		    all_operand0 = false;
3604		}
3605	      if (all_operand0 && !side_effects_p (XEXP (op0, 1)))
3606		return simplify_gen_binary (VEC_SELECT, mode, XEXP (op0, 0), op1);
3607	      if (all_operand1 && !side_effects_p (XEXP (op0, 0)))
3608		return simplify_gen_binary (VEC_SELECT, mode, XEXP (op0, 1), op1);
3609	    }
3610	}
3611
3612      /* If we have two nested selects that are inverses of each
3613	 other, replace them with the source operand.  */
3614      if (GET_CODE (trueop0) == VEC_SELECT
3615	  && GET_MODE (XEXP (trueop0, 0)) == mode)
3616	{
3617	  rtx op0_subop1 = XEXP (trueop0, 1);
3618	  gcc_assert (GET_CODE (op0_subop1) == PARALLEL);
3619	  gcc_assert (XVECLEN (trueop1, 0) == GET_MODE_NUNITS (mode));
3620
3621	  /* Apply the outer ordering vector to the inner one.  (The inner
3622	     ordering vector is expressly permitted to be of a different
3623	     length than the outer one.)  If the result is { 0, 1, ..., n-1 }
3624	     then the two VEC_SELECTs cancel.  */
3625	  for (int i = 0; i < XVECLEN (trueop1, 0); ++i)
3626	    {
3627	      rtx x = XVECEXP (trueop1, 0, i);
3628	      if (!CONST_INT_P (x))
3629		return 0;
3630	      rtx y = XVECEXP (op0_subop1, 0, INTVAL (x));
3631	      if (!CONST_INT_P (y) || i != INTVAL (y))
3632		return 0;
3633	    }
3634	  return XEXP (trueop0, 0);
3635	}
3636
3637      return 0;
3638    case VEC_CONCAT:
3639      {
3640	machine_mode op0_mode = (GET_MODE (trueop0) != VOIDmode
3641				      ? GET_MODE (trueop0)
3642				      : GET_MODE_INNER (mode));
3643	machine_mode op1_mode = (GET_MODE (trueop1) != VOIDmode
3644				      ? GET_MODE (trueop1)
3645				      : GET_MODE_INNER (mode));
3646
3647	gcc_assert (VECTOR_MODE_P (mode));
3648	gcc_assert (GET_MODE_SIZE (op0_mode) + GET_MODE_SIZE (op1_mode)
3649		    == GET_MODE_SIZE (mode));
3650
3651	if (VECTOR_MODE_P (op0_mode))
3652	  gcc_assert (GET_MODE_INNER (mode)
3653		      == GET_MODE_INNER (op0_mode));
3654	else
3655	  gcc_assert (GET_MODE_INNER (mode) == op0_mode);
3656
3657	if (VECTOR_MODE_P (op1_mode))
3658	  gcc_assert (GET_MODE_INNER (mode)
3659		      == GET_MODE_INNER (op1_mode));
3660	else
3661	  gcc_assert (GET_MODE_INNER (mode) == op1_mode);
3662
3663	if ((GET_CODE (trueop0) == CONST_VECTOR
3664	     || CONST_SCALAR_INT_P (trueop0)
3665	     || CONST_DOUBLE_AS_FLOAT_P (trueop0))
3666	    && (GET_CODE (trueop1) == CONST_VECTOR
3667		|| CONST_SCALAR_INT_P (trueop1)
3668		|| CONST_DOUBLE_AS_FLOAT_P (trueop1)))
3669	  {
3670	    int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
3671	    unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
3672	    rtvec v = rtvec_alloc (n_elts);
3673	    unsigned int i;
3674	    unsigned in_n_elts = 1;
3675
3676	    if (VECTOR_MODE_P (op0_mode))
3677	      in_n_elts = (GET_MODE_SIZE (op0_mode) / elt_size);
3678	    for (i = 0; i < n_elts; i++)
3679	      {
3680		if (i < in_n_elts)
3681		  {
3682		    if (!VECTOR_MODE_P (op0_mode))
3683		      RTVEC_ELT (v, i) = trueop0;
3684		    else
3685		      RTVEC_ELT (v, i) = CONST_VECTOR_ELT (trueop0, i);
3686		  }
3687		else
3688		  {
3689		    if (!VECTOR_MODE_P (op1_mode))
3690		      RTVEC_ELT (v, i) = trueop1;
3691		    else
3692		      RTVEC_ELT (v, i) = CONST_VECTOR_ELT (trueop1,
3693							   i - in_n_elts);
3694		  }
3695	      }
3696
3697	    return gen_rtx_CONST_VECTOR (mode, v);
3698	  }
3699
3700	/* Try to merge two VEC_SELECTs from the same vector into a single one.
3701	   Restrict the transformation to avoid generating a VEC_SELECT with a
3702	   mode unrelated to its operand.  */
3703	if (GET_CODE (trueop0) == VEC_SELECT
3704	    && GET_CODE (trueop1) == VEC_SELECT
3705	    && rtx_equal_p (XEXP (trueop0, 0), XEXP (trueop1, 0))
3706	    && GET_MODE (XEXP (trueop0, 0)) == mode)
3707	  {
3708	    rtx par0 = XEXP (trueop0, 1);
3709	    rtx par1 = XEXP (trueop1, 1);
3710	    int len0 = XVECLEN (par0, 0);
3711	    int len1 = XVECLEN (par1, 0);
3712	    rtvec vec = rtvec_alloc (len0 + len1);
3713	    for (int i = 0; i < len0; i++)
3714	      RTVEC_ELT (vec, i) = XVECEXP (par0, 0, i);
3715	    for (int i = 0; i < len1; i++)
3716	      RTVEC_ELT (vec, len0 + i) = XVECEXP (par1, 0, i);
3717	    return simplify_gen_binary (VEC_SELECT, mode, XEXP (trueop0, 0),
3718					gen_rtx_PARALLEL (VOIDmode, vec));
3719	  }
3720      }
3721      return 0;
3722
3723    default:
3724      gcc_unreachable ();
3725    }
3726
3727  return 0;
3728}
3729
3730rtx
3731simplify_const_binary_operation (enum rtx_code code, machine_mode mode,
3732				 rtx op0, rtx op1)
3733{
3734  unsigned int width = GET_MODE_PRECISION (mode);
3735
3736  if (VECTOR_MODE_P (mode)
3737      && code != VEC_CONCAT
3738      && GET_CODE (op0) == CONST_VECTOR
3739      && GET_CODE (op1) == CONST_VECTOR)
3740    {
3741      unsigned n_elts = GET_MODE_NUNITS (mode);
3742      machine_mode op0mode = GET_MODE (op0);
3743      unsigned op0_n_elts = GET_MODE_NUNITS (op0mode);
3744      machine_mode op1mode = GET_MODE (op1);
3745      unsigned op1_n_elts = GET_MODE_NUNITS (op1mode);
3746      rtvec v = rtvec_alloc (n_elts);
3747      unsigned int i;
3748
3749      gcc_assert (op0_n_elts == n_elts);
3750      gcc_assert (op1_n_elts == n_elts);
3751      for (i = 0; i < n_elts; i++)
3752	{
3753	  rtx x = simplify_binary_operation (code, GET_MODE_INNER (mode),
3754					     CONST_VECTOR_ELT (op0, i),
3755					     CONST_VECTOR_ELT (op1, i));
3756	  if (!x)
3757	    return 0;
3758	  RTVEC_ELT (v, i) = x;
3759	}
3760
3761      return gen_rtx_CONST_VECTOR (mode, v);
3762    }
3763
3764  if (VECTOR_MODE_P (mode)
3765      && code == VEC_CONCAT
3766      && (CONST_SCALAR_INT_P (op0)
3767	  || GET_CODE (op0) == CONST_FIXED
3768	  || CONST_DOUBLE_AS_FLOAT_P (op0))
3769      && (CONST_SCALAR_INT_P (op1)
3770	  || CONST_DOUBLE_AS_FLOAT_P (op1)
3771	  || GET_CODE (op1) == CONST_FIXED))
3772    {
3773      unsigned n_elts = GET_MODE_NUNITS (mode);
3774      rtvec v = rtvec_alloc (n_elts);
3775
3776      gcc_assert (n_elts >= 2);
3777      if (n_elts == 2)
3778	{
3779	  gcc_assert (GET_CODE (op0) != CONST_VECTOR);
3780	  gcc_assert (GET_CODE (op1) != CONST_VECTOR);
3781
3782	  RTVEC_ELT (v, 0) = op0;
3783	  RTVEC_ELT (v, 1) = op1;
3784	}
3785      else
3786	{
3787	  unsigned op0_n_elts = GET_MODE_NUNITS (GET_MODE (op0));
3788	  unsigned op1_n_elts = GET_MODE_NUNITS (GET_MODE (op1));
3789	  unsigned i;
3790
3791	  gcc_assert (GET_CODE (op0) == CONST_VECTOR);
3792	  gcc_assert (GET_CODE (op1) == CONST_VECTOR);
3793	  gcc_assert (op0_n_elts + op1_n_elts == n_elts);
3794
3795	  for (i = 0; i < op0_n_elts; ++i)
3796	    RTVEC_ELT (v, i) = XVECEXP (op0, 0, i);
3797	  for (i = 0; i < op1_n_elts; ++i)
3798	    RTVEC_ELT (v, op0_n_elts+i) = XVECEXP (op1, 0, i);
3799	}
3800
3801      return gen_rtx_CONST_VECTOR (mode, v);
3802    }
3803
3804  if (SCALAR_FLOAT_MODE_P (mode)
3805      && CONST_DOUBLE_AS_FLOAT_P (op0)
3806      && CONST_DOUBLE_AS_FLOAT_P (op1)
3807      && mode == GET_MODE (op0) && mode == GET_MODE (op1))
3808    {
3809      if (code == AND
3810	  || code == IOR
3811	  || code == XOR)
3812	{
3813	  long tmp0[4];
3814	  long tmp1[4];
3815	  REAL_VALUE_TYPE r;
3816	  int i;
3817
3818	  real_to_target (tmp0, CONST_DOUBLE_REAL_VALUE (op0),
3819			  GET_MODE (op0));
3820	  real_to_target (tmp1, CONST_DOUBLE_REAL_VALUE (op1),
3821			  GET_MODE (op1));
3822	  for (i = 0; i < 4; i++)
3823	    {
3824	      switch (code)
3825	      {
3826	      case AND:
3827		tmp0[i] &= tmp1[i];
3828		break;
3829	      case IOR:
3830		tmp0[i] |= tmp1[i];
3831		break;
3832	      case XOR:
3833		tmp0[i] ^= tmp1[i];
3834		break;
3835	      default:
3836		gcc_unreachable ();
3837	      }
3838	    }
3839	   real_from_target (&r, tmp0, mode);
3840	   return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
3841	}
3842      else
3843	{
3844	  REAL_VALUE_TYPE f0, f1, value, result;
3845	  bool inexact;
3846
3847	  REAL_VALUE_FROM_CONST_DOUBLE (f0, op0);
3848	  REAL_VALUE_FROM_CONST_DOUBLE (f1, op1);
3849	  real_convert (&f0, mode, &f0);
3850	  real_convert (&f1, mode, &f1);
3851
3852	  if (HONOR_SNANS (mode)
3853	      && (REAL_VALUE_ISNAN (f0) || REAL_VALUE_ISNAN (f1)))
3854	    return 0;
3855
3856	  if (code == DIV
3857	      && REAL_VALUES_EQUAL (f1, dconst0)
3858	      && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
3859	    return 0;
3860
3861	  if (MODE_HAS_INFINITIES (mode) && HONOR_NANS (mode)
3862	      && flag_trapping_math
3863	      && REAL_VALUE_ISINF (f0) && REAL_VALUE_ISINF (f1))
3864	    {
3865	      int s0 = REAL_VALUE_NEGATIVE (f0);
3866	      int s1 = REAL_VALUE_NEGATIVE (f1);
3867
3868	      switch (code)
3869		{
3870		case PLUS:
3871		  /* Inf + -Inf = NaN plus exception.  */
3872		  if (s0 != s1)
3873		    return 0;
3874		  break;
3875		case MINUS:
3876		  /* Inf - Inf = NaN plus exception.  */
3877		  if (s0 == s1)
3878		    return 0;
3879		  break;
3880		case DIV:
3881		  /* Inf / Inf = NaN plus exception.  */
3882		  return 0;
3883		default:
3884		  break;
3885		}
3886	    }
3887
3888	  if (code == MULT && MODE_HAS_INFINITIES (mode) && HONOR_NANS (mode)
3889	      && flag_trapping_math
3890	      && ((REAL_VALUE_ISINF (f0) && REAL_VALUES_EQUAL (f1, dconst0))
3891		  || (REAL_VALUE_ISINF (f1)
3892		      && REAL_VALUES_EQUAL (f0, dconst0))))
3893	    /* Inf * 0 = NaN plus exception.  */
3894	    return 0;
3895
3896	  inexact = real_arithmetic (&value, rtx_to_tree_code (code),
3897				     &f0, &f1);
3898	  real_convert (&result, mode, &value);
3899
3900	  /* Don't constant fold this floating point operation if
3901	     the result has overflowed and flag_trapping_math.  */
3902
3903	  if (flag_trapping_math
3904	      && MODE_HAS_INFINITIES (mode)
3905	      && REAL_VALUE_ISINF (result)
3906	      && !REAL_VALUE_ISINF (f0)
3907	      && !REAL_VALUE_ISINF (f1))
3908	    /* Overflow plus exception.  */
3909	    return 0;
3910
3911	  /* Don't constant fold this floating point operation if the
3912	     result may dependent upon the run-time rounding mode and
3913	     flag_rounding_math is set, or if GCC's software emulation
3914	     is unable to accurately represent the result.  */
3915
3916	  if ((flag_rounding_math
3917	       || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
3918	      && (inexact || !real_identical (&result, &value)))
3919	    return NULL_RTX;
3920
3921	  return CONST_DOUBLE_FROM_REAL_VALUE (result, mode);
3922	}
3923    }
3924
3925  /* We can fold some multi-word operations.  */
3926  if ((GET_MODE_CLASS (mode) == MODE_INT
3927       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
3928      && CONST_SCALAR_INT_P (op0)
3929      && CONST_SCALAR_INT_P (op1))
3930    {
3931      wide_int result;
3932      bool overflow;
3933      rtx_mode_t pop0 = std::make_pair (op0, mode);
3934      rtx_mode_t pop1 = std::make_pair (op1, mode);
3935
3936#if TARGET_SUPPORTS_WIDE_INT == 0
3937      /* This assert keeps the simplification from producing a result
3938	 that cannot be represented in a CONST_DOUBLE but a lot of
3939	 upstream callers expect that this function never fails to
3940	 simplify something and so you if you added this to the test
3941	 above the code would die later anyway.  If this assert
3942	 happens, you just need to make the port support wide int.  */
3943      gcc_assert (width <= HOST_BITS_PER_DOUBLE_INT);
3944#endif
3945      switch (code)
3946	{
3947	case MINUS:
3948	  result = wi::sub (pop0, pop1);
3949	  break;
3950
3951	case PLUS:
3952	  result = wi::add (pop0, pop1);
3953	  break;
3954
3955	case MULT:
3956	  result = wi::mul (pop0, pop1);
3957	  break;
3958
3959	case DIV:
3960	  result = wi::div_trunc (pop0, pop1, SIGNED, &overflow);
3961	  if (overflow)
3962	    return NULL_RTX;
3963	  break;
3964
3965	case MOD:
3966	  result = wi::mod_trunc (pop0, pop1, SIGNED, &overflow);
3967	  if (overflow)
3968	    return NULL_RTX;
3969	  break;
3970
3971	case UDIV:
3972	  result = wi::div_trunc (pop0, pop1, UNSIGNED, &overflow);
3973	  if (overflow)
3974	    return NULL_RTX;
3975	  break;
3976
3977	case UMOD:
3978	  result = wi::mod_trunc (pop0, pop1, UNSIGNED, &overflow);
3979	  if (overflow)
3980	    return NULL_RTX;
3981	  break;
3982
3983	case AND:
3984	  result = wi::bit_and (pop0, pop1);
3985	  break;
3986
3987	case IOR:
3988	  result = wi::bit_or (pop0, pop1);
3989	  break;
3990
3991	case XOR:
3992	  result = wi::bit_xor (pop0, pop1);
3993	  break;
3994
3995	case SMIN:
3996	  result = wi::smin (pop0, pop1);
3997	  break;
3998
3999	case SMAX:
4000	  result = wi::smax (pop0, pop1);
4001	  break;
4002
4003	case UMIN:
4004	  result = wi::umin (pop0, pop1);
4005	  break;
4006
4007	case UMAX:
4008	  result = wi::umax (pop0, pop1);
4009	  break;
4010
4011	case LSHIFTRT:
4012	case ASHIFTRT:
4013	case ASHIFT:
4014	  {
4015	    wide_int wop1 = pop1;
4016	    if (SHIFT_COUNT_TRUNCATED)
4017	      wop1 = wi::umod_trunc (wop1, width);
4018	    else if (wi::geu_p (wop1, width))
4019	      return NULL_RTX;
4020
4021	    switch (code)
4022	      {
4023	      case LSHIFTRT:
4024		result = wi::lrshift (pop0, wop1);
4025		break;
4026
4027	      case ASHIFTRT:
4028		result = wi::arshift (pop0, wop1);
4029		break;
4030
4031	      case ASHIFT:
4032		result = wi::lshift (pop0, wop1);
4033		break;
4034
4035	      default:
4036		gcc_unreachable ();
4037	      }
4038	    break;
4039	  }
4040	case ROTATE:
4041	case ROTATERT:
4042	  {
4043	    if (wi::neg_p (pop1))
4044	      return NULL_RTX;
4045
4046	    switch (code)
4047	      {
4048	      case ROTATE:
4049		result = wi::lrotate (pop0, pop1);
4050		break;
4051
4052	      case ROTATERT:
4053		result = wi::rrotate (pop0, pop1);
4054		break;
4055
4056	      default:
4057		gcc_unreachable ();
4058	      }
4059	    break;
4060	  }
4061	default:
4062	  return NULL_RTX;
4063	}
4064      return immed_wide_int_const (result, mode);
4065    }
4066
4067  return NULL_RTX;
4068}
4069
4070
4071
4072/* Simplify a PLUS or MINUS, at least one of whose operands may be another
4073   PLUS or MINUS.
4074
4075   Rather than test for specific case, we do this by a brute-force method
4076   and do all possible simplifications until no more changes occur.  Then
4077   we rebuild the operation.  */
4078
4079struct simplify_plus_minus_op_data
4080{
4081  rtx op;
4082  short neg;
4083};
4084
4085static bool
4086simplify_plus_minus_op_data_cmp (rtx x, rtx y)
4087{
4088  int result;
4089
4090  result = (commutative_operand_precedence (y)
4091	    - commutative_operand_precedence (x));
4092  if (result)
4093    return result > 0;
4094
4095  /* Group together equal REGs to do more simplification.  */
4096  if (REG_P (x) && REG_P (y))
4097    return REGNO (x) > REGNO (y);
4098  else
4099    return false;
4100}
4101
4102static rtx
4103simplify_plus_minus (enum rtx_code code, machine_mode mode, rtx op0,
4104		     rtx op1)
4105{
4106  struct simplify_plus_minus_op_data ops[16];
4107  rtx result, tem;
4108  int n_ops = 2;
4109  int changed, n_constants, canonicalized = 0;
4110  int i, j;
4111
4112  memset (ops, 0, sizeof ops);
4113
4114  /* Set up the two operands and then expand them until nothing has been
4115     changed.  If we run out of room in our array, give up; this should
4116     almost never happen.  */
4117
4118  ops[0].op = op0;
4119  ops[0].neg = 0;
4120  ops[1].op = op1;
4121  ops[1].neg = (code == MINUS);
4122
4123  do
4124    {
4125      changed = 0;
4126      n_constants = 0;
4127
4128      for (i = 0; i < n_ops; i++)
4129	{
4130	  rtx this_op = ops[i].op;
4131	  int this_neg = ops[i].neg;
4132	  enum rtx_code this_code = GET_CODE (this_op);
4133
4134	  switch (this_code)
4135	    {
4136	    case PLUS:
4137	    case MINUS:
4138	      if (n_ops == ARRAY_SIZE (ops))
4139		return NULL_RTX;
4140
4141	      ops[n_ops].op = XEXP (this_op, 1);
4142	      ops[n_ops].neg = (this_code == MINUS) ^ this_neg;
4143	      n_ops++;
4144
4145	      ops[i].op = XEXP (this_op, 0);
4146	      changed = 1;
4147	      canonicalized |= this_neg || i != n_ops - 2;
4148	      break;
4149
4150	    case NEG:
4151	      ops[i].op = XEXP (this_op, 0);
4152	      ops[i].neg = ! this_neg;
4153	      changed = 1;
4154	      canonicalized = 1;
4155	      break;
4156
4157	    case CONST:
4158	      if (n_ops != ARRAY_SIZE (ops)
4159		  && GET_CODE (XEXP (this_op, 0)) == PLUS
4160		  && CONSTANT_P (XEXP (XEXP (this_op, 0), 0))
4161		  && CONSTANT_P (XEXP (XEXP (this_op, 0), 1)))
4162		{
4163		  ops[i].op = XEXP (XEXP (this_op, 0), 0);
4164		  ops[n_ops].op = XEXP (XEXP (this_op, 0), 1);
4165		  ops[n_ops].neg = this_neg;
4166		  n_ops++;
4167		  changed = 1;
4168	          canonicalized = 1;
4169		}
4170	      break;
4171
4172	    case NOT:
4173	      /* ~a -> (-a - 1) */
4174	      if (n_ops != ARRAY_SIZE (ops))
4175		{
4176		  ops[n_ops].op = CONSTM1_RTX (mode);
4177		  ops[n_ops++].neg = this_neg;
4178		  ops[i].op = XEXP (this_op, 0);
4179		  ops[i].neg = !this_neg;
4180		  changed = 1;
4181	          canonicalized = 1;
4182		}
4183	      break;
4184
4185	    case CONST_INT:
4186	      n_constants++;
4187	      if (this_neg)
4188		{
4189		  ops[i].op = neg_const_int (mode, this_op);
4190		  ops[i].neg = 0;
4191		  changed = 1;
4192	          canonicalized = 1;
4193		}
4194	      break;
4195
4196	    default:
4197	      break;
4198	    }
4199	}
4200    }
4201  while (changed);
4202
4203  if (n_constants > 1)
4204    canonicalized = 1;
4205
4206  gcc_assert (n_ops >= 2);
4207
4208  /* If we only have two operands, we can avoid the loops.  */
4209  if (n_ops == 2)
4210    {
4211      enum rtx_code code = ops[0].neg || ops[1].neg ? MINUS : PLUS;
4212      rtx lhs, rhs;
4213
4214      /* Get the two operands.  Be careful with the order, especially for
4215	 the cases where code == MINUS.  */
4216      if (ops[0].neg && ops[1].neg)
4217	{
4218	  lhs = gen_rtx_NEG (mode, ops[0].op);
4219	  rhs = ops[1].op;
4220	}
4221      else if (ops[0].neg)
4222	{
4223	  lhs = ops[1].op;
4224	  rhs = ops[0].op;
4225	}
4226      else
4227	{
4228	  lhs = ops[0].op;
4229	  rhs = ops[1].op;
4230	}
4231
4232      return simplify_const_binary_operation (code, mode, lhs, rhs);
4233    }
4234
4235  /* Now simplify each pair of operands until nothing changes.  */
4236  do
4237    {
4238      /* Insertion sort is good enough for a small array.  */
4239      for (i = 1; i < n_ops; i++)
4240        {
4241          struct simplify_plus_minus_op_data save;
4242          j = i - 1;
4243          if (!simplify_plus_minus_op_data_cmp (ops[j].op, ops[i].op))
4244	    continue;
4245
4246          canonicalized = 1;
4247          save = ops[i];
4248          do
4249	    ops[j + 1] = ops[j];
4250          while (j-- && simplify_plus_minus_op_data_cmp (ops[j].op, save.op));
4251          ops[j + 1] = save;
4252        }
4253
4254      changed = 0;
4255      for (i = n_ops - 1; i > 0; i--)
4256	for (j = i - 1; j >= 0; j--)
4257	  {
4258	    rtx lhs = ops[j].op, rhs = ops[i].op;
4259	    int lneg = ops[j].neg, rneg = ops[i].neg;
4260
4261	    if (lhs != 0 && rhs != 0)
4262	      {
4263		enum rtx_code ncode = PLUS;
4264
4265		if (lneg != rneg)
4266		  {
4267		    ncode = MINUS;
4268		    if (lneg)
4269		      tem = lhs, lhs = rhs, rhs = tem;
4270		  }
4271		else if (swap_commutative_operands_p (lhs, rhs))
4272		  tem = lhs, lhs = rhs, rhs = tem;
4273
4274		if ((GET_CODE (lhs) == CONST || CONST_INT_P (lhs))
4275		    && (GET_CODE (rhs) == CONST || CONST_INT_P (rhs)))
4276		  {
4277		    rtx tem_lhs, tem_rhs;
4278
4279		    tem_lhs = GET_CODE (lhs) == CONST ? XEXP (lhs, 0) : lhs;
4280		    tem_rhs = GET_CODE (rhs) == CONST ? XEXP (rhs, 0) : rhs;
4281		    tem = simplify_binary_operation (ncode, mode, tem_lhs, tem_rhs);
4282
4283		    if (tem && !CONSTANT_P (tem))
4284		      tem = gen_rtx_CONST (GET_MODE (tem), tem);
4285		  }
4286		else
4287		  tem = simplify_binary_operation (ncode, mode, lhs, rhs);
4288
4289		if (tem)
4290		  {
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)
4303		      break;
4304		    lneg &= rneg;
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;
4309
4310		    ops[i].op = tem;
4311		    ops[i].neg = lneg;
4312		    ops[j].op = NULL_RTX;
4313		    changed = 1;
4314		    canonicalized = 1;
4315		  }
4316	      }
4317	  }
4318
4319      /* If nothing changed, fail.  */
4320      if (!canonicalized)
4321        return NULL_RTX;
4322
4323      /* Pack all the operands to the lower-numbered entries.  */
4324      for (i = 0, j = 0; j < n_ops; j++)
4325        if (ops[j].op)
4326          {
4327	    ops[i] = ops[j];
4328	    i++;
4329          }
4330      n_ops = i;
4331    }
4332  while (changed);
4333
4334  /* Create (minus -C X) instead of (neg (const (plus X C))).  */
4335  if (n_ops == 2
4336      && CONST_INT_P (ops[1].op)
4337      && CONSTANT_P (ops[0].op)
4338      && ops[0].neg)
4339    return gen_rtx_fmt_ee (MINUS, mode, ops[1].op, ops[0].op);
4340
4341  /* We suppressed creation of trivial CONST expressions in the
4342     combination loop to avoid recursion.  Create one manually now.
4343     The combination loop should have ensured that there is exactly
4344     one CONST_INT, and the sort will have ensured that it is last
4345     in the array and that any other constant will be next-to-last.  */
4346
4347  if (n_ops > 1
4348      && CONST_INT_P (ops[n_ops - 1].op)
4349      && CONSTANT_P (ops[n_ops - 2].op))
4350    {
4351      rtx value = ops[n_ops - 1].op;
4352      if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
4353	value = neg_const_int (mode, value);
4354      ops[n_ops - 2].op = plus_constant (mode, ops[n_ops - 2].op,
4355					 INTVAL (value));
4356      n_ops--;
4357    }
4358
4359  /* Put a non-negated operand first, if possible.  */
4360
4361  for (i = 0; i < n_ops && ops[i].neg; i++)
4362    continue;
4363  if (i == n_ops)
4364    ops[0].op = gen_rtx_NEG (mode, ops[0].op);
4365  else if (i != 0)
4366    {
4367      tem = ops[0].op;
4368      ops[0] = ops[i];
4369      ops[i].op = tem;
4370      ops[i].neg = 1;
4371    }
4372
4373  /* Now make the result by performing the requested operations.  */
4374  result = ops[0].op;
4375  for (i = 1; i < n_ops; i++)
4376    result = gen_rtx_fmt_ee (ops[i].neg ? MINUS : PLUS,
4377			     mode, result, ops[i].op);
4378
4379  return result;
4380}
4381
4382/* Check whether an operand is suitable for calling simplify_plus_minus.  */
4383static bool
4384plus_minus_operand_p (const_rtx x)
4385{
4386  return GET_CODE (x) == PLUS
4387         || GET_CODE (x) == MINUS
4388	 || (GET_CODE (x) == CONST
4389	     && GET_CODE (XEXP (x, 0)) == PLUS
4390	     && CONSTANT_P (XEXP (XEXP (x, 0), 0))
4391	     && CONSTANT_P (XEXP (XEXP (x, 0), 1)));
4392}
4393
4394/* Like simplify_binary_operation except used for relational operators.
4395   MODE is the mode of the result. If MODE is VOIDmode, both operands must
4396   not also be VOIDmode.
4397
4398   CMP_MODE specifies in which mode the comparison is done in, so it is
4399   the mode of the operands.  If CMP_MODE is VOIDmode, it is taken from
4400   the operands or, if both are VOIDmode, the operands are compared in
4401   "infinite precision".  */
4402rtx
4403simplify_relational_operation (enum rtx_code code, machine_mode mode,
4404			       machine_mode cmp_mode, rtx op0, rtx op1)
4405{
4406  rtx tem, trueop0, trueop1;
4407
4408  if (cmp_mode == VOIDmode)
4409    cmp_mode = GET_MODE (op0);
4410  if (cmp_mode == VOIDmode)
4411    cmp_mode = GET_MODE (op1);
4412
4413  tem = simplify_const_relational_operation (code, cmp_mode, op0, op1);
4414  if (tem)
4415    {
4416      if (SCALAR_FLOAT_MODE_P (mode))
4417	{
4418          if (tem == const0_rtx)
4419            return CONST0_RTX (mode);
4420#ifdef FLOAT_STORE_FLAG_VALUE
4421	  {
4422	    REAL_VALUE_TYPE val;
4423	    val = FLOAT_STORE_FLAG_VALUE (mode);
4424	    return CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
4425	  }
4426#else
4427	  return NULL_RTX;
4428#endif
4429	}
4430      if (VECTOR_MODE_P (mode))
4431	{
4432	  if (tem == const0_rtx)
4433	    return CONST0_RTX (mode);
4434#ifdef VECTOR_STORE_FLAG_VALUE
4435	  {
4436	    int i, units;
4437	    rtvec v;
4438
4439	    rtx val = VECTOR_STORE_FLAG_VALUE (mode);
4440	    if (val == NULL_RTX)
4441	      return NULL_RTX;
4442	    if (val == const1_rtx)
4443	      return CONST1_RTX (mode);
4444
4445	    units = GET_MODE_NUNITS (mode);
4446	    v = rtvec_alloc (units);
4447	    for (i = 0; i < units; i++)
4448	      RTVEC_ELT (v, i) = val;
4449	    return gen_rtx_raw_CONST_VECTOR (mode, v);
4450	  }
4451#else
4452	  return NULL_RTX;
4453#endif
4454	}
4455
4456      return tem;
4457    }
4458
4459  /* For the following tests, ensure const0_rtx is op1.  */
4460  if (swap_commutative_operands_p (op0, op1)
4461      || (op0 == const0_rtx && op1 != const0_rtx))
4462    tem = op0, op0 = op1, op1 = tem, code = swap_condition (code);
4463
4464  /* If op0 is a compare, extract the comparison arguments from it.  */
4465  if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
4466    return simplify_gen_relational (code, mode, VOIDmode,
4467				    XEXP (op0, 0), XEXP (op0, 1));
4468
4469  if (GET_MODE_CLASS (cmp_mode) == MODE_CC
4470      || CC0_P (op0))
4471    return NULL_RTX;
4472
4473  trueop0 = avoid_constant_pool_reference (op0);
4474  trueop1 = avoid_constant_pool_reference (op1);
4475  return simplify_relational_operation_1 (code, mode, cmp_mode,
4476		  			  trueop0, trueop1);
4477}
4478
4479/* This part of simplify_relational_operation is only used when CMP_MODE
4480   is not in class MODE_CC (i.e. it is a real comparison).
4481
4482   MODE is the mode of the result, while CMP_MODE specifies in which
4483   mode the comparison is done in, so it is the mode of the operands.  */
4484
4485static rtx
4486simplify_relational_operation_1 (enum rtx_code code, machine_mode mode,
4487				 machine_mode cmp_mode, rtx op0, rtx op1)
4488{
4489  enum rtx_code op0code = GET_CODE (op0);
4490
4491  if (op1 == const0_rtx && COMPARISON_P (op0))
4492    {
4493      /* If op0 is a comparison, extract the comparison arguments
4494         from it.  */
4495      if (code == NE)
4496	{
4497	  if (GET_MODE (op0) == mode)
4498	    return simplify_rtx (op0);
4499	  else
4500	    return simplify_gen_relational (GET_CODE (op0), mode, VOIDmode,
4501					    XEXP (op0, 0), XEXP (op0, 1));
4502	}
4503      else if (code == EQ)
4504	{
4505	  enum rtx_code new_code = reversed_comparison_code (op0, NULL_RTX);
4506	  if (new_code != UNKNOWN)
4507	    return simplify_gen_relational (new_code, mode, VOIDmode,
4508					    XEXP (op0, 0), XEXP (op0, 1));
4509	}
4510    }
4511
4512  /* (LTU/GEU (PLUS a C) C), where C is constant, can be simplified to
4513     (GEU/LTU a -C).  Likewise for (LTU/GEU (PLUS a C) a).  */
4514  if ((code == LTU || code == GEU)
4515      && GET_CODE (op0) == PLUS
4516      && CONST_INT_P (XEXP (op0, 1))
4517      && (rtx_equal_p (op1, XEXP (op0, 0))
4518	  || rtx_equal_p (op1, XEXP (op0, 1)))
4519      /* (LTU/GEU (PLUS a 0) 0) is not the same as (GEU/LTU a 0). */
4520      && XEXP (op0, 1) != const0_rtx)
4521    {
4522      rtx new_cmp
4523	= simplify_gen_unary (NEG, cmp_mode, XEXP (op0, 1), cmp_mode);
4524      return simplify_gen_relational ((code == LTU ? GEU : LTU), mode,
4525				      cmp_mode, XEXP (op0, 0), new_cmp);
4526    }
4527
4528  /* Canonicalize (LTU/GEU (PLUS a b) b) as (LTU/GEU (PLUS a b) a).  */
4529  if ((code == LTU || code == GEU)
4530      && GET_CODE (op0) == PLUS
4531      && rtx_equal_p (op1, XEXP (op0, 1))
4532      /* Don't recurse "infinitely" for (LTU/GEU (PLUS b b) b).  */
4533      && !rtx_equal_p (op1, XEXP (op0, 0)))
4534    return simplify_gen_relational (code, mode, cmp_mode, op0,
4535				    copy_rtx (XEXP (op0, 0)));
4536
4537  if (op1 == const0_rtx)
4538    {
4539      /* Canonicalize (GTU x 0) as (NE x 0).  */
4540      if (code == GTU)
4541        return simplify_gen_relational (NE, mode, cmp_mode, op0, op1);
4542      /* Canonicalize (LEU x 0) as (EQ x 0).  */
4543      if (code == LEU)
4544        return simplify_gen_relational (EQ, mode, cmp_mode, op0, op1);
4545    }
4546  else if (op1 == const1_rtx)
4547    {
4548      switch (code)
4549        {
4550        case GE:
4551	  /* Canonicalize (GE x 1) as (GT x 0).  */
4552	  return simplify_gen_relational (GT, mode, cmp_mode,
4553					  op0, const0_rtx);
4554	case GEU:
4555	  /* Canonicalize (GEU x 1) as (NE x 0).  */
4556	  return simplify_gen_relational (NE, mode, cmp_mode,
4557					  op0, const0_rtx);
4558	case LT:
4559	  /* Canonicalize (LT x 1) as (LE x 0).  */
4560	  return simplify_gen_relational (LE, mode, cmp_mode,
4561					  op0, const0_rtx);
4562	case LTU:
4563	  /* Canonicalize (LTU x 1) as (EQ x 0).  */
4564	  return simplify_gen_relational (EQ, mode, cmp_mode,
4565					  op0, const0_rtx);
4566	default:
4567	  break;
4568	}
4569    }
4570  else if (op1 == constm1_rtx)
4571    {
4572      /* Canonicalize (LE x -1) as (LT x 0).  */
4573      if (code == LE)
4574        return simplify_gen_relational (LT, mode, cmp_mode, op0, const0_rtx);
4575      /* Canonicalize (GT x -1) as (GE x 0).  */
4576      if (code == GT)
4577        return simplify_gen_relational (GE, mode, cmp_mode, op0, const0_rtx);
4578    }
4579
4580  /* (eq/ne (plus x cst1) cst2) simplifies to (eq/ne x (cst2 - cst1))  */
4581  if ((code == EQ || code == NE)
4582      && (op0code == PLUS || op0code == MINUS)
4583      && CONSTANT_P (op1)
4584      && CONSTANT_P (XEXP (op0, 1))
4585      && (INTEGRAL_MODE_P (cmp_mode) || flag_unsafe_math_optimizations))
4586    {
4587      rtx x = XEXP (op0, 0);
4588      rtx c = XEXP (op0, 1);
4589      enum rtx_code invcode = op0code == PLUS ? MINUS : PLUS;
4590      rtx tem = simplify_gen_binary (invcode, cmp_mode, op1, c);
4591
4592      /* Detect an infinite recursive condition, where we oscillate at this
4593	 simplification case between:
4594	    A + B == C  <--->  C - B == A,
4595	 where A, B, and C are all constants with non-simplifiable expressions,
4596	 usually SYMBOL_REFs.  */
4597      if (GET_CODE (tem) == invcode
4598	  && CONSTANT_P (x)
4599	  && rtx_equal_p (c, XEXP (tem, 1)))
4600	return NULL_RTX;
4601
4602      return simplify_gen_relational (code, mode, cmp_mode, x, tem);
4603    }
4604
4605  /* (ne:SI (zero_extract:SI FOO (const_int 1) BAR) (const_int 0))) is
4606     the same as (zero_extract:SI FOO (const_int 1) BAR).  */
4607  if (code == NE
4608      && op1 == const0_rtx
4609      && GET_MODE_CLASS (mode) == MODE_INT
4610      && cmp_mode != VOIDmode
4611      /* ??? Work-around BImode bugs in the ia64 backend.  */
4612      && mode != BImode
4613      && cmp_mode != BImode
4614      && nonzero_bits (op0, cmp_mode) == 1
4615      && STORE_FLAG_VALUE == 1)
4616    return GET_MODE_SIZE (mode) > GET_MODE_SIZE (cmp_mode)
4617	   ? simplify_gen_unary (ZERO_EXTEND, mode, op0, cmp_mode)
4618	   : lowpart_subreg (mode, op0, cmp_mode);
4619
4620  /* (eq/ne (xor x y) 0) simplifies to (eq/ne x y).  */
4621  if ((code == EQ || code == NE)
4622      && op1 == const0_rtx
4623      && op0code == XOR)
4624    return simplify_gen_relational (code, mode, cmp_mode,
4625				    XEXP (op0, 0), XEXP (op0, 1));
4626
4627  /* (eq/ne (xor x y) x) simplifies to (eq/ne y 0).  */
4628  if ((code == EQ || code == NE)
4629      && op0code == XOR
4630      && rtx_equal_p (XEXP (op0, 0), op1)
4631      && !side_effects_p (XEXP (op0, 0)))
4632    return simplify_gen_relational (code, mode, cmp_mode, XEXP (op0, 1),
4633				    CONST0_RTX (mode));
4634
4635  /* Likewise (eq/ne (xor x y) y) simplifies to (eq/ne x 0).  */
4636  if ((code == EQ || code == NE)
4637      && op0code == XOR
4638      && rtx_equal_p (XEXP (op0, 1), op1)
4639      && !side_effects_p (XEXP (op0, 1)))
4640    return simplify_gen_relational (code, mode, cmp_mode, XEXP (op0, 0),
4641				    CONST0_RTX (mode));
4642
4643  /* (eq/ne (xor x C1) C2) simplifies to (eq/ne x (C1^C2)).  */
4644  if ((code == EQ || code == NE)
4645      && op0code == XOR
4646      && CONST_SCALAR_INT_P (op1)
4647      && CONST_SCALAR_INT_P (XEXP (op0, 1)))
4648    return simplify_gen_relational (code, mode, cmp_mode, XEXP (op0, 0),
4649				    simplify_gen_binary (XOR, cmp_mode,
4650							 XEXP (op0, 1), op1));
4651
4652  /* (eq/ne (and x y) x) simplifies to (eq/ne (and (not y) x) 0), which
4653     can be implemented with a BICS instruction on some targets, or
4654     constant-folded if y is a constant.  */
4655  if ((code == EQ || code == NE)
4656      && op0code == AND
4657      && rtx_equal_p (XEXP (op0, 0), op1)
4658      && !side_effects_p (op1)
4659      && op1 != CONST0_RTX (cmp_mode))
4660    {
4661      rtx not_y = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 1), cmp_mode);
4662      rtx lhs = simplify_gen_binary (AND, cmp_mode, not_y, XEXP (op0, 0));
4663
4664      return simplify_gen_relational (code, mode, cmp_mode, lhs,
4665				      CONST0_RTX (cmp_mode));
4666    }
4667
4668  /* Likewise for (eq/ne (and x y) y).  */
4669  if ((code == EQ || code == NE)
4670      && op0code == AND
4671      && rtx_equal_p (XEXP (op0, 1), op1)
4672      && !side_effects_p (op1)
4673      && op1 != CONST0_RTX (cmp_mode))
4674    {
4675      rtx not_x = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 0), cmp_mode);
4676      rtx lhs = simplify_gen_binary (AND, cmp_mode, not_x, XEXP (op0, 1));
4677
4678      return simplify_gen_relational (code, mode, cmp_mode, lhs,
4679				      CONST0_RTX (cmp_mode));
4680    }
4681
4682  /* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped.  */
4683  if ((code == EQ || code == NE)
4684      && GET_CODE (op0) == BSWAP
4685      && CONST_SCALAR_INT_P (op1))
4686    return simplify_gen_relational (code, mode, cmp_mode, XEXP (op0, 0),
4687				    simplify_gen_unary (BSWAP, cmp_mode,
4688							op1, cmp_mode));
4689
4690  /* (eq/ne (bswap x) (bswap y)) simplifies to (eq/ne x y).  */
4691  if ((code == EQ || code == NE)
4692      && GET_CODE (op0) == BSWAP
4693      && GET_CODE (op1) == BSWAP)
4694    return simplify_gen_relational (code, mode, cmp_mode,
4695				    XEXP (op0, 0), XEXP (op1, 0));
4696
4697  if (op0code == POPCOUNT && op1 == const0_rtx)
4698    switch (code)
4699      {
4700      case EQ:
4701      case LE:
4702      case LEU:
4703	/* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)).  */
4704	return simplify_gen_relational (EQ, mode, GET_MODE (XEXP (op0, 0)),
4705					XEXP (op0, 0), const0_rtx);
4706
4707      case NE:
4708      case GT:
4709      case GTU:
4710	/* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)).  */
4711	return simplify_gen_relational (NE, mode, GET_MODE (XEXP (op0, 0)),
4712					XEXP (op0, 0), const0_rtx);
4713
4714      default:
4715	break;
4716      }
4717
4718  return NULL_RTX;
4719}
4720
4721enum
4722{
4723  CMP_EQ = 1,
4724  CMP_LT = 2,
4725  CMP_GT = 4,
4726  CMP_LTU = 8,
4727  CMP_GTU = 16
4728};
4729
4730
4731/* Convert the known results for EQ, LT, GT, LTU, GTU contained in
4732   KNOWN_RESULT to a CONST_INT, based on the requested comparison CODE
4733   For KNOWN_RESULT to make sense it should be either CMP_EQ, or the
4734   logical OR of one of (CMP_LT, CMP_GT) and one of (CMP_LTU, CMP_GTU).
4735   For floating-point comparisons, assume that the operands were ordered.  */
4736
4737static rtx
4738comparison_result (enum rtx_code code, int known_results)
4739{
4740  switch (code)
4741    {
4742    case EQ:
4743    case UNEQ:
4744      return (known_results & CMP_EQ) ? const_true_rtx : const0_rtx;
4745    case NE:
4746    case LTGT:
4747      return (known_results & CMP_EQ) ? const0_rtx : const_true_rtx;
4748
4749    case LT:
4750    case UNLT:
4751      return (known_results & CMP_LT) ? const_true_rtx : const0_rtx;
4752    case GE:
4753    case UNGE:
4754      return (known_results & CMP_LT) ? const0_rtx : const_true_rtx;
4755
4756    case GT:
4757    case UNGT:
4758      return (known_results & CMP_GT) ? const_true_rtx : const0_rtx;
4759    case LE:
4760    case UNLE:
4761      return (known_results & CMP_GT) ? const0_rtx : const_true_rtx;
4762
4763    case LTU:
4764      return (known_results & CMP_LTU) ? const_true_rtx : const0_rtx;
4765    case GEU:
4766      return (known_results & CMP_LTU) ? const0_rtx : const_true_rtx;
4767
4768    case GTU:
4769      return (known_results & CMP_GTU) ? const_true_rtx : const0_rtx;
4770    case LEU:
4771      return (known_results & CMP_GTU) ? const0_rtx : const_true_rtx;
4772
4773    case ORDERED:
4774      return const_true_rtx;
4775    case UNORDERED:
4776      return const0_rtx;
4777    default:
4778      gcc_unreachable ();
4779    }
4780}
4781
4782/* Check if the given comparison (done in the given MODE) is actually
4783   a tautology or a contradiction.  If the mode is VOID_mode, the
4784   comparison is done in "infinite precision".  If no simplification
4785   is possible, this function returns zero.  Otherwise, it returns
4786   either const_true_rtx or const0_rtx.  */
4787
4788rtx
4789simplify_const_relational_operation (enum rtx_code code,
4790				     machine_mode mode,
4791				     rtx op0, rtx op1)
4792{
4793  rtx tem;
4794  rtx trueop0;
4795  rtx trueop1;
4796
4797  gcc_assert (mode != VOIDmode
4798	      || (GET_MODE (op0) == VOIDmode
4799		  && GET_MODE (op1) == VOIDmode));
4800
4801  /* If op0 is a compare, extract the comparison arguments from it.  */
4802  if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
4803    {
4804      op1 = XEXP (op0, 1);
4805      op0 = XEXP (op0, 0);
4806
4807      if (GET_MODE (op0) != VOIDmode)
4808	mode = GET_MODE (op0);
4809      else if (GET_MODE (op1) != VOIDmode)
4810	mode = GET_MODE (op1);
4811      else
4812	return 0;
4813    }
4814
4815  /* We can't simplify MODE_CC values since we don't know what the
4816     actual comparison is.  */
4817  if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC || CC0_P (op0))
4818    return 0;
4819
4820  /* Make sure the constant is second.  */
4821  if (swap_commutative_operands_p (op0, op1))
4822    {
4823      tem = op0, op0 = op1, op1 = tem;
4824      code = swap_condition (code);
4825    }
4826
4827  trueop0 = avoid_constant_pool_reference (op0);
4828  trueop1 = avoid_constant_pool_reference (op1);
4829
4830  /* For integer comparisons of A and B maybe we can simplify A - B and can
4831     then simplify a comparison of that with zero.  If A and B are both either
4832     a register or a CONST_INT, this can't help; testing for these cases will
4833     prevent infinite recursion here and speed things up.
4834
4835     We can only do this for EQ and NE comparisons as otherwise we may
4836     lose or introduce overflow which we cannot disregard as undefined as
4837     we do not know the signedness of the operation on either the left or
4838     the right hand side of the comparison.  */
4839
4840  if (INTEGRAL_MODE_P (mode) && trueop1 != const0_rtx
4841      && (code == EQ || code == NE)
4842      && ! ((REG_P (op0) || CONST_INT_P (trueop0))
4843	    && (REG_P (op1) || CONST_INT_P (trueop1)))
4844      && 0 != (tem = simplify_binary_operation (MINUS, mode, op0, op1))
4845      /* We cannot do this if tem is a nonzero address.  */
4846      && ! nonzero_address_p (tem))
4847    return simplify_const_relational_operation (signed_condition (code),
4848						mode, tem, const0_rtx);
4849
4850  if (! HONOR_NANS (mode) && code == ORDERED)
4851    return const_true_rtx;
4852
4853  if (! HONOR_NANS (mode) && code == UNORDERED)
4854    return const0_rtx;
4855
4856  /* For modes without NaNs, if the two operands are equal, we know the
4857     result except if they have side-effects.  Even with NaNs we know
4858     the result of unordered comparisons and, if signaling NaNs are
4859     irrelevant, also the result of LT/GT/LTGT.  */
4860  if ((! HONOR_NANS (trueop0)
4861       || code == UNEQ || code == UNLE || code == UNGE
4862       || ((code == LT || code == GT || code == LTGT)
4863	   && ! HONOR_SNANS (trueop0)))
4864      && rtx_equal_p (trueop0, trueop1)
4865      && ! side_effects_p (trueop0))
4866    return comparison_result (code, CMP_EQ);
4867
4868  /* If the operands are floating-point constants, see if we can fold
4869     the result.  */
4870  if (CONST_DOUBLE_AS_FLOAT_P (trueop0)
4871      && CONST_DOUBLE_AS_FLOAT_P (trueop1)
4872      && SCALAR_FLOAT_MODE_P (GET_MODE (trueop0)))
4873    {
4874      REAL_VALUE_TYPE d0, d1;
4875
4876      REAL_VALUE_FROM_CONST_DOUBLE (d0, trueop0);
4877      REAL_VALUE_FROM_CONST_DOUBLE (d1, trueop1);
4878
4879      /* Comparisons are unordered iff at least one of the values is NaN.  */
4880      if (REAL_VALUE_ISNAN (d0) || REAL_VALUE_ISNAN (d1))
4881	switch (code)
4882	  {
4883	  case UNEQ:
4884	  case UNLT:
4885	  case UNGT:
4886	  case UNLE:
4887	  case UNGE:
4888	  case NE:
4889	  case UNORDERED:
4890	    return const_true_rtx;
4891	  case EQ:
4892	  case LT:
4893	  case GT:
4894	  case LE:
4895	  case GE:
4896	  case LTGT:
4897	  case ORDERED:
4898	    return const0_rtx;
4899	  default:
4900	    return 0;
4901	  }
4902
4903      return comparison_result (code,
4904				(REAL_VALUES_EQUAL (d0, d1) ? CMP_EQ :
4905				 REAL_VALUES_LESS (d0, d1) ? CMP_LT : CMP_GT));
4906    }
4907
4908  /* Otherwise, see if the operands are both integers.  */
4909  if ((GET_MODE_CLASS (mode) == MODE_INT || mode == VOIDmode)
4910      && CONST_SCALAR_INT_P (trueop0) && CONST_SCALAR_INT_P (trueop1))
4911    {
4912      /* It would be nice if we really had a mode here.  However, the
4913	 largest int representable on the target is as good as
4914	 infinite.  */
4915      machine_mode cmode = (mode == VOIDmode) ? MAX_MODE_INT : mode;
4916      rtx_mode_t ptrueop0 = std::make_pair (trueop0, cmode);
4917      rtx_mode_t ptrueop1 = std::make_pair (trueop1, cmode);
4918
4919      if (wi::eq_p (ptrueop0, ptrueop1))
4920	return comparison_result (code, CMP_EQ);
4921      else
4922	{
4923	  int cr = wi::lts_p (ptrueop0, ptrueop1) ? CMP_LT : CMP_GT;
4924	  cr |= wi::ltu_p (ptrueop0, ptrueop1) ? CMP_LTU : CMP_GTU;
4925	  return comparison_result (code, cr);
4926	}
4927    }
4928
4929  /* Optimize comparisons with upper and lower bounds.  */
4930  if (HWI_COMPUTABLE_MODE_P (mode)
4931      && CONST_INT_P (trueop1)
4932      && !side_effects_p (trueop0))
4933    {
4934      int sign;
4935      unsigned HOST_WIDE_INT nonzero = nonzero_bits (trueop0, mode);
4936      HOST_WIDE_INT val = INTVAL (trueop1);
4937      HOST_WIDE_INT mmin, mmax;
4938
4939      if (code == GEU
4940	  || code == LEU
4941	  || code == GTU
4942	  || code == LTU)
4943	sign = 0;
4944      else
4945	sign = 1;
4946
4947      /* Get a reduced range if the sign bit is zero.  */
4948      if (nonzero <= (GET_MODE_MASK (mode) >> 1))
4949	{
4950	  mmin = 0;
4951	  mmax = nonzero;
4952	}
4953      else
4954	{
4955	  rtx mmin_rtx, mmax_rtx;
4956	  get_mode_bounds (mode, sign, mode, &mmin_rtx, &mmax_rtx);
4957
4958	  mmin = INTVAL (mmin_rtx);
4959	  mmax = INTVAL (mmax_rtx);
4960	  if (sign)
4961	    {
4962	      unsigned int sign_copies = num_sign_bit_copies (trueop0, mode);
4963
4964	      mmin >>= (sign_copies - 1);
4965	      mmax >>= (sign_copies - 1);
4966	    }
4967	}
4968
4969      switch (code)
4970	{
4971	/* x >= y is always true for y <= mmin, always false for y > mmax.  */
4972	case GEU:
4973	  if ((unsigned HOST_WIDE_INT) val <= (unsigned HOST_WIDE_INT) mmin)
4974	    return const_true_rtx;
4975	  if ((unsigned HOST_WIDE_INT) val > (unsigned HOST_WIDE_INT) mmax)
4976	    return const0_rtx;
4977	  break;
4978	case GE:
4979	  if (val <= mmin)
4980	    return const_true_rtx;
4981	  if (val > mmax)
4982	    return const0_rtx;
4983	  break;
4984
4985	/* x <= y is always true for y >= mmax, always false for y < mmin.  */
4986	case LEU:
4987	  if ((unsigned HOST_WIDE_INT) val >= (unsigned HOST_WIDE_INT) mmax)
4988	    return const_true_rtx;
4989	  if ((unsigned HOST_WIDE_INT) val < (unsigned HOST_WIDE_INT) mmin)
4990	    return const0_rtx;
4991	  break;
4992	case LE:
4993	  if (val >= mmax)
4994	    return const_true_rtx;
4995	  if (val < mmin)
4996	    return const0_rtx;
4997	  break;
4998
4999	case EQ:
5000	  /* x == y is always false for y out of range.  */
5001	  if (val < mmin || val > mmax)
5002	    return const0_rtx;
5003	  break;
5004
5005	/* x > y is always false for y >= mmax, always true for y < mmin.  */
5006	case GTU:
5007	  if ((unsigned HOST_WIDE_INT) val >= (unsigned HOST_WIDE_INT) mmax)
5008	    return const0_rtx;
5009	  if ((unsigned HOST_WIDE_INT) val < (unsigned HOST_WIDE_INT) mmin)
5010	    return const_true_rtx;
5011	  break;
5012	case GT:
5013	  if (val >= mmax)
5014	    return const0_rtx;
5015	  if (val < mmin)
5016	    return const_true_rtx;
5017	  break;
5018
5019	/* x < y is always false for y <= mmin, always true for y > mmax.  */
5020	case LTU:
5021	  if ((unsigned HOST_WIDE_INT) val <= (unsigned HOST_WIDE_INT) mmin)
5022	    return const0_rtx;
5023	  if ((unsigned HOST_WIDE_INT) val > (unsigned HOST_WIDE_INT) mmax)
5024	    return const_true_rtx;
5025	  break;
5026	case LT:
5027	  if (val <= mmin)
5028	    return const0_rtx;
5029	  if (val > mmax)
5030	    return const_true_rtx;
5031	  break;
5032
5033	case NE:
5034	  /* x != y is always true for y out of range.  */
5035	  if (val < mmin || val > mmax)
5036	    return const_true_rtx;
5037	  break;
5038
5039	default:
5040	  break;
5041	}
5042    }
5043
5044  /* Optimize integer comparisons with zero.  */
5045  if (trueop1 == const0_rtx && !side_effects_p (trueop0))
5046    {
5047      /* Some addresses are known to be nonzero.  We don't know
5048	 their sign, but equality comparisons are known.  */
5049      if (nonzero_address_p (trueop0))
5050	{
5051	  if (code == EQ || code == LEU)
5052	    return const0_rtx;
5053	  if (code == NE || code == GTU)
5054	    return const_true_rtx;
5055	}
5056
5057      /* See if the first operand is an IOR with a constant.  If so, we
5058	 may be able to determine the result of this comparison.  */
5059      if (GET_CODE (op0) == IOR)
5060	{
5061	  rtx inner_const = avoid_constant_pool_reference (XEXP (op0, 1));
5062	  if (CONST_INT_P (inner_const) && inner_const != const0_rtx)
5063	    {
5064	      int sign_bitnum = GET_MODE_PRECISION (mode) - 1;
5065	      int has_sign = (HOST_BITS_PER_WIDE_INT >= sign_bitnum
5066			      && (UINTVAL (inner_const)
5067				  & ((unsigned HOST_WIDE_INT) 1
5068				     << sign_bitnum)));
5069
5070	      switch (code)
5071		{
5072		case EQ:
5073		case LEU:
5074		  return const0_rtx;
5075		case NE:
5076		case GTU:
5077		  return const_true_rtx;
5078		case LT:
5079		case LE:
5080		  if (has_sign)
5081		    return const_true_rtx;
5082		  break;
5083		case GT:
5084		case GE:
5085		  if (has_sign)
5086		    return const0_rtx;
5087		  break;
5088		default:
5089		  break;
5090		}
5091	    }
5092	}
5093    }
5094
5095  /* Optimize comparison of ABS with zero.  */
5096  if (trueop1 == CONST0_RTX (mode) && !side_effects_p (trueop0)
5097      && (GET_CODE (trueop0) == ABS
5098	  || (GET_CODE (trueop0) == FLOAT_EXTEND
5099	      && GET_CODE (XEXP (trueop0, 0)) == ABS)))
5100    {
5101      switch (code)
5102	{
5103	case LT:
5104	  /* Optimize abs(x) < 0.0.  */
5105	  if (!HONOR_SNANS (mode)
5106	      && (!INTEGRAL_MODE_P (mode)
5107		  || (!flag_wrapv && !flag_trapv && flag_strict_overflow)))
5108	    {
5109	      if (INTEGRAL_MODE_P (mode)
5110		  && (issue_strict_overflow_warning
5111		      (WARN_STRICT_OVERFLOW_CONDITIONAL)))
5112		warning (OPT_Wstrict_overflow,
5113			 ("assuming signed overflow does not occur when "
5114			  "assuming abs (x) < 0 is false"));
5115	       return const0_rtx;
5116	    }
5117	  break;
5118
5119	case GE:
5120	  /* Optimize abs(x) >= 0.0.  */
5121	  if (!HONOR_NANS (mode)
5122	      && (!INTEGRAL_MODE_P (mode)
5123		  || (!flag_wrapv && !flag_trapv && flag_strict_overflow)))
5124	    {
5125	      if (INTEGRAL_MODE_P (mode)
5126	          && (issue_strict_overflow_warning
5127	    	  (WARN_STRICT_OVERFLOW_CONDITIONAL)))
5128	        warning (OPT_Wstrict_overflow,
5129			 ("assuming signed overflow does not occur when "
5130			  "assuming abs (x) >= 0 is true"));
5131	      return const_true_rtx;
5132	    }
5133	  break;
5134
5135	case UNGE:
5136	  /* Optimize ! (abs(x) < 0.0).  */
5137	  return const_true_rtx;
5138
5139	default:
5140	  break;
5141	}
5142    }
5143
5144  return 0;
5145}
5146
5147/* Simplify CODE, an operation with result mode MODE and three operands,
5148   OP0, OP1, and OP2.  OP0_MODE was the mode of OP0 before it became
5149   a constant.  Return 0 if no simplifications is possible.  */
5150
5151rtx
5152simplify_ternary_operation (enum rtx_code code, machine_mode mode,
5153			    machine_mode op0_mode, rtx op0, rtx op1,
5154			    rtx op2)
5155{
5156  unsigned int width = GET_MODE_PRECISION (mode);
5157  bool any_change = false;
5158  rtx tem, trueop2;
5159
5160  /* VOIDmode means "infinite" precision.  */
5161  if (width == 0)
5162    width = HOST_BITS_PER_WIDE_INT;
5163
5164  switch (code)
5165    {
5166    case FMA:
5167      /* Simplify negations around the multiplication.  */
5168      /* -a * -b + c  =>  a * b + c.  */
5169      if (GET_CODE (op0) == NEG)
5170	{
5171	  tem = simplify_unary_operation (NEG, mode, op1, mode);
5172	  if (tem)
5173	    op1 = tem, op0 = XEXP (op0, 0), any_change = true;
5174	}
5175      else if (GET_CODE (op1) == NEG)
5176	{
5177	  tem = simplify_unary_operation (NEG, mode, op0, mode);
5178	  if (tem)
5179	    op0 = tem, op1 = XEXP (op1, 0), any_change = true;
5180	}
5181
5182      /* Canonicalize the two multiplication operands.  */
5183      /* a * -b + c  =>  -b * a + c.  */
5184      if (swap_commutative_operands_p (op0, op1))
5185	tem = op0, op0 = op1, op1 = tem, any_change = true;
5186
5187      if (any_change)
5188	return gen_rtx_FMA (mode, op0, op1, op2);
5189      return NULL_RTX;
5190
5191    case SIGN_EXTRACT:
5192    case ZERO_EXTRACT:
5193      if (CONST_INT_P (op0)
5194	  && CONST_INT_P (op1)
5195	  && CONST_INT_P (op2)
5196	  && ((unsigned) INTVAL (op1) + (unsigned) INTVAL (op2) <= width)
5197	  && width <= (unsigned) HOST_BITS_PER_WIDE_INT)
5198	{
5199	  /* Extracting a bit-field from a constant */
5200	  unsigned HOST_WIDE_INT val = UINTVAL (op0);
5201	  HOST_WIDE_INT op1val = INTVAL (op1);
5202	  HOST_WIDE_INT op2val = INTVAL (op2);
5203	  if (BITS_BIG_ENDIAN)
5204	    val >>= GET_MODE_PRECISION (op0_mode) - op2val - op1val;
5205	  else
5206	    val >>= op2val;
5207
5208	  if (HOST_BITS_PER_WIDE_INT != op1val)
5209	    {
5210	      /* First zero-extend.  */
5211	      val &= ((unsigned HOST_WIDE_INT) 1 << op1val) - 1;
5212	      /* If desired, propagate sign bit.  */
5213	      if (code == SIGN_EXTRACT
5214		  && (val & ((unsigned HOST_WIDE_INT) 1 << (op1val - 1)))
5215		     != 0)
5216		val |= ~ (((unsigned HOST_WIDE_INT) 1 << op1val) - 1);
5217	    }
5218
5219	  return gen_int_mode (val, mode);
5220	}
5221      break;
5222
5223    case IF_THEN_ELSE:
5224      if (CONST_INT_P (op0))
5225	return op0 != const0_rtx ? op1 : op2;
5226
5227      /* Convert c ? a : a into "a".  */
5228      if (rtx_equal_p (op1, op2) && ! side_effects_p (op0))
5229	return op1;
5230
5231      /* Convert a != b ? a : b into "a".  */
5232      if (GET_CODE (op0) == NE
5233	  && ! side_effects_p (op0)
5234	  && ! HONOR_NANS (mode)
5235	  && ! HONOR_SIGNED_ZEROS (mode)
5236	  && ((rtx_equal_p (XEXP (op0, 0), op1)
5237	       && rtx_equal_p (XEXP (op0, 1), op2))
5238	      || (rtx_equal_p (XEXP (op0, 0), op2)
5239		  && rtx_equal_p (XEXP (op0, 1), op1))))
5240	return op1;
5241
5242      /* Convert a == b ? a : b into "b".  */
5243      if (GET_CODE (op0) == EQ
5244	  && ! side_effects_p (op0)
5245	  && ! HONOR_NANS (mode)
5246	  && ! HONOR_SIGNED_ZEROS (mode)
5247	  && ((rtx_equal_p (XEXP (op0, 0), op1)
5248	       && rtx_equal_p (XEXP (op0, 1), op2))
5249	      || (rtx_equal_p (XEXP (op0, 0), op2)
5250		  && rtx_equal_p (XEXP (op0, 1), op1))))
5251	return op2;
5252
5253      if (COMPARISON_P (op0) && ! side_effects_p (op0))
5254	{
5255	  machine_mode cmp_mode = (GET_MODE (XEXP (op0, 0)) == VOIDmode
5256					? GET_MODE (XEXP (op0, 1))
5257					: GET_MODE (XEXP (op0, 0)));
5258	  rtx temp;
5259
5260	  /* Look for happy constants in op1 and op2.  */
5261	  if (CONST_INT_P (op1) && CONST_INT_P (op2))
5262	    {
5263	      HOST_WIDE_INT t = INTVAL (op1);
5264	      HOST_WIDE_INT f = INTVAL (op2);
5265
5266	      if (t == STORE_FLAG_VALUE && f == 0)
5267	        code = GET_CODE (op0);
5268	      else if (t == 0 && f == STORE_FLAG_VALUE)
5269		{
5270		  enum rtx_code tmp;
5271		  tmp = reversed_comparison_code (op0, NULL_RTX);
5272		  if (tmp == UNKNOWN)
5273		    break;
5274		  code = tmp;
5275		}
5276	      else
5277		break;
5278
5279	      return simplify_gen_relational (code, mode, cmp_mode,
5280					      XEXP (op0, 0), XEXP (op0, 1));
5281	    }
5282
5283	  if (cmp_mode == VOIDmode)
5284	    cmp_mode = op0_mode;
5285	  temp = simplify_relational_operation (GET_CODE (op0), op0_mode,
5286			  			cmp_mode, XEXP (op0, 0),
5287						XEXP (op0, 1));
5288
5289	  /* See if any simplifications were possible.  */
5290	  if (temp)
5291	    {
5292	      if (CONST_INT_P (temp))
5293		return temp == const0_rtx ? op2 : op1;
5294	      else if (temp)
5295	        return gen_rtx_IF_THEN_ELSE (mode, temp, op1, op2);
5296	    }
5297	}
5298      break;
5299
5300    case VEC_MERGE:
5301      gcc_assert (GET_MODE (op0) == mode);
5302      gcc_assert (GET_MODE (op1) == mode);
5303      gcc_assert (VECTOR_MODE_P (mode));
5304      trueop2 = avoid_constant_pool_reference (op2);
5305      if (CONST_INT_P (trueop2))
5306	{
5307	  int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
5308	  unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
5309	  unsigned HOST_WIDE_INT sel = UINTVAL (trueop2);
5310	  unsigned HOST_WIDE_INT mask;
5311	  if (n_elts == HOST_BITS_PER_WIDE_INT)
5312	    mask = -1;
5313	  else
5314	    mask = ((unsigned HOST_WIDE_INT) 1 << n_elts) - 1;
5315
5316	  if (!(sel & mask) && !side_effects_p (op0))
5317	    return op1;
5318	  if ((sel & mask) == mask && !side_effects_p (op1))
5319	    return op0;
5320
5321	  rtx trueop0 = avoid_constant_pool_reference (op0);
5322	  rtx trueop1 = avoid_constant_pool_reference (op1);
5323	  if (GET_CODE (trueop0) == CONST_VECTOR
5324	      && GET_CODE (trueop1) == CONST_VECTOR)
5325	    {
5326	      rtvec v = rtvec_alloc (n_elts);
5327	      unsigned int i;
5328
5329	      for (i = 0; i < n_elts; i++)
5330		RTVEC_ELT (v, i) = ((sel & ((unsigned HOST_WIDE_INT) 1 << i))
5331				    ? CONST_VECTOR_ELT (trueop0, i)
5332				    : CONST_VECTOR_ELT (trueop1, i));
5333	      return gen_rtx_CONST_VECTOR (mode, v);
5334	    }
5335
5336	  /* Replace (vec_merge (vec_merge a b m) c n) with (vec_merge b c n)
5337	     if no element from a appears in the result.  */
5338	  if (GET_CODE (op0) == VEC_MERGE)
5339	    {
5340	      tem = avoid_constant_pool_reference (XEXP (op0, 2));
5341	      if (CONST_INT_P (tem))
5342		{
5343		  unsigned HOST_WIDE_INT sel0 = UINTVAL (tem);
5344		  if (!(sel & sel0 & mask) && !side_effects_p (XEXP (op0, 0)))
5345		    return simplify_gen_ternary (code, mode, mode,
5346						 XEXP (op0, 1), op1, op2);
5347		  if (!(sel & ~sel0 & mask) && !side_effects_p (XEXP (op0, 1)))
5348		    return simplify_gen_ternary (code, mode, mode,
5349						 XEXP (op0, 0), op1, op2);
5350		}
5351	    }
5352	  if (GET_CODE (op1) == VEC_MERGE)
5353	    {
5354	      tem = avoid_constant_pool_reference (XEXP (op1, 2));
5355	      if (CONST_INT_P (tem))
5356		{
5357		  unsigned HOST_WIDE_INT sel1 = UINTVAL (tem);
5358		  if (!(~sel & sel1 & mask) && !side_effects_p (XEXP (op1, 0)))
5359		    return simplify_gen_ternary (code, mode, mode,
5360						 op0, XEXP (op1, 1), op2);
5361		  if (!(~sel & ~sel1 & mask) && !side_effects_p (XEXP (op1, 1)))
5362		    return simplify_gen_ternary (code, mode, mode,
5363						 op0, XEXP (op1, 0), op2);
5364		}
5365	    }
5366
5367	  /* Replace (vec_merge (vec_duplicate (vec_select a parallel (i))) a 1 << i)
5368	     with a.  */
5369	  if (GET_CODE (op0) == VEC_DUPLICATE
5370	      && GET_CODE (XEXP (op0, 0)) == VEC_SELECT
5371	      && GET_CODE (XEXP (XEXP (op0, 0), 1)) == PARALLEL
5372	      && mode_nunits[GET_MODE (XEXP (op0, 0))] == 1)
5373	    {
5374	      tem = XVECEXP ((XEXP (XEXP (op0, 0), 1)), 0, 0);
5375	      if (CONST_INT_P (tem) && CONST_INT_P (op2))
5376		{
5377		  if (XEXP (XEXP (op0, 0), 0) == op1
5378		      && UINTVAL (op2) == HOST_WIDE_INT_1U << UINTVAL (tem))
5379		    return op1;
5380		}
5381	    }
5382	}
5383
5384      if (rtx_equal_p (op0, op1)
5385	  && !side_effects_p (op2) && !side_effects_p (op1))
5386	return op0;
5387
5388      break;
5389
5390    default:
5391      gcc_unreachable ();
5392    }
5393
5394  return 0;
5395}
5396
5397/* Evaluate a SUBREG of a CONST_INT or CONST_WIDE_INT or CONST_DOUBLE
5398   or CONST_FIXED or CONST_VECTOR, returning another CONST_INT or
5399   CONST_WIDE_INT or CONST_DOUBLE or CONST_FIXED or CONST_VECTOR.
5400
5401   Works by unpacking OP into a collection of 8-bit values
5402   represented as a little-endian array of 'unsigned char', selecting by BYTE,
5403   and then repacking them again for OUTERMODE.  */
5404
5405static rtx
5406simplify_immed_subreg (machine_mode outermode, rtx op,
5407		       machine_mode innermode, unsigned int byte)
5408{
5409  enum {
5410    value_bit = 8,
5411    value_mask = (1 << value_bit) - 1
5412  };
5413  unsigned char value[MAX_BITSIZE_MODE_ANY_MODE / value_bit];
5414  int value_start;
5415  int i;
5416  int elem;
5417
5418  int num_elem;
5419  rtx * elems;
5420  int elem_bitsize;
5421  rtx result_s;
5422  rtvec result_v = NULL;
5423  enum mode_class outer_class;
5424  machine_mode outer_submode;
5425  int max_bitsize;
5426
5427  /* Some ports misuse CCmode.  */
5428  if (GET_MODE_CLASS (outermode) == MODE_CC && CONST_INT_P (op))
5429    return op;
5430
5431  /* We have no way to represent a complex constant at the rtl level.  */
5432  if (COMPLEX_MODE_P (outermode))
5433    return NULL_RTX;
5434
5435  /* We support any size mode.  */
5436  max_bitsize = MAX (GET_MODE_BITSIZE (outermode),
5437		     GET_MODE_BITSIZE (innermode));
5438
5439  /* Unpack the value.  */
5440
5441  if (GET_CODE (op) == CONST_VECTOR)
5442    {
5443      num_elem = CONST_VECTOR_NUNITS (op);
5444      elems = &CONST_VECTOR_ELT (op, 0);
5445      elem_bitsize = GET_MODE_BITSIZE (GET_MODE_INNER (innermode));
5446    }
5447  else
5448    {
5449      num_elem = 1;
5450      elems = &op;
5451      elem_bitsize = max_bitsize;
5452    }
5453  /* If this asserts, it is too complicated; reducing value_bit may help.  */
5454  gcc_assert (BITS_PER_UNIT % value_bit == 0);
5455  /* I don't know how to handle endianness of sub-units.  */
5456  gcc_assert (elem_bitsize % BITS_PER_UNIT == 0);
5457
5458  for (elem = 0; elem < num_elem; elem++)
5459    {
5460      unsigned char * vp;
5461      rtx el = elems[elem];
5462
5463      /* Vectors are kept in target memory order.  (This is probably
5464	 a mistake.)  */
5465      {
5466	unsigned byte = (elem * elem_bitsize) / BITS_PER_UNIT;
5467	unsigned ibyte = (((num_elem - 1 - elem) * elem_bitsize)
5468			  / BITS_PER_UNIT);
5469	unsigned word_byte = WORDS_BIG_ENDIAN ? ibyte : byte;
5470	unsigned subword_byte = BYTES_BIG_ENDIAN ? ibyte : byte;
5471	unsigned bytele = (subword_byte % UNITS_PER_WORD
5472			 + (word_byte / UNITS_PER_WORD) * UNITS_PER_WORD);
5473	vp = value + (bytele * BITS_PER_UNIT) / value_bit;
5474      }
5475
5476      switch (GET_CODE (el))
5477	{
5478	case CONST_INT:
5479	  for (i = 0;
5480	       i < HOST_BITS_PER_WIDE_INT && i < elem_bitsize;
5481	       i += value_bit)
5482	    *vp++ = INTVAL (el) >> i;
5483	  /* CONST_INTs are always logically sign-extended.  */
5484	  for (; i < elem_bitsize; i += value_bit)
5485	    *vp++ = INTVAL (el) < 0 ? -1 : 0;
5486	  break;
5487
5488	case CONST_WIDE_INT:
5489	  {
5490	    rtx_mode_t val = std::make_pair (el, innermode);
5491	    unsigned char extend = wi::sign_mask (val);
5492
5493	    for (i = 0; i < elem_bitsize; i += value_bit)
5494	      *vp++ = wi::extract_uhwi (val, i, value_bit);
5495	    for (; i < elem_bitsize; i += value_bit)
5496	      *vp++ = extend;
5497	  }
5498	  break;
5499
5500	case CONST_DOUBLE:
5501	  if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (el) == VOIDmode)
5502	    {
5503	      unsigned char extend = 0;
5504	      /* If this triggers, someone should have generated a
5505		 CONST_INT instead.  */
5506	      gcc_assert (elem_bitsize > HOST_BITS_PER_WIDE_INT);
5507
5508	      for (i = 0; i < HOST_BITS_PER_WIDE_INT; i += value_bit)
5509		*vp++ = CONST_DOUBLE_LOW (el) >> i;
5510	      while (i < HOST_BITS_PER_DOUBLE_INT && i < elem_bitsize)
5511		{
5512		  *vp++
5513		    = CONST_DOUBLE_HIGH (el) >> (i - HOST_BITS_PER_WIDE_INT);
5514		  i += value_bit;
5515		}
5516
5517	      if (CONST_DOUBLE_HIGH (el) >> (HOST_BITS_PER_WIDE_INT - 1))
5518		extend = -1;
5519	      for (; i < elem_bitsize; i += value_bit)
5520		*vp++ = extend;
5521	    }
5522	  else
5523	    {
5524	      /* This is big enough for anything on the platform.  */
5525	      long tmp[MAX_BITSIZE_MODE_ANY_MODE / 32];
5526	      int bitsize = GET_MODE_BITSIZE (GET_MODE (el));
5527
5528	      gcc_assert (SCALAR_FLOAT_MODE_P (GET_MODE (el)));
5529	      gcc_assert (bitsize <= elem_bitsize);
5530	      gcc_assert (bitsize % value_bit == 0);
5531
5532	      real_to_target (tmp, CONST_DOUBLE_REAL_VALUE (el),
5533			      GET_MODE (el));
5534
5535	      /* real_to_target produces its result in words affected by
5536		 FLOAT_WORDS_BIG_ENDIAN.  However, we ignore this,
5537		 and use WORDS_BIG_ENDIAN instead; see the documentation
5538	         of SUBREG in rtl.texi.  */
5539	      for (i = 0; i < bitsize; i += value_bit)
5540		{
5541		  int ibase;
5542		  if (WORDS_BIG_ENDIAN)
5543		    ibase = bitsize - 1 - i;
5544		  else
5545		    ibase = i;
5546		  *vp++ = tmp[ibase / 32] >> i % 32;
5547		}
5548
5549	      /* It shouldn't matter what's done here, so fill it with
5550		 zero.  */
5551	      for (; i < elem_bitsize; i += value_bit)
5552		*vp++ = 0;
5553	    }
5554	  break;
5555
5556        case CONST_FIXED:
5557	  if (elem_bitsize <= HOST_BITS_PER_WIDE_INT)
5558	    {
5559	      for (i = 0; i < elem_bitsize; i += value_bit)
5560		*vp++ = CONST_FIXED_VALUE_LOW (el) >> i;
5561	    }
5562	  else
5563	    {
5564	      for (i = 0; i < HOST_BITS_PER_WIDE_INT; i += value_bit)
5565		*vp++ = CONST_FIXED_VALUE_LOW (el) >> i;
5566              for (; i < HOST_BITS_PER_DOUBLE_INT && i < elem_bitsize;
5567		   i += value_bit)
5568		*vp++ = CONST_FIXED_VALUE_HIGH (el)
5569			>> (i - HOST_BITS_PER_WIDE_INT);
5570	      for (; i < elem_bitsize; i += value_bit)
5571		*vp++ = 0;
5572	    }
5573          break;
5574
5575	default:
5576	  gcc_unreachable ();
5577	}
5578    }
5579
5580  /* Now, pick the right byte to start with.  */
5581  /* Renumber BYTE so that the least-significant byte is byte 0.  A special
5582     case is paradoxical SUBREGs, which shouldn't be adjusted since they
5583     will already have offset 0.  */
5584  if (GET_MODE_SIZE (innermode) >= GET_MODE_SIZE (outermode))
5585    {
5586      unsigned ibyte = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode)
5587			- byte);
5588      unsigned word_byte = WORDS_BIG_ENDIAN ? ibyte : byte;
5589      unsigned subword_byte = BYTES_BIG_ENDIAN ? ibyte : byte;
5590      byte = (subword_byte % UNITS_PER_WORD
5591	      + (word_byte / UNITS_PER_WORD) * UNITS_PER_WORD);
5592    }
5593
5594  /* BYTE should still be inside OP.  (Note that BYTE is unsigned,
5595     so if it's become negative it will instead be very large.)  */
5596  gcc_assert (byte < GET_MODE_SIZE (innermode));
5597
5598  /* Convert from bytes to chunks of size value_bit.  */
5599  value_start = byte * (BITS_PER_UNIT / value_bit);
5600
5601  /* Re-pack the value.  */
5602
5603  if (VECTOR_MODE_P (outermode))
5604    {
5605      num_elem = GET_MODE_NUNITS (outermode);
5606      result_v = rtvec_alloc (num_elem);
5607      elems = &RTVEC_ELT (result_v, 0);
5608      outer_submode = GET_MODE_INNER (outermode);
5609    }
5610  else
5611    {
5612      num_elem = 1;
5613      elems = &result_s;
5614      outer_submode = outermode;
5615    }
5616
5617  outer_class = GET_MODE_CLASS (outer_submode);
5618  elem_bitsize = GET_MODE_BITSIZE (outer_submode);
5619
5620  gcc_assert (elem_bitsize % value_bit == 0);
5621  gcc_assert (elem_bitsize + value_start * value_bit <= max_bitsize);
5622
5623  for (elem = 0; elem < num_elem; elem++)
5624    {
5625      unsigned char *vp;
5626
5627      /* Vectors are stored in target memory order.  (This is probably
5628	 a mistake.)  */
5629      {
5630	unsigned byte = (elem * elem_bitsize) / BITS_PER_UNIT;
5631	unsigned ibyte = (((num_elem - 1 - elem) * elem_bitsize)
5632			  / BITS_PER_UNIT);
5633	unsigned word_byte = WORDS_BIG_ENDIAN ? ibyte : byte;
5634	unsigned subword_byte = BYTES_BIG_ENDIAN ? ibyte : byte;
5635	unsigned bytele = (subword_byte % UNITS_PER_WORD
5636			 + (word_byte / UNITS_PER_WORD) * UNITS_PER_WORD);
5637	vp = value + value_start + (bytele * BITS_PER_UNIT) / value_bit;
5638      }
5639
5640      switch (outer_class)
5641	{
5642	case MODE_INT:
5643	case MODE_PARTIAL_INT:
5644	  {
5645	    int u;
5646	    int base = 0;
5647	    int units
5648	      = (GET_MODE_BITSIZE (outer_submode) + HOST_BITS_PER_WIDE_INT - 1)
5649	      / HOST_BITS_PER_WIDE_INT;
5650	    HOST_WIDE_INT tmp[MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT];
5651	    wide_int r;
5652
5653	    if (GET_MODE_PRECISION (outer_submode) > MAX_BITSIZE_MODE_ANY_INT)
5654	      return NULL_RTX;
5655	    for (u = 0; u < units; u++)
5656	      {
5657		unsigned HOST_WIDE_INT buf = 0;
5658		for (i = 0;
5659		     i < HOST_BITS_PER_WIDE_INT && base + i < elem_bitsize;
5660		     i += value_bit)
5661		  buf |= (unsigned HOST_WIDE_INT)(*vp++ & value_mask) << i;
5662
5663		tmp[u] = buf;
5664		base += HOST_BITS_PER_WIDE_INT;
5665	      }
5666	    r = wide_int::from_array (tmp, units,
5667				      GET_MODE_PRECISION (outer_submode));
5668#if TARGET_SUPPORTS_WIDE_INT == 0
5669	    /* Make sure r will fit into CONST_INT or CONST_DOUBLE.  */
5670	    if (wi::min_precision (r, SIGNED) > HOST_BITS_PER_DOUBLE_INT)
5671	      return NULL_RTX;
5672#endif
5673	    elems[elem] = immed_wide_int_const (r, outer_submode);
5674	  }
5675	  break;
5676
5677	case MODE_FLOAT:
5678	case MODE_DECIMAL_FLOAT:
5679	  {
5680	    REAL_VALUE_TYPE r;
5681	    long tmp[MAX_BITSIZE_MODE_ANY_MODE / 32];
5682
5683	    /* real_from_target wants its input in words affected by
5684	       FLOAT_WORDS_BIG_ENDIAN.  However, we ignore this,
5685	       and use WORDS_BIG_ENDIAN instead; see the documentation
5686	       of SUBREG in rtl.texi.  */
5687	    for (i = 0; i < max_bitsize / 32; i++)
5688	      tmp[i] = 0;
5689	    for (i = 0; i < elem_bitsize; i += value_bit)
5690	      {
5691		int ibase;
5692		if (WORDS_BIG_ENDIAN)
5693		  ibase = elem_bitsize - 1 - i;
5694		else
5695		  ibase = i;
5696		tmp[ibase / 32] |= (*vp++ & value_mask) << i % 32;
5697	      }
5698
5699	    real_from_target (&r, tmp, outer_submode);
5700	    elems[elem] = CONST_DOUBLE_FROM_REAL_VALUE (r, outer_submode);
5701	  }
5702	  break;
5703
5704	case MODE_FRACT:
5705	case MODE_UFRACT:
5706	case MODE_ACCUM:
5707	case MODE_UACCUM:
5708	  {
5709	    FIXED_VALUE_TYPE f;
5710	    f.data.low = 0;
5711	    f.data.high = 0;
5712	    f.mode = outer_submode;
5713
5714	    for (i = 0;
5715		 i < HOST_BITS_PER_WIDE_INT && i < elem_bitsize;
5716		 i += value_bit)
5717	      f.data.low |= (unsigned HOST_WIDE_INT)(*vp++ & value_mask) << i;
5718	    for (; i < elem_bitsize; i += value_bit)
5719	      f.data.high |= ((unsigned HOST_WIDE_INT)(*vp++ & value_mask)
5720			     << (i - HOST_BITS_PER_WIDE_INT));
5721
5722	    elems[elem] = CONST_FIXED_FROM_FIXED_VALUE (f, outer_submode);
5723          }
5724          break;
5725
5726	default:
5727	  gcc_unreachable ();
5728	}
5729    }
5730  if (VECTOR_MODE_P (outermode))
5731    return gen_rtx_CONST_VECTOR (outermode, result_v);
5732  else
5733    return result_s;
5734}
5735
5736/* Simplify SUBREG:OUTERMODE(OP:INNERMODE, BYTE)
5737   Return 0 if no simplifications are possible.  */
5738rtx
5739simplify_subreg (machine_mode outermode, rtx op,
5740		 machine_mode innermode, unsigned int byte)
5741{
5742  /* Little bit of sanity checking.  */
5743  gcc_assert (innermode != VOIDmode);
5744  gcc_assert (outermode != VOIDmode);
5745  gcc_assert (innermode != BLKmode);
5746  gcc_assert (outermode != BLKmode);
5747
5748  gcc_assert (GET_MODE (op) == innermode
5749	      || GET_MODE (op) == VOIDmode);
5750
5751  if ((byte % GET_MODE_SIZE (outermode)) != 0)
5752    return NULL_RTX;
5753
5754  if (byte >= GET_MODE_SIZE (innermode))
5755    return NULL_RTX;
5756
5757  if (outermode == innermode && !byte)
5758    return op;
5759
5760  if (CONST_SCALAR_INT_P (op)
5761      || CONST_DOUBLE_AS_FLOAT_P (op)
5762      || GET_CODE (op) == CONST_FIXED
5763      || GET_CODE (op) == CONST_VECTOR)
5764    return simplify_immed_subreg (outermode, op, innermode, byte);
5765
5766  /* Changing mode twice with SUBREG => just change it once,
5767     or not at all if changing back op starting mode.  */
5768  if (GET_CODE (op) == SUBREG)
5769    {
5770      machine_mode innermostmode = GET_MODE (SUBREG_REG (op));
5771      int final_offset = byte + SUBREG_BYTE (op);
5772      rtx newx;
5773
5774      if (outermode == innermostmode
5775	  && byte == 0 && SUBREG_BYTE (op) == 0)
5776	return SUBREG_REG (op);
5777
5778      /* The SUBREG_BYTE represents offset, as if the value were stored
5779	 in memory.  Irritating exception is paradoxical subreg, where
5780	 we define SUBREG_BYTE to be 0.  On big endian machines, this
5781	 value should be negative.  For a moment, undo this exception.  */
5782      if (byte == 0 && GET_MODE_SIZE (innermode) < GET_MODE_SIZE (outermode))
5783	{
5784	  int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
5785	  if (WORDS_BIG_ENDIAN)
5786	    final_offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
5787	  if (BYTES_BIG_ENDIAN)
5788	    final_offset += difference % UNITS_PER_WORD;
5789	}
5790      if (SUBREG_BYTE (op) == 0
5791	  && GET_MODE_SIZE (innermostmode) < GET_MODE_SIZE (innermode))
5792	{
5793	  int difference = (GET_MODE_SIZE (innermostmode) - GET_MODE_SIZE (innermode));
5794	  if (WORDS_BIG_ENDIAN)
5795	    final_offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
5796	  if (BYTES_BIG_ENDIAN)
5797	    final_offset += difference % UNITS_PER_WORD;
5798	}
5799
5800      /* See whether resulting subreg will be paradoxical.  */
5801      if (GET_MODE_SIZE (innermostmode) > GET_MODE_SIZE (outermode))
5802	{
5803	  /* In nonparadoxical subregs we can't handle negative offsets.  */
5804	  if (final_offset < 0)
5805	    return NULL_RTX;
5806	  /* Bail out in case resulting subreg would be incorrect.  */
5807	  if (final_offset % GET_MODE_SIZE (outermode)
5808	      || (unsigned) final_offset >= GET_MODE_SIZE (innermostmode))
5809	    return NULL_RTX;
5810	}
5811      else
5812	{
5813	  int offset = 0;
5814	  int difference = (GET_MODE_SIZE (innermostmode) - GET_MODE_SIZE (outermode));
5815
5816	  /* In paradoxical subreg, see if we are still looking on lower part.
5817	     If so, our SUBREG_BYTE will be 0.  */
5818	  if (WORDS_BIG_ENDIAN)
5819	    offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
5820	  if (BYTES_BIG_ENDIAN)
5821	    offset += difference % UNITS_PER_WORD;
5822	  if (offset == final_offset)
5823	    final_offset = 0;
5824	  else
5825	    return NULL_RTX;
5826	}
5827
5828      /* Recurse for further possible simplifications.  */
5829      newx = simplify_subreg (outermode, SUBREG_REG (op), innermostmode,
5830			      final_offset);
5831      if (newx)
5832	return newx;
5833      if (validate_subreg (outermode, innermostmode,
5834			   SUBREG_REG (op), final_offset))
5835	{
5836	  newx = gen_rtx_SUBREG (outermode, SUBREG_REG (op), final_offset);
5837	  if (SUBREG_PROMOTED_VAR_P (op)
5838	      && SUBREG_PROMOTED_SIGN (op) >= 0
5839	      && GET_MODE_CLASS (outermode) == MODE_INT
5840	      && IN_RANGE (GET_MODE_SIZE (outermode),
5841			   GET_MODE_SIZE (innermode),
5842			   GET_MODE_SIZE (innermostmode))
5843	      && subreg_lowpart_p (newx))
5844	    {
5845	      SUBREG_PROMOTED_VAR_P (newx) = 1;
5846	      SUBREG_PROMOTED_SET (newx, SUBREG_PROMOTED_GET (op));
5847	    }
5848	  return newx;
5849	}
5850      return NULL_RTX;
5851    }
5852
5853  /* SUBREG of a hard register => just change the register number
5854     and/or mode.  If the hard register is not valid in that mode,
5855     suppress this simplification.  If the hard register is the stack,
5856     frame, or argument pointer, leave this as a SUBREG.  */
5857
5858  if (REG_P (op) && HARD_REGISTER_P (op))
5859    {
5860      unsigned int regno, final_regno;
5861
5862      regno = REGNO (op);
5863      final_regno = simplify_subreg_regno (regno, innermode, byte, outermode);
5864      if (HARD_REGISTER_NUM_P (final_regno))
5865	{
5866	  rtx x;
5867	  int final_offset = byte;
5868
5869	  /* Adjust offset for paradoxical subregs.  */
5870	  if (byte == 0
5871	      && GET_MODE_SIZE (innermode) < GET_MODE_SIZE (outermode))
5872	    {
5873	      int difference = (GET_MODE_SIZE (innermode)
5874				- GET_MODE_SIZE (outermode));
5875	      if (WORDS_BIG_ENDIAN)
5876		final_offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
5877	      if (BYTES_BIG_ENDIAN)
5878		final_offset += difference % UNITS_PER_WORD;
5879	    }
5880
5881	  x = gen_rtx_REG_offset (op, outermode, final_regno, final_offset);
5882
5883	  /* Propagate original regno.  We don't have any way to specify
5884	     the offset inside original regno, so do so only for lowpart.
5885	     The information is used only by alias analysis that can not
5886	     grog partial register anyway.  */
5887
5888	  if (subreg_lowpart_offset (outermode, innermode) == byte)
5889	    ORIGINAL_REGNO (x) = ORIGINAL_REGNO (op);
5890	  return x;
5891	}
5892    }
5893
5894  /* If we have a SUBREG of a register that we are replacing and we are
5895     replacing it with a MEM, make a new MEM and try replacing the
5896     SUBREG with it.  Don't do this if the MEM has a mode-dependent address
5897     or if we would be widening it.  */
5898
5899  if (MEM_P (op)
5900      && ! mode_dependent_address_p (XEXP (op, 0), MEM_ADDR_SPACE (op))
5901      /* Allow splitting of volatile memory references in case we don't
5902         have instruction to move the whole thing.  */
5903      && (! MEM_VOLATILE_P (op)
5904	  || ! have_insn_for (SET, innermode))
5905      && GET_MODE_SIZE (outermode) <= GET_MODE_SIZE (GET_MODE (op)))
5906    return adjust_address_nv (op, outermode, byte);
5907
5908  /* Handle complex values represented as CONCAT
5909     of real and imaginary part.  */
5910  if (GET_CODE (op) == CONCAT)
5911    {
5912      unsigned int part_size, final_offset;
5913      rtx part, res;
5914
5915      part_size = GET_MODE_UNIT_SIZE (GET_MODE (XEXP (op, 0)));
5916      if (byte < part_size)
5917	{
5918	  part = XEXP (op, 0);
5919	  final_offset = byte;
5920	}
5921      else
5922	{
5923	  part = XEXP (op, 1);
5924	  final_offset = byte - part_size;
5925	}
5926
5927      if (final_offset + GET_MODE_SIZE (outermode) > part_size)
5928	return NULL_RTX;
5929
5930      res = simplify_subreg (outermode, part, GET_MODE (part), final_offset);
5931      if (res)
5932	return res;
5933      if (validate_subreg (outermode, GET_MODE (part), part, final_offset))
5934	return gen_rtx_SUBREG (outermode, part, final_offset);
5935      return NULL_RTX;
5936    }
5937
5938  /* A SUBREG resulting from a zero extension may fold to zero if
5939     it extracts higher bits that the ZERO_EXTEND's source bits.  */
5940  if (GET_CODE (op) == ZERO_EXTEND && SCALAR_INT_MODE_P (innermode))
5941    {
5942      unsigned int bitpos = subreg_lsb_1 (outermode, innermode, byte);
5943      if (bitpos >= GET_MODE_PRECISION (GET_MODE (XEXP (op, 0))))
5944	return CONST0_RTX (outermode);
5945    }
5946
5947  if (SCALAR_INT_MODE_P (outermode)
5948      && SCALAR_INT_MODE_P (innermode)
5949      && GET_MODE_PRECISION (outermode) < GET_MODE_PRECISION (innermode)
5950      && byte == subreg_lowpart_offset (outermode, innermode))
5951    {
5952      rtx tem = simplify_truncation (outermode, op, innermode);
5953      if (tem)
5954	return tem;
5955    }
5956
5957  return NULL_RTX;
5958}
5959
5960/* Make a SUBREG operation or equivalent if it folds.  */
5961
5962rtx
5963simplify_gen_subreg (machine_mode outermode, rtx op,
5964		     machine_mode innermode, unsigned int byte)
5965{
5966  rtx newx;
5967
5968  newx = simplify_subreg (outermode, op, innermode, byte);
5969  if (newx)
5970    return newx;
5971
5972  if (GET_CODE (op) == SUBREG
5973      || GET_CODE (op) == CONCAT
5974      || GET_MODE (op) == VOIDmode)
5975    return NULL_RTX;
5976
5977  if (validate_subreg (outermode, innermode, op, byte))
5978    return gen_rtx_SUBREG (outermode, op, byte);
5979
5980  return NULL_RTX;
5981}
5982
5983/* Simplify X, an rtx expression.
5984
5985   Return the simplified expression or NULL if no simplifications
5986   were possible.
5987
5988   This is the preferred entry point into the simplification routines;
5989   however, we still allow passes to call the more specific routines.
5990
5991   Right now GCC has three (yes, three) major bodies of RTL simplification
5992   code that need to be unified.
5993
5994	1. fold_rtx in cse.c.  This code uses various CSE specific
5995	   information to aid in RTL simplification.
5996
5997	2. simplify_rtx in combine.c.  Similar to fold_rtx, except that
5998	   it uses combine specific information to aid in RTL
5999	   simplification.
6000
6001	3. The routines in this file.
6002
6003
6004   Long term we want to only have one body of simplification code; to
6005   get to that state I recommend the following steps:
6006
6007	1. Pour over fold_rtx & simplify_rtx and move any simplifications
6008	   which are not pass dependent state into these routines.
6009
6010	2. As code is moved by #1, change fold_rtx & simplify_rtx to
6011	   use this routine whenever possible.
6012
6013	3. Allow for pass dependent state to be provided to these
6014	   routines and add simplifications based on the pass dependent
6015	   state.  Remove code from cse.c & combine.c that becomes
6016	   redundant/dead.
6017
6018    It will take time, but ultimately the compiler will be easier to
6019    maintain and improve.  It's totally silly that when we add a
6020    simplification that it needs to be added to 4 places (3 for RTL
6021    simplification and 1 for tree simplification.  */
6022
6023rtx
6024simplify_rtx (const_rtx x)
6025{
6026  const enum rtx_code code = GET_CODE (x);
6027  const machine_mode mode = GET_MODE (x);
6028
6029  switch (GET_RTX_CLASS (code))
6030    {
6031    case RTX_UNARY:
6032      return simplify_unary_operation (code, mode,
6033				       XEXP (x, 0), GET_MODE (XEXP (x, 0)));
6034    case RTX_COMM_ARITH:
6035      if (swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
6036	return simplify_gen_binary (code, mode, XEXP (x, 1), XEXP (x, 0));
6037
6038      /* Fall through....  */
6039
6040    case RTX_BIN_ARITH:
6041      return simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
6042
6043    case RTX_TERNARY:
6044    case RTX_BITFIELD_OPS:
6045      return simplify_ternary_operation (code, mode, GET_MODE (XEXP (x, 0)),
6046					 XEXP (x, 0), XEXP (x, 1),
6047					 XEXP (x, 2));
6048
6049    case RTX_COMPARE:
6050    case RTX_COMM_COMPARE:
6051      return simplify_relational_operation (code, mode,
6052                                            ((GET_MODE (XEXP (x, 0))
6053                                             != VOIDmode)
6054                                            ? GET_MODE (XEXP (x, 0))
6055                                            : GET_MODE (XEXP (x, 1))),
6056                                            XEXP (x, 0),
6057                                            XEXP (x, 1));
6058
6059    case RTX_EXTRA:
6060      if (code == SUBREG)
6061	return simplify_subreg (mode, SUBREG_REG (x),
6062				GET_MODE (SUBREG_REG (x)),
6063				SUBREG_BYTE (x));
6064      break;
6065
6066    case RTX_OBJ:
6067      if (code == LO_SUM)
6068	{
6069	  /* Convert (lo_sum (high FOO) FOO) to FOO.  */
6070	  if (GET_CODE (XEXP (x, 0)) == HIGH
6071	      && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
6072	  return XEXP (x, 1);
6073	}
6074      break;
6075
6076    default:
6077      break;
6078    }
6079  return NULL;
6080}
6081