Overview of poly_int#
We define indeterminates x1, …, xn whose values are
only known at runtime and use polynomials of the form:
c0 + c1 * x1 + ... + cn * xn
to represent a size or offset whose value might depend on some
of these indeterminates. The coefficients c0, …, cn
are always known at compile time, with the c0 term being the
‘constant’ part that does not depend on any runtime value.
GCC uses the poly_int class to represent these coefficients.
The class has two template parameters: the first specifies the number of
coefficients (n + 1) and the second specifies the type of the
coefficients. For example, poly_int<2, unsigned short> represents
a polynomial with two coefficients (and thus one indeterminate), with each
coefficient having type unsigned short. When n is 0,
the class degenerates to a single compile-time constant c0.
The number of coefficients needed for compilation is a fixed
property of each target and is specified by the configuration macro
NUM_POLY_INT_COEFFS. The default value is 1, since most targets
do not have such runtime invariants. Targets that need a different
value should #define the macro in their cpu-modes.def
file. See Anatomy of a Target Back End.
poly_int makes the simplifying requirement that each indeterminate
must be a nonnegative integer. An indeterminate value of 0 should usually
represent the minimum possible runtime value, with c0 specifying
the value in that case.
For example, when targetting the Arm SVE ISA, the single indeterminate
represents the number of 128-bit blocks in a vector beyond the minimum
length of 128 bits. Thus the number of 64-bit doublewords in a vector
is 2 + 2 * x1. If an aggregate has a single SVE vector and 16
additional bytes, its total size is 32 + 16 * x1 bytes.
The header file poly-int-types.h provides typedefs for the
most common forms of poly_int, all having
NUM_POLY_INT_COEFFS coefficients:
poly_uint16a
poly_intwithunsigned shortcoefficients.poly_int64a
poly_intwithHOST_WIDE_INTcoefficients.poly_uint64a
poly_intwithunsigned HOST_WIDE_INTcoefficients.poly_offset_inta
poly_intwithoffset_intcoefficients.poly_wide_inta
poly_intwithwide_intcoefficients.poly_widest_inta
poly_intwithwidest_intcoefficients.Since the main purpose of
poly_intis to represent sizes and offsets, the last two typedefs are only rarely used.