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

116 views
Skip to first unread message

zhi chen

unread,
Apr 15, 2015, 2:56:38 PM4/15/15
to LLVM Dev
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

mats petersson

unread,
Apr 15, 2015, 4:05:12 PM4/15/15
to zhi chen, LLVM Dev
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
> _______________________________________________
> LLVM Developers mailing list
> LLV...@cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
_______________________________________________
LLVM Developers mailing list
LLV...@cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

zhi chen

unread,
Apr 15, 2015, 5:01:22 PM4/15/15
to mats petersson, LLVM Dev
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;
}

zhi chen

unread,
Apr 15, 2015, 5:23:50 PM4/15/15
to mats petersson, LLVM Dev
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 <ma...@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

mats petersson

unread,
Apr 15, 2015, 5:42:40 PM4/15/15
to zhi chen, LLVM Dev
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 <zch...@gmail.com> wrote:

mats petersson

unread,
Apr 15, 2015, 6:04:37 PM4/15/15
to zhi chen, LLVM Dev
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
Reply all
Reply to author
Forward
0 new messages