Skip to content

Commit 73a183f

Browse files
committed
fptrunc in true16
1 parent 3275291 commit 73a183f

File tree

5 files changed

+739
-361
lines changed

5 files changed

+739
-361
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3579,15 +3579,22 @@ SDValue AMDGPUTargetLowering::LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) con
35793579
return SDValue();
35803580
}
35813581

3582-
assert(N0.getSimpleValueType() == MVT::f64);
3582+
return LowerF64ToF16Safe(N0, DL, DAG);
3583+
}
3584+
3585+
// return node in i32
3586+
SDValue AMDGPUTargetLowering::LowerF64ToF16Safe(SDValue Src, const SDLoc &DL,
3587+
SelectionDAG &DAG) const {
3588+
assert(Src.getSimpleValueType() == MVT::f64);
35833589

35843590
// f64 -> f16 conversion using round-to-nearest-even rounding mode.
3591+
// TODO: We can generate better code for True16.
35853592
const unsigned ExpMask = 0x7ff;
35863593
const unsigned ExpBiasf64 = 1023;
35873594
const unsigned ExpBiasf16 = 15;
35883595
SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
35893596
SDValue One = DAG.getConstant(1, DL, MVT::i32);
3590-
SDValue U = DAG.getNode(ISD::BITCAST, DL, MVT::i64, N0);
3597+
SDValue U = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Src);
35913598
SDValue UH = DAG.getNode(ISD::SRL, DL, MVT::i64, U,
35923599
DAG.getConstant(32, DL, MVT::i64));
35933600
UH = DAG.getZExtOrTrunc(UH, DL, MVT::i32);
@@ -3661,8 +3668,7 @@ SDValue AMDGPUTargetLowering::LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) con
36613668
Sign = DAG.getNode(ISD::AND, DL, MVT::i32, Sign,
36623669
DAG.getConstant(0x8000, DL, MVT::i32));
36633670

3664-
V = DAG.getNode(ISD::OR, DL, MVT::i32, Sign, V);
3665-
return DAG.getZExtOrTrunc(V, DL, Op.getValueType());
3671+
return DAG.getNode(ISD::OR, DL, MVT::i32, Sign, V);
36663672
}
36673673

36683674
SDValue AMDGPUTargetLowering::LowerFP_TO_INT(const SDValue Op,

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ class AMDGPUTargetLowering : public TargetLowering {
9797
SDValue LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const;
9898
SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
9999

100+
SDValue LowerF64ToF16Safe(SDValue Src, const SDLoc &DL,
101+
SelectionDAG &DAG) const;
102+
100103
SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
101104

102105
protected:

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6903,7 +6903,17 @@ SDValue SITargetLowering::lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
69036903
if (Op.getOpcode() != ISD::FP_ROUND)
69046904
return Op;
69056905

6906-
SDValue FpToFp16 = DAG.getNode(ISD::FP_TO_FP16, DL, MVT::i32, Src);
6906+
if (!Subtarget->has16BitInsts()) {
6907+
SDValue FpToFp16 = DAG.getNode(ISD::FP_TO_FP16, DL, MVT::i32, Src);
6908+
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, FpToFp16);
6909+
return DAG.getNode(ISD::BITCAST, DL, MVT::f16, Trunc);
6910+
}
6911+
if (getTargetMachine().Options.UnsafeFPMath) {
6912+
SDValue Flags = Op.getOperand(1);
6913+
SDValue Src32 = DAG.getNode(ISD::FP_ROUND, DL, MVT::f32, Src, Flags);
6914+
return DAG.getNode(ISD::FP_ROUND, DL, MVT::f16, Src32, Flags);
6915+
}
6916+
SDValue FpToFp16 = LowerF64ToF16Safe(Src, DL, DAG);
69076917
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, FpToFp16);
69086918
return DAG.getNode(ISD::BITCAST, DL, MVT::f16, Trunc);
69096919
}

0 commit comments

Comments
 (0)