[PATCH] D29942: Add custom lowering for llvm.log.f32 intrinsic
Vedran Miletić via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 15 09:25:26 PST 2017
rivanvx updated this revision to Diff 88557.
rivanvx marked 2 inline comments as done.
rivanvx edited the summary of this revision.
rivanvx added a comment.
Better version: handle log10 as well, define constants locally, handle f16, do not pretend to handle f64. Tests incoming.
https://reviews.llvm.org/D29942
Files:
lib/Target/AMDGPU/SIISelLowering.cpp
lib/Target/AMDGPU/SIISelLowering.h
Index: lib/Target/AMDGPU/SIISelLowering.h
===================================================================
--- lib/Target/AMDGPU/SIISelLowering.h
+++ lib/Target/AMDGPU/SIISelLowering.h
@@ -44,6 +44,7 @@
SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG, bool Signed) const;
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
+ SDValue LowerFLOG(SDValue Op, SelectionDAG &Dag) const;
SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
Index: lib/Target/AMDGPU/SIISelLowering.cpp
===================================================================
--- lib/Target/AMDGPU/SIISelLowering.cpp
+++ lib/Target/AMDGPU/SIISelLowering.cpp
@@ -17,6 +17,10 @@
#define _USE_MATH_DEFINES
#endif
+#define M_LOG2E_F 1.44269504088896340735992468100189214f
+#define M_LN2_F 0.693147180559945309417232121458176568f
+#define M_LN10_F 2.30258509299404568401799145468436421f
+
#include "AMDGPU.h"
#include "AMDGPUIntrinsicInfo.h"
#include "AMDGPUSubtarget.h"
@@ -291,6 +295,8 @@
setOperationAction(ISD::FSIN, MVT::f32, Custom);
setOperationAction(ISD::FCOS, MVT::f32, Custom);
+ setOperationAction(ISD::FLOG, MVT::f32, Custom);
+ setOperationAction(ISD::FLOG10, MVT::f32, Custom);
setOperationAction(ISD::FDIV, MVT::f32, Custom);
setOperationAction(ISD::FDIV, MVT::f64, Custom);
@@ -353,6 +359,8 @@
setOperationAction(ISD::FP_ROUND, MVT::f16, Custom);
setOperationAction(ISD::FCOS, MVT::f16, Promote);
setOperationAction(ISD::FSIN, MVT::f16, Promote);
+ setOperationAction(ISD::FLOG, MVT::f16, Custom);
+ setOperationAction(ISD::FLOG10, MVT::f16, Custom);
setOperationAction(ISD::FP_TO_SINT, MVT::f16, Promote);
setOperationAction(ISD::FP_TO_UINT, MVT::f16, Promote);
setOperationAction(ISD::SINT_TO_FP, MVT::f16, Promote);
@@ -1973,6 +1981,9 @@
return Result;
}
+ case ISD::FLOG:
+ case ISD::FLOG10:
+ return LowerFLOG(Op, DAG);
case ISD::FSIN:
case ISD::FCOS:
return LowerTrig(Op, DAG);
@@ -3530,6 +3541,28 @@
}
}
+SDValue SITargetLowering::LowerFLOG(SDValue Op, SelectionDAG &DAG) const {
+ EVT VT = Op.getValueType();
+
+ SDLoc SL(Op);
+ SDValue Operand = Op.getOperand(0);
+
+ SDValue Log2Operand = DAG.getNode(ISD::FLOG2, SL, VT, Operand);
+ SDValue Log2Base;
+ switch (Op.getOpcode()) {
+ case ISD::FLOG:
+ Log2Base = DAG.getConstantFP(M_LOG2E_F, SL, VT);
+ break;
+ case ISD::FLOG10:
+ Log2Base = DAG.getConstantFP(M_LN10_F / M_LN2_F, SL, VT);
+ break;
+ default:
+ llvm_unreachable("Wrong log opcode");
+ }
+
+ return DAG.getNode(ISD::FDIV, SL, VT, Log2Operand, Log2Base);
+}
+
SDValue SITargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
SDLoc DL(Op);
EVT VT = Op.getValueType();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29942.88557.patch
Type: text/x-patch
Size: 2939 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170215/d03c67ee/attachment.bin>
More information about the llvm-commits
mailing list