[LLVMdev] Complex constant expressions?
Talin
viridia at gmail.com
Wed Jan 23 17:45:25 PST 2008
Neil Booth wrote:
> Talin wrote:-
>
>> Well, I may be using it wrong. But looking at APFloat.h, I see four
>> functions that purport to convert to integer:
>>
>> opStatus convertToInteger(integerPart *, unsigned int, bool,
>> roundingMode) const;
>> opStatus convertFromSignExtendedInteger(const integerPart *,
>> unsigned int,
>> bool, roundingMode);
>> opStatus convertFromZeroExtendedInteger(const integerPart *,
>> unsigned int,
>> bool, roundingMode);
>> APInt convertToAPInt() const;
>>
>> The first three convert to an array of integer parts, which (as far as I
>> can tell) is not easily convertible into an APInt via any public methods
>> I have been able to discover so far.
>>
>> The last function doesn't appear to convert the APFloat into the nearest
>> integer equivalent, since my experiments with it returned completely
>> unexpected values; I'm assuming that what is returned is an APInt
>> containing the bitwise representation of the floating-point value?
>>
>
> Only two convert to integer. The convertToAPInt is unfortunately
> named; I'm not sure what it does but suspect it captures bitpatterns
> like you suggest.
>
> convertToInteger is the function I'm responsible for and it does
> float->int conversion according to IEEE754. If you want to place
> it in an APInt, create your APInt with the appropriate size and
> use its buffer as input. APInt has made unfortunate sign choices
> though, IIRC it is not sign-extended, so you may need to fudge in
> the case of a signed target. This is also why there are two "from"
> functions above :(
>
OK here's a follow-up question: So far the ConstantExpr class has been
doing what I want pretty well. However, I'd like to be able to detect
overflow / loss of precision when casting constant values so that I can
issue the appropriate warning. Since the values are constant, I ought to
be able to tell whether or not they can "fit" in the destination type
without loss. For ints, this is easy enough using getActiveBits(). For
floats, I guess I would need to know whether the fractional part of the
number is zero or not, and I'd need floating-point equivalents to the
various integer min and max values, so that I could compare them with
the APFloat.
What would be a good technique for accomplishing this?
> Neil.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
More information about the llvm-dev
mailing list