1 /* Polynomial integer classes.
2    Copyright (C) 2014-2021 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 /* This file provides a representation of sizes and offsets whose exact
21    values depend on certain runtime properties.  The motivating example
22    is the Arm SVE ISA, in which the number of vector elements is only
23    known at runtime.  See doc/poly-int.texi for more details.
24 
25    Tests for poly-int.h are located in testsuite/gcc.dg/plugin,
26    since they are too expensive (in terms of binary size) to be
27    included as selftests.  */
28 
29 #ifndef HAVE_POLY_INT_H
30 #define HAVE_POLY_INT_H
31 
32 template<unsigned int N, typename T> struct poly_int_pod;
33 template<unsigned int N, typename T> class poly_int;
34 
35 /* poly_coeff_traiits<T> describes the properties of a poly_int
36    coefficient type T:
37 
38    - poly_coeff_traits<T1>::rank is less than poly_coeff_traits<T2>::rank
39      if T1 can promote to T2.  For C-like types the rank is:
40 
41        (2 * number of bytes) + (unsigned ? 1 : 0)
42 
43      wide_ints don't have a normal rank and so use a value of INT_MAX.
44      Any fixed-width integer should be promoted to wide_int if possible
45      and lead to an error otherwise.
46 
47    - poly_coeff_traits<T>::int_type is the type to which an integer
48      literal should be cast before comparing it with T.
49 
50    - poly_coeff_traits<T>::precision is the number of bits that T can hold.
51 
52    - poly_coeff_traits<T>::signedness is:
53 	0 if T is unsigned
54 	1 if T is signed
55        -1 if T has no inherent sign (as for wide_int).
56 
57    - poly_coeff_traits<T>::max_value, if defined, is the maximum value of T.
58 
59    - poly_coeff_traits<T>::result is a type that can hold results of
60      operations on T.  This is different from T itself in cases where T
61      is the result of an accessor like wi::to_offset.  */
62 template<typename T, wi::precision_type = wi::int_traits<T>::precision_type>
63 struct poly_coeff_traits;
64 
65 template<typename T>
66 struct poly_coeff_traits<T, wi::FLEXIBLE_PRECISION>
67 {
68   typedef T result;
69   typedef T int_type;
70   static const int signedness = (T (0) >= T (-1));
71   static const int precision = sizeof (T) * CHAR_BIT;
72   static const T max_value = (signedness
73 			      ? ((T (1) << (precision - 2))
74 				 + ((T (1) << (precision - 2)) - 1))
75 			      : T (-1));
76   static const int rank = sizeof (T) * 2 + !signedness;
77 };
78 
79 template<typename T>
80 struct poly_coeff_traits<T, wi::VAR_PRECISION>
81 {
82   typedef T result;
83   typedef int int_type;
84   static const int signedness = -1;
85   static const int precision = WIDE_INT_MAX_PRECISION;
86   static const int rank = INT_MAX;
87 };
88 
89 template<typename T>
90 struct poly_coeff_traits<T, wi::CONST_PRECISION>
91 {
92   typedef WI_UNARY_RESULT (T) result;
93   typedef int int_type;
94   /* These types are always signed.  */
95   static const int signedness = 1;
96   static const int precision = wi::int_traits<T>::precision;
97   static const int rank = precision * 2 / CHAR_BIT;
98 };
99 
100 /* Information about a pair of coefficient types.  */
101 template<typename T1, typename T2>
102 struct poly_coeff_pair_traits
103 {
104   /* True if T1 can represent all the values of T2.
105 
106      Either:
107 
108      - T1 should be a type with the same signedness as T2 and no less
109        precision.  This allows things like int16_t -> int16_t and
110        uint32_t -> uint64_t.
111 
112      - T1 should be signed, T2 should be unsigned, and T1 should be
113        wider than T2.  This allows things like uint16_t -> int32_t.
114 
115      This rules out cases in which T1 has less precision than T2 or where
116      the conversion would reinterpret the top bit.  E.g. int16_t -> uint32_t
117      can be dangerous and should have an explicit cast if deliberate.  */
118   static const bool lossless_p = (poly_coeff_traits<T1>::signedness
119 				  == poly_coeff_traits<T2>::signedness
120 				  ? (poly_coeff_traits<T1>::precision
121 				     >= poly_coeff_traits<T2>::precision)
122 				  : (poly_coeff_traits<T1>::signedness == 1
123 				     && poly_coeff_traits<T2>::signedness == 0
124 				     && (poly_coeff_traits<T1>::precision
125 					 > poly_coeff_traits<T2>::precision)));
126 
127   /* 0 if T1 op T2 should promote to HOST_WIDE_INT,
128      1 if T1 op T2 should promote to unsigned HOST_WIDE_INT,
129      2 if T1 op T2 should use wide-int rules.  */
130 #define RANK(X) poly_coeff_traits<X>::rank
131   static const int result_kind
132     = ((RANK (T1) <= RANK (HOST_WIDE_INT)
133 	&& RANK (T2) <= RANK (HOST_WIDE_INT))
134        ? 0
135        : (RANK (T1) <= RANK (unsigned HOST_WIDE_INT)
136 	  && RANK (T2) <= RANK (unsigned HOST_WIDE_INT))
137        ? 1 : 2);
138 #undef RANK
139 };
140 
141 /* SFINAE class that makes T3 available as "type" if T2 can represent all the
142    values in T1.  */
143 template<typename T1, typename T2, typename T3,
144 	 bool lossless_p = poly_coeff_pair_traits<T1, T2>::lossless_p>
145 struct if_lossless;
146 template<typename T1, typename T2, typename T3>
147 struct if_lossless<T1, T2, T3, true>
148 {
149   typedef T3 type;
150 };
151 
152 /* poly_int_traits<T> describes an integer type T that might be polynomial
153    or non-polynomial:
154 
155    - poly_int_traits<T>::is_poly is true if T is a poly_int-based type
156      and false otherwise.
157 
158    - poly_int_traits<T>::num_coeffs gives the number of coefficients in T
159      if T is a poly_int and 1 otherwise.
160 
161    - poly_int_traits<T>::coeff_type gives the coefficent type of T if T
162      is a poly_int and T itself otherwise
163 
164    - poly_int_traits<T>::int_type is a shorthand for
165      typename poly_coeff_traits<coeff_type>::int_type.  */
166 template<typename T>
167 struct poly_int_traits
168 {
169   static const bool is_poly = false;
170   static const unsigned int num_coeffs = 1;
171   typedef T coeff_type;
172   typedef typename poly_coeff_traits<T>::int_type int_type;
173 };
174 template<unsigned int N, typename C>
175 struct poly_int_traits<poly_int_pod<N, C> >
176 {
177   static const bool is_poly = true;
178   static const unsigned int num_coeffs = N;
179   typedef C coeff_type;
180   typedef typename poly_coeff_traits<C>::int_type int_type;
181 };
182 template<unsigned int N, typename C>
183 struct poly_int_traits<poly_int<N, C> > : poly_int_traits<poly_int_pod<N, C> >
184 {
185 };
186 
187 /* SFINAE class that makes T2 available as "type" if T1 is a non-polynomial
188    type.  */
189 template<typename T1, typename T2 = T1,
190 	 bool is_poly = poly_int_traits<T1>::is_poly>
191 struct if_nonpoly {};
192 template<typename T1, typename T2>
193 struct if_nonpoly<T1, T2, false>
194 {
195   typedef T2 type;
196 };
197 
198 /* SFINAE class that makes T3 available as "type" if both T1 and T2 are
199    non-polynomial types.  */
200 template<typename T1, typename T2, typename T3,
201 	 bool is_poly1 = poly_int_traits<T1>::is_poly,
202 	 bool is_poly2 = poly_int_traits<T2>::is_poly>
203 struct if_nonpoly2 {};
204 template<typename T1, typename T2, typename T3>
205 struct if_nonpoly2<T1, T2, T3, false, false>
206 {
207   typedef T3 type;
208 };
209 
210 /* SFINAE class that makes T2 available as "type" if T1 is a polynomial
211    type.  */
212 template<typename T1, typename T2 = T1,
213 	 bool is_poly = poly_int_traits<T1>::is_poly>
214 struct if_poly {};
215 template<typename T1, typename T2>
216 struct if_poly<T1, T2, true>
217 {
218   typedef T2 type;
219 };
220 
221 /* poly_result<T1, T2> describes the result of an operation on two
222    types T1 and T2, where at least one of the types is polynomial:
223 
224    - poly_result<T1, T2>::type gives the result type for the operation.
225      The intention is to provide normal C-like rules for integer ranks,
226      except that everything smaller than HOST_WIDE_INT promotes to
227      HOST_WIDE_INT.
228 
229    - poly_result<T1, T2>::cast is the type to which an operand of type
230      T1 should be cast before doing the operation, to ensure that
231      the operation is done at the right precision.  Casting to
232      poly_result<T1, T2>::type would also work, but casting to this
233      type is more efficient.  */
234 template<typename T1, typename T2 = T1,
235 	 int result_kind = poly_coeff_pair_traits<T1, T2>::result_kind>
236 struct poly_result;
237 
238 /* Promote pair to HOST_WIDE_INT.  */
239 template<typename T1, typename T2>
240 struct poly_result<T1, T2, 0>
241 {
242   typedef HOST_WIDE_INT type;
243   /* T1 and T2 are primitive types, so cast values to T before operating
244      on them.  */
245   typedef type cast;
246 };
247 
248 /* Promote pair to unsigned HOST_WIDE_INT.  */
249 template<typename T1, typename T2>
250 struct poly_result<T1, T2, 1>
251 {
252   typedef unsigned HOST_WIDE_INT type;
253   /* T1 and T2 are primitive types, so cast values to T before operating
254      on them.  */
255   typedef type cast;
256 };
257 
258 /* Use normal wide-int rules.  */
259 template<typename T1, typename T2>
260 struct poly_result<T1, T2, 2>
261 {
262   typedef WI_BINARY_RESULT (T1, T2) type;
263   /* Don't cast values before operating on them; leave the wi:: routines
264      to handle promotion as necessary.  */
265   typedef const T1 &cast;
266 };
267 
268 /* The coefficient type for the result of a binary operation on two
269    poly_ints, the first of which has coefficients of type C1 and the
270    second of which has coefficients of type C2.  */
271 #define POLY_POLY_COEFF(C1, C2) typename poly_result<C1, C2>::type
272 
273 /* Enforce that T2 is non-polynomial and provide the cofficient type of
274    the result of a binary operation in which the first operand is a
275    poly_int with coefficients of type C1 and the second operand is
276    a constant of type T2.  */
277 #define POLY_CONST_COEFF(C1, T2) \
278   POLY_POLY_COEFF (C1, typename if_nonpoly<T2>::type)
279 
280 /* Likewise in reverse.  */
281 #define CONST_POLY_COEFF(T1, C2) \
282   POLY_POLY_COEFF (typename if_nonpoly<T1>::type, C2)
283 
284 /* The result type for a binary operation on poly_int<N, C1> and
285    poly_int<N, C2>.  */
286 #define POLY_POLY_RESULT(N, C1, C2) poly_int<N, POLY_POLY_COEFF (C1, C2)>
287 
288 /* Enforce that T2 is non-polynomial and provide the result type
289    for a binary operation on poly_int<N, C1> and T2.  */
290 #define POLY_CONST_RESULT(N, C1, T2) poly_int<N, POLY_CONST_COEFF (C1, T2)>
291 
292 /* Enforce that T1 is non-polynomial and provide the result type
293    for a binary operation on T1 and poly_int<N, C2>.  */
294 #define CONST_POLY_RESULT(N, T1, C2) poly_int<N, CONST_POLY_COEFF (T1, C2)>
295 
296 /* Enforce that T1 and T2 are non-polynomial and provide the result type
297    for a binary operation on T1 and T2.  */
298 #define CONST_CONST_RESULT(N, T1, T2) \
299   POLY_POLY_COEFF (typename if_nonpoly<T1>::type, \
300 		   typename if_nonpoly<T2>::type)
301 
302 /* The type to which a coefficient of type C1 should be cast before
303    using it in a binary operation with a coefficient of type C2.  */
304 #define POLY_CAST(C1, C2) typename poly_result<C1, C2>::cast
305 
306 /* Provide the coefficient type for the result of T1 op T2, where T1
307    and T2 can be polynomial or non-polynomial.  */
308 #define POLY_BINARY_COEFF(T1, T2) \
309   typename poly_result<typename poly_int_traits<T1>::coeff_type, \
310 		       typename poly_int_traits<T2>::coeff_type>::type
311 
312 /* The type to which an integer constant should be cast before
313    comparing it with T.  */
314 #define POLY_INT_TYPE(T) typename poly_int_traits<T>::int_type
315 
316 /* RES is a poly_int result that has coefficients of type C and that
317    is being built up a coefficient at a time.  Set coefficient number I
318    to VALUE in the most efficient way possible.
319 
320    For primitive C it is better to assign directly, since it avoids
321    any further calls and so is more efficient when the compiler is
322    built at -O0.  But for wide-int based C it is better to construct
323    the value in-place.  This means that calls out to a wide-int.cc
324    routine can take the address of RES rather than the address of
325    a temporary.
326 
327    The dummy comparison against a null C * is just a way of checking
328    that C gives the right type.  */
329 #define POLY_SET_COEFF(C, RES, I, VALUE) \
330   ((void) (&(RES).coeffs[0] == (C *) 0), \
331    wi::int_traits<C>::precision_type == wi::FLEXIBLE_PRECISION \
332    ? (void) ((RES).coeffs[I] = VALUE) \
333    : (void) ((RES).coeffs[I].~C (), new (&(RES).coeffs[I]) C (VALUE)))
334 
335 /* A base POD class for polynomial integers.  The polynomial has N
336    coefficients of type C.  */
337 template<unsigned int N, typename C>
338 struct poly_int_pod
339 {
340 public:
341   template<typename Ca>
342   poly_int_pod &operator = (const poly_int_pod<N, Ca> &);
343   template<typename Ca>
344   typename if_nonpoly<Ca, poly_int_pod>::type &operator = (const Ca &);
345 
346   template<typename Ca>
347   poly_int_pod &operator += (const poly_int_pod<N, Ca> &);
348   template<typename Ca>
349   typename if_nonpoly<Ca, poly_int_pod>::type &operator += (const Ca &);
350 
351   template<typename Ca>
352   poly_int_pod &operator -= (const poly_int_pod<N, Ca> &);
353   template<typename Ca>
354   typename if_nonpoly<Ca, poly_int_pod>::type &operator -= (const Ca &);
355 
356   template<typename Ca>
357   typename if_nonpoly<Ca, poly_int_pod>::type &operator *= (const Ca &);
358 
359   poly_int_pod &operator <<= (unsigned int);
360 
361   bool is_constant () const;
362 
363   template<typename T>
364   typename if_lossless<T, C, bool>::type is_constant (T *) const;
365 
366   C to_constant () const;
367 
368   template<typename Ca>
369   static poly_int<N, C> from (const poly_int_pod<N, Ca> &, unsigned int,
370 			      signop);
371   template<typename Ca>
372   static poly_int<N, C> from (const poly_int_pod<N, Ca> &, signop);
373 
374   bool to_shwi (poly_int_pod<N, HOST_WIDE_INT> *) const;
375   bool to_uhwi (poly_int_pod<N, unsigned HOST_WIDE_INT> *) const;
376   poly_int<N, HOST_WIDE_INT> force_shwi () const;
377   poly_int<N, unsigned HOST_WIDE_INT> force_uhwi () const;
378 
379 #if POLY_INT_CONVERSION
380   operator C () const;
381 #endif
382 
383   C coeffs[N];
384 };
385 
386 template<unsigned int N, typename C>
387 template<typename Ca>
388 inline poly_int_pod<N, C>&
389 poly_int_pod<N, C>::operator = (const poly_int_pod<N, Ca> &a)
390 {
391   for (unsigned int i = 0; i < N; i++)
392     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
393   return *this;
394 }
395 
396 template<unsigned int N, typename C>
397 template<typename Ca>
398 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
399 poly_int_pod<N, C>::operator = (const Ca &a)
400 {
401   POLY_SET_COEFF (C, *this, 0, a);
402   if (N >= 2)
403     for (unsigned int i = 1; i < N; i++)
404       POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
405   return *this;
406 }
407 
408 template<unsigned int N, typename C>
409 template<typename Ca>
410 inline poly_int_pod<N, C>&
411 poly_int_pod<N, C>::operator += (const poly_int_pod<N, Ca> &a)
412 {
413   for (unsigned int i = 0; i < N; i++)
414     this->coeffs[i] += a.coeffs[i];
415   return *this;
416 }
417 
418 template<unsigned int N, typename C>
419 template<typename Ca>
420 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
421 poly_int_pod<N, C>::operator += (const Ca &a)
422 {
423   this->coeffs[0] += a;
424   return *this;
425 }
426 
427 template<unsigned int N, typename C>
428 template<typename Ca>
429 inline poly_int_pod<N, C>&
430 poly_int_pod<N, C>::operator -= (const poly_int_pod<N, Ca> &a)
431 {
432   for (unsigned int i = 0; i < N; i++)
433     this->coeffs[i] -= a.coeffs[i];
434   return *this;
435 }
436 
437 template<unsigned int N, typename C>
438 template<typename Ca>
439 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
440 poly_int_pod<N, C>::operator -= (const Ca &a)
441 {
442   this->coeffs[0] -= a;
443   return *this;
444 }
445 
446 template<unsigned int N, typename C>
447 template<typename Ca>
448 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
449 poly_int_pod<N, C>::operator *= (const Ca &a)
450 {
451   for (unsigned int i = 0; i < N; i++)
452     this->coeffs[i] *= a;
453   return *this;
454 }
455 
456 template<unsigned int N, typename C>
457 inline poly_int_pod<N, C>&
458 poly_int_pod<N, C>::operator <<= (unsigned int a)
459 {
460   for (unsigned int i = 0; i < N; i++)
461     this->coeffs[i] <<= a;
462   return *this;
463 }
464 
465 /* Return true if the polynomial value is a compile-time constant.  */
466 
467 template<unsigned int N, typename C>
468 inline bool
469 poly_int_pod<N, C>::is_constant () const
470 {
471   if (N >= 2)
472     for (unsigned int i = 1; i < N; i++)
473       if (this->coeffs[i] != 0)
474 	return false;
475   return true;
476 }
477 
478 /* Return true if the polynomial value is a compile-time constant,
479    storing its value in CONST_VALUE if so.  */
480 
481 template<unsigned int N, typename C>
482 template<typename T>
483 inline typename if_lossless<T, C, bool>::type
484 poly_int_pod<N, C>::is_constant (T *const_value) const
485 {
486   if (is_constant ())
487     {
488       *const_value = this->coeffs[0];
489       return true;
490     }
491   return false;
492 }
493 
494 /* Return the value of a polynomial that is already known to be a
495    compile-time constant.
496 
497    NOTE: When using this function, please add a comment above the call
498    explaining why we know the value is constant in that context.  */
499 
500 template<unsigned int N, typename C>
501 inline C
502 poly_int_pod<N, C>::to_constant () const
503 {
504   gcc_checking_assert (is_constant ());
505   return this->coeffs[0];
506 }
507 
508 /* Convert X to a wide_int-based polynomial in which each coefficient
509    has BITSIZE bits.  If X's coefficients are smaller than BITSIZE,
510    extend them according to SGN.  */
511 
512 template<unsigned int N, typename C>
513 template<typename Ca>
514 inline poly_int<N, C>
515 poly_int_pod<N, C>::from (const poly_int_pod<N, Ca> &a,
516 			  unsigned int bitsize, signop sgn)
517 {
518   poly_int<N, C> r;
519   for (unsigned int i = 0; i < N; i++)
520     POLY_SET_COEFF (C, r, i, C::from (a.coeffs[i], bitsize, sgn));
521   return r;
522 }
523 
524 /* Convert X to a fixed_wide_int-based polynomial, extending according
525    to SGN.  */
526 
527 template<unsigned int N, typename C>
528 template<typename Ca>
529 inline poly_int<N, C>
530 poly_int_pod<N, C>::from (const poly_int_pod<N, Ca> &a, signop sgn)
531 {
532   poly_int<N, C> r;
533   for (unsigned int i = 0; i < N; i++)
534     POLY_SET_COEFF (C, r, i, C::from (a.coeffs[i], sgn));
535   return r;
536 }
537 
538 /* Return true if the coefficients of this generic_wide_int-based
539    polynomial can be represented as signed HOST_WIDE_INTs without loss
540    of precision.  Store the HOST_WIDE_INT representation in *R if so.  */
541 
542 template<unsigned int N, typename C>
543 inline bool
544 poly_int_pod<N, C>::to_shwi (poly_int_pod<N, HOST_WIDE_INT> *r) const
545 {
546   for (unsigned int i = 0; i < N; i++)
547     if (!wi::fits_shwi_p (this->coeffs[i]))
548       return false;
549   for (unsigned int i = 0; i < N; i++)
550     r->coeffs[i] = this->coeffs[i].to_shwi ();
551   return true;
552 }
553 
554 /* Return true if the coefficients of this generic_wide_int-based
555    polynomial can be represented as unsigned HOST_WIDE_INTs without
556    loss of precision.  Store the unsigned HOST_WIDE_INT representation
557    in *R if so.  */
558 
559 template<unsigned int N, typename C>
560 inline bool
561 poly_int_pod<N, C>::to_uhwi (poly_int_pod<N, unsigned HOST_WIDE_INT> *r) const
562 {
563   for (unsigned int i = 0; i < N; i++)
564     if (!wi::fits_uhwi_p (this->coeffs[i]))
565       return false;
566   for (unsigned int i = 0; i < N; i++)
567     r->coeffs[i] = this->coeffs[i].to_uhwi ();
568   return true;
569 }
570 
571 /* Force a generic_wide_int-based constant to HOST_WIDE_INT precision,
572    truncating if necessary.  */
573 
574 template<unsigned int N, typename C>
575 inline poly_int<N, HOST_WIDE_INT>
576 poly_int_pod<N, C>::force_shwi () const
577 {
578   poly_int_pod<N, HOST_WIDE_INT> r;
579   for (unsigned int i = 0; i < N; i++)
580     r.coeffs[i] = this->coeffs[i].to_shwi ();
581   return r;
582 }
583 
584 /* Force a generic_wide_int-based constant to unsigned HOST_WIDE_INT precision,
585    truncating if necessary.  */
586 
587 template<unsigned int N, typename C>
588 inline poly_int<N, unsigned HOST_WIDE_INT>
589 poly_int_pod<N, C>::force_uhwi () const
590 {
591   poly_int_pod<N, unsigned HOST_WIDE_INT> r;
592   for (unsigned int i = 0; i < N; i++)
593     r.coeffs[i] = this->coeffs[i].to_uhwi ();
594   return r;
595 }
596 
597 #if POLY_INT_CONVERSION
598 /* Provide a conversion operator to constants.  */
599 
600 template<unsigned int N, typename C>
601 inline
602 poly_int_pod<N, C>::operator C () const
603 {
604   gcc_checking_assert (this->is_constant ());
605   return this->coeffs[0];
606 }
607 #endif
608 
609 /* The main class for polynomial integers.  The class provides
610    constructors that are necessarily missing from the POD base.  */
611 template<unsigned int N, typename C>
612 class poly_int : public poly_int_pod<N, C>
613 {
614 public:
615   poly_int () {}
616 
617   template<typename Ca>
618   poly_int (const poly_int<N, Ca> &);
619   template<typename Ca>
620   poly_int (const poly_int_pod<N, Ca> &);
621   template<typename C0>
622   poly_int (const C0 &);
623   template<typename C0, typename C1>
624   poly_int (const C0 &, const C1 &);
625 
626   template<typename Ca>
627   poly_int &operator = (const poly_int_pod<N, Ca> &);
628   template<typename Ca>
629   typename if_nonpoly<Ca, poly_int>::type &operator = (const Ca &);
630 
631   template<typename Ca>
632   poly_int &operator += (const poly_int_pod<N, Ca> &);
633   template<typename Ca>
634   typename if_nonpoly<Ca, poly_int>::type &operator += (const Ca &);
635 
636   template<typename Ca>
637   poly_int &operator -= (const poly_int_pod<N, Ca> &);
638   template<typename Ca>
639   typename if_nonpoly<Ca, poly_int>::type &operator -= (const Ca &);
640 
641   template<typename Ca>
642   typename if_nonpoly<Ca, poly_int>::type &operator *= (const Ca &);
643 
644   poly_int &operator <<= (unsigned int);
645 };
646 
647 template<unsigned int N, typename C>
648 template<typename Ca>
649 inline
650 poly_int<N, C>::poly_int (const poly_int<N, Ca> &a)
651 {
652   for (unsigned int i = 0; i < N; i++)
653     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
654 }
655 
656 template<unsigned int N, typename C>
657 template<typename Ca>
658 inline
659 poly_int<N, C>::poly_int (const poly_int_pod<N, Ca> &a)
660 {
661   for (unsigned int i = 0; i < N; i++)
662     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
663 }
664 
665 template<unsigned int N, typename C>
666 template<typename C0>
667 inline
668 poly_int<N, C>::poly_int (const C0 &c0)
669 {
670   POLY_SET_COEFF (C, *this, 0, c0);
671   for (unsigned int i = 1; i < N; i++)
672     POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
673 }
674 
675 template<unsigned int N, typename C>
676 template<typename C0, typename C1>
677 inline
678 poly_int<N, C>::poly_int (const C0 &c0, const C1 &c1)
679 {
680   STATIC_ASSERT (N >= 2);
681   POLY_SET_COEFF (C, *this, 0, c0);
682   POLY_SET_COEFF (C, *this, 1, c1);
683   for (unsigned int i = 2; i < N; i++)
684     POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
685 }
686 
687 template<unsigned int N, typename C>
688 template<typename Ca>
689 inline poly_int<N, C>&
690 poly_int<N, C>::operator = (const poly_int_pod<N, Ca> &a)
691 {
692   for (unsigned int i = 0; i < N; i++)
693     this->coeffs[i] = a.coeffs[i];
694   return *this;
695 }
696 
697 template<unsigned int N, typename C>
698 template<typename Ca>
699 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
700 poly_int<N, C>::operator = (const Ca &a)
701 {
702   this->coeffs[0] = a;
703   if (N >= 2)
704     for (unsigned int i = 1; i < N; i++)
705       this->coeffs[i] = wi::ints_for<C>::zero (this->coeffs[0]);
706   return *this;
707 }
708 
709 template<unsigned int N, typename C>
710 template<typename Ca>
711 inline poly_int<N, C>&
712 poly_int<N, C>::operator += (const poly_int_pod<N, Ca> &a)
713 {
714   for (unsigned int i = 0; i < N; i++)
715     this->coeffs[i] += a.coeffs[i];
716   return *this;
717 }
718 
719 template<unsigned int N, typename C>
720 template<typename Ca>
721 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
722 poly_int<N, C>::operator += (const Ca &a)
723 {
724   this->coeffs[0] += a;
725   return *this;
726 }
727 
728 template<unsigned int N, typename C>
729 template<typename Ca>
730 inline poly_int<N, C>&
731 poly_int<N, C>::operator -= (const poly_int_pod<N, Ca> &a)
732 {
733   for (unsigned int i = 0; i < N; i++)
734     this->coeffs[i] -= a.coeffs[i];
735   return *this;
736 }
737 
738 template<unsigned int N, typename C>
739 template<typename Ca>
740 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
741 poly_int<N, C>::operator -= (const Ca &a)
742 {
743   this->coeffs[0] -= a;
744   return *this;
745 }
746 
747 template<unsigned int N, typename C>
748 template<typename Ca>
749 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
750 poly_int<N, C>::operator *= (const Ca &a)
751 {
752   for (unsigned int i = 0; i < N; i++)
753     this->coeffs[i] *= a;
754   return *this;
755 }
756 
757 template<unsigned int N, typename C>
758 inline poly_int<N, C>&
759 poly_int<N, C>::operator <<= (unsigned int a)
760 {
761   for (unsigned int i = 0; i < N; i++)
762     this->coeffs[i] <<= a;
763   return *this;
764 }
765 
766 /* Return true if every coefficient of A is in the inclusive range [B, C].  */
767 
768 template<typename Ca, typename Cb, typename Cc>
769 inline typename if_nonpoly<Ca, bool>::type
770 coeffs_in_range_p (const Ca &a, const Cb &b, const Cc &c)
771 {
772   return a >= b && a <= c;
773 }
774 
775 template<unsigned int N, typename Ca, typename Cb, typename Cc>
776 inline typename if_nonpoly<Ca, bool>::type
777 coeffs_in_range_p (const poly_int_pod<N, Ca> &a, const Cb &b, const Cc &c)
778 {
779   for (unsigned int i = 0; i < N; i++)
780     if (a.coeffs[i] < b || a.coeffs[i] > c)
781       return false;
782   return true;
783 }
784 
785 namespace wi {
786 /* Poly version of wi::shwi, with the same interface.  */
787 
788 template<unsigned int N>
789 inline poly_int<N, hwi_with_prec>
790 shwi (const poly_int_pod<N, HOST_WIDE_INT> &a, unsigned int precision)
791 {
792   poly_int<N, hwi_with_prec> r;
793   for (unsigned int i = 0; i < N; i++)
794     POLY_SET_COEFF (hwi_with_prec, r, i, wi::shwi (a.coeffs[i], precision));
795   return r;
796 }
797 
798 /* Poly version of wi::uhwi, with the same interface.  */
799 
800 template<unsigned int N>
801 inline poly_int<N, hwi_with_prec>
802 uhwi (const poly_int_pod<N, unsigned HOST_WIDE_INT> &a, unsigned int precision)
803 {
804   poly_int<N, hwi_with_prec> r;
805   for (unsigned int i = 0; i < N; i++)
806     POLY_SET_COEFF (hwi_with_prec, r, i, wi::uhwi (a.coeffs[i], precision));
807   return r;
808 }
809 
810 /* Poly version of wi::sext, with the same interface.  */
811 
812 template<unsigned int N, typename Ca>
813 inline POLY_POLY_RESULT (N, Ca, Ca)
814 sext (const poly_int_pod<N, Ca> &a, unsigned int precision)
815 {
816   typedef POLY_POLY_COEFF (Ca, Ca) C;
817   poly_int<N, C> r;
818   for (unsigned int i = 0; i < N; i++)
819     POLY_SET_COEFF (C, r, i, wi::sext (a.coeffs[i], precision));
820   return r;
821 }
822 
823 /* Poly version of wi::zext, with the same interface.  */
824 
825 template<unsigned int N, typename Ca>
826 inline POLY_POLY_RESULT (N, Ca, Ca)
827 zext (const poly_int_pod<N, Ca> &a, unsigned int precision)
828 {
829   typedef POLY_POLY_COEFF (Ca, Ca) C;
830   poly_int<N, C> r;
831   for (unsigned int i = 0; i < N; i++)
832     POLY_SET_COEFF (C, r, i, wi::zext (a.coeffs[i], precision));
833   return r;
834 }
835 }
836 
837 template<unsigned int N, typename Ca, typename Cb>
838 inline POLY_POLY_RESULT (N, Ca, Cb)
839 operator + (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
840 {
841   typedef POLY_CAST (Ca, Cb) NCa;
842   typedef POLY_POLY_COEFF (Ca, Cb) C;
843   poly_int<N, C> r;
844   for (unsigned int i = 0; i < N; i++)
845     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) + b.coeffs[i]);
846   return r;
847 }
848 
849 template<unsigned int N, typename Ca, typename Cb>
850 inline POLY_CONST_RESULT (N, Ca, Cb)
851 operator + (const poly_int_pod<N, Ca> &a, const Cb &b)
852 {
853   typedef POLY_CAST (Ca, Cb) NCa;
854   typedef POLY_CONST_COEFF (Ca, Cb) C;
855   poly_int<N, C> r;
856   POLY_SET_COEFF (C, r, 0, NCa (a.coeffs[0]) + b);
857   if (N >= 2)
858     for (unsigned int i = 1; i < N; i++)
859       POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]));
860   return r;
861 }
862 
863 template<unsigned int N, typename Ca, typename Cb>
864 inline CONST_POLY_RESULT (N, Ca, Cb)
865 operator + (const Ca &a, const poly_int_pod<N, Cb> &b)
866 {
867   typedef POLY_CAST (Cb, Ca) NCb;
868   typedef CONST_POLY_COEFF (Ca, Cb) C;
869   poly_int<N, C> r;
870   POLY_SET_COEFF (C, r, 0, a + NCb (b.coeffs[0]));
871   if (N >= 2)
872     for (unsigned int i = 1; i < N; i++)
873       POLY_SET_COEFF (C, r, i, NCb (b.coeffs[i]));
874   return r;
875 }
876 
877 namespace wi {
878 /* Poly versions of wi::add, with the same interface.  */
879 
880 template<unsigned int N, typename Ca, typename Cb>
881 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
882 add (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
883 {
884   typedef WI_BINARY_RESULT (Ca, Cb) C;
885   poly_int<N, C> r;
886   for (unsigned int i = 0; i < N; i++)
887     POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i], b.coeffs[i]));
888   return r;
889 }
890 
891 template<unsigned int N, typename Ca, typename Cb>
892 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
893 add (const poly_int_pod<N, Ca> &a, const Cb &b)
894 {
895   typedef WI_BINARY_RESULT (Ca, Cb) C;
896   poly_int<N, C> r;
897   POLY_SET_COEFF (C, r, 0, wi::add (a.coeffs[0], b));
898   for (unsigned int i = 1; i < N; i++)
899     POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i],
900 				      wi::ints_for<Cb>::zero (b)));
901   return r;
902 }
903 
904 template<unsigned int N, typename Ca, typename Cb>
905 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
906 add (const Ca &a, const poly_int_pod<N, Cb> &b)
907 {
908   typedef WI_BINARY_RESULT (Ca, Cb) C;
909   poly_int<N, C> r;
910   POLY_SET_COEFF (C, r, 0, wi::add (a, b.coeffs[0]));
911   for (unsigned int i = 1; i < N; i++)
912     POLY_SET_COEFF (C, r, i, wi::add (wi::ints_for<Ca>::zero (a),
913 				      b.coeffs[i]));
914   return r;
915 }
916 
917 template<unsigned int N, typename Ca, typename Cb>
918 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
919 add (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
920      signop sgn, wi::overflow_type *overflow)
921 {
922   typedef WI_BINARY_RESULT (Ca, Cb) C;
923   poly_int<N, C> r;
924   POLY_SET_COEFF (C, r, 0, wi::add (a.coeffs[0], b.coeffs[0], sgn, overflow));
925   for (unsigned int i = 1; i < N; i++)
926     {
927       wi::overflow_type suboverflow;
928       POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i], b.coeffs[i], sgn,
929 					&suboverflow));
930       wi::accumulate_overflow (*overflow, suboverflow);
931     }
932   return r;
933 }
934 }
935 
936 template<unsigned int N, typename Ca, typename Cb>
937 inline POLY_POLY_RESULT (N, Ca, Cb)
938 operator - (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
939 {
940   typedef POLY_CAST (Ca, Cb) NCa;
941   typedef POLY_POLY_COEFF (Ca, Cb) C;
942   poly_int<N, C> r;
943   for (unsigned int i = 0; i < N; i++)
944     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) - b.coeffs[i]);
945   return r;
946 }
947 
948 template<unsigned int N, typename Ca, typename Cb>
949 inline POLY_CONST_RESULT (N, Ca, Cb)
950 operator - (const poly_int_pod<N, Ca> &a, const Cb &b)
951 {
952   typedef POLY_CAST (Ca, Cb) NCa;
953   typedef POLY_CONST_COEFF (Ca, Cb) C;
954   poly_int<N, C> r;
955   POLY_SET_COEFF (C, r, 0, NCa (a.coeffs[0]) - b);
956   if (N >= 2)
957     for (unsigned int i = 1; i < N; i++)
958       POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]));
959   return r;
960 }
961 
962 template<unsigned int N, typename Ca, typename Cb>
963 inline CONST_POLY_RESULT (N, Ca, Cb)
964 operator - (const Ca &a, const poly_int_pod<N, Cb> &b)
965 {
966   typedef POLY_CAST (Cb, Ca) NCb;
967   typedef CONST_POLY_COEFF (Ca, Cb) C;
968   poly_int<N, C> r;
969   POLY_SET_COEFF (C, r, 0, a - NCb (b.coeffs[0]));
970   if (N >= 2)
971     for (unsigned int i = 1; i < N; i++)
972       POLY_SET_COEFF (C, r, i, -NCb (b.coeffs[i]));
973   return r;
974 }
975 
976 namespace wi {
977 /* Poly versions of wi::sub, with the same interface.  */
978 
979 template<unsigned int N, typename Ca, typename Cb>
980 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
981 sub (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
982 {
983   typedef WI_BINARY_RESULT (Ca, Cb) C;
984   poly_int<N, C> r;
985   for (unsigned int i = 0; i < N; i++)
986     POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i], b.coeffs[i]));
987   return r;
988 }
989 
990 template<unsigned int N, typename Ca, typename Cb>
991 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
992 sub (const poly_int_pod<N, Ca> &a, const Cb &b)
993 {
994   typedef WI_BINARY_RESULT (Ca, Cb) C;
995   poly_int<N, C> r;
996   POLY_SET_COEFF (C, r, 0, wi::sub (a.coeffs[0], b));
997   for (unsigned int i = 1; i < N; i++)
998     POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i],
999 				      wi::ints_for<Cb>::zero (b)));
1000   return r;
1001 }
1002 
1003 template<unsigned int N, typename Ca, typename Cb>
1004 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1005 sub (const Ca &a, const poly_int_pod<N, Cb> &b)
1006 {
1007   typedef WI_BINARY_RESULT (Ca, Cb) C;
1008   poly_int<N, C> r;
1009   POLY_SET_COEFF (C, r, 0, wi::sub (a, b.coeffs[0]));
1010   for (unsigned int i = 1; i < N; i++)
1011     POLY_SET_COEFF (C, r, i, wi::sub (wi::ints_for<Ca>::zero (a),
1012 				      b.coeffs[i]));
1013   return r;
1014 }
1015 
1016 template<unsigned int N, typename Ca, typename Cb>
1017 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1018 sub (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
1019      signop sgn, wi::overflow_type *overflow)
1020 {
1021   typedef WI_BINARY_RESULT (Ca, Cb) C;
1022   poly_int<N, C> r;
1023   POLY_SET_COEFF (C, r, 0, wi::sub (a.coeffs[0], b.coeffs[0], sgn, overflow));
1024   for (unsigned int i = 1; i < N; i++)
1025     {
1026       wi::overflow_type suboverflow;
1027       POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i], b.coeffs[i], sgn,
1028 					&suboverflow));
1029       wi::accumulate_overflow (*overflow, suboverflow);
1030     }
1031   return r;
1032 }
1033 }
1034 
1035 template<unsigned int N, typename Ca>
1036 inline POLY_POLY_RESULT (N, Ca, Ca)
1037 operator - (const poly_int_pod<N, Ca> &a)
1038 {
1039   typedef POLY_CAST (Ca, Ca) NCa;
1040   typedef POLY_POLY_COEFF (Ca, Ca) C;
1041   poly_int<N, C> r;
1042   for (unsigned int i = 0; i < N; i++)
1043     POLY_SET_COEFF (C, r, i, -NCa (a.coeffs[i]));
1044   return r;
1045 }
1046 
1047 namespace wi {
1048 /* Poly version of wi::neg, with the same interface.  */
1049 
1050 template<unsigned int N, typename Ca>
1051 inline poly_int<N, WI_UNARY_RESULT (Ca)>
1052 neg (const poly_int_pod<N, Ca> &a)
1053 {
1054   typedef WI_UNARY_RESULT (Ca) C;
1055   poly_int<N, C> r;
1056   for (unsigned int i = 0; i < N; i++)
1057     POLY_SET_COEFF (C, r, i, wi::neg (a.coeffs[i]));
1058   return r;
1059 }
1060 
1061 template<unsigned int N, typename Ca>
1062 inline poly_int<N, WI_UNARY_RESULT (Ca)>
1063 neg (const poly_int_pod<N, Ca> &a, wi::overflow_type *overflow)
1064 {
1065   typedef WI_UNARY_RESULT (Ca) C;
1066   poly_int<N, C> r;
1067   POLY_SET_COEFF (C, r, 0, wi::neg (a.coeffs[0], overflow));
1068   for (unsigned int i = 1; i < N; i++)
1069     {
1070       wi::overflow_type suboverflow;
1071       POLY_SET_COEFF (C, r, i, wi::neg (a.coeffs[i], &suboverflow));
1072       wi::accumulate_overflow (*overflow, suboverflow);
1073     }
1074   return r;
1075 }
1076 }
1077 
1078 template<unsigned int N, typename Ca>
1079 inline POLY_POLY_RESULT (N, Ca, Ca)
1080 operator ~ (const poly_int_pod<N, Ca> &a)
1081 {
1082   if (N >= 2)
1083     return -1 - a;
1084   return ~a.coeffs[0];
1085 }
1086 
1087 template<unsigned int N, typename Ca, typename Cb>
1088 inline POLY_CONST_RESULT (N, Ca, Cb)
1089 operator * (const poly_int_pod<N, Ca> &a, const Cb &b)
1090 {
1091   typedef POLY_CAST (Ca, Cb) NCa;
1092   typedef POLY_CONST_COEFF (Ca, Cb) C;
1093   poly_int<N, C> r;
1094   for (unsigned int i = 0; i < N; i++)
1095     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) * b);
1096   return r;
1097 }
1098 
1099 template<unsigned int N, typename Ca, typename Cb>
1100 inline CONST_POLY_RESULT (N, Ca, Cb)
1101 operator * (const Ca &a, const poly_int_pod<N, Cb> &b)
1102 {
1103   typedef POLY_CAST (Ca, Cb) NCa;
1104   typedef CONST_POLY_COEFF (Ca, Cb) C;
1105   poly_int<N, C> r;
1106   for (unsigned int i = 0; i < N; i++)
1107     POLY_SET_COEFF (C, r, i, NCa (a) * b.coeffs[i]);
1108   return r;
1109 }
1110 
1111 namespace wi {
1112 /* Poly versions of wi::mul, with the same interface.  */
1113 
1114 template<unsigned int N, typename Ca, typename Cb>
1115 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1116 mul (const poly_int_pod<N, Ca> &a, const Cb &b)
1117 {
1118   typedef WI_BINARY_RESULT (Ca, Cb) C;
1119   poly_int<N, C> r;
1120   for (unsigned int i = 0; i < N; i++)
1121     POLY_SET_COEFF (C, r, i, wi::mul (a.coeffs[i], b));
1122   return r;
1123 }
1124 
1125 template<unsigned int N, typename Ca, typename Cb>
1126 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1127 mul (const Ca &a, const poly_int_pod<N, Cb> &b)
1128 {
1129   typedef WI_BINARY_RESULT (Ca, Cb) C;
1130   poly_int<N, C> r;
1131   for (unsigned int i = 0; i < N; i++)
1132     POLY_SET_COEFF (C, r, i, wi::mul (a, b.coeffs[i]));
1133   return r;
1134 }
1135 
1136 template<unsigned int N, typename Ca, typename Cb>
1137 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1138 mul (const poly_int_pod<N, Ca> &a, const Cb &b,
1139      signop sgn, wi::overflow_type *overflow)
1140 {
1141   typedef WI_BINARY_RESULT (Ca, Cb) C;
1142   poly_int<N, C> r;
1143   POLY_SET_COEFF (C, r, 0, wi::mul (a.coeffs[0], b, sgn, overflow));
1144   for (unsigned int i = 1; i < N; i++)
1145     {
1146       wi::overflow_type suboverflow;
1147       POLY_SET_COEFF (C, r, i, wi::mul (a.coeffs[i], b, sgn, &suboverflow));
1148       wi::accumulate_overflow (*overflow, suboverflow);
1149     }
1150   return r;
1151 }
1152 }
1153 
1154 template<unsigned int N, typename Ca, typename Cb>
1155 inline POLY_POLY_RESULT (N, Ca, Ca)
1156 operator << (const poly_int_pod<N, Ca> &a, const Cb &b)
1157 {
1158   typedef POLY_CAST (Ca, Ca) NCa;
1159   typedef POLY_POLY_COEFF (Ca, Ca) C;
1160   poly_int<N, C> r;
1161   for (unsigned int i = 0; i < N; i++)
1162     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) << b);
1163   return r;
1164 }
1165 
1166 namespace wi {
1167 /* Poly version of wi::lshift, with the same interface.  */
1168 
1169 template<unsigned int N, typename Ca, typename Cb>
1170 inline poly_int<N, WI_BINARY_RESULT (Ca, Ca)>
1171 lshift (const poly_int_pod<N, Ca> &a, const Cb &b)
1172 {
1173   typedef WI_BINARY_RESULT (Ca, Ca) C;
1174   poly_int<N, C> r;
1175   for (unsigned int i = 0; i < N; i++)
1176     POLY_SET_COEFF (C, r, i, wi::lshift (a.coeffs[i], b));
1177   return r;
1178 }
1179 }
1180 
1181 /* Return true if a0 + a1 * x might equal b0 + b1 * x for some nonnegative
1182    integer x.  */
1183 
1184 template<typename Ca, typename Cb>
1185 inline bool
1186 maybe_eq_2 (const Ca &a0, const Ca &a1, const Cb &b0, const Cb &b1)
1187 {
1188   if (a1 != b1)
1189      /*      a0 + a1 * x == b0 + b1 * x
1190        ==> (a1 - b1) * x == b0 - a0
1191        ==>             x == (b0 - a0) / (a1 - b1)
1192 
1193        We need to test whether that's a valid value of x.
1194        (b0 - a0) and (a1 - b1) must not have opposite signs
1195        and the result must be integral.  */
1196     return (a1 < b1
1197 	    ? b0 <= a0 && (a0 - b0) % (b1 - a1) == 0
1198 	    : b0 >= a0 && (b0 - a0) % (a1 - b1) == 0);
1199   return a0 == b0;
1200 }
1201 
1202 /* Return true if a0 + a1 * x might equal b for some nonnegative
1203    integer x.  */
1204 
1205 template<typename Ca, typename Cb>
1206 inline bool
1207 maybe_eq_2 (const Ca &a0, const Ca &a1, const Cb &b)
1208 {
1209   if (a1 != 0)
1210      /*      a0 + a1 * x == b
1211        ==>             x == (b - a0) / a1
1212 
1213        We need to test whether that's a valid value of x.
1214        (b - a0) and a1 must not have opposite signs and the
1215        result must be integral.  */
1216     return (a1 < 0
1217 	    ? b <= a0 && (a0 - b) % a1 == 0
1218 	    : b >= a0 && (b - a0) % a1 == 0);
1219   return a0 == b;
1220 }
1221 
1222 /* Return true if A might equal B for some indeterminate values.  */
1223 
1224 template<unsigned int N, typename Ca, typename Cb>
1225 inline bool
1226 maybe_eq (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1227 {
1228   STATIC_ASSERT (N <= 2);
1229   if (N == 2)
1230     return maybe_eq_2 (a.coeffs[0], a.coeffs[1], b.coeffs[0], b.coeffs[1]);
1231   return a.coeffs[0] == b.coeffs[0];
1232 }
1233 
1234 template<unsigned int N, typename Ca, typename Cb>
1235 inline typename if_nonpoly<Cb, bool>::type
1236 maybe_eq (const poly_int_pod<N, Ca> &a, const Cb &b)
1237 {
1238   STATIC_ASSERT (N <= 2);
1239   if (N == 2)
1240     return maybe_eq_2 (a.coeffs[0], a.coeffs[1], b);
1241   return a.coeffs[0] == b;
1242 }
1243 
1244 template<unsigned int N, typename Ca, typename Cb>
1245 inline typename if_nonpoly<Ca, bool>::type
1246 maybe_eq (const Ca &a, const poly_int_pod<N, Cb> &b)
1247 {
1248   STATIC_ASSERT (N <= 2);
1249   if (N == 2)
1250     return maybe_eq_2 (b.coeffs[0], b.coeffs[1], a);
1251   return a == b.coeffs[0];
1252 }
1253 
1254 template<typename Ca, typename Cb>
1255 inline typename if_nonpoly2<Ca, Cb, bool>::type
1256 maybe_eq (const Ca &a, const Cb &b)
1257 {
1258   return a == b;
1259 }
1260 
1261 /* Return true if A might not equal B for some indeterminate values.  */
1262 
1263 template<unsigned int N, typename Ca, typename Cb>
1264 inline bool
1265 maybe_ne (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1266 {
1267   if (N >= 2)
1268     for (unsigned int i = 1; i < N; i++)
1269       if (a.coeffs[i] != b.coeffs[i])
1270 	return true;
1271   return a.coeffs[0] != b.coeffs[0];
1272 }
1273 
1274 template<unsigned int N, typename Ca, typename Cb>
1275 inline typename if_nonpoly<Cb, bool>::type
1276 maybe_ne (const poly_int_pod<N, Ca> &a, const Cb &b)
1277 {
1278   if (N >= 2)
1279     for (unsigned int i = 1; i < N; i++)
1280       if (a.coeffs[i] != 0)
1281 	return true;
1282   return a.coeffs[0] != b;
1283 }
1284 
1285 template<unsigned int N, typename Ca, typename Cb>
1286 inline typename if_nonpoly<Ca, bool>::type
1287 maybe_ne (const Ca &a, const poly_int_pod<N, Cb> &b)
1288 {
1289   if (N >= 2)
1290     for (unsigned int i = 1; i < N; i++)
1291       if (b.coeffs[i] != 0)
1292 	return true;
1293   return a != b.coeffs[0];
1294 }
1295 
1296 template<typename Ca, typename Cb>
1297 inline typename if_nonpoly2<Ca, Cb, bool>::type
1298 maybe_ne (const Ca &a, const Cb &b)
1299 {
1300   return a != b;
1301 }
1302 
1303 /* Return true if A is known to be equal to B.  */
1304 #define known_eq(A, B) (!maybe_ne (A, B))
1305 
1306 /* Return true if A is known to be unequal to B.  */
1307 #define known_ne(A, B) (!maybe_eq (A, B))
1308 
1309 /* Return true if A might be less than or equal to B for some
1310    indeterminate values.  */
1311 
1312 template<unsigned int N, typename Ca, typename Cb>
1313 inline bool
1314 maybe_le (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1315 {
1316   if (N >= 2)
1317     for (unsigned int i = 1; i < N; i++)
1318       if (a.coeffs[i] < b.coeffs[i])
1319 	return true;
1320   return a.coeffs[0] <= b.coeffs[0];
1321 }
1322 
1323 template<unsigned int N, typename Ca, typename Cb>
1324 inline typename if_nonpoly<Cb, bool>::type
1325 maybe_le (const poly_int_pod<N, Ca> &a, const Cb &b)
1326 {
1327   if (N >= 2)
1328     for (unsigned int i = 1; i < N; i++)
1329       if (a.coeffs[i] < 0)
1330 	return true;
1331   return a.coeffs[0] <= b;
1332 }
1333 
1334 template<unsigned int N, typename Ca, typename Cb>
1335 inline typename if_nonpoly<Ca, bool>::type
1336 maybe_le (const Ca &a, const poly_int_pod<N, Cb> &b)
1337 {
1338   if (N >= 2)
1339     for (unsigned int i = 1; i < N; i++)
1340       if (b.coeffs[i] > 0)
1341 	return true;
1342   return a <= b.coeffs[0];
1343 }
1344 
1345 template<typename Ca, typename Cb>
1346 inline typename if_nonpoly2<Ca, Cb, bool>::type
1347 maybe_le (const Ca &a, const Cb &b)
1348 {
1349   return a <= b;
1350 }
1351 
1352 /* Return true if A might be less than B for some indeterminate values.  */
1353 
1354 template<unsigned int N, typename Ca, typename Cb>
1355 inline bool
1356 maybe_lt (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1357 {
1358   if (N >= 2)
1359     for (unsigned int i = 1; i < N; i++)
1360       if (a.coeffs[i] < b.coeffs[i])
1361 	return true;
1362   return a.coeffs[0] < b.coeffs[0];
1363 }
1364 
1365 template<unsigned int N, typename Ca, typename Cb>
1366 inline typename if_nonpoly<Cb, bool>::type
1367 maybe_lt (const poly_int_pod<N, Ca> &a, const Cb &b)
1368 {
1369   if (N >= 2)
1370     for (unsigned int i = 1; i < N; i++)
1371       if (a.coeffs[i] < 0)
1372 	return true;
1373   return a.coeffs[0] < b;
1374 }
1375 
1376 template<unsigned int N, typename Ca, typename Cb>
1377 inline typename if_nonpoly<Ca, bool>::type
1378 maybe_lt (const Ca &a, const poly_int_pod<N, Cb> &b)
1379 {
1380   if (N >= 2)
1381     for (unsigned int i = 1; i < N; i++)
1382       if (b.coeffs[i] > 0)
1383 	return true;
1384   return a < b.coeffs[0];
1385 }
1386 
1387 template<typename Ca, typename Cb>
1388 inline typename if_nonpoly2<Ca, Cb, bool>::type
1389 maybe_lt (const Ca &a, const Cb &b)
1390 {
1391   return a < b;
1392 }
1393 
1394 /* Return true if A may be greater than or equal to B.  */
1395 #define maybe_ge(A, B) maybe_le (B, A)
1396 
1397 /* Return true if A may be greater than B.  */
1398 #define maybe_gt(A, B) maybe_lt (B, A)
1399 
1400 /* Return true if A is known to be less than or equal to B.  */
1401 #define known_le(A, B) (!maybe_gt (A, B))
1402 
1403 /* Return true if A is known to be less than B.  */
1404 #define known_lt(A, B) (!maybe_ge (A, B))
1405 
1406 /* Return true if A is known to be greater than B.  */
1407 #define known_gt(A, B) (!maybe_le (A, B))
1408 
1409 /* Return true if A is known to be greater than or equal to B.  */
1410 #define known_ge(A, B) (!maybe_lt (A, B))
1411 
1412 /* Return true if A and B are ordered by the partial ordering known_le.  */
1413 
1414 template<typename T1, typename T2>
1415 inline bool
1416 ordered_p (const T1 &a, const T2 &b)
1417 {
1418   return ((poly_int_traits<T1>::num_coeffs == 1
1419 	   && poly_int_traits<T2>::num_coeffs == 1)
1420 	  || known_le (a, b)
1421 	  || known_le (b, a));
1422 }
1423 
1424 /* Assert that A and B are known to be ordered and return the minimum
1425    of the two.
1426 
1427    NOTE: When using this function, please add a comment above the call
1428    explaining why we know the values are ordered in that context.  */
1429 
1430 template<unsigned int N, typename Ca, typename Cb>
1431 inline POLY_POLY_RESULT (N, Ca, Cb)
1432 ordered_min (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1433 {
1434   if (known_le (a, b))
1435     return a;
1436   else
1437     {
1438       if (N > 1)
1439 	gcc_checking_assert (known_le (b, a));
1440       return b;
1441     }
1442 }
1443 
1444 template<unsigned int N, typename Ca, typename Cb>
1445 inline CONST_POLY_RESULT (N, Ca, Cb)
1446 ordered_min (const Ca &a, const poly_int_pod<N, Cb> &b)
1447 {
1448   if (known_le (a, b))
1449     return a;
1450   else
1451     {
1452       if (N > 1)
1453 	gcc_checking_assert (known_le (b, a));
1454       return b;
1455     }
1456 }
1457 
1458 template<unsigned int N, typename Ca, typename Cb>
1459 inline POLY_CONST_RESULT (N, Ca, Cb)
1460 ordered_min (const poly_int_pod<N, Ca> &a, const Cb &b)
1461 {
1462   if (known_le (a, b))
1463     return a;
1464   else
1465     {
1466       if (N > 1)
1467 	gcc_checking_assert (known_le (b, a));
1468       return b;
1469     }
1470 }
1471 
1472 /* Assert that A and B are known to be ordered and return the maximum
1473    of the two.
1474 
1475    NOTE: When using this function, please add a comment above the call
1476    explaining why we know the values are ordered in that context.  */
1477 
1478 template<unsigned int N, typename Ca, typename Cb>
1479 inline POLY_POLY_RESULT (N, Ca, Cb)
1480 ordered_max (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1481 {
1482   if (known_le (a, b))
1483     return b;
1484   else
1485     {
1486       if (N > 1)
1487 	gcc_checking_assert (known_le (b, a));
1488       return a;
1489     }
1490 }
1491 
1492 template<unsigned int N, typename Ca, typename Cb>
1493 inline CONST_POLY_RESULT (N, Ca, Cb)
1494 ordered_max (const Ca &a, const poly_int_pod<N, Cb> &b)
1495 {
1496   if (known_le (a, b))
1497     return b;
1498   else
1499     {
1500       if (N > 1)
1501 	gcc_checking_assert (known_le (b, a));
1502       return a;
1503     }
1504 }
1505 
1506 template<unsigned int N, typename Ca, typename Cb>
1507 inline POLY_CONST_RESULT (N, Ca, Cb)
1508 ordered_max (const poly_int_pod<N, Ca> &a, const Cb &b)
1509 {
1510   if (known_le (a, b))
1511     return b;
1512   else
1513     {
1514       if (N > 1)
1515 	gcc_checking_assert (known_le (b, a));
1516       return a;
1517     }
1518 }
1519 
1520 /* Return a constant lower bound on the value of A, which is known
1521    to be nonnegative.  */
1522 
1523 template<unsigned int N, typename Ca>
1524 inline Ca
1525 constant_lower_bound (const poly_int_pod<N, Ca> &a)
1526 {
1527   gcc_checking_assert (known_ge (a, POLY_INT_TYPE (Ca) (0)));
1528   return a.coeffs[0];
1529 }
1530 
1531 /* Return the constant lower bound of A, given that it is no less than B.  */
1532 
1533 template<unsigned int N, typename Ca, typename Cb>
1534 inline POLY_CONST_COEFF (Ca, Cb)
1535 constant_lower_bound_with_limit (const poly_int_pod<N, Ca> &a, const Cb &b)
1536 {
1537   if (known_ge (a, b))
1538     return a.coeffs[0];
1539   return b;
1540 }
1541 
1542 /* Return the constant upper bound of A, given that it is no greater
1543    than B.  */
1544 
1545 template<unsigned int N, typename Ca, typename Cb>
1546 inline POLY_CONST_COEFF (Ca, Cb)
1547 constant_upper_bound_with_limit (const poly_int_pod<N, Ca> &a, const Cb &b)
1548 {
1549   if (known_le (a, b))
1550     return a.coeffs[0];
1551   return b;
1552 }
1553 
1554 /* Return a value that is known to be no greater than A and B.  This
1555    will be the greatest lower bound for some indeterminate values but
1556    not necessarily for all.  */
1557 
1558 template<unsigned int N, typename Ca, typename Cb>
1559 inline POLY_CONST_RESULT (N, Ca, Cb)
1560 lower_bound (const poly_int_pod<N, Ca> &a, const Cb &b)
1561 {
1562   typedef POLY_CAST (Ca, Cb) NCa;
1563   typedef POLY_CAST (Cb, Ca) NCb;
1564   typedef POLY_INT_TYPE (Cb) ICb;
1565   typedef POLY_CONST_COEFF (Ca, Cb) C;
1566 
1567   poly_int<N, C> r;
1568   POLY_SET_COEFF (C, r, 0, MIN (NCa (a.coeffs[0]), NCb (b)));
1569   if (N >= 2)
1570     for (unsigned int i = 1; i < N; i++)
1571       POLY_SET_COEFF (C, r, i, MIN (NCa (a.coeffs[i]), ICb (0)));
1572   return r;
1573 }
1574 
1575 template<unsigned int N, typename Ca, typename Cb>
1576 inline CONST_POLY_RESULT (N, Ca, Cb)
1577 lower_bound (const Ca &a, const poly_int_pod<N, Cb> &b)
1578 {
1579   return lower_bound (b, a);
1580 }
1581 
1582 template<unsigned int N, typename Ca, typename Cb>
1583 inline POLY_POLY_RESULT (N, Ca, Cb)
1584 lower_bound (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1585 {
1586   typedef POLY_CAST (Ca, Cb) NCa;
1587   typedef POLY_CAST (Cb, Ca) NCb;
1588   typedef POLY_POLY_COEFF (Ca, Cb) C;
1589 
1590   poly_int<N, C> r;
1591   for (unsigned int i = 0; i < N; i++)
1592     POLY_SET_COEFF (C, r, i, MIN (NCa (a.coeffs[i]), NCb (b.coeffs[i])));
1593   return r;
1594 }
1595 
1596 template<typename Ca, typename Cb>
1597 inline CONST_CONST_RESULT (N, Ca, Cb)
1598 lower_bound (const Ca &a, const Cb &b)
1599 {
1600   return a < b ? a : b;
1601 }
1602 
1603 /* Return a value that is known to be no less than A and B.  This will
1604    be the least upper bound for some indeterminate values but not
1605    necessarily for all.  */
1606 
1607 template<unsigned int N, typename Ca, typename Cb>
1608 inline POLY_CONST_RESULT (N, Ca, Cb)
1609 upper_bound (const poly_int_pod<N, Ca> &a, const Cb &b)
1610 {
1611   typedef POLY_CAST (Ca, Cb) NCa;
1612   typedef POLY_CAST (Cb, Ca) NCb;
1613   typedef POLY_INT_TYPE (Cb) ICb;
1614   typedef POLY_CONST_COEFF (Ca, Cb) C;
1615 
1616   poly_int<N, C> r;
1617   POLY_SET_COEFF (C, r, 0, MAX (NCa (a.coeffs[0]), NCb (b)));
1618   if (N >= 2)
1619     for (unsigned int i = 1; i < N; i++)
1620       POLY_SET_COEFF (C, r, i, MAX (NCa (a.coeffs[i]), ICb (0)));
1621   return r;
1622 }
1623 
1624 template<unsigned int N, typename Ca, typename Cb>
1625 inline CONST_POLY_RESULT (N, Ca, Cb)
1626 upper_bound (const Ca &a, const poly_int_pod<N, Cb> &b)
1627 {
1628   return upper_bound (b, a);
1629 }
1630 
1631 template<unsigned int N, typename Ca, typename Cb>
1632 inline POLY_POLY_RESULT (N, Ca, Cb)
1633 upper_bound (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1634 {
1635   typedef POLY_CAST (Ca, Cb) NCa;
1636   typedef POLY_CAST (Cb, Ca) NCb;
1637   typedef POLY_POLY_COEFF (Ca, Cb) C;
1638 
1639   poly_int<N, C> r;
1640   for (unsigned int i = 0; i < N; i++)
1641     POLY_SET_COEFF (C, r, i, MAX (NCa (a.coeffs[i]), NCb (b.coeffs[i])));
1642   return r;
1643 }
1644 
1645 /* Return the greatest common divisor of all nonzero coefficients, or zero
1646    if all coefficients are zero.  */
1647 
1648 template<unsigned int N, typename Ca>
1649 inline POLY_BINARY_COEFF (Ca, Ca)
1650 coeff_gcd (const poly_int_pod<N, Ca> &a)
1651 {
1652   /* Find the first nonzero coefficient, stopping at 0 whatever happens.  */
1653   unsigned int i;
1654   for (i = N - 1; i > 0; --i)
1655     if (a.coeffs[i] != 0)
1656       break;
1657   typedef POLY_BINARY_COEFF (Ca, Ca) C;
1658   C r = a.coeffs[i];
1659   for (unsigned int j = 0; j < i; ++j)
1660     if (a.coeffs[j] != 0)
1661       r = gcd (r, C (a.coeffs[j]));
1662   return r;
1663 }
1664 
1665 /* Return a value that is a multiple of both A and B.  This will be the
1666    least common multiple for some indeterminate values but necessarily
1667    for all.  */
1668 
1669 template<unsigned int N, typename Ca, typename Cb>
1670 POLY_CONST_RESULT (N, Ca, Cb)
1671 common_multiple (const poly_int_pod<N, Ca> &a, Cb b)
1672 {
1673   POLY_BINARY_COEFF (Ca, Ca) xgcd = coeff_gcd (a);
1674   return a * (least_common_multiple (xgcd, b) / xgcd);
1675 }
1676 
1677 template<unsigned int N, typename Ca, typename Cb>
1678 inline CONST_POLY_RESULT (N, Ca, Cb)
1679 common_multiple (const Ca &a, const poly_int_pod<N, Cb> &b)
1680 {
1681   return common_multiple (b, a);
1682 }
1683 
1684 /* Return a value that is a multiple of both A and B, asserting that
1685    such a value exists.  The result will be the least common multiple
1686    for some indeterminate values but necessarily for all.
1687 
1688    NOTE: When using this function, please add a comment above the call
1689    explaining why we know the values have a common multiple (which might
1690    for example be because we know A / B is rational).  */
1691 
1692 template<unsigned int N, typename Ca, typename Cb>
1693 POLY_POLY_RESULT (N, Ca, Cb)
1694 force_common_multiple (const poly_int_pod<N, Ca> &a,
1695 		       const poly_int_pod<N, Cb> &b)
1696 {
1697   if (b.is_constant ())
1698     return common_multiple (a, b.coeffs[0]);
1699   if (a.is_constant ())
1700     return common_multiple (a.coeffs[0], b);
1701 
1702   typedef POLY_CAST (Ca, Cb) NCa;
1703   typedef POLY_CAST (Cb, Ca) NCb;
1704   typedef POLY_BINARY_COEFF (Ca, Cb) C;
1705   typedef POLY_INT_TYPE (Ca) ICa;
1706 
1707   for (unsigned int i = 1; i < N; ++i)
1708     if (a.coeffs[i] != ICa (0))
1709       {
1710 	C lcm = least_common_multiple (NCa (a.coeffs[i]), NCb (b.coeffs[i]));
1711 	C amul = lcm / a.coeffs[i];
1712 	C bmul = lcm / b.coeffs[i];
1713 	for (unsigned int j = 0; j < N; ++j)
1714 	  gcc_checking_assert (a.coeffs[j] * amul == b.coeffs[j] * bmul);
1715 	return a * amul;
1716       }
1717   gcc_unreachable ();
1718 }
1719 
1720 /* Compare A and B for sorting purposes, returning -1 if A should come
1721    before B, 0 if A and B are identical, and 1 if A should come after B.
1722    This is a lexicographical compare of the coefficients in reverse order.
1723 
1724    A consequence of this is that all constant sizes come before all
1725    non-constant ones, regardless of magnitude (since a size is never
1726    negative).  This is what most callers want.  For example, when laying
1727    data out on the stack, it's better to keep all the constant-sized
1728    data together so that it can be accessed as a constant offset from a
1729    single base.  */
1730 
1731 template<unsigned int N, typename Ca, typename Cb>
1732 inline int
1733 compare_sizes_for_sort (const poly_int_pod<N, Ca> &a,
1734 			const poly_int_pod<N, Cb> &b)
1735 {
1736   for (unsigned int i = N; i-- > 0; )
1737     if (a.coeffs[i] != b.coeffs[i])
1738       return a.coeffs[i] < b.coeffs[i] ? -1 : 1;
1739   return 0;
1740 }
1741 
1742 /* Return true if we can calculate VALUE & (ALIGN - 1) at compile time.  */
1743 
1744 template<unsigned int N, typename Ca, typename Cb>
1745 inline bool
1746 can_align_p (const poly_int_pod<N, Ca> &value, Cb align)
1747 {
1748   for (unsigned int i = 1; i < N; i++)
1749     if ((value.coeffs[i] & (align - 1)) != 0)
1750       return false;
1751   return true;
1752 }
1753 
1754 /* Return true if we can align VALUE up to the smallest multiple of
1755    ALIGN that is >= VALUE.  Store the aligned value in *ALIGNED if so.  */
1756 
1757 template<unsigned int N, typename Ca, typename Cb>
1758 inline bool
1759 can_align_up (const poly_int_pod<N, Ca> &value, Cb align,
1760 	      poly_int_pod<N, Ca> *aligned)
1761 {
1762   if (!can_align_p (value, align))
1763     return false;
1764   *aligned = value + (-value.coeffs[0] & (align - 1));
1765   return true;
1766 }
1767 
1768 /* Return true if we can align VALUE down to the largest multiple of
1769    ALIGN that is <= VALUE.  Store the aligned value in *ALIGNED if so.  */
1770 
1771 template<unsigned int N, typename Ca, typename Cb>
1772 inline bool
1773 can_align_down (const poly_int_pod<N, Ca> &value, Cb align,
1774 		poly_int_pod<N, Ca> *aligned)
1775 {
1776   if (!can_align_p (value, align))
1777     return false;
1778   *aligned = value - (value.coeffs[0] & (align - 1));
1779   return true;
1780 }
1781 
1782 /* Return true if we can align A and B up to the smallest multiples of
1783    ALIGN that are >= A and B respectively, and if doing so gives the
1784    same value.  */
1785 
1786 template<unsigned int N, typename Ca, typename Cb, typename Cc>
1787 inline bool
1788 known_equal_after_align_up (const poly_int_pod<N, Ca> &a,
1789 			    const poly_int_pod<N, Cb> &b,
1790 			    Cc align)
1791 {
1792   poly_int<N, Ca> aligned_a;
1793   poly_int<N, Cb> aligned_b;
1794   return (can_align_up (a, align, &aligned_a)
1795 	  && can_align_up (b, align, &aligned_b)
1796 	  && known_eq (aligned_a, aligned_b));
1797 }
1798 
1799 /* Return true if we can align A and B down to the largest multiples of
1800    ALIGN that are <= A and B respectively, and if doing so gives the
1801    same value.  */
1802 
1803 template<unsigned int N, typename Ca, typename Cb, typename Cc>
1804 inline bool
1805 known_equal_after_align_down (const poly_int_pod<N, Ca> &a,
1806 			      const poly_int_pod<N, Cb> &b,
1807 			      Cc align)
1808 {
1809   poly_int<N, Ca> aligned_a;
1810   poly_int<N, Cb> aligned_b;
1811   return (can_align_down (a, align, &aligned_a)
1812 	  && can_align_down (b, align, &aligned_b)
1813 	  && known_eq (aligned_a, aligned_b));
1814 }
1815 
1816 /* Assert that we can align VALUE to ALIGN at compile time and return
1817    the smallest multiple of ALIGN that is >= VALUE.
1818 
1819    NOTE: When using this function, please add a comment above the call
1820    explaining why we know the non-constant coefficients must already
1821    be a multiple of ALIGN.  */
1822 
1823 template<unsigned int N, typename Ca, typename Cb>
1824 inline poly_int<N, Ca>
1825 force_align_up (const poly_int_pod<N, Ca> &value, Cb align)
1826 {
1827   gcc_checking_assert (can_align_p (value, align));
1828   return value + (-value.coeffs[0] & (align - 1));
1829 }
1830 
1831 /* Assert that we can align VALUE to ALIGN at compile time and return
1832    the largest multiple of ALIGN that is <= VALUE.
1833 
1834    NOTE: When using this function, please add a comment above the call
1835    explaining why we know the non-constant coefficients must already
1836    be a multiple of ALIGN.  */
1837 
1838 template<unsigned int N, typename Ca, typename Cb>
1839 inline poly_int<N, Ca>
1840 force_align_down (const poly_int_pod<N, Ca> &value, Cb align)
1841 {
1842   gcc_checking_assert (can_align_p (value, align));
1843   return value - (value.coeffs[0] & (align - 1));
1844 }
1845 
1846 /* Return a value <= VALUE that is a multiple of ALIGN.  It will be the
1847    greatest such value for some indeterminate values but not necessarily
1848    for all.  */
1849 
1850 template<unsigned int N, typename Ca, typename Cb>
1851 inline poly_int<N, Ca>
1852 aligned_lower_bound (const poly_int_pod<N, Ca> &value, Cb align)
1853 {
1854   poly_int<N, Ca> r;
1855   for (unsigned int i = 0; i < N; i++)
1856     /* This form copes correctly with more type combinations than
1857        value.coeffs[i] & -align would.  */
1858     POLY_SET_COEFF (Ca, r, i, (value.coeffs[i]
1859 			       - (value.coeffs[i] & (align - 1))));
1860   return r;
1861 }
1862 
1863 /* Return a value >= VALUE that is a multiple of ALIGN.  It will be the
1864    least such value for some indeterminate values but not necessarily
1865    for all.  */
1866 
1867 template<unsigned int N, typename Ca, typename Cb>
1868 inline poly_int<N, Ca>
1869 aligned_upper_bound (const poly_int_pod<N, Ca> &value, Cb align)
1870 {
1871   poly_int<N, Ca> r;
1872   for (unsigned int i = 0; i < N; i++)
1873     POLY_SET_COEFF (Ca, r, i, (value.coeffs[i]
1874 			       + (-value.coeffs[i] & (align - 1))));
1875   return r;
1876 }
1877 
1878 /* Assert that we can align VALUE to ALIGN at compile time.  Align VALUE
1879    down to the largest multiple of ALIGN that is <= VALUE, then divide by
1880    ALIGN.
1881 
1882    NOTE: When using this function, please add a comment above the call
1883    explaining why we know the non-constant coefficients must already
1884    be a multiple of ALIGN.  */
1885 
1886 template<unsigned int N, typename Ca, typename Cb>
1887 inline poly_int<N, Ca>
1888 force_align_down_and_div (const poly_int_pod<N, Ca> &value, Cb align)
1889 {
1890   gcc_checking_assert (can_align_p (value, align));
1891 
1892   poly_int<N, Ca> r;
1893   POLY_SET_COEFF (Ca, r, 0, ((value.coeffs[0]
1894 			      - (value.coeffs[0] & (align - 1)))
1895 			     / align));
1896   if (N >= 2)
1897     for (unsigned int i = 1; i < N; i++)
1898       POLY_SET_COEFF (Ca, r, i, value.coeffs[i] / align);
1899   return r;
1900 }
1901 
1902 /* Assert that we can align VALUE to ALIGN at compile time.  Align VALUE
1903    up to the smallest multiple of ALIGN that is >= VALUE, then divide by
1904    ALIGN.
1905 
1906    NOTE: When using this function, please add a comment above the call
1907    explaining why we know the non-constant coefficients must already
1908    be a multiple of ALIGN.  */
1909 
1910 template<unsigned int N, typename Ca, typename Cb>
1911 inline poly_int<N, Ca>
1912 force_align_up_and_div (const poly_int_pod<N, Ca> &value, Cb align)
1913 {
1914   gcc_checking_assert (can_align_p (value, align));
1915 
1916   poly_int<N, Ca> r;
1917   POLY_SET_COEFF (Ca, r, 0, ((value.coeffs[0]
1918 			      + (-value.coeffs[0] & (align - 1)))
1919 			     / align));
1920   if (N >= 2)
1921     for (unsigned int i = 1; i < N; i++)
1922       POLY_SET_COEFF (Ca, r, i, value.coeffs[i] / align);
1923   return r;
1924 }
1925 
1926 /* Return true if we know at compile time the difference between VALUE
1927    and the equal or preceding multiple of ALIGN.  Store the value in
1928    *MISALIGN if so.  */
1929 
1930 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1931 inline bool
1932 known_misalignment (const poly_int_pod<N, Ca> &value, Cb align, Cm *misalign)
1933 {
1934   gcc_checking_assert (align != 0);
1935   if (!can_align_p (value, align))
1936     return false;
1937   *misalign = value.coeffs[0] & (align - 1);
1938   return true;
1939 }
1940 
1941 /* Return X & (Y - 1), asserting that this value is known.  Please add
1942    an a comment above callers to this function to explain why the condition
1943    is known to hold.  */
1944 
1945 template<unsigned int N, typename Ca, typename Cb>
1946 inline POLY_BINARY_COEFF (Ca, Ca)
1947 force_get_misalignment (const poly_int_pod<N, Ca> &a, Cb align)
1948 {
1949   gcc_checking_assert (can_align_p (a, align));
1950   return a.coeffs[0] & (align - 1);
1951 }
1952 
1953 /* Return the maximum alignment that A is known to have.  Return 0
1954    if A is known to be zero.  */
1955 
1956 template<unsigned int N, typename Ca>
1957 inline POLY_BINARY_COEFF (Ca, Ca)
1958 known_alignment (const poly_int_pod<N, Ca> &a)
1959 {
1960   typedef POLY_BINARY_COEFF (Ca, Ca) C;
1961   C r = a.coeffs[0];
1962   for (unsigned int i = 1; i < N; ++i)
1963     r |= a.coeffs[i];
1964   return r & -r;
1965 }
1966 
1967 /* Return true if we can compute A | B at compile time, storing the
1968    result in RES if so.  */
1969 
1970 template<unsigned int N, typename Ca, typename Cb, typename Cr>
1971 inline typename if_nonpoly<Cb, bool>::type
1972 can_ior_p (const poly_int_pod<N, Ca> &a, Cb b, Cr *result)
1973 {
1974   /* Coefficients 1 and above must be a multiple of something greater
1975      than B.  */
1976   typedef POLY_INT_TYPE (Ca) int_type;
1977   if (N >= 2)
1978     for (unsigned int i = 1; i < N; i++)
1979       if ((-(a.coeffs[i] & -a.coeffs[i]) & b) != int_type (0))
1980 	return false;
1981   *result = a;
1982   result->coeffs[0] |= b;
1983   return true;
1984 }
1985 
1986 /* Return true if A is a constant multiple of B, storing the
1987    multiple in *MULTIPLE if so.  */
1988 
1989 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1990 inline typename if_nonpoly<Cb, bool>::type
1991 constant_multiple_p (const poly_int_pod<N, Ca> &a, Cb b, Cm *multiple)
1992 {
1993   typedef POLY_CAST (Ca, Cb) NCa;
1994   typedef POLY_CAST (Cb, Ca) NCb;
1995 
1996   /* Do the modulus before the constant check, to catch divide by
1997      zero errors.  */
1998   if (NCa (a.coeffs[0]) % NCb (b) != 0 || !a.is_constant ())
1999     return false;
2000   *multiple = NCa (a.coeffs[0]) / NCb (b);
2001   return true;
2002 }
2003 
2004 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2005 inline typename if_nonpoly<Ca, bool>::type
2006 constant_multiple_p (Ca a, const poly_int_pod<N, Cb> &b, Cm *multiple)
2007 {
2008   typedef POLY_CAST (Ca, Cb) NCa;
2009   typedef POLY_CAST (Cb, Ca) NCb;
2010   typedef POLY_INT_TYPE (Ca) int_type;
2011 
2012   /* Do the modulus before the constant check, to catch divide by
2013      zero errors.  */
2014   if (NCa (a) % NCb (b.coeffs[0]) != 0
2015       || (a != int_type (0) && !b.is_constant ()))
2016     return false;
2017   *multiple = NCa (a) / NCb (b.coeffs[0]);
2018   return true;
2019 }
2020 
2021 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2022 inline bool
2023 constant_multiple_p (const poly_int_pod<N, Ca> &a,
2024 		     const poly_int_pod<N, Cb> &b, Cm *multiple)
2025 {
2026   typedef POLY_CAST (Ca, Cb) NCa;
2027   typedef POLY_CAST (Cb, Ca) NCb;
2028   typedef POLY_INT_TYPE (Ca) ICa;
2029   typedef POLY_INT_TYPE (Cb) ICb;
2030   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2031 
2032   if (NCa (a.coeffs[0]) % NCb (b.coeffs[0]) != 0)
2033     return false;
2034 
2035   C r = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2036   for (unsigned int i = 1; i < N; ++i)
2037     if (b.coeffs[i] == ICb (0)
2038 	? a.coeffs[i] != ICa (0)
2039 	: (NCa (a.coeffs[i]) % NCb (b.coeffs[i]) != 0
2040 	   || NCa (a.coeffs[i]) / NCb (b.coeffs[i]) != r))
2041       return false;
2042 
2043   *multiple = r;
2044   return true;
2045 }
2046 
2047 /* Return true if A is a constant multiple of B.  */
2048 
2049 template<unsigned int N, typename Ca, typename Cb>
2050 inline typename if_nonpoly<Cb, bool>::type
2051 constant_multiple_p (const poly_int_pod<N, Ca> &a, Cb b)
2052 {
2053   typedef POLY_CAST (Ca, Cb) NCa;
2054   typedef POLY_CAST (Cb, Ca) NCb;
2055 
2056   /* Do the modulus before the constant check, to catch divide by
2057      zero errors.  */
2058   if (NCa (a.coeffs[0]) % NCb (b) != 0 || !a.is_constant ())
2059     return false;
2060   return true;
2061 }
2062 
2063 template<unsigned int N, typename Ca, typename Cb>
2064 inline typename if_nonpoly<Ca, bool>::type
2065 constant_multiple_p (Ca a, const poly_int_pod<N, Cb> &b)
2066 {
2067   typedef POLY_CAST (Ca, Cb) NCa;
2068   typedef POLY_CAST (Cb, Ca) NCb;
2069   typedef POLY_INT_TYPE (Ca) int_type;
2070 
2071   /* Do the modulus before the constant check, to catch divide by
2072      zero errors.  */
2073   if (NCa (a) % NCb (b.coeffs[0]) != 0
2074       || (a != int_type (0) && !b.is_constant ()))
2075     return false;
2076   return true;
2077 }
2078 
2079 template<unsigned int N, typename Ca, typename Cb>
2080 inline bool
2081 constant_multiple_p (const poly_int_pod<N, Ca> &a,
2082 		     const poly_int_pod<N, Cb> &b)
2083 {
2084   typedef POLY_CAST (Ca, Cb) NCa;
2085   typedef POLY_CAST (Cb, Ca) NCb;
2086   typedef POLY_INT_TYPE (Ca) ICa;
2087   typedef POLY_INT_TYPE (Cb) ICb;
2088   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2089 
2090   if (NCa (a.coeffs[0]) % NCb (b.coeffs[0]) != 0)
2091     return false;
2092 
2093   C r = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2094   for (unsigned int i = 1; i < N; ++i)
2095     if (b.coeffs[i] == ICb (0)
2096 	? a.coeffs[i] != ICa (0)
2097 	: (NCa (a.coeffs[i]) % NCb (b.coeffs[i]) != 0
2098 	   || NCa (a.coeffs[i]) / NCb (b.coeffs[i]) != r))
2099       return false;
2100   return true;
2101 }
2102 
2103 
2104 /* Return true if A is a multiple of B.  */
2105 
2106 template<typename Ca, typename Cb>
2107 inline typename if_nonpoly2<Ca, Cb, bool>::type
2108 multiple_p (Ca a, Cb b)
2109 {
2110   return a % b == 0;
2111 }
2112 
2113 /* Return true if A is a (polynomial) multiple of B.  */
2114 
2115 template<unsigned int N, typename Ca, typename Cb>
2116 inline typename if_nonpoly<Cb, bool>::type
2117 multiple_p (const poly_int_pod<N, Ca> &a, Cb b)
2118 {
2119   for (unsigned int i = 0; i < N; ++i)
2120     if (a.coeffs[i] % b != 0)
2121       return false;
2122   return true;
2123 }
2124 
2125 /* Return true if A is a (constant) multiple of B.  */
2126 
2127 template<unsigned int N, typename Ca, typename Cb>
2128 inline typename if_nonpoly<Ca, bool>::type
2129 multiple_p (Ca a, const poly_int_pod<N, Cb> &b)
2130 {
2131   typedef POLY_INT_TYPE (Ca) int_type;
2132 
2133   /* Do the modulus before the constant check, to catch divide by
2134      potential zeros.  */
2135   return a % b.coeffs[0] == 0 && (a == int_type (0) || b.is_constant ());
2136 }
2137 
2138 /* Return true if A is a (polynomial) multiple of B.  This handles cases
2139    where either B is constant or the multiple is constant.  */
2140 
2141 template<unsigned int N, typename Ca, typename Cb>
2142 inline bool
2143 multiple_p (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
2144 {
2145   if (b.is_constant ())
2146     return multiple_p (a, b.coeffs[0]);
2147   POLY_BINARY_COEFF (Ca, Ca) tmp;
2148   return constant_multiple_p (a, b, &tmp);
2149 }
2150 
2151 /* Return true if A is a (constant) multiple of B, storing the
2152    multiple in *MULTIPLE if so.  */
2153 
2154 template<typename Ca, typename Cb, typename Cm>
2155 inline typename if_nonpoly2<Ca, Cb, bool>::type
2156 multiple_p (Ca a, Cb b, Cm *multiple)
2157 {
2158   if (a % b != 0)
2159     return false;
2160   *multiple = a / b;
2161   return true;
2162 }
2163 
2164 /* Return true if A is a (polynomial) multiple of B, storing the
2165    multiple in *MULTIPLE if so.  */
2166 
2167 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2168 inline typename if_nonpoly<Cb, bool>::type
2169 multiple_p (const poly_int_pod<N, Ca> &a, Cb b, poly_int_pod<N, Cm> *multiple)
2170 {
2171   if (!multiple_p (a, b))
2172     return false;
2173   for (unsigned int i = 0; i < N; ++i)
2174     multiple->coeffs[i] = a.coeffs[i] / b;
2175   return true;
2176 }
2177 
2178 /* Return true if B is a constant and A is a (constant) multiple of B,
2179    storing the multiple in *MULTIPLE if so.  */
2180 
2181 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2182 inline typename if_nonpoly<Ca, bool>::type
2183 multiple_p (Ca a, const poly_int_pod<N, Cb> &b, Cm *multiple)
2184 {
2185   typedef POLY_CAST (Ca, Cb) NCa;
2186 
2187   /* Do the modulus before the constant check, to catch divide by
2188      potential zeros.  */
2189   if (a % b.coeffs[0] != 0 || (NCa (a) != 0 && !b.is_constant ()))
2190     return false;
2191   *multiple = a / b.coeffs[0];
2192   return true;
2193 }
2194 
2195 /* Return true if A is a (polynomial) multiple of B, storing the
2196    multiple in *MULTIPLE if so.  This handles cases where either
2197    B is constant or the multiple is constant.  */
2198 
2199 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2200 inline bool
2201 multiple_p (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
2202 	    poly_int_pod<N, Cm> *multiple)
2203 {
2204   if (b.is_constant ())
2205     return multiple_p (a, b.coeffs[0], multiple);
2206   return constant_multiple_p (a, b, multiple);
2207 }
2208 
2209 /* Return A / B, given that A is known to be a multiple of B.  */
2210 
2211 template<unsigned int N, typename Ca, typename Cb>
2212 inline POLY_CONST_RESULT (N, Ca, Cb)
2213 exact_div (const poly_int_pod<N, Ca> &a, Cb b)
2214 {
2215   typedef POLY_CONST_COEFF (Ca, Cb) C;
2216   poly_int<N, C> r;
2217   for (unsigned int i = 0; i < N; i++)
2218     {
2219       gcc_checking_assert (a.coeffs[i] % b == 0);
2220       POLY_SET_COEFF (C, r, i, a.coeffs[i] / b);
2221     }
2222   return r;
2223 }
2224 
2225 /* Return A / B, given that A is known to be a multiple of B.  */
2226 
2227 template<unsigned int N, typename Ca, typename Cb>
2228 inline POLY_POLY_RESULT (N, Ca, Cb)
2229 exact_div (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
2230 {
2231   if (b.is_constant ())
2232     return exact_div (a, b.coeffs[0]);
2233 
2234   typedef POLY_CAST (Ca, Cb) NCa;
2235   typedef POLY_CAST (Cb, Ca) NCb;
2236   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2237   typedef POLY_INT_TYPE (Cb) int_type;
2238 
2239   gcc_checking_assert (a.coeffs[0] % b.coeffs[0] == 0);
2240   C r = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2241   for (unsigned int i = 1; i < N; ++i)
2242     gcc_checking_assert (b.coeffs[i] == int_type (0)
2243 			 ? a.coeffs[i] == int_type (0)
2244 			 : (a.coeffs[i] % b.coeffs[i] == 0
2245 			    && NCa (a.coeffs[i]) / NCb (b.coeffs[i]) == r));
2246 
2247   return r;
2248 }
2249 
2250 /* Return true if there is some constant Q and polynomial r such that:
2251 
2252      (1) a = b * Q + r
2253      (2) |b * Q| <= |a|
2254      (3) |r| < |b|
2255 
2256    Store the value Q in *QUOTIENT if so.  */
2257 
2258 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2259 inline typename if_nonpoly2<Cb, Cq, bool>::type
2260 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b, Cq *quotient)
2261 {
2262   typedef POLY_CAST (Ca, Cb) NCa;
2263   typedef POLY_CAST (Cb, Ca) NCb;
2264 
2265   /* Do the division before the constant check, to catch divide by
2266      zero errors.  */
2267   Cq q = NCa (a.coeffs[0]) / NCb (b);
2268   if (!a.is_constant ())
2269     return false;
2270   *quotient = q;
2271   return true;
2272 }
2273 
2274 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2275 inline typename if_nonpoly<Cq, bool>::type
2276 can_div_trunc_p (const poly_int_pod<N, Ca> &a,
2277 		 const poly_int_pod<N, Cb> &b,
2278 		 Cq *quotient)
2279 {
2280   /* We can calculate Q from the case in which the indeterminates
2281      are zero.  */
2282   typedef POLY_CAST (Ca, Cb) NCa;
2283   typedef POLY_CAST (Cb, Ca) NCb;
2284   typedef POLY_INT_TYPE (Ca) ICa;
2285   typedef POLY_INT_TYPE (Cb) ICb;
2286   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2287   C q = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2288 
2289   /* Check the other coefficients and record whether the division is exact.
2290      The only difficult case is when it isn't.  If we require a and b to
2291      ordered wrt zero, there can be no two coefficients of the same value
2292      that have opposite signs.  This means that:
2293 
2294 	 |a| = |a0| + |a1 * x1| + |a2 * x2| + ...
2295 	 |b| = |b0| + |b1 * x1| + |b2 * x2| + ...
2296 
2297       The Q we've just calculated guarantees:
2298 
2299 	 |b0 * Q| <= |a0|
2300 	 |a0 - b0 * Q| < |b0|
2301 
2302       and so:
2303 
2304 	 (2) |b * Q| <= |a|
2305 
2306       is satisfied if:
2307 
2308 	 |bi * xi * Q| <= |ai * xi|
2309 
2310       for each i in [1, N].  This is trivially true when xi is zero.
2311       When it isn't we need:
2312 
2313 	 (2') |bi * Q| <= |ai|
2314 
2315       r is calculated as:
2316 
2317 	 r = r0 + r1 * x1 + r2 * x2 + ...
2318 	 where ri = ai - bi * Q
2319 
2320       Restricting to ordered a and b also guarantees that no two ris
2321       have opposite signs, so we have:
2322 
2323 	 |r| = |r0| + |r1 * x1| + |r2 * x2| + ...
2324 
2325       We know from the calculation of Q that |r0| < |b0|, so:
2326 
2327 	 (3) |r| < |b|
2328 
2329       is satisfied if:
2330 
2331 	 (3') |ai - bi * Q| <= |bi|
2332 
2333       for each i in [1, N].  */
2334   bool rem_p = NCa (a.coeffs[0]) % NCb (b.coeffs[0]) != 0;
2335   for (unsigned int i = 1; i < N; ++i)
2336     {
2337       if (b.coeffs[i] == ICb (0))
2338 	{
2339 	  /* For bi == 0 we simply need: (3') |ai| == 0.  */
2340 	  if (a.coeffs[i] != ICa (0))
2341 	    return false;
2342 	}
2343       else
2344 	{
2345 	  if (q == 0)
2346 	    {
2347 	      /* For Q == 0 we simply need: (3') |ai| <= |bi|.  */
2348 	      if (a.coeffs[i] != ICa (0))
2349 		{
2350 		  /* Use negative absolute to avoid overflow, i.e.
2351 		     -|ai| >= -|bi|.  */
2352 		  C neg_abs_a = (a.coeffs[i] < 0 ? a.coeffs[i] : -a.coeffs[i]);
2353 		  C neg_abs_b = (b.coeffs[i] < 0 ? b.coeffs[i] : -b.coeffs[i]);
2354 		  if (neg_abs_a < neg_abs_b)
2355 		    return false;
2356 		  rem_p = true;
2357 		}
2358 	    }
2359 	  else
2360 	    {
2361 	      /* Otherwise just check for the case in which ai / bi == Q.  */
2362 	      if (NCa (a.coeffs[i]) / NCb (b.coeffs[i]) != q)
2363 		return false;
2364 	      if (NCa (a.coeffs[i]) % NCb (b.coeffs[i]) != 0)
2365 		rem_p = true;
2366 	    }
2367 	}
2368     }
2369 
2370   /* If the division isn't exact, require both values to be ordered wrt 0,
2371      so that we can guarantee conditions (2) and (3) for all indeterminate
2372      values.  */
2373   if (rem_p && (!ordered_p (a, ICa (0)) || !ordered_p (b, ICb (0))))
2374     return false;
2375 
2376   *quotient = q;
2377   return true;
2378 }
2379 
2380 /* Likewise, but also store r in *REMAINDER.  */
2381 
2382 template<unsigned int N, typename Ca, typename Cb, typename Cq, typename Cr>
2383 inline typename if_nonpoly<Cq, bool>::type
2384 can_div_trunc_p (const poly_int_pod<N, Ca> &a,
2385 		 const poly_int_pod<N, Cb> &b,
2386 		 Cq *quotient, Cr *remainder)
2387 {
2388   if (!can_div_trunc_p (a, b, quotient))
2389     return false;
2390   *remainder = a - *quotient * b;
2391   return true;
2392 }
2393 
2394 /* Return true if there is some polynomial q and constant R such that:
2395 
2396      (1) a = B * q + R
2397      (2) |B * q| <= |a|
2398      (3) |R| < |B|
2399 
2400    Store the value q in *QUOTIENT if so.  */
2401 
2402 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2403 inline typename if_nonpoly<Cb, bool>::type
2404 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b,
2405 		 poly_int_pod<N, Cq> *quotient)
2406 {
2407   /* The remainder must be constant.  */
2408   for (unsigned int i = 1; i < N; ++i)
2409     if (a.coeffs[i] % b != 0)
2410       return false;
2411   for (unsigned int i = 0; i < N; ++i)
2412     quotient->coeffs[i] = a.coeffs[i] / b;
2413   return true;
2414 }
2415 
2416 /* Likewise, but also store R in *REMAINDER.  */
2417 
2418 template<unsigned int N, typename Ca, typename Cb, typename Cq, typename Cr>
2419 inline typename if_nonpoly<Cb, bool>::type
2420 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b,
2421 		 poly_int_pod<N, Cq> *quotient, Cr *remainder)
2422 {
2423   if (!can_div_trunc_p (a, b, quotient))
2424     return false;
2425   *remainder = a.coeffs[0] % b;
2426   return true;
2427 }
2428 
2429 /* Return true if we can compute A / B at compile time, rounding towards zero.
2430    Store the result in QUOTIENT if so.
2431 
2432    This handles cases in which either B is constant or the result is
2433    constant.  */
2434 
2435 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2436 inline bool
2437 can_div_trunc_p (const poly_int_pod<N, Ca> &a,
2438 		 const poly_int_pod<N, Cb> &b,
2439 		 poly_int_pod<N, Cq> *quotient)
2440 {
2441   if (b.is_constant ())
2442     return can_div_trunc_p (a, b.coeffs[0], quotient);
2443   if (!can_div_trunc_p (a, b, &quotient->coeffs[0]))
2444     return false;
2445   for (unsigned int i = 1; i < N; ++i)
2446     quotient->coeffs[i] = 0;
2447   return true;
2448 }
2449 
2450 /* Return true if there is some constant Q and polynomial r such that:
2451 
2452      (1) a = b * Q + r
2453      (2) |a| <= |b * Q|
2454      (3) |r| < |b|
2455 
2456    Store the value Q in *QUOTIENT if so.  */
2457 
2458 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2459 inline typename if_nonpoly<Cq, bool>::type
2460 can_div_away_from_zero_p (const poly_int_pod<N, Ca> &a,
2461 			  const poly_int_pod<N, Cb> &b,
2462 			  Cq *quotient)
2463 {
2464   if (!can_div_trunc_p (a, b, quotient))
2465     return false;
2466   if (maybe_ne (*quotient * b, a))
2467     *quotient += (*quotient < 0 ? -1 : 1);
2468   return true;
2469 }
2470 
2471 /* Use print_dec to print VALUE to FILE, where SGN is the sign
2472    of the values.  */
2473 
2474 template<unsigned int N, typename C>
2475 void
2476 print_dec (const poly_int_pod<N, C> &value, FILE *file, signop sgn)
2477 {
2478   if (value.is_constant ())
2479     print_dec (value.coeffs[0], file, sgn);
2480   else
2481     {
2482       fprintf (file, "[");
2483       for (unsigned int i = 0; i < N; ++i)
2484 	{
2485 	  print_dec (value.coeffs[i], file, sgn);
2486 	  fputc (i == N - 1 ? ']' : ',', file);
2487 	}
2488     }
2489 }
2490 
2491 /* Likewise without the signop argument, for coefficients that have an
2492    inherent signedness.  */
2493 
2494 template<unsigned int N, typename C>
2495 void
2496 print_dec (const poly_int_pod<N, C> &value, FILE *file)
2497 {
2498   STATIC_ASSERT (poly_coeff_traits<C>::signedness >= 0);
2499   print_dec (value, file,
2500 	     poly_coeff_traits<C>::signedness ? SIGNED : UNSIGNED);
2501 }
2502 
2503 /* Use print_hex to print VALUE to FILE.  */
2504 
2505 template<unsigned int N, typename C>
2506 void
2507 print_hex (const poly_int_pod<N, C> &value, FILE *file)
2508 {
2509   if (value.is_constant ())
2510     print_hex (value.coeffs[0], file);
2511   else
2512     {
2513       fprintf (file, "[");
2514       for (unsigned int i = 0; i < N; ++i)
2515 	{
2516 	  print_hex (value.coeffs[i], file);
2517 	  fputc (i == N - 1 ? ']' : ',', file);
2518 	}
2519     }
2520 }
2521 
2522 /* Helper for calculating the distance between two points P1 and P2,
2523    in cases where known_le (P1, P2).  T1 and T2 are the types of the
2524    two positions, in either order.  The coefficients of P2 - P1 have
2525    type unsigned HOST_WIDE_INT if the coefficients of both T1 and T2
2526    have C++ primitive type, otherwise P2 - P1 has its usual
2527    wide-int-based type.
2528 
2529    The actual subtraction should look something like this:
2530 
2531      typedef poly_span_traits<T1, T2> span_traits;
2532      span_traits::cast (P2) - span_traits::cast (P1)
2533 
2534    Applying the cast before the subtraction avoids undefined overflow
2535    for signed T1 and T2.
2536 
2537    The implementation of the cast tries to avoid unnecessary arithmetic
2538    or copying.  */
2539 template<typename T1, typename T2,
2540 	 typename Res = POLY_BINARY_COEFF (POLY_BINARY_COEFF (T1, T2),
2541 					   unsigned HOST_WIDE_INT)>
2542 struct poly_span_traits
2543 {
2544   template<typename T>
2545   static const T &cast (const T &x) { return x; }
2546 };
2547 
2548 template<typename T1, typename T2>
2549 struct poly_span_traits<T1, T2, unsigned HOST_WIDE_INT>
2550 {
2551   template<typename T>
2552   static typename if_nonpoly<T, unsigned HOST_WIDE_INT>::type
2553   cast (const T &x) { return x; }
2554 
2555   template<unsigned int N, typename T>
2556   static poly_int<N, unsigned HOST_WIDE_INT>
2557   cast (const poly_int_pod<N, T> &x) { return x; }
2558 };
2559 
2560 /* Return true if SIZE represents a known size, assuming that all-ones
2561    indicates an unknown size.  */
2562 
2563 template<typename T>
2564 inline bool
2565 known_size_p (const T &a)
2566 {
2567   return maybe_ne (a, POLY_INT_TYPE (T) (-1));
2568 }
2569 
2570 /* Return true if range [POS, POS + SIZE) might include VAL.
2571    SIZE can be the special value -1, in which case the range is
2572    open-ended.  */
2573 
2574 template<typename T1, typename T2, typename T3>
2575 inline bool
2576 maybe_in_range_p (const T1 &val, const T2 &pos, const T3 &size)
2577 {
2578   typedef poly_span_traits<T1, T2> start_span;
2579   typedef poly_span_traits<T3, T3> size_span;
2580   if (known_lt (val, pos))
2581     return false;
2582   if (!known_size_p (size))
2583     return true;
2584   if ((poly_int_traits<T1>::num_coeffs > 1
2585        || poly_int_traits<T2>::num_coeffs > 1)
2586       && maybe_lt (val, pos))
2587     /* In this case we don't know whether VAL >= POS is true at compile
2588        time, so we can't prove that VAL >= POS + SIZE.  */
2589     return true;
2590   return maybe_lt (start_span::cast (val) - start_span::cast (pos),
2591 		   size_span::cast (size));
2592 }
2593 
2594 /* Return true if range [POS, POS + SIZE) is known to include VAL.
2595    SIZE can be the special value -1, in which case the range is
2596    open-ended.  */
2597 
2598 template<typename T1, typename T2, typename T3>
2599 inline bool
2600 known_in_range_p (const T1 &val, const T2 &pos, const T3 &size)
2601 {
2602   typedef poly_span_traits<T1, T2> start_span;
2603   typedef poly_span_traits<T3, T3> size_span;
2604   return (known_size_p (size)
2605 	  && known_ge (val, pos)
2606 	  && known_lt (start_span::cast (val) - start_span::cast (pos),
2607 		       size_span::cast (size)));
2608 }
2609 
2610 /* Return true if the two ranges [POS1, POS1 + SIZE1) and [POS2, POS2 + SIZE2)
2611    might overlap.  SIZE1 and/or SIZE2 can be the special value -1, in which
2612    case the range is open-ended.  */
2613 
2614 template<typename T1, typename T2, typename T3, typename T4>
2615 inline bool
2616 ranges_maybe_overlap_p (const T1 &pos1, const T2 &size1,
2617 			const T3 &pos2, const T4 &size2)
2618 {
2619   if (maybe_in_range_p (pos2, pos1, size1))
2620     return maybe_ne (size2, POLY_INT_TYPE (T4) (0));
2621   if (maybe_in_range_p (pos1, pos2, size2))
2622     return maybe_ne (size1, POLY_INT_TYPE (T2) (0));
2623   return false;
2624 }
2625 
2626 /* Return true if the two ranges [POS1, POS1 + SIZE1) and [POS2, POS2 + SIZE2)
2627    are known to overlap.  SIZE1 and/or SIZE2 can be the special value -1,
2628    in which case the range is open-ended.  */
2629 
2630 template<typename T1, typename T2, typename T3, typename T4>
2631 inline bool
2632 ranges_known_overlap_p (const T1 &pos1, const T2 &size1,
2633 			const T3 &pos2, const T4 &size2)
2634 {
2635   typedef poly_span_traits<T1, T3> start_span;
2636   typedef poly_span_traits<T2, T2> size1_span;
2637   typedef poly_span_traits<T4, T4> size2_span;
2638   /* known_gt (POS1 + SIZE1, POS2)                         [infinite precision]
2639      --> known_gt (SIZE1, POS2 - POS1)                     [infinite precision]
2640      --> known_gt (SIZE1, POS2 - lower_bound (POS1, POS2)) [infinite precision]
2641                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ always nonnegative
2642      --> known_gt (SIZE1, span1::cast (POS2 - lower_bound (POS1, POS2))).
2643 
2644      Using the saturating subtraction enforces that SIZE1 must be
2645      nonzero, since known_gt (0, x) is false for all nonnegative x.
2646      If POS2.coeff[I] < POS1.coeff[I] for some I > 0, increasing
2647      indeterminate number I makes the unsaturated condition easier to
2648      satisfy, so using a saturated coefficient of zero tests the case in
2649      which the indeterminate is zero (the minimum value).  */
2650   return (known_size_p (size1)
2651 	  && known_size_p (size2)
2652 	  && known_lt (start_span::cast (pos2)
2653 		       - start_span::cast (lower_bound (pos1, pos2)),
2654 		       size1_span::cast (size1))
2655 	  && known_lt (start_span::cast (pos1)
2656 		       - start_span::cast (lower_bound (pos1, pos2)),
2657 		       size2_span::cast (size2)));
2658 }
2659 
2660 /* Return true if range [POS1, POS1 + SIZE1) is known to be a subrange of
2661    [POS2, POS2 + SIZE2).  SIZE1 and/or SIZE2 can be the special value -1,
2662    in which case the range is open-ended.  */
2663 
2664 template<typename T1, typename T2, typename T3, typename T4>
2665 inline bool
2666 known_subrange_p (const T1 &pos1, const T2 &size1,
2667 		  const T3 &pos2, const T4 &size2)
2668 {
2669   typedef typename poly_int_traits<T2>::coeff_type C2;
2670   typedef poly_span_traits<T1, T3> start_span;
2671   typedef poly_span_traits<T2, T4> size_span;
2672   return (known_gt (size1, POLY_INT_TYPE (T2) (0))
2673 	  && (poly_coeff_traits<C2>::signedness > 0
2674 	      || known_size_p (size1))
2675 	  && known_size_p (size2)
2676 	  && known_ge (pos1, pos2)
2677 	  && known_le (size1, size2)
2678 	  && known_le (start_span::cast (pos1) - start_span::cast (pos2),
2679 		       size_span::cast (size2) - size_span::cast (size1)));
2680 }
2681 
2682 /* Return true if the endpoint of the range [POS, POS + SIZE) can be
2683    stored in a T, or if SIZE is the special value -1, which makes the
2684    range open-ended.  */
2685 
2686 template<typename T>
2687 inline typename if_nonpoly<T, bool>::type
2688 endpoint_representable_p (const T &pos, const T &size)
2689 {
2690   return (!known_size_p (size)
2691 	  || pos <= poly_coeff_traits<T>::max_value - size);
2692 }
2693 
2694 template<unsigned int N, typename C>
2695 inline bool
2696 endpoint_representable_p (const poly_int_pod<N, C> &pos,
2697 			  const poly_int_pod<N, C> &size)
2698 {
2699   if (known_size_p (size))
2700     for (unsigned int i = 0; i < N; ++i)
2701       if (pos.coeffs[i] > poly_coeff_traits<C>::max_value - size.coeffs[i])
2702 	return false;
2703   return true;
2704 }
2705 
2706 template<unsigned int N, typename C>
2707 void
2708 gt_ggc_mx (poly_int_pod<N, C> *)
2709 {
2710 }
2711 
2712 template<unsigned int N, typename C>
2713 void
2714 gt_pch_nx (poly_int_pod<N, C> *)
2715 {
2716 }
2717 
2718 template<unsigned int N, typename C>
2719 void
2720 gt_pch_nx (poly_int_pod<N, C> *, void (*) (void *, void *), void *)
2721 {
2722 }
2723 
2724 #undef POLY_SET_COEFF
2725 #undef POLY_INT_TYPE
2726 #undef POLY_BINARY_COEFF
2727 #undef CONST_CONST_RESULT
2728 #undef POLY_CONST_RESULT
2729 #undef CONST_POLY_RESULT
2730 #undef POLY_POLY_RESULT
2731 #undef POLY_CONST_COEFF
2732 #undef CONST_POLY_COEFF
2733 #undef POLY_POLY_COEFF
2734 
2735 #endif
2736