Skip to content

Commit eed4fd2

Browse files
committed
Move into AArch64ISD::FCVTZ[S|U]_HALF
1 parent 0d35d2d commit eed4fd2

File tree

3 files changed

+34
-15
lines changed

3 files changed

+34
-15
lines changed

llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ class AArch64DAGToDAGISel : public SelectionDAGISel {
424424
void SelectPostStoreLane(SDNode *N, unsigned NumVecs, unsigned Opc);
425425
void SelectPredicatedStore(SDNode *N, unsigned NumVecs, unsigned Scale,
426426
unsigned Opc_rr, unsigned Opc_ri);
427+
void SelectFCVT_FPTOINT_Half(SDNode *N, unsigned Opc);
427428
std::tuple<unsigned, SDValue, SDValue>
428429
findAddrModeSVELoadStore(SDNode *N, unsigned Opc_rr, unsigned Opc_ri,
429430
const SDValue &OldBase, const SDValue &OldOffset,
@@ -2536,6 +2537,25 @@ void AArch64DAGToDAGISel::SelectPostStoreLane(SDNode *N, unsigned NumVecs,
25362537
ReplaceNode(N, St);
25372538
}
25382539

2540+
// Select f16 -> i16 conversions
2541+
// Since i16 is an illegal type, they need to return an i32 result
2542+
void AArch64DAGToDAGISel::SelectFCVT_FPTOINT_Half(SDNode *N, unsigned int Opc) {
2543+
SDLoc DL(N);
2544+
SDValue SrcVal = N->getOperand(0);
2545+
SDNode *Cvt = CurDAG->getMachineNode(Opc, DL, MVT::f16, SrcVal);
2546+
SDValue Sign = CurDAG->getTargetConstant(-1, DL, MVT::i64);
2547+
SDValue Hsub = CurDAG->getTargetConstant(AArch64::hsub, DL, MVT::i32);
2548+
SDNode *SubregToReg = CurDAG->getMachineNode(
2549+
TargetOpcode::SUBREG_TO_REG, DL, MVT::v8f16, Sign, SDValue(Cvt, 0), Hsub);
2550+
SDValue Ssub = CurDAG->getTargetConstant(AArch64::ssub, DL, MVT::i32);
2551+
SDNode *Extract =
2552+
CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL, MVT::f32,
2553+
SDValue(SubregToReg, 0), Ssub);
2554+
SDNode *Result = CurDAG->getMachineNode(AArch64::FMOVSWr, DL, MVT::i32,
2555+
SDValue(Extract, 0));
2556+
ReplaceNode(N, Result);
2557+
}
2558+
25392559
static bool isBitfieldExtractOpFromAnd(SelectionDAG *CurDAG, SDNode *N,
25402560
unsigned &Opc, SDValue &Opd0,
25412561
unsigned &LSB, unsigned &MSB,
@@ -7359,6 +7379,14 @@ void AArch64DAGToDAGISel::Select(SDNode *Node) {
73597379
}
73607380
break;
73617381
}
7382+
case AArch64ISD::FCVTZS_HALF: {
7383+
SelectFCVT_FPTOINT_Half(Node, AArch64::FCVTZSv1f16);
7384+
return;
7385+
}
7386+
case AArch64ISD::FCVTZU_HALF: {
7387+
SelectFCVT_FPTOINT_Half(Node, AArch64::FCVTZUv1f16);
7388+
return;
7389+
}
73627390
}
73637391

73647392
// Select the default instruction

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4912,21 +4912,9 @@ SDValue AArch64TargetLowering::LowerFP_TO_INT_SAT(SDValue Op,
49124912
return SDValue();
49134913

49144914
if (SrcVT == MVT::f16 && SatVT == MVT::i16 && DstVT == MVT::i32) {
4915-
auto Opcode = (Op.getOpcode() == ISD::FP_TO_SINT_SAT)
4916-
? AArch64::FCVTZSv1f16
4917-
: AArch64::FCVTZUv1f16;
4918-
auto Cvt = SDValue(DAG.getMachineNode(Opcode, DL, MVT::f16, SrcVal), 0);
4919-
auto Sign = DAG.getTargetConstant(-1, DL, MVT::i64);
4920-
auto Hsub = DAG.getTargetConstant(AArch64::hsub, DL, MVT::i32);
4921-
auto SubregToReg =
4922-
SDValue(DAG.getMachineNode(TargetOpcode::SUBREG_TO_REG, DL, MVT::v8f16,
4923-
Sign, Cvt, Hsub),
4924-
0);
4925-
auto Ssub = DAG.getTargetConstant(AArch64::ssub, DL, MVT::i32);
4926-
auto Extract = SDValue(DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
4927-
MVT::f32, SubregToReg, Ssub),
4928-
0);
4929-
return DAG.getBitcast(MVT::i32, Extract);
4915+
if (Op.getOpcode() == ISD::FP_TO_SINT_SAT)
4916+
return DAG.getNode(AArch64ISD::FCVTZS_HALF, DL, DstVT, SrcVal);
4917+
return DAG.getNode(AArch64ISD::FCVTZU_HALF, DL, DstVT, SrcVal);
49304918
}
49314919

49324920
SDValue NativeCvt =

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,9 @@ def AArch64fcvtxnv: PatFrags<(ops node:$Rn),
989989
[(int_aarch64_neon_fcvtxn node:$Rn),
990990
(AArch64fcvtxn_n node:$Rn)]>;
991991

992+
def AArch64fcvtzs_half : SDNode<"AArch64ISD::FCVTZS_HALF", SDTFPToIntOp>;
993+
def AArch64fcvtzu_half : SDNode<"AArch64ISD::FCVTZU_HALF", SDTFPToIntOp>;
994+
992995
//def Aarch64softf32tobf16v8: SDNode<"AArch64ISD::", SDTFPRoundOp>;
993996

994997
// Vector immediate ops

0 commit comments

Comments
 (0)