[LLVMdev] confused about float literals
John McCall
rjmccall at apple.com
Tue Apr 26 15:51:21 PDT 2011
On Apr 26, 2011, at 2:07 AM, Joe Armstrong wrote:
> Compiles (via clang) to:
>
> ; ModuleID = 'test101.c'
> target datalayout =
> "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
> target triple = "i386-pc-linux-gnu"
>
> define i32 @main() nounwind {
> %1 = alloca i32, align 4 ; <i32*> [#uses=3]
> %f = alloca float, align 4 ; <float*> [#uses=1]
> %f1 = alloca double, align 8 ; <double*> [#uses=1]
> store i32 0, i32* %1
> store float 0x400928F5C0000000, float* %f
> store double 3.145000e+00, double* %f1
> store i32 0, i32* %1
> %2 = load i32* %1 ; <i32> [#uses=1]
> ret i32 %2
> }
>
> This is very strange - what is 0x400928F5C0000000 ???
> the 32 bit hex representation of 3.145 is 0x404947ae, and,
> the 64 bit hex representation of 3.145 is 0x400928f5c28f5c29
For murky historical reasons, float literals are represented as
if they were doubles, but with the precision of a float. It does
not change their semantics.
As for your other question, I don't know that there's a good reason
that the parser isn't more accommodating.
John.
More information about the llvm-dev
mailing list