[llvm] [AArch64][SDAG] Lower f16->s16 FP_TO_INT_SAT to *v1f16 (PR #154822)
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 27 14:28:53 PDT 2025
================
@@ -2536,6 +2537,24 @@ void AArch64DAGToDAGISel::SelectPostStoreLane(SDNode *N, unsigned NumVecs,
ReplaceNode(N, St);
}
+// Select f16 -> i16 conversions
+// Since i16 is an illegal type, we return the converted bit pattern in a f32
+// which can then be bitcast to i32 and truncated as needed.
+void AArch64DAGToDAGISel::SelectFCVT_FPTOINT_Half(SDNode *N, unsigned int Opc) {
+ SDLoc DL(N);
+ SDValue SrcVal = N->getOperand(0);
+ SDNode *Cvt = CurDAG->getMachineNode(Opc, DL, MVT::f16, SrcVal);
+ SDValue Sign = CurDAG->getTargetConstant(-1, DL, MVT::i64);
+ SDValue Hsub = CurDAG->getTargetConstant(AArch64::hsub, DL, MVT::i32);
+ SDNode *SubregToReg = CurDAG->getMachineNode(
+ TargetOpcode::SUBREG_TO_REG, DL, MVT::v8f16, Sign, SDValue(Cvt, 0), Hsub);
+ SDValue Ssub = CurDAG->getTargetConstant(AArch64::ssub, DL, MVT::i32);
+ SDNode *Extract =
+ CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL, MVT::f32,
+ SDValue(SubregToReg, 0), Ssub);
----------------
efriedma-quic wrote:
Can you write this as a TableGen pattern, instead of C++ code? (We normally prefer TableGen if possible.)
https://github.com/llvm/llvm-project/pull/154822
More information about the llvm-commits
mailing list