Duncan Sands
2012-Nov-28 12:53 UTC
[LLVMdev] [llvm-commits] [dragonegg] r168787 - in /dragonegg/trunk: src/x86/Target.cpp src/x86/x86_builtins test/validator/c/copysignp.c
Hi Pawel, can you please pull this dragonegg patch into 3.2. I am the code owner for dragonegg. Thanks a lot, Duncan. On 28/11/12 13:44, Duncan Sands wrote:> Author: baldrick > Date: Wed Nov 28 06:44:50 2012 > New Revision: 168787 > > URL: http://llvm.org/viewvc/llvm-project?rev=168787&view=rev > Log: > Add support for GCC's vector copysign builtins, fixing PR12664. > > Added: > dragonegg/trunk/test/validator/c/copysignp.c > Modified: > dragonegg/trunk/src/x86/Target.cpp > dragonegg/trunk/src/x86/x86_builtins > > Modified: dragonegg/trunk/src/x86/Target.cpp > URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/x86/Target.cpp?rev=168787&r1=168786&r2=168787&view=diff > =============================================================================> --- dragonegg/trunk/src/x86/Target.cpp (original) > +++ dragonegg/trunk/src/x86/Target.cpp Wed Nov 28 06:44:50 2012 > @@ -165,6 +165,29 @@ > case addpd256: > Result = Builder.CreateFAdd(Ops[0], Ops[1]); > return true; > + case copysignpd: > + case copysignpd256: > + case copysignps: > + case copysignps256: { > + if (Ops.size() != 2) > + return false; > + VectorType *VecTy = dyn_cast<VectorType>(Ops[0]->getType()); > + if (Ops[1]->getType() != VecTy) > + return false; > + Type *EltTy = VecTy->getElementType(); > + unsigned EltBitWidth = EltTy->getPrimitiveSizeInBits(); > + Type *IntEltTy = IntegerType::get(Context, EltBitWidth); > + Type *IntVecTy = VectorType::get(IntEltTy, VecTy->getNumElements()); > + APInt SignBit = APInt::getSignBit(EltBitWidth); > + Constant *SignMask = ConstantInt::get(IntVecTy, SignBit); > + Value *IntLHS = Builder.CreateBitCast(Ops[0], IntVecTy); > + Value *IntRHS = Builder.CreateBitCast(Ops[1], IntVecTy); > + Value *Sign = Builder.CreateAnd(IntRHS, SignMask); > + Value *Abs = Builder.CreateAnd(IntLHS, ConstantExpr::getNot(SignMask)); > + Value *IntRes = Builder.CreateOr(Abs, Sign); > + Result = Builder.CreateBitCast(IntRes, VecTy); > + return true; > + } > case paddb: > case paddw: > case paddd: > > Modified: dragonegg/trunk/src/x86/x86_builtins > URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/x86/x86_builtins?rev=168787&r1=168786&r2=168787&view=diff > =============================================================================> --- dragonegg/trunk/src/x86/x86_builtins (original) > +++ dragonegg/trunk/src/x86/x86_builtins Wed Nov 28 06:44:50 2012 > @@ -120,10 +120,10 @@ > //DEFINE_BUILTIN(comisdle), > //DEFINE_BUILTIN(comisdlt), > //DEFINE_BUILTIN(comisdneq), > -//DEFINE_BUILTIN(copysignpd), > -//DEFINE_BUILTIN(copysignpd256), > -//DEFINE_BUILTIN(copysignps), > -//DEFINE_BUILTIN(copysignps256), > +DEFINE_BUILTIN(copysignpd), > +DEFINE_BUILTIN(copysignpd256), > +DEFINE_BUILTIN(copysignps), > +DEFINE_BUILTIN(copysignps256), > //DEFINE_BUILTIN(crc32di), > //DEFINE_BUILTIN(crc32hi), > //DEFINE_BUILTIN(crc32qi), > > Added: dragonegg/trunk/test/validator/c/copysignp.c > URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c/copysignp.c?rev=168787&view=auto > =============================================================================> --- dragonegg/trunk/test/validator/c/copysignp.c (added) > +++ dragonegg/trunk/test/validator/c/copysignp.c Wed Nov 28 06:44:50 2012 > @@ -0,0 +1,7 @@ > +// RUN: %dragonegg -S %s > +// PR12664 > + > +typedef float v4sf __attribute__ ((vector_size (16))); > +v4sf foo(v4sf l, v4sf r) { > + return __builtin_ia32_copysignps (l, r); > +} > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >