[llvm] [DirectX] Add atan2 intrinsic and expand for DXIL backend (p1) (PR #108865)
Tex Riddell via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 19 20:09:12 PDT 2024
================
@@ -305,6 +306,48 @@ static Value *expandNormalizeIntrinsic(CallInst *Orig) {
return Builder.CreateFMul(X, MultiplicandVec);
}
+static Value *expandAtan2Intrinsic(CallInst *Orig) {
+ Value *Y = Orig->getOperand(0);
+ Value *X = Orig->getOperand(1);
+ Type *Ty = X->getType();
+ IRBuilder<> Builder(Orig);
+
+ Value *Tan = Builder.CreateFDiv(Y, X);
+
+ Value *Atan =
+ Builder.CreateIntrinsic(Ty, Intrinsic::atan, {Tan}, nullptr, "Elt.Atan");
+
+ Constant *Pi = ConstantFP::get(Ty, llvm::numbers::pi);
+ Constant *HalfPi = ConstantFP::get(Ty, llvm::numbers::pi / 2);
+ Constant *NegHalfPi = ConstantFP::get(Ty, -llvm::numbers::pi / 2);
+ Constant *Zero = ConstantFP::get(Ty, 0);
+
+ Value *AtanAddPi = Builder.CreateFAdd(Atan, Pi);
+ Value *AtanSubPi = Builder.CreateFSub(Atan, Pi);
+
+ Value *Result = Atan;
+
+ Value *XLt0 = Builder.CreateFCmpOLT(X, Zero);
+ Value *XEq0 = Builder.CreateFCmpOEQ(X, Zero);
+
+ Value *YGe0 = Builder.CreateFCmpOGE(Y, Zero);
+ Value *YLt0 = Builder.CreateFCmpOLT(Y, Zero);
+
+ Value *XLt0AndYGe0 = Builder.CreateAnd(XLt0, YGe0);
+ Result = Builder.CreateSelect(XLt0AndYGe0, AtanAddPi, Result);
+
+ Value *XLt0AndYLt0 = Builder.CreateAnd(XLt0, YLt0);
+ Result = Builder.CreateSelect(XLt0AndYLt0, AtanSubPi, Result);
+
+ Value *XEq0AndYLt0 = Builder.CreateAnd(XEq0, YLt0);
+ Result = Builder.CreateSelect(XEq0AndYLt0, NegHalfPi, Result);
+
+ Value *XEq0AndYGe0 = Builder.CreateAnd(XEq0, YGe0);
+ Result = Builder.CreateSelect(XEq0AndYGe0, HalfPi, Result);
+
+ return Result;
----------------
tex3d wrote:
I did add this, so we can decide what we want to do and apply that consistently to the whole set later. Let me know if I should do anything more here.
https://github.com/llvm/llvm-project/pull/108865
More information about the llvm-commits
mailing list