[LLVMdev] Need help in converting int to double
sarath chandra
sarathcse19 at gmail.com
Thu Sep 22 03:17:31 PDT 2011
On Thu, Sep 22, 2011 at 3:46 PM, sarath chandra <sarathcse19 at gmail.com>wrote:
> Hi James,
>
> First i converted the void * to int* and then did FPToSI...then did SHL...(
> because CreateShl only accepts integers... i pointer casted it to int64 type
> first)... Below is the code snippet....
>
>
> lhs = mBuilder.CreateStructGEP(firstArg, 0);
> lhs = mBuilder.CreateLoad(lhs);
> lhs = mBuilder.CreatePointerCast(lhs, PointerType::get(
> mBuilder.getInt64Ty(), 0));
> int typelhs = getValueType(lhs);
> rhs = mBuilder.CreateStructGEP(secondArg, 0);
> rhs = mBuilder.CreateLoad(rhs);
> rhs = mBuilder.CreatePointerCast(rhs, PointerType::get(
> mBuilder.getInt64Ty(), 0));
>
> lhs = mBuilder.CreateLoad(lhs);
> rhs = mBuilder.CreateLoad(rhs);
>
> lhs = convertDoubleToInt64(lhs); // used FPToSI
> rhs = convertDoubleToInt64(rhs);// " "
>
> //lhs = mBuilder.CreateLoad(lhs);
> //rhs = mBuilder.CreateLoad(rhs);
>
> lhs = mBuilder.CreateShl(lhs, rhs);
> //lhs = mBuilder.CreatePointerCast(lhs,
> PointerType::get(mBuilder.getDoubleTy(),0));
> lhs = convertIntToDouble(lhs);
> typelhs = getValueType(lhs);
>
>
>
> llvm::Value* returnValue = mBuilder.CreateAlloca(PointerType::get(
> mModule->getTypeByName("Value"), 0));
>
> llvm::Value* valueStructSize = getValueStructSize();
> llvm::Value* memory = insertCallToMalloc(valueStructSize);
>
> memory = mBuilder.CreatePointerCast(memory, PointerType::get(
> mModule->getTypeByName("Value"), 0));
>
> mBuilder.CreateStore(memory, returnValue);
>
> allocateAndAssignDoubleTypeVar(mBuilder.CreateLoad(returnValue), lhs);
>
> //return the value
> mBuilder.CreateRet(mBuilder.CreateLoad(returnValue));
>
>
> /*
> * create call to SHL function
> */
> mCurrentFunction = previousFunction;
> mBuilder.SetInsertPoint(previousBlock);
>
> return mBuilder.CreateCall2(shlFunction, aLHS, aRHS);
>
>
>
> On Thu, Sep 22, 2011 at 3:40 PM, James Molloy <James.Molloy at arm.com>wrote:
>
>> Hi Sarath,
>>
>> Your example will break.
>>
>> If the values are held internally as doubles casted to void* (which
>> incidentally will only work on 64-bit systems), just casting void* -> int*
>> will not get you a valid integer value. It will get you the double's
>> internal representation as an integer. For example (actual values are made
>> up):
>>
>> double a = 42.0;
>> void *v = (void*)&a;
>> int b = *(int*)v;
>>
>> "b" will not contain 42. It will contain what looks like random garbage
>> (although it is the IEE754 floating point representation of "42.0").
>>
>> You need to perform an actual cast:
>>
>> double a = 42.0;
>> void *v = (void*)&a;
>> double b = *(double*)v;
>> int c = (int)b;
>>
>> "c" will contain 42.
>>
>> In LLVM speak, you need to LOAD as a double*, perform a fptosi to create
>> an int64, perform the shift, then sitofp and store:
>>
>> %1 = load bitcast i8* %arg0 to double* ; Cast the void* to double*, then
>> load it.
>> %2 = load bitcast i8* %arg1 to double*
>>
>> %3 = fptosi double %1 to i64 ; Perform explicit double -> int conversion.
>> %4 = fptosi double %2 to i64
>>
>> %5 = shr i64 %3, %4 ; Perform your operation.
>>
>> %6 = sitofp i64 %5 to double ; Convert explicitly back to integer
>> representation.
>>
>> %7 = store bitcast i8* %dest to double*, double %6 ; Store back,
>> reinterpreting your void* (which is i8* in LLVM) as a double*.
>>
>>
>> Hopefully this makes sense, especially if you know how you would have to
>> do it in C.
>>
>> Cheers,
>>
>> James
>>
>> From: sarath chandra [mailto:sarathcse19 at gmail.com]
>> Sent: 22 September 2011 10:49
>> To: James Molloy
>> Subject: Re: [LLVMdev] Need help in converting int to double
>>
>> Hi James,
>>
>> CreateShl() accepts only integers or vectors as arguments. At the
>> starting my arguments , let us suppose LHS,RHS, are double values. To pass
>> them as arguments to CreateShl(), i used Pointer Casting to convert the
>> Void* to Int*. Now the problem is after getting the result is, the result
>> variable which captures the output is Int*.. i wanted to make it
>> Double*..(so that i can accomadate it in value structure)
>> On Thu, Sep 22, 2011 at 3:12 PM, James Molloy <James.Molloy at arm.com>
>> wrote:
>> Hi Sarath,
>>
>> If you can only hold doubles (not integers), and you originally converted
>> the doubles to integers to do an integer shift, why can you not just convert
>> the result back to a double using CreateFPToSI ?
>>
>> CreateFPToSI(CreateShr(CreateSIToFP(arg0), CreateSIToFP(arg1)))
>>
>> Cheers,
>>
>> James
>>
>> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
>> Behalf Of sarath chandra
>> Sent: 22 September 2011 10:37
>> To: llvmdev at cs.uiuc.edu
>> Subject: [LLVMdev] Need help in converting int to double
>>
>> Hi,
>>
>> I'm pursuing M.Tech course. As a part of the project work i'm using
>> LLVM as back-end. My project area is "Enhancing the performance of V8
>> javascript engine using LLVM as a back-end".
>>
>> Now i'm writing code for shift left(SHL) operator. I had my own Value
>> Structure .. it's like this
>>
>> Struct Value
>> {
>> void *val ;
>> char type;
>> }
>>
>> The "char type" holds DoubleType,DoubleConst,StringType,StringConst...
>>
>> when i'm executing the IrBuilder.CreateShl(LHS,RHS) instruction it is
>> returning an integer value as output.. i'm unable to store the value in my
>> structure....(because my structure can hold Doubles,Strings).
>>
>> Is there any way to store the integer output in my structure( i used
>> CreateSIToFP() to change int to double)........
>>
>> Thanks in advance
>>
>> Regards,
>>
>> (¨`·.·´¨)
>> `·.¸(¨`·.·´¨)
>> (¨`·.·´¨)¸.·´ Sarath!!!
>> `·.¸.·´
>>
>> -- IMPORTANT NOTICE: The contents of this email and any attachments are
>> confidential and may also be privileged. If you are not the intended
>> recipient, please notify the sender immediately and do not disclose the
>> contents to any other person, use it for any purpose, or store or copy the
>> information in any medium. Thank you.
>>
>>
>>
>> --
>> Sairam,
>>
>> (¨`·.·´¨)
>> `·.¸(¨`·.·´¨)
>> (¨`·.·´¨)¸.·´ Sarath!!!
>> `·.¸.·´
>>
>> -- IMPORTANT NOTICE: The contents of this email and any attachments are
>> confidential and may also be privileged. If you are not the intended
>> recipient, please notify the sender immediately and do not disclose the
>> contents to any other person, use it for any purpose, or store or copy the
>> information in any medium. Thank you.
>>
>>
>
>
> --
> Sairam,
>
> (¨`·.·´¨)
> `·.¸(¨`·.·´¨)
> (¨`·.·´¨)¸.·´ Sarath!!!
> `·.¸.·´
>
--
Sairam,
(¨`·.·´¨)
`·.¸(¨`·.·´¨)
(¨`·.·´¨)¸.·´ Sarath!!!
`·.¸.·´
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110922/f16ee446/attachment.html>
More information about the llvm-dev
mailing list