[LLVMdev] How to do bitcast for double to <2 x double>

mats petersson mats at planetcatfish.com
Wed Apr 15 14:21:39 PDT 2015


Without knowing how you generated the original instruction, don't
know, but it should be possible to just have say `alloca` or `gep` for
vector of 2 doubles and o `load` on that.

I have a few bitcasts in my Pascal compiler, and they are all based
one kind of pointer being cast to another pointer type - although
bitcast can be used for other purposes too, I believe that is the
"common use".  In every case, the input and output must be the same
size...

--
Mats

On 15 April 2015 at 22:16, zhi chen <zchenhn at gmail.com> wrote:
> Thanks Mats. Yes, it currently leads to "Illegal BitCast". Can I change the
> pInst directly to generate the code I want?
>
> On Wed, Apr 15, 2015 at 2:13 PM, mats petersson <mats at planetcatfish.com>
> wrote:
>>
>> So, you need to bitcast `pinst` to a pointer to Vector of double,
>> since it (I hope for your sake) is a pointer to integer. What you are
>> trying to do is bitcast a pointer into a vector, which probably will
>> lead to an assert or "bad code that doesn't work".
>>
>> --
>> Mats
>>
>> On 15 April 2015 at 21:57, zhi chen <zchenhn at gmail.com> wrote:
>> > What I want to do is to change the pInst from : 2%= load double* %1,
>> > align 8
>> > to 2% = load < 2 x double>* %1, align 16, where <2 x double> should be
>> > two
>> > double identical double values that is same as the one in the previous
>> > instruction
>> >
>> > Instruction* ScalarToVectorLoad(Instruction* pInst) {
>> >   Value *loadValue = pInst->getOperand(0);
>> >   Instruction *newLoad;   //this one should be 2% = load < 2 x double>*
>> > %1
>> >
>> >   BitCastInst *scalarToVector = new BitCastInst(loadValue,
>> > VectorType::get(Type::getDoubleTy(currF->getContext()), 2),
>> > "vectorizedLoad", pInst);
>> >   newLoad = new LoadInst(); //to be implemented...
>> >   return newLoad;
>> > }
>> >
>> > On Wed, Apr 15, 2015 at 1:03 PM, mats petersson <mats at planetcatfish.com>
>> > wrote:
>> >>
>> >> Create a type that is a "vector (array) of 2 double", and then a
>> >> pointer to that. Now use bitcast your on double pointer to that
>> >> pointer type you've created, and then create a load...
>> >>
>> >> If you need more help, it would help if you post the code you are
>> >> working
>> >> on...
>> >>
>> >> --
>> >> Mats
>> >>
>> >> On 15 April 2015 at 19:51, zhi chen <zchenhn at gmail.com> wrote:
>> >> > How can I write code to generate IR for:
>> >> > %2 = bitcast double* %1 to <2 x double>*.
>> >> > %3 = load <2 x double>* %2, align 16
>> >> > Basically, it is similar to x86 _mm_load_pd1 intrinsics.
>> >> >
>> >> > Thanks,
>> >> > Zhi
>> >> >
>> >> > _______________________________________________
>> >> > 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