i have already converted the vrp code, so i have some guess at where you
are talking about. (of course correct me if i am wrong).
in the code that computes the range when two variables are multiplied
together needs to do a multiplication that produces a result that is
twice as wide as the inputs.
my library is able to do that with one catch (and this is a big catch):
the target has to have an integer mode that is twice as big as the mode
of the operands. The issue is that wide-ints actually carry around the
mode of the value in order to get the bitsize and precision of the
operands (it does not have the type, because this code has to both work
on the rtl and tree level and i generally do not want the signness anyway).
my current code in vrp checks to see if such a mode exists and if it
does, it produces the product. if the mode does not exist, it returns
bottom. What this means is that for most (many or some) targets that
have a TImode, the largest thing that particular vrp discover ranges for
is a DImode value. We could get around this by defining the next
larger mode than what the target really needs but i wonder how much
mileage you are going to get out of that with really large numbers.
Of course you could have something else in mind.
kenny
On 10/03/2012 04:47 PM, Marc Glisse wrote:
On Wed, 3 Oct 2012, Kenneth Zadeck wrote:
The patch defines a new datatype, a 'wide_int' (defined in
wide-int.[ch], and this datatype will be used to perform all of the
integer constant math in the compiler. Externally, wide-int is very
similar to double-int except that it does not have the limitation that
math must be done on exactly two HOST_WIDE_INTs.
Internally, a wide_int is a structure that contains a fixed sized
array of HOST_WIDE_INTs, a length field and a mode. The size of the
array is determined at generation time by dividing the number of bits
of the largest integer supported on the target by the number of bits
in a HOST_WIDE_INT of the host. Thus, with this format, any length of
integer can be supported on any host.
Hello,
did you consider making the size of wide_int a template parameter, now
that we are using C++? All with a convenient typedef or macro so it
doesn't show. I am asking because in vrp I do some arithmetic that
requires 2*N+1 bits where N is the size of double_int.