Skip to content

Commit

Permalink
Enable roundeven.
Browse files Browse the repository at this point in the history
Add support for roundeven and implement appropriate tests.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D137954
  • Loading branch information
Leon Clark committed Dec 20, 2022
1 parent d73383c commit daa022c
Show file tree
Hide file tree
Showing 3 changed files with 632 additions and 0 deletions.
11 changes: 11 additions & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
Expand Up @@ -332,6 +332,8 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(const TargetMachine &TM,

setOperationAction(ISD::FNEARBYINT, {MVT::f16, MVT::f32, MVT::f64}, Custom);

setOperationAction(ISD::FROUNDEVEN, {MVT::f16, MVT::f32, MVT::f64}, Custom);

setOperationAction(ISD::FREM, {MVT::f16, MVT::f32, MVT::f64}, Custom);

if (Subtarget->has16BitInsts())
Expand Down Expand Up @@ -1252,6 +1254,8 @@ SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op,
case ISD::FTRUNC: return LowerFTRUNC(Op, DAG);
case ISD::FRINT: return LowerFRINT(Op, DAG);
case ISD::FNEARBYINT: return LowerFNEARBYINT(Op, DAG);
case ISD::FROUNDEVEN:
return LowerFROUNDEVEN(Op, DAG);
case ISD::FROUND: return LowerFROUND(Op, DAG);
case ISD::FFLOOR: return LowerFFLOOR(Op, DAG);
case ISD::FLOG:
Expand Down Expand Up @@ -2244,6 +2248,13 @@ SDValue AMDGPUTargetLowering::LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) con
return DAG.getNode(ISD::FRINT, SDLoc(Op), Op.getValueType(), Op.getOperand(0));
}

SDValue AMDGPUTargetLowering::LowerFROUNDEVEN(SDValue Op,
SelectionDAG &DAG) const {
auto VT = Op.getValueType();
auto Arg = Op.getOperand(0u);
return DAG.getNode(ISD::FRINT, SDLoc(Op), VT, Arg);
}

// XXX - May require not supporting f32 denormals?

// Don't handle v2f16. The extra instructions to scalarize and repack around the
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUISelLowering.h
Expand Up @@ -57,6 +57,7 @@ class AMDGPUTargetLowering : public TargetLowering {
SDValue LowerFRINT(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) const;

SDValue LowerFROUNDEVEN(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerFLOG(SDValue Op, SelectionDAG &DAG,
Expand Down

0 comments on commit daa022c

Please sign in to comment.