annotate gcc/doc/poly-int.texi @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 @node poly_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 @chapter Sizes and offsets as runtime invariants
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 @cindex polynomial integers
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 @findex poly_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 GCC allows the size of a hardware register to be a runtime invariant
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 rather than a compile-time constant. This in turn means that various
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 sizes and offsets must also be runtime invariants rather than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 compile-time constants, such as:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 @itemize @bullet
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 the size of a general @code{machine_mode} (@pxref{Machine Modes});
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 the size of a spill slot;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 the offset of something within a stack frame;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 the number of elements in a vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 the size and offset of a @code{mem} rtx (@pxref{Regs and Memory}); and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 the byte offset in a @code{subreg} rtx (@pxref{Regs and Memory}).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 The motivating example is the Arm SVE ISA, whose vector registers can be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 any multiple of 128 bits between 128 and 2048 inclusive. The compiler
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 normally produces code that works for all SVE register sizes, with the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 actual size only being known at runtime.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 GCC's main representation of such runtime invariants is the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 @code{poly_int} class. This chapter describes what @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 does, lists the available operations, and gives some general
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 usage guidelines.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 @menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 * Overview of @code{poly_int}::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 * Consequences of using @code{poly_int}::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 * Comparisons involving @code{poly_int}::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 * Arithmetic on @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 * Alignment of @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 * Computing bounds on @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 * Converting @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 * Miscellaneous @code{poly_int} routines::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 * Guidelines for using @code{poly_int}::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 @end menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 @node Overview of @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 @section Overview of @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 @cindex @code{poly_int}, runtime value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 We define indeterminates @var{x1}, @dots{}, @var{xn} whose values are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 only known at runtime and use polynomials of the form:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 @var{c0} + @var{c1} * @var{x1} + @dots{} + @var{cn} * @var{xn}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 to represent a size or offset whose value might depend on some
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 of these indeterminates. The coefficients @var{c0}, @dots{}, @var{cn}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 are always known at compile time, with the @var{c0} term being the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 ``constant'' part that does not depend on any runtime value.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 GCC uses the @code{poly_int} class to represent these coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 The class has two template parameters: the first specifies the number of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 coefficients (@var{n} + 1) and the second specifies the type of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 coefficients. For example, @samp{poly_int<2, unsigned short>} represents
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 a polynomial with two coefficients (and thus one indeterminate), with each
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 coefficient having type @code{unsigned short}. When @var{n} is 0,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 the class degenerates to a single compile-time constant @var{c0}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 @cindex @code{poly_int}, template parameters
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 @findex NUM_POLY_INT_COEFFS
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 The number of coefficients needed for compilation is a fixed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 property of each target and is specified by the configuration macro
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 @code{NUM_POLY_INT_COEFFS}. The default value is 1, since most targets
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 do not have such runtime invariants. Targets that need a different
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 value should @code{#define} the macro in their @file{@var{cpu}-modes.def}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 file. @xref{Back End}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 @cindex @code{poly_int}, invariant range
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 @code{poly_int} makes the simplifying requirement that each indeterminate
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 must be a nonnegative integer. An indeterminate value of 0 should usually
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 represent the minimum possible runtime value, with @var{c0} specifying
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 the value in that case.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 For example, when targetting the Arm SVE ISA, the single indeterminate
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 represents the number of 128-bit blocks in a vector @emph{beyond the minimum
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 length of 128 bits}. Thus the number of 64-bit doublewords in a vector
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 is 2 + 2 * @var{x1}. If an aggregate has a single SVE vector and 16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 additional bytes, its total size is 32 + 16 * @var{x1} bytes.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 The header file @file{poly-int-types.h} provides typedefs for the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 most common forms of @code{poly_int}, all having
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 @code{NUM_POLY_INT_COEFFS} coefficients:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 @cindex @code{poly_int}, main typedefs
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 @table @code
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 @item poly_uint16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 a @samp{poly_int} with @code{unsigned short} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 @item poly_int64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 a @samp{poly_int} with @code{HOST_WIDE_INT} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 @item poly_uint64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 a @samp{poly_int} with @code{unsigned HOST_WIDE_INT} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 @item poly_offset_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 a @samp{poly_int} with @code{offset_int} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 @item poly_wide_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 a @samp{poly_int} with @code{wide_int} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 @item poly_widest_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 a @samp{poly_int} with @code{widest_int} coefficients.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 Since the main purpose of @code{poly_int} is to represent sizes and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 offsets, the last two typedefs are only rarely used.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 @node Consequences of using @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 @section Consequences of using @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 The two main consequences of using polynomial sizes and offsets are that:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 @itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 there is no total ordering between the values at compile time, and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 some operations might yield results that cannot be expressed as a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 @code{poly_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 For example, if @var{x} is a runtime invariant, we cannot tell at
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 compile time whether:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 3 + 4@var{x} <= 1 + 5@var{x}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 since the condition is false when @var{x} <= 1 and true when @var{x} >= 2.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 Similarly, @code{poly_int} cannot represent the result of:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 (3 + 4@var{x}) * (1 + 5@var{x})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 since it cannot (and in practice does not need to) store powers greater
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 than one. It also cannot represent the result of:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 (3 + 4@var{x}) / (1 + 5@var{x})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 The following sections describe how we deal with these restrictions.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 @cindex @code{poly_int}, use in target-independent code
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 As described earlier, a @code{poly_int<1, @var{T}>} has no indeterminates
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 and so degenerates to a compile-time constant of type @var{T}. It would
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 be possible in that case to do all normal arithmetic on the @var{T},
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 and to compare the @var{T} using the normal C++ operators. We deliberately
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 prevent target-independent code from doing this, since the compiler needs
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 to support other @code{poly_int<@var{n}, @var{T}>} as well, regardless of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 the current target's @code{NUM_POLY_INT_COEFFS}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 @cindex @code{poly_int}, use in target-specific code
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 However, it would be very artificial to force target-specific code
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 to follow these restrictions if the target has no runtime indeterminates.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 There is therefore an implicit conversion from @code{poly_int<1, @var{T}>}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 to @var{T} when compiling target-specific translation units.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 @node Comparisons involving @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 @section Comparisons involving @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 In general we need to compare sizes and offsets in two situations:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 those in which the values need to be ordered, and those in which
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 the values can be unordered. More loosely, the distinction is often
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 between values that have a definite link (usually because they refer to the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 same underlying register or memory location) and values that have
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 no definite link. An example of the former is the relationship between
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 the inner and outer sizes of a subreg, where we must know at compile time
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 whether the subreg is paradoxical, partial, or complete. An example of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 the latter is alias analysis: we might want to check whether two
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 arbitrary memory references overlap.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 Referring back to the examples in the previous section, it makes sense
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 to ask whether a memory reference of size @samp{3 + 4@var{x}} overlaps
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 one of size @samp{1 + 5@var{x}}, but it does not make sense to have a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 subreg in which the outer mode has @samp{3 + 4@var{x}} bytes and the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 inner mode has @samp{1 + 5@var{x}} bytes (or vice versa). Such subregs
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 are always invalid and should trigger an internal compiler error
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199 if formed.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 The underlying operators are the same in both cases, but the distinction
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 affects how they are used.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 @menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 * Comparison functions for @code{poly_int}::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 * Properties of the @code{poly_int} comparisons::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 * Comparing potentially-unordered @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 * Comparing ordered @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 * Checking for a @code{poly_int} marker value::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 * Range checks on @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 * Sorting @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 @end menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 @node Comparison functions for @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 @subsection Comparison functions for @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 @code{poly_int} provides the following routines for checking whether
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 a particular condition ``may be'' (might be) true:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220 @example
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 maybe_lt maybe_le maybe_eq maybe_ge maybe_gt
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 maybe_ne
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 @end example
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225 The functions have their natural meaning:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228 @item maybe_lt(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 Return true if @var{a} might be less than @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 @item maybe_le(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 Return true if @var{a} might be less than or equal to @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 @item maybe_eq(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 Return true if @var{a} might be equal to @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 @item maybe_ne(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 Return true if @var{a} might not be equal to @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 @item maybe_ge(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 Return true if @var{a} might be greater than or equal to @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 @item maybe_gt(@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 Return true if @var{a} might be greater than @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 For readability, @code{poly_int} also provides ``known'' inverses of these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 functions:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 @example
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 known_lt (@var{a}, @var{b}) == !maybe_ge (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 known_le (@var{a}, @var{b}) == !maybe_gt (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 known_eq (@var{a}, @var{b}) == !maybe_ne (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 known_ge (@var{a}, @var{b}) == !maybe_lt (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 known_gt (@var{a}, @var{b}) == !maybe_le (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 known_ne (@var{a}, @var{b}) == !maybe_eq (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 @end example
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 @node Properties of the @code{poly_int} comparisons
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 @subsection Properties of the @code{poly_int} comparisons
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 All ``maybe'' relations except @code{maybe_ne} are transitive, so for example:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 maybe_lt (@var{a}, @var{b}) && maybe_lt (@var{b}, @var{c}) implies maybe_lt (@var{a}, @var{c})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 for all @var{a}, @var{b} and @var{c}. @code{maybe_lt}, @code{maybe_gt}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 and @code{maybe_ne} are irreflexive, so for example:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 !maybe_lt (@var{a}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 is true for all @var{a}. @code{maybe_le}, @code{maybe_eq} and @code{maybe_ge}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 are reflexive, so for example:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 maybe_le (@var{a}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282 is true for all @var{a}. @code{maybe_eq} and @code{maybe_ne} are symmetric, so:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 maybe_eq (@var{a}, @var{b}) == maybe_eq (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 maybe_ne (@var{a}, @var{b}) == maybe_ne (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 for all @var{a} and @var{b}. In addition:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 maybe_le (@var{a}, @var{b}) == maybe_lt (@var{a}, @var{b}) || maybe_eq (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 maybe_ge (@var{a}, @var{b}) == maybe_gt (@var{a}, @var{b}) || maybe_eq (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 maybe_lt (@var{a}, @var{b}) == maybe_gt (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 maybe_le (@var{a}, @var{b}) == maybe_ge (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 However:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 maybe_le (@var{a}, @var{b}) && maybe_le (@var{b}, @var{a}) does not imply !maybe_ne (@var{a}, @var{b}) [== known_eq (@var{a}, @var{b})]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302 maybe_ge (@var{a}, @var{b}) && maybe_ge (@var{b}, @var{a}) does not imply !maybe_ne (@var{a}, @var{b}) [== known_eq (@var{a}, @var{b})]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 One example is again @samp{@var{a} == 3 + 4@var{x}}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 and @samp{@var{b} == 1 + 5@var{x}}, where @samp{maybe_le (@var{a}, @var{b})},
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 @samp{maybe_ge (@var{a}, @var{b})} and @samp{maybe_ne (@var{a}, @var{b})}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 all hold. @code{maybe_le} and @code{maybe_ge} are therefore not antisymetric
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 and do not form a partial order.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 From the above, it follows that:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 @itemize @bullet
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 All ``known'' relations except @code{known_ne} are transitive.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 @code{known_lt}, @code{known_ne} and @code{known_gt} are irreflexive.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 @code{known_le}, @code{known_eq} and @code{known_ge} are reflexive.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 Also:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 known_lt (@var{a}, @var{b}) == known_gt (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 known_le (@var{a}, @var{b}) == known_ge (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 known_lt (@var{a}, @var{b}) implies !known_lt (@var{b}, @var{a}) [asymmetry]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 known_gt (@var{a}, @var{b}) implies !known_gt (@var{b}, @var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 known_le (@var{a}, @var{b}) && known_le (@var{b}, @var{a}) == known_eq (@var{a}, @var{b}) [== !maybe_ne (@var{a}, @var{b})]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 known_ge (@var{a}, @var{b}) && known_ge (@var{b}, @var{a}) == known_eq (@var{a}, @var{b}) [== !maybe_ne (@var{a}, @var{b})]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 @code{known_le} and @code{known_ge} are therefore antisymmetric and are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336 partial orders. However:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339 known_le (@var{a}, @var{b}) does not imply known_lt (@var{a}, @var{b}) || known_eq (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340 known_ge (@var{a}, @var{b}) does not imply known_gt (@var{a}, @var{b}) || known_eq (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 For example, @samp{known_le (4, 4 + 4@var{x})} holds because the runtime
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344 indeterminate @var{x} is a nonnegative integer, but neither
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345 @code{known_lt (4, 4 + 4@var{x})} nor @code{known_eq (4, 4 + 4@var{x})} hold.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347 @node Comparing potentially-unordered @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 @subsection Comparing potentially-unordered @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 In cases where there is no definite link between two @code{poly_int}s,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351 we can usually make a conservatively-correct assumption. For example,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 the conservative assumption for alias analysis is that two references
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353 @emph{might} alias.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 One way of checking whether [@var{begin1}, @var{end1}) might overlap
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356 [@var{begin2}, @var{end2}) using the @code{poly_int} comparisons is:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359 maybe_gt (@var{end1}, @var{begin2}) && maybe_gt (@var{end2}, @var{begin1})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 and another (equivalent) way is:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 !(known_le (@var{end1}, @var{begin2}) || known_le (@var{end2}, @var{begin1}))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368 However, in this particular example, it is better to use the range helper
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 functions instead. @xref{Range checks on @code{poly_int}s}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371 @node Comparing ordered @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372 @subsection Comparing ordered @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 In cases where there is a definite link between two @code{poly_int}s,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375 such as the outer and inner sizes of subregs, we usually require the sizes
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 to be ordered by the @code{known_le} partial order. @code{poly_int} provides
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 the following utility functions for ordered values:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 @item ordered_p (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381 Return true if @var{a} and @var{b} are ordered by the @code{known_le}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382 partial order.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 @item ordered_min (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 Assert that @var{a} and @var{b} are ordered by @code{known_le} and return the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386 minimum of the two. When using this function, please add a comment explaining
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 why the values are known to be ordered.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389 @item ordered_max (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 Assert that @var{a} and @var{b} are ordered by @code{known_le} and return the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
391 maximum of the two. When using this function, please add a comment explaining
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
392 why the values are known to be ordered.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
393 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
394
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
395 For example, if a subreg has an outer mode of size @var{outer} and an
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
396 inner mode of size @var{inner}:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
397
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
398 @itemize @bullet
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
399 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
400 the subreg is complete if known_eq (@var{inner}, @var{outer})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
402 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
403 otherwise, the subreg is paradoxical if known_le (@var{inner}, @var{outer})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
404
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
405 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
406 otherwise, the subreg is partial if known_le (@var{outer}, @var{inner})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
407
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
408 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
409 otherwise, the subreg is ill-formed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
410 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
411
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
412 Thus the subreg is only valid if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
413 @samp{ordered_p (@var{outer}, @var{inner})} is true. If this condition
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
414 is already known to be true then:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
415
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
416 @itemize @bullet
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
417 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
418 the subreg is complete if known_eq (@var{inner}, @var{outer})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
419
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
420 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
421 the subreg is paradoxical if maybe_lt (@var{inner}, @var{outer})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
422
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
423 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
424 the subreg is partial if maybe_lt (@var{outer}, @var{inner})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
425 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
426
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
427 with the three conditions being mutually exclusive.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
428
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
429 Code that checks whether a subreg is valid would therefore generally
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
430 check whether @code{ordered_p} holds (in addition to whatever other
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
431 checks are required for subreg validity). Code that is dealing
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
432 with existing subregs can assert that @code{ordered_p} holds
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
433 and use either of the classifications above.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
434
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
435 @node Checking for a @code{poly_int} marker value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
436 @subsection Checking for a @code{poly_int} marker value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
437
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
438 It is sometimes useful to have a special ``marker value'' that is not
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
439 meant to be taken literally. For example, some code uses a size
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
440 of -1 to represent an unknown size, rather than having to carry around
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
441 a separate boolean to say whether the size is known.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
442
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
443 The best way of checking whether something is a marker value is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
444 @code{known_eq}. Conversely the best way of checking whether something
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
445 is @emph{not} a marker value is @code{maybe_ne}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
446
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
447 Thus in the size example just mentioned, @samp{known_eq (size, -1)} would
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
448 check for an unknown size and @samp{maybe_ne (size, -1)} would check for a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
449 known size.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
450
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
451 @node Range checks on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
452 @subsection Range checks on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
453
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
454 As well as the core comparisons
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
455 (@pxref{Comparison functions for @code{poly_int}}), @code{poly_int} provides
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
456 utilities for various kinds of range check. In each case the range
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
457 is represented by a start position and a size rather than a start
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
458 position and an end position; this is because the former is used
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
459 much more often than the latter in GCC@. Also, the sizes can be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
460 -1 (or all ones for unsigned sizes) to indicate a range with a known
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
461 start position but an unknown size. All other sizes must be nonnegative.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
462 A range of size 0 does not contain anything or overlap anything.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
463
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
464 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
465 @item known_size_p (@var{size})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
466 Return true if @var{size} represents a known range size, false if it
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
467 is -1 or all ones (for signed and unsigned types respectively).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
468
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
469 @item ranges_maybe_overlap_p (@var{pos1}, @var{size1}, @var{pos2}, @var{size2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
470 Return true if the range described by @var{pos1} and @var{size1} @emph{might}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
471 overlap the range described by @var{pos2} and @var{size2} (in other words,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
472 return true if we cannot prove that the ranges are disjoint).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
473
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
474 @item ranges_known_overlap_p (@var{pos1}, @var{size1}, @var{pos2}, @var{size2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
475 Return true if the range described by @var{pos1} and @var{size1} is known to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
476 overlap the range described by @var{pos2} and @var{size2}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
477
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
478 @item known_subrange_p (@var{pos1}, @var{size1}, @var{pos2}, @var{size2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
479 Return true if the range described by @var{pos1} and @var{size1} is known to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
480 be contained in the range described by @var{pos2} and @var{size2}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
481
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
482 @item maybe_in_range_p (@var{value}, @var{pos}, @var{size})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
483 Return true if @var{value} @emph{might} be in the range described by
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
484 @var{pos} and @var{size} (in other words, return true if we cannot
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
485 prove that @var{value} is outside that range).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
486
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
487 @item known_in_range_p (@var{value}, @var{pos}, @var{size})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
488 Return true if @var{value} is known to be in the range described
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
489 by @var{pos} and @var{size}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
490
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
491 @item endpoint_representable_p (@var{pos}, @var{size})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
492 Return true if the range described by @var{pos} and @var{size} is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
493 open-ended or if the endpoint (@var{pos} + @var{size}) is representable
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
494 in the same type as @var{pos} and @var{size}. The function returns false
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
495 if adding @var{size} to @var{pos} makes conceptual sense but could overflow.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
496 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
497
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
498 There is also a @code{poly_int} version of the @code{IN_RANGE_P} macro:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
499
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
500 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
501 @item coeffs_in_range_p (@var{x}, @var{lower}, @var{upper})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
502 Return true if every coefficient of @var{x} is in the inclusive range
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
503 [@var{lower}, @var{upper}]. This function can be useful when testing
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
504 whether an operation would cause the values of coefficients to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
505 overflow.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
506
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
507 Note that the function does not indicate whether @var{x} itself is in the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
508 given range. @var{x} can be either a constant or a @code{poly_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
509 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
510
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
511 @node Sorting @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
512 @subsection Sorting @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
513
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
514 @code{poly_int} provides the following routine for sorting:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
515
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
516 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
517 @item compare_sizes_for_sort (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
518 Compare @var{a} and @var{b} in reverse lexicographical order (that is,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
519 compare the highest-indexed coefficients first). This can be useful when
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
520 sorting data structures, since it has the effect of separating constant
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
521 and non-constant values. If all values are nonnegative, the constant
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
522 values come first.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
523
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
524 Note that the values do not necessarily end up in numerical order.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
525 For example, @samp{1 + 1@var{x}} would come after @samp{100} in the sort order,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
526 but may well be less than @samp{100} at run time.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
527 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
528
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
529 @node Arithmetic on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
530 @section Arithmetic on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
531
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
532 Addition, subtraction, negation and bit inversion all work normally for
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
533 @code{poly_int}s. Multiplication by a constant multiplier and left
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
534 shifting by a constant shift amount also work normally. General
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
535 multiplication of two @code{poly_int}s is not supported and is not
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
536 useful in practice.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
537
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
538 Other operations are only conditionally supported: the operation
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
539 might succeed or might fail, depending on the inputs.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
540
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
541 This section describes both types of operation.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
542
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
543 @menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
544 * Using @code{poly_int} with C++ arithmetic operators::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
545 * @code{wi} arithmetic on @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
546 * Division of @code{poly_int}s::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
547 * Other @code{poly_int} arithmetic::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
548 @end menu
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
549
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
550 @node Using @code{poly_int} with C++ arithmetic operators
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
551 @subsection Using @code{poly_int} with C++ arithmetic operators
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
552
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
553 The following C++ expressions are supported, where @var{p1} and @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
554 are @code{poly_int}s and where @var{c1} and @var{c2} are scalars:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
555
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
556 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
557 -@var{p1}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
558 ~@var{p1}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
559
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
560 @var{p1} + @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
561 @var{p1} + @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
562 @var{c1} + @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
563
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
564 @var{p1} - @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
565 @var{p1} - @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
566 @var{c1} - @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
567
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
568 @var{c1} * @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
569 @var{p1} * @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
570
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
571 @var{p1} << @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
572
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
573 @var{p1} += @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
574 @var{p1} += @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
575
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
576 @var{p1} -= @var{p2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
577 @var{p1} -= @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
578
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
579 @var{p1} *= @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
580 @var{p1} <<= @var{c2}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
581 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
582
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
583 These arithmetic operations handle integer ranks in a similar way
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
584 to C++. The main difference is that every coefficient narrower than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
585 @code{HOST_WIDE_INT} promotes to @code{HOST_WIDE_INT}, whereas in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
586 C++ everything narrower than @code{int} promotes to @code{int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
587 For example:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
588
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
589 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
590 poly_uint16 + int -> poly_int64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
591 unsigned int + poly_uint16 -> poly_int64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
592 poly_int64 + int -> poly_int64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
593 poly_int32 + poly_uint64 -> poly_uint64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
594 uint64 + poly_int64 -> poly_uint64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
595 poly_offset_int + int32 -> poly_offset_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
596 offset_int + poly_uint16 -> poly_offset_int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
597 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
598
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
599 In the first two examples, both coefficients are narrower than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
600 @code{HOST_WIDE_INT}, so the result has coefficients of type
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
601 @code{HOST_WIDE_INT}. In the other examples, the coefficient
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
602 with the highest rank ``wins''.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
603
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
604 If one of the operands is @code{wide_int} or @code{poly_wide_int},
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
605 the rules are the same as for @code{wide_int} arithmetic.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
606
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
607 @node @code{wi} arithmetic on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
608 @subsection @code{wi} arithmetic on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
609
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
610 As well as the C++ operators, @code{poly_int} supports the following
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
611 @code{wi} routines:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
612
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
613 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
614 wi::neg (@var{p1}, &@var{overflow})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
615
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
616 wi::add (@var{p1}, @var{p2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
617 wi::add (@var{p1}, @var{c2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
618 wi::add (@var{c1}, @var{p1})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
619 wi::add (@var{p1}, @var{p2}, @var{sign}, &@var{overflow})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
620
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
621 wi::sub (@var{p1}, @var{p2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
622 wi::sub (@var{p1}, @var{c2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
623 wi::sub (@var{c1}, @var{p1})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
624 wi::sub (@var{p1}, @var{p2}, @var{sign}, &@var{overflow})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
625
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
626 wi::mul (@var{p1}, @var{c2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
627 wi::mul (@var{c1}, @var{p1})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
628 wi::mul (@var{p1}, @var{c2}, @var{sign}, &@var{overflow})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
629
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
630 wi::lshift (@var{p1}, @var{c2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
631 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
632
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
633 These routines just check whether overflow occurs on any individual
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
634 coefficient; it is not possible to know at compile time whether the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
635 final runtime value would overflow.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
636
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
637 @node Division of @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
638 @subsection Division of @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
639
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
640 Division of @code{poly_int}s is possible for certain inputs. The functions
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
641 for division return true if the operation is possible and in most cases
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
642 return the results by pointer. The routines are:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
643
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
644 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
645 @item multiple_p (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
646 @itemx multiple_p (@var{a}, @var{b}, &@var{quotient})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
647 Return true if @var{a} is an exact multiple of @var{b}, storing the result
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
648 in @var{quotient} if so. There are overloads for various combinations
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
649 of polynomial and constant @var{a}, @var{b} and @var{quotient}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
650
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
651 @item constant_multiple_p (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
652 @itemx constant_multiple_p (@var{a}, @var{b}, &@var{quotient})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
653 Like @code{multiple_p}, but also test whether the multiple is a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
654 compile-time constant.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
655
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
656 @item can_div_trunc_p (@var{a}, @var{b}, &@var{quotient})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
657 @itemx can_div_trunc_p (@var{a}, @var{b}, &@var{quotient}, &@var{remainder})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
658 Return true if we can calculate @samp{trunc (@var{a} / @var{b})} at compile
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
659 time, storing the result in @var{quotient} and @var{remainder} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
660
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
661 @item can_div_away_from_zero_p (@var{a}, @var{b}, &@var{quotient})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
662 Return true if we can calculate @samp{@var{a} / @var{b}} at compile time,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
663 rounding away from zero. Store the result in @var{quotient} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
664
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
665 Note that this is true if and only if @code{can_div_trunc_p} is true.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
666 The only difference is in the rounding of the result.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
667 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
668
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
669 There is also an asserting form of division:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
670
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
671 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
672 @item exact_div (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
673 Assert that @var{a} is a multiple of @var{b} and return
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
674 @samp{@var{a} / @var{b}}. The result is a @code{poly_int} if @var{a}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
675 is a @code{poly_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
676 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
677
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
678 @node Other @code{poly_int} arithmetic
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
679 @subsection Other @code{poly_int} arithmetic
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
680
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
681 There are tentative routines for other operations besides division:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
682
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
683 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
684 @item can_ior_p (@var{a}, @var{b}, &@var{result})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
685 Return true if we can calculate @samp{@var{a} | @var{b}} at compile time,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
686 storing the result in @var{result} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
687 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
688
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
689 Also, ANDs with a value @samp{(1 << @var{y}) - 1} or its inverse can be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
690 treated as alignment operations. @xref{Alignment of @code{poly_int}s}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
691
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
692 In addition, the following miscellaneous routines are available:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
693
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
694 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
695 @item coeff_gcd (@var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
696 Return the greatest common divisor of all nonzero coefficients in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
697 @var{a}, or zero if @var{a} is known to be zero.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
698
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
699 @item common_multiple (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
700 Return a value that is a multiple of both @var{a} and @var{b}, where
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
701 one value is a @code{poly_int} and the other is a scalar. The result
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
702 will be the least common multiple for some indeterminate values but
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
703 not necessarily for all.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
704
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
705 @item force_common_multiple (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
706 Return a value that is a multiple of both @code{poly_int} @var{a} and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
707 @code{poly_int} @var{b}, asserting that such a value exists. The
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
708 result will be the least common multiple for some indeterminate values
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
709 but not necessarily for all.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
710
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
711 When using this routine, please add a comment explaining why the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
712 assertion is known to hold.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
713 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
714
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
715 Please add any other operations that you find to be useful.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
716
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
717 @node Alignment of @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
718 @section Alignment of @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
719
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
720 @code{poly_int} provides various routines for aligning values and for querying
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
721 misalignments. In each case the alignment must be a power of 2.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
722
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
723 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
724 @item can_align_p (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
725 Return true if we can align @var{value} up or down to the nearest multiple
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
726 of @var{align} at compile time. The answer is the same for both directions.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
727
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
728 @item can_align_down (@var{value}, @var{align}, &@var{aligned})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
729 Return true if @code{can_align_p}; if so, set @var{aligned} to the greatest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
730 aligned value that is less than or equal to @var{value}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
731
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
732 @item can_align_up (@var{value}, @var{align}, &@var{aligned})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
733 Return true if @code{can_align_p}; if so, set @var{aligned} to the lowest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
734 aligned value that is greater than or equal to @var{value}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
735
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
736 @item known_equal_after_align_down (@var{a}, @var{b}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
737 Return true if we can align @var{a} and @var{b} down to the nearest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
738 @var{align} boundary at compile time and if the two results are equal.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
739
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
740 @item known_equal_after_align_up (@var{a}, @var{b}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
741 Return true if we can align @var{a} and @var{b} up to the nearest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
742 @var{align} boundary at compile time and if the two results are equal.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
743
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
744 @item aligned_lower_bound (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
745 Return a result that is no greater than @var{value} and that is aligned
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
746 to @var{align}. The result will the closest aligned value for some
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
747 indeterminate values but not necessarily for all.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
748
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
749 For example, suppose we are allocating an object of @var{size} bytes
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
750 in a downward-growing stack whose current limit is given by @var{limit}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
751 If the object requires @var{align} bytes of alignment, the new stack
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
752 limit is given by:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
753
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
754 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
755 aligned_lower_bound (@var{limit} - @var{size}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
756 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
757
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
758 @item aligned_upper_bound (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
759 Likewise return a result that is no less than @var{value} and that is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
760 aligned to @var{align}. This is the routine that would be used for
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
761 upward-growing stacks in the scenario just described.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
762
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
763 @item known_misalignment (@var{value}, @var{align}, &@var{misalign})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
764 Return true if we can calculate the misalignment of @var{value}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
765 with respect to @var{align} at compile time, storing the result in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
766 @var{misalign} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
767
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
768 @item known_alignment (@var{value})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
769 Return the minimum alignment that @var{value} is known to have
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
770 (in other words, the largest alignment that can be guaranteed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
771 whatever the values of the indeterminates turn out to be).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
772 Return 0 if @var{value} is known to be 0.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
773
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
774 @item force_align_down (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
775 Assert that @var{value} can be aligned down to @var{align} at compile
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
776 time and return the result. When using this routine, please add a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
777 comment explaining why the assertion is known to hold.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
778
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
779 @item force_align_up (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
780 Likewise, but aligning up.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
781
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
782 @item force_align_down_and_div (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
783 Divide the result of @code{force_align_down} by @var{align}. Again,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
784 please add a comment explaining why the assertion in @code{force_align_down}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
785 is known to hold.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
786
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
787 @item force_align_up_and_div (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
788 Likewise for @code{force_align_up}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
789
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
790 @item force_get_misalignment (@var{value}, @var{align})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
791 Assert that we can calculate the misalignment of @var{value} with
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
792 respect to @var{align} at compile time and return the misalignment.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
793 When using this function, please add a comment explaining why
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
794 the assertion is known to hold.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
795 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
796
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
797 @node Computing bounds on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
798 @section Computing bounds on @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
799
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
800 @code{poly_int} also provides routines for calculating lower and upper bounds:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
801
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
802 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
803 @item constant_lower_bound (@var{a})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
804 Assert that @var{a} is nonnegative and return the smallest value it can have.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
805
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 @item constant_lower_bound_with_limit (@var{a}, @var{b})
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
807 Return the least value @var{a} can have, given that the context in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
808 which @var{a} appears guarantees that the answer is no less than @var{b}.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
809 In other words, the caller is asserting that @var{a} is greater than or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
810 equal to @var{b} even if @samp{known_ge (@var{a}, @var{b})} doesn't hold.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
812 @item constant_upper_bound_with_limit (@var{a}, @var{b})
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
813 Return the greatest value @var{a} can have, given that the context in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 which @var{a} appears guarantees that the answer is no greater than @var{b}.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
815 In other words, the caller is asserting that @var{a} is less than or equal
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816 to @var{b} even if @samp{known_le (@var{a}, @var{b})} doesn't hold.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
818 @item lower_bound (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
819 Return a value that is always less than or equal to both @var{a} and @var{b}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
820 It will be the greatest such value for some indeterminate values
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
821 but necessarily for all.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
822
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
823 @item upper_bound (@var{a}, @var{b})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
824 Return a value that is always greater than or equal to both @var{a} and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
825 @var{b}. It will be the least such value for some indeterminate values
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
826 but necessarily for all.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
827 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
828
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
829 @node Converting @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
830 @section Converting @code{poly_int}s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
831
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
832 A @code{poly_int<@var{n}, @var{T}>} can be constructed from up to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
833 @var{n} individual @var{T} coefficients, with the remaining coefficients
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
834 being implicitly zero. In particular, this means that every
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
835 @code{poly_int<@var{n}, @var{T}>} can be constructed from a single
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
836 scalar @var{T}, or something compatible with @var{T}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
837
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
838 Also, a @code{poly_int<@var{n}, @var{T}>} can be constructed from
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
839 a @code{poly_int<@var{n}, @var{U}>} if @var{T} can be constructed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
840 from @var{U}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
841
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
842 The following functions provide other forms of conversion,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
843 or test whether such a conversion would succeed.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
844
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
845 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
846 @item @var{value}.is_constant ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
847 Return true if @code{poly_int} @var{value} is a compile-time constant.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
848
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
849 @item @var{value}.is_constant (&@var{c1})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
850 Return true if @code{poly_int} @var{value} is a compile-time constant,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
851 storing it in @var{c1} if so. @var{c1} must be able to hold all
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
852 constant values of @var{value} without loss of precision.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
853
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
854 @item @var{value}.to_constant ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
855 Assert that @var{value} is a compile-time constant and return its value.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
856 When using this function, please add a comment explaining why the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
857 condition is known to hold (for example, because an earlier phase
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
858 of analysis rejected non-constants).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
859
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
860 @item @var{value}.to_shwi (&@var{p2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
861 Return true if @samp{poly_int<@var{N}, @var{T}>} @var{value} can be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
862 represented without loss of precision as a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
863 @samp{poly_int<@var{N}, @code{HOST_WIDE_INT}>}, storing it in that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
864 form in @var{p2} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
865
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
866 @item @var{value}.to_uhwi (&@var{p2})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
867 Return true if @samp{poly_int<@var{N}, @var{T}>} @var{value} can be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
868 represented without loss of precision as a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
869 @samp{poly_int<@var{N}, @code{unsigned HOST_WIDE_INT}>}, storing it in that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
870 form in @var{p2} if so.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
871
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
872 @item @var{value}.force_shwi ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
873 Forcibly convert each coefficient of @samp{poly_int<@var{N}, @var{T}>}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
874 @var{value} to @code{HOST_WIDE_INT}, truncating any that are out of range.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
875 Return the result as a @samp{poly_int<@var{N}, @code{HOST_WIDE_INT}>}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
876
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
877 @item @var{value}.force_uhwi ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
878 Forcibly convert each coefficient of @samp{poly_int<@var{N}, @var{T}>}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
879 @var{value} to @code{unsigned HOST_WIDE_INT}, truncating any that are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
880 out of range. Return the result as a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
881 @samp{poly_int<@var{N}, @code{unsigned HOST_WIDE_INT}>}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
882
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
883 @item wi::shwi (@var{value}, @var{precision})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
884 Return a @code{poly_int} with the same value as @var{value}, but with
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
885 the coefficients converted from @code{HOST_WIDE_INT} to @code{wide_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
886 @var{precision} specifies the precision of the @code{wide_int} cofficients;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
887 if this is wider than a @code{HOST_WIDE_INT}, the coefficients of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
888 @var{value} will be sign-extended to fit.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
889
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
890 @item wi::uhwi (@var{value}, @var{precision})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
891 Like @code{wi::shwi}, except that @var{value} has coefficients of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
892 type @code{unsigned HOST_WIDE_INT}. If @var{precision} is wider than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
893 a @code{HOST_WIDE_INT}, the coefficients of @var{value} will be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
894 zero-extended to fit.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
895
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
896 @item wi::sext (@var{value}, @var{precision})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
897 Return a @code{poly_int} of the same type as @var{value}, sign-extending
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
898 every coefficient from the low @var{precision} bits. This in effect
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
899 applies @code{wi::sext} to each coefficient individually.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
900
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
901 @item wi::zext (@var{value}, @var{precision})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
902 Like @code{wi::sext}, but for zero extension.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
903
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
904 @item poly_wide_int::from (@var{value}, @var{precision}, @var{sign})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
905 Convert @var{value} to a @code{poly_wide_int} in which each coefficient
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
906 has @var{precision} bits. Extend the coefficients according to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
907 @var{sign} if the coefficients have fewer bits.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
908
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
909 @item poly_offset_int::from (@var{value}, @var{sign})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
910 Convert @var{value} to a @code{poly_offset_int}, extending its coefficients
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
911 according to @var{sign} if they have fewer bits than @code{offset_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
912
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
913 @item poly_widest_int::from (@var{value}, @var{sign})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
914 Convert @var{value} to a @code{poly_widest_int}, extending its coefficients
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
915 according to @var{sign} if they have fewer bits than @code{widest_int}.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
916 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
917
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
918 @node Miscellaneous @code{poly_int} routines
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
919 @section Miscellaneous @code{poly_int} routines
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
920
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
921 @table @samp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
922 @item print_dec (@var{value}, @var{file}, @var{sign})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
923 @itemx print_dec (@var{value}, @var{file})
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
924 Print @var{value} to @var{file} as a decimal value, interpreting
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
925 the coefficients according to @var{sign}. The final argument is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
926 optional if @var{value} has an inherent sign; for example,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
927 @code{poly_int64} values print as signed by default and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
928 @code{poly_uint64} values print as unsigned by default.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
929
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
930 This is a simply a @code{poly_int} version of a wide-int routine.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
931 @end table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
932
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
933 @node Guidelines for using @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
934 @section Guidelines for using @code{poly_int}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
935
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
936 One of the main design goals of @code{poly_int} was to make it easy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
937 to write target-independent code that handles variable-sized registers
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
938 even when the current target has fixed-sized registers. There are two
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
939 aspects to this:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
940
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
941 @itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
942 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
943 The set of @code{poly_int} operations should be complete enough that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
944 the question in most cases becomes ``Can we do this operation on these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
945 particular @code{poly_int} values? If not, bail out'' rather than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
946 ``Are these @code{poly_int} values constant? If so, do the operation,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
947 otherwise bail out''.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
948
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
949 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
950 If target-independent code compiles and runs correctly on a target
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
951 with one value of @code{NUM_POLY_INT_COEFFS}, and if the code does not
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
952 use asserting functions like @code{to_constant}, it is reasonable to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
953 assume that the code also works on targets with other values of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
954 @code{NUM_POLY_INT_COEFFS}. There is no need to check this during
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
955 everyday development.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
956 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
957
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
958 So the general principle is: if target-independent code is dealing
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
959 with a @code{poly_int} value, it is better to operate on it as a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
960 @code{poly_int} if at all possible, choosing conservatively-correct
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
961 behavior if a particular operation fails. For example, the following
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
962 code handles an index @code{pos} into a sequence of vectors that each
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
963 have @code{nunits} elements:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
964
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
965 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
966 /* Calculate which vector contains the result, and which lane of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
967 that vector we need. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
968 if (!can_div_trunc_p (pos, nunits, &vec_entry, &vec_index))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
969 @{
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
970 if (dump_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
971 dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
972 "Cannot determine which vector holds the"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
973 " final result.\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
974 return false;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
975 @}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
976 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
977
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
978 However, there are some contexts in which operating on a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
979 @code{poly_int} is not possible or does not make sense. One example
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
980 is when handling static initializers, since no current target supports
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
981 the concept of a variable-length static initializer. In these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
982 situations, a reasonable fallback is:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
983
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
984 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
985 if (@var{poly_value}.is_constant (&@var{const_value}))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
986 @{
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
987 @dots{}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
988 /* Operate on @var{const_value}. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
989 @dots{}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
990 @}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
991 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
992 @{
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
993 @dots{}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
994 /* Conservatively correct fallback. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
995 @dots{}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
996 @}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
997 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
998
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
999 @code{poly_int} also provides some asserting functions like
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1000 @code{to_constant}. Please only use these functions if there is a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1001 good theoretical reason to believe that the assertion cannot fire.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1002 For example, if some work is divided into an analysis phase and an
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1003 implementation phase, the analysis phase might reject inputs that are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1004 not @code{is_constant}, in which case the implementation phase can
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1005 reasonably use @code{to_constant} on the remaining inputs. The assertions
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1006 should not be used to discover whether a condition ever occurs ``in the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1007 field''; in other words, they should not be used to restrict code to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1008 constants at first, with the intention of only implementing a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1009 @code{poly_int} version if a user hits the assertion.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1010
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1011 If a particular asserting function like @code{to_constant} is needed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1012 more than once for the same reason, it is probably worth adding a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1013 helper function or macro for that situation, so that the justification
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1014 only needs to be given once. For example:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1015
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1016 @smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1017 /* Return the size of an element in a vector of size SIZE, given that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1018 the vector has NELTS elements. The return value is in the same units
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1019 as SIZE (either bits or bytes).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1020
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1021 to_constant () is safe in this situation because vector elements are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1022 always constant-sized scalars. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1023 #define vector_element_size(SIZE, NELTS) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1024 (exact_div (SIZE, NELTS).to_constant ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1025 @end smallexample
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1026
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1027 Target-specific code in @file{config/@var{cpu}} only needs to handle
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1028 non-constant @code{poly_int}s if @code{NUM_POLY_INT_COEFFS} is greater
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1029 than one. For other targets, @code{poly_int} degenerates to a compile-time
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1030 constant and is often interchangable with a normal scalar integer.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1031 There are two main exceptions:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1032
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1033 @itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1034 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1035 Sometimes an explicit cast to an integer type might be needed, such as to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1036 resolve ambiguities in a @code{?:} expression, or when passing values
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1037 through @code{...} to things like print functions.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1038
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1039 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1040 Target macros are included in target-independent code and so do not
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1041 have access to the implicit conversion to a scalar integer.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1042 If this becomes a problem for a particular target macro, the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1043 possible solutions, in order of preference, are:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1044
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1045 @itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1046 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1047 Convert the target macro to a target hook (for all targets).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1048
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1049 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1050 Put the target's implementation of the target macro in its
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1051 @file{@var{cpu}.c} file and call it from the target macro in the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1052 @file{@var{cpu}.h} file.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1053
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1054 @item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1055 Add @code{to_constant ()} calls where necessary. The previous option
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1056 is preferable because it will help with any future conversion of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1057 macro to a hook.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1058 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1059 @end itemize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1060