[llvm-branch-commits] [llvm] [LoongArch] Lower FP_TO_SINT_SAT to [X]VFTINTRZ/FTINTRZ (PR #233760)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Oct 20 02:29:50 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: hev (heiher)
<details>
<summary>Changes</summary>
The ftintrz.{w,l}.{s,d} and [x]vftintrz.{w.s,l.d} instructions saturate out-of-range inputs to the minimum/maximum integer and convert NaN to 0 (when the invalid operation exception is not trapped), which matches the semantics of llvm.fptosi.sat when the saturation width is the native 32/64 bits. This was verified on LA664 for all scalar, LSX and LASX variants and matches QEMU's LoongArch model. Use them instead of the generic expansion, which emits three compares and selects per element and fully scalarizes vectors.
Also override shouldConvertFpToSat so DAGCombiner only folds min/max clamps and NaN-guarded selects into FP_TO_SINT_SAT when that lowers to a single ftintrz, avoiding the generic expansion for mismatched vector element widths and for i64 results without the D extension.
This is what Rust emits for `f32 as i32`. rustc-perf svg-render-1 on LA664: instructions -6.4%, cycles -4.0%.
---
Patch is 59.73 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/233760.diff
7 Files Affected:
- (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+58)
- (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.h (+3)
- (modified) llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td (+2)
- (modified) llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td (+2)
- (modified) llvm/test/CodeGen/LoongArch/fptosi-sat.ll (+16-167)
- (modified) llvm/test/CodeGen/LoongArch/lasx/fptosi-sat.ll (+44-614)
- (modified) llvm/test/CodeGen/LoongArch/lsx/fptosi-sat.ll (+33-347)
``````````diff
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 1d01e76a5ebd2d..700b1a07b718c6 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -111,6 +111,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::SRA_PARTS, GRLenVT, Custom);
setOperationAction(ISD::SRL_PARTS, GRLenVT, Custom);
setOperationAction(ISD::FP_TO_SINT, GRLenVT, Custom);
+ if (Subtarget.hasBasicF())
+ setOperationAction(ISD::FP_TO_SINT_SAT, GRLenVT, Custom);
setOperationAction(ISD::ROTL, GRLenVT, Expand);
setOperationAction(ISD::CTPOP, GRLenVT, Expand);
@@ -364,6 +366,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
for (MVT VT : {MVT::v4i32, MVT::v2i64}) {
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP}, VT, Legal);
setOperationAction({ISD::FP_TO_SINT, ISD::FP_TO_UINT}, VT, Legal);
+ setOperationAction(ISD::FP_TO_SINT_SAT, VT, Custom);
}
setOperationAction(ISD::UINT_TO_FP, GRLenVT, Custom);
for (MVT VT : {MVT::v4f32, MVT::v2f64}) {
@@ -464,6 +467,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::BITREVERSE, VT, Custom);
for (MVT VT : {MVT::v16i16, MVT::v8i32, MVT::v4i64})
setOperationAction(ISD::BSWAP, VT, Legal);
+ for (MVT VT : {MVT::v8i32, MVT::v4i64})
+ setOperationAction(ISD::FP_TO_SINT_SAT, VT, Custom);
for (MVT VT : {MVT::v8i32, MVT::v4i32, MVT::v4i64}) {
setOperationAction({ISD::FP_TO_SINT, ISD::FP_TO_UINT}, VT, Legal);
setOperationAction(ISD::SINT_TO_FP, VT, Legal);
@@ -619,6 +624,8 @@ SDValue LoongArchTargetLowering::LowerOperation(SDValue Op,
return lowerFP_TO_SINT(Op, DAG);
case ISD::FP_TO_UINT:
return lowerFP_TO_UINT(Op, DAG);
+ case ISD::FP_TO_SINT_SAT:
+ return lowerFP_TO_SINT_SAT(Op, DAG);
case ISD::BITCAST:
return lowerBITCAST(Op, DAG);
case ISD::UINT_TO_FP:
@@ -4381,6 +4388,43 @@ SDValue LoongArchTargetLowering::lowerFP_TO_SINT(SDValue Op,
return DAG.getNode(ISD::BITCAST, DL, Op.getValueType(), Trunc);
}
+// [X]VFTINTRZ and FTINTRZ saturate out-of-range values and convert NaN to 0,
+// which is exactly the semantics of FP_TO_SINT_SAT with a native saturation
+// width.
+SDValue LoongArchTargetLowering::lowerFP_TO_SINT_SAT(SDValue Op,
+ SelectionDAG &DAG) const {
+ SDLoc DL(Op);
+ SDValue Src = Op.getOperand(0);
+ EVT VT = Op.getValueType();
+ EVT SrcVT = Src.getValueType();
+ unsigned SatWidth = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
+
+ // Vectors are selected by patterns.
+ if (VT.isVector()) {
+ if (SatWidth == VT.getScalarSizeInBits() &&
+ SatWidth == SrcVT.getScalarSizeInBits())
+ return Op;
+ return SDValue();
+ }
+
+ if (SrcVT != MVT::f32 && SrcVT != MVT::f64)
+ return SDValue();
+
+ if (SatWidth == 32) {
+ SDValue Ftint = DAG.getNode(LoongArchISD::FTINT, DL, MVT::f32, Src);
+ if (Subtarget.is64Bit())
+ return DAG.getNode(LoongArchISD::MOVFR2GR_S_LA64, DL, VT, Ftint);
+ return DAG.getBitcast(VT, Ftint);
+ }
+
+ if (SatWidth == 64 && Subtarget.is64Bit() && Subtarget.hasBasicD()) {
+ SDValue Ftint = DAG.getNode(LoongArchISD::FTINT, DL, MVT::f64, Src);
+ return DAG.getBitcast(VT, Ftint);
+ }
+
+ return SDValue();
+}
+
SDValue LoongArchTargetLowering::lowerFP_TO_UINT(SDValue Op,
SelectionDAG &DAG) const {
if (!Subtarget.hasExtLSX())
@@ -11018,6 +11062,20 @@ bool LoongArchTargetLowering::isFPImmVLDILegal(const APFloat &Imm,
return false;
}
+// Only form FP_TO_SINT_SAT from clamp/NaN-guard idioms when it will be lowered
+// to a single [X]VFTINTRZ/FTINTRZ, otherwise the generic expansion is worse
+// than the original sequence.
+bool LoongArchTargetLowering::shouldConvertFpToSat(unsigned Op, EVT FPVT,
+ EVT VT) const {
+ if (!isOperationLegalOrCustom(Op, VT))
+ return false;
+ if (VT.isVector())
+ return FPVT.getScalarSizeInBits() == VT.getScalarSizeInBits();
+ if (FPVT == MVT::f32)
+ return VT.getSizeInBits() == 32 || Subtarget.hasBasicD();
+ return FPVT == MVT::f64 && Subtarget.hasBasicD();
+}
+
bool LoongArchTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
bool ForCodeSize) const {
// TODO: Maybe need more checks here after vector extension is supported.
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
index 7c3ae7d6aac14a..ee66fb191c2429 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
@@ -229,6 +229,7 @@ class LoongArchTargetLowering : public TargetLowering {
SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
+ SDValue lowerFP_TO_SINT_SAT(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
@@ -269,6 +270,8 @@ class LoongArchTargetLowering : public TargetLowering {
bool isFPImmLegal(const APFloat &Imm, EVT VT,
bool ForCodeSize) const override;
+ bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override;
+
bool shouldInsertFencesForAtomic(const Instruction *I) const override;
ConstraintType getConstraintType(StringRef Constraint) const override;
diff --git a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
index fcd134770332de..690fe4afff212a 100644
--- a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
@@ -2193,6 +2193,8 @@ def : Pat<(v8f32 (loongarch_vffint_s_l (v4i64 LASX256:$xj), (v4i64 LASX256:$xk))
// XVFTINTRZ_{W_S/L_D}
def : Pat<(v8i32 (fp_to_sint v8f32:$vj)), (XVFTINTRZ_W_S v8f32:$vj)>;
def : Pat<(v4i64 (fp_to_sint v4f64:$vj)), (XVFTINTRZ_L_D v4f64:$vj)>;
+def : Pat<(v8i32 (fp_to_sint_sat v8f32:$vj, i32)), (XVFTINTRZ_W_S v8f32:$vj)>;
+def : Pat<(v4i64 (fp_to_sint_sat v4f64:$vj, i64)), (XVFTINTRZ_L_D v4f64:$vj)>;
def : Pat<(v4i64 (fp_to_sint v4f32:$vj)),
(XVFTINTRZL_L_S
(XVPERMI_D (SUBREG_TO_REG v4f32:$vj, sub_128), 216))>;
diff --git a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
index e1489f9e36d69b..d6eb050de12776 100644
--- a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
@@ -2412,6 +2412,8 @@ def : Pat<(v4f32 (loongarch_vffint_s_l (v2i64 LSX128:$vj), (v2i64 LSX128:$vk))),
// VFTINTRZ_{W_S/L_D}
def : Pat<(v4i32 (fp_to_sint v4f32:$vj)), (VFTINTRZ_W_S v4f32:$vj)>;
def : Pat<(v2i64 (fp_to_sint v2f64:$vj)), (VFTINTRZ_L_D v2f64:$vj)>;
+def : Pat<(v4i32 (fp_to_sint_sat v4f32:$vj, i32)), (VFTINTRZ_W_S v4f32:$vj)>;
+def : Pat<(v2i64 (fp_to_sint_sat v2f64:$vj, i64)), (VFTINTRZ_L_D v2f64:$vj)>;
// VFTINTRZ_{W_SU/L_DU}
def : Pat<(v4i32 (fp_to_uint v4f32:$vj)), (VFTINTRZ_WU_S v4f32:$vj)>;
diff --git a/llvm/test/CodeGen/LoongArch/fptosi-sat.ll b/llvm/test/CodeGen/LoongArch/fptosi-sat.ll
index 96c563a48ef000..73889aed522c2f 100644
--- a/llvm/test/CodeGen/LoongArch/fptosi-sat.ll
+++ b/llvm/test/CodeGen/LoongArch/fptosi-sat.ll
@@ -141,110 +141,26 @@ entry:
define i32 @fptosi_sat_f32_to_i32(float %a) nounwind {
; LA32F-LABEL: fptosi_sat_f32_to_i32:
; LA32F: # %bb.0: # %entry
-; LA32F-NEXT: lu12i.w $a0, -200704
-; LA32F-NEXT: movgr2fr.w $fa1, $a0
-; LA32F-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
-; LA32F-NEXT: ftintrz.w.s $fa1, $fa0
-; LA32F-NEXT: movfr2gr.s $a0, $fa1
-; LA32F-NEXT: movcf2gr $a1, $fcc0
-; LA32F-NEXT: masknez $a0, $a0, $a1
-; LA32F-NEXT: lu12i.w $a2, -524288
-; LA32F-NEXT: maskeqz $a1, $a2, $a1
-; LA32F-NEXT: lu12i.w $a2, 323583
-; LA32F-NEXT: ori $a2, $a2, 4095
-; LA32F-NEXT: movgr2fr.w $fa1, $a2
-; LA32F-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
-; LA32F-NEXT: or $a0, $a1, $a0
-; LA32F-NEXT: movcf2gr $a1, $fcc0
-; LA32F-NEXT: masknez $a0, $a0, $a1
-; LA32F-NEXT: lu12i.w $a2, 524287
-; LA32F-NEXT: ori $a2, $a2, 4095
-; LA32F-NEXT: maskeqz $a1, $a2, $a1
-; LA32F-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
-; LA32F-NEXT: or $a0, $a1, $a0
-; LA32F-NEXT: movcf2gr $a1, $fcc0
-; LA32F-NEXT: masknez $a0, $a0, $a1
+; LA32F-NEXT: ftintrz.w.s $fa0, $fa0
+; LA32F-NEXT: movfr2gr.s $a0, $fa0
; LA32F-NEXT: ret
;
; LA32D-LABEL: fptosi_sat_f32_to_i32:
; LA32D: # %bb.0: # %entry
-; LA32D-NEXT: lu12i.w $a0, -200704
-; LA32D-NEXT: movgr2fr.w $fa1, $a0
-; LA32D-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
-; LA32D-NEXT: ftintrz.w.s $fa1, $fa0
-; LA32D-NEXT: movfr2gr.s $a0, $fa1
-; LA32D-NEXT: movcf2gr $a1, $fcc0
-; LA32D-NEXT: masknez $a0, $a0, $a1
-; LA32D-NEXT: lu12i.w $a2, -524288
-; LA32D-NEXT: maskeqz $a1, $a2, $a1
-; LA32D-NEXT: lu12i.w $a2, 323583
-; LA32D-NEXT: ori $a2, $a2, 4095
-; LA32D-NEXT: movgr2fr.w $fa1, $a2
-; LA32D-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
-; LA32D-NEXT: or $a0, $a1, $a0
-; LA32D-NEXT: movcf2gr $a1, $fcc0
-; LA32D-NEXT: masknez $a0, $a0, $a1
-; LA32D-NEXT: lu12i.w $a2, 524287
-; LA32D-NEXT: ori $a2, $a2, 4095
-; LA32D-NEXT: maskeqz $a1, $a2, $a1
-; LA32D-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
-; LA32D-NEXT: or $a0, $a1, $a0
-; LA32D-NEXT: movcf2gr $a1, $fcc0
-; LA32D-NEXT: masknez $a0, $a0, $a1
+; LA32D-NEXT: ftintrz.w.s $fa0, $fa0
+; LA32D-NEXT: movfr2gr.s $a0, $fa0
; LA32D-NEXT: ret
;
; LA64F-LABEL: fptosi_sat_f32_to_i32:
; LA64F: # %bb.0: # %entry
-; LA64F-NEXT: lu12i.w $a0, -200704
-; LA64F-NEXT: movgr2fr.w $fa1, $a0
-; LA64F-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
-; LA64F-NEXT: ftintrz.w.s $fa1, $fa0
-; LA64F-NEXT: movfr2gr.s $a0, $fa1
-; LA64F-NEXT: movcf2gr $a1, $fcc0
-; LA64F-NEXT: masknez $a0, $a0, $a1
-; LA64F-NEXT: lu12i.w $a2, -524288
-; LA64F-NEXT: maskeqz $a1, $a2, $a1
-; LA64F-NEXT: lu12i.w $a2, 323583
-; LA64F-NEXT: ori $a2, $a2, 4095
-; LA64F-NEXT: movgr2fr.w $fa1, $a2
-; LA64F-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
-; LA64F-NEXT: or $a0, $a1, $a0
-; LA64F-NEXT: movcf2gr $a1, $fcc0
-; LA64F-NEXT: masknez $a0, $a0, $a1
-; LA64F-NEXT: lu12i.w $a2, 524287
-; LA64F-NEXT: ori $a2, $a2, 4095
-; LA64F-NEXT: maskeqz $a1, $a2, $a1
-; LA64F-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
-; LA64F-NEXT: or $a0, $a1, $a0
-; LA64F-NEXT: movcf2gr $a1, $fcc0
-; LA64F-NEXT: masknez $a0, $a0, $a1
+; LA64F-NEXT: ftintrz.w.s $fa0, $fa0
+; LA64F-NEXT: movfr2gr.s $a0, $fa0
; LA64F-NEXT: ret
;
; LA64D-LABEL: fptosi_sat_f32_to_i32:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: lu12i.w $a0, -200704
-; LA64D-NEXT: movgr2fr.w $fa1, $a0
-; LA64D-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
-; LA64D-NEXT: ftintrz.l.s $fa1, $fa0
-; LA64D-NEXT: movfr2gr.d $a0, $fa1
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: lu12i.w $a2, -524288
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: lu12i.w $a2, 323583
-; LA64D-NEXT: ori $a2, $a2, 4095
-; LA64D-NEXT: movgr2fr.w $fa1, $a2
-; LA64D-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: lu12i.w $a2, 524287
-; LA64D-NEXT: ori $a2, $a2, 4095
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
+; LA64D-NEXT: ftintrz.w.s $fa0, $fa0
+; LA64D-NEXT: movfr2gr.s $a0, $fa0
; LA64D-NEXT: ret
entry:
%r = call i32 @llvm.fptosi.sat.i32.f32(float %a)
@@ -377,29 +293,8 @@ define i64 @fptosi_sat_f32_to_i64(float %a) nounwind {
;
; LA64D-LABEL: fptosi_sat_f32_to_i64:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: lu12i.w $a0, -135168
-; LA64D-NEXT: movgr2fr.w $fa1, $a0
-; LA64D-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
-; LA64D-NEXT: ftintrz.l.s $fa1, $fa0
-; LA64D-NEXT: movfr2gr.d $a0, $fa1
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: lu52i.d $a2, $zero, -2048
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: lu12i.w $a2, 389119
-; LA64D-NEXT: ori $a2, $a2, 4095
-; LA64D-NEXT: movgr2fr.w $fa1, $a2
-; LA64D-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: addi.w $a2, $zero, -1
-; LA64D-NEXT: lu52i.d $a2, $a2, 2047
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
+; LA64D-NEXT: ftintrz.l.s $fa0, $fa0
+; LA64D-NEXT: movfr2gr.d $a0, $fa0
; LA64D-NEXT: ret
entry:
%r = call i64 @llvm.fptosi.sat.i64.f32(float %a)
@@ -700,18 +595,8 @@ define i32 @fptosi_sat_f64_to_i32(double %a) nounwind {
;
; LA32D-LABEL: fptosi_sat_f64_to_i32:
; LA32D: # %bb.0: # %entry
-; LA32D-NEXT: movgr2fr.w $fa1, $zero
-; LA32D-NEXT: pcalau12i $a0, %pc_hi20(.LCPI6_0)
-; LA32D-NEXT: fld.d $fa2, $a0, %pc_lo12(.LCPI6_0)
-; LA32D-NEXT: lu12i.w $a0, -254464
-; LA32D-NEXT: movgr2frh.w $fa1, $a0
-; LA32D-NEXT: fmax.d $fa1, $fa0, $fa1
-; LA32D-NEXT: fmin.d $fa1, $fa1, $fa2
-; LA32D-NEXT: ftintrz.w.d $fa1, $fa1
-; LA32D-NEXT: fcmp.cun.d $fcc0, $fa0, $fa0
-; LA32D-NEXT: movfr2gr.s $a0, $fa1
-; LA32D-NEXT: movcf2gr $a1, $fcc0
-; LA32D-NEXT: masknez $a0, $a0, $a1
+; LA32D-NEXT: ftintrz.w.d $fa0, $fa0
+; LA32D-NEXT: movfr2gr.s $a0, $fa0
; LA32D-NEXT: ret
;
; LA64F-LABEL: fptosi_sat_f64_to_i32:
@@ -757,18 +642,8 @@ define i32 @fptosi_sat_f64_to_i32(double %a) nounwind {
;
; LA64D-LABEL: fptosi_sat_f64_to_i32:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: lu52i.d $a0, $zero, -994
-; LA64D-NEXT: movgr2fr.d $fa1, $a0
-; LA64D-NEXT: fmax.d $fa1, $fa0, $fa1
-; LA64D-NEXT: lu12i.w $a0, -1024
-; LA64D-NEXT: lu52i.d $a0, $a0, 1053
-; LA64D-NEXT: movgr2fr.d $fa2, $a0
-; LA64D-NEXT: fmin.d $fa1, $fa1, $fa2
-; LA64D-NEXT: ftintrz.l.d $fa1, $fa1
-; LA64D-NEXT: fcmp.cun.d $fcc0, $fa0, $fa0
-; LA64D-NEXT: movfr2gr.d $a0, $fa1
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
+; LA64D-NEXT: ftintrz.w.d $fa0, $fa0
+; LA64D-NEXT: movfr2gr.s $a0, $fa0
; LA64D-NEXT: ret
entry:
%r = call i32 @llvm.fptosi.sat.i32.f64(double %a)
@@ -928,28 +803,8 @@ define i64 @fptosi_sat_f64_to_i64(double %a) nounwind {
;
; LA64D-LABEL: fptosi_sat_f64_to_i64:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: lu52i.d $a0, $zero, -962
-; LA64D-NEXT: movgr2fr.d $fa1, $a0
-; LA64D-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1
-; LA64D-NEXT: ftintrz.l.d $fa1, $fa0
-; LA64D-NEXT: movfr2gr.d $a0, $fa1
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: lu52i.d $a2, $zero, -2048
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: addi.w $a2, $zero, -1
-; LA64D-NEXT: lu52i.d $a3, $a2, 1085
-; LA64D-NEXT: movgr2fr.d $fa1, $a3
-; LA64D-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
-; LA64D-NEXT: lu52i.d $a2, $a2, 2047
-; LA64D-NEXT: maskeqz $a1, $a2, $a1
-; LA64D-NEXT: fcmp.cun.d $fcc0, $fa0, $fa0
-; LA64D-NEXT: or $a0, $a1, $a0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
+; LA64D-NEXT: ftintrz.l.d $fa0, $fa0
+; LA64D-NEXT: movfr2gr.d $a0, $fa0
; LA64D-NEXT: ret
entry:
%r = call i64 @llvm.fptosi.sat.i64.f64(double %a)
@@ -1002,11 +857,8 @@ define i64 @fptosi_nanguard_f32_to_i64(float %a) nounwind {
;
; LA64D-LABEL: fptosi_nanguard_f32_to_i64:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: fcmp.cun.s $fcc0, $fa0, $fa0
; LA64D-NEXT: ftintrz.l.s $fa0, $fa0
; LA64D-NEXT: movfr2gr.d $a0, $fa0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
; LA64D-NEXT: ret
entry:
%c = fcmp uno float %a, 0.0
@@ -1081,11 +933,8 @@ define i64 @fptosi_nanguard_f64_to_i64(double %a) nounwind {
;
; LA64D-LABEL: fptosi_nanguard_f64_to_i64:
; LA64D: # %bb.0: # %entry
-; LA64D-NEXT: fcmp.cun.d $fcc0, $fa0, $fa0
; LA64D-NEXT: ftintrz.l.d $fa0, $fa0
; LA64D-NEXT: movfr2gr.d $a0, $fa0
-; LA64D-NEXT: movcf2gr $a1, $fcc0
-; LA64D-NEXT: masknez $a0, $a0, $a1
; LA64D-NEXT: ret
entry:
%c = fcmp uno double %a, 0.0
diff --git a/llvm/test/CodeGen/LoongArch/lasx/fptosi-sat.ll b/llvm/test/CodeGen/LoongArch/lasx/fptosi-sat.ll
index 3ee311b5fd7546..d5266e4c07981d 100644
--- a/llvm/test/CodeGen/LoongArch/lasx/fptosi-sat.ll
+++ b/llvm/test/CodeGen/LoongArch/lasx/fptosi-sat.ll
@@ -1,309 +1,14 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s --check-prefixes=LA32
-; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=LA64
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
define void @fptosi_sat_v8f32_to_v8i32(ptr %res, ptr %a) nounwind {
-; LA32-LABEL: fptosi_sat_v8f32_to_v8i32:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: xvld $xr0, $a1, 0
-; LA32-NEXT: xvpickve.w $xr3, $xr0, 5
-; LA32-NEXT: lu12i.w $a1, -200704
-; LA32-NEXT: movgr2fr.w $fa1, $a1
-; LA32-NEXT: fcmp.cult.s $fcc0, $fa3, $fa1
-; LA32-NEXT: lu12i.w $a1, -524288
-; LA32-NEXT: movcf2gr $a2, $fcc0
-; LA32-NEXT: maskeqz $a3, $a1, $a2
-; LA32-NEXT: ftintrz.w.s $fa2, $fa3
-; LA32-NEXT: movfr2gr.s $a4, $fa2
-; LA32-NEXT: masknez $a2, $a4, $a2
-; LA32-NEXT: lu12i.w $a4, 323583
-; LA32-NEXT: ori $a4, $a4, 4095
-; LA32-NEXT: movgr2fr.w $fa2, $a4
-; LA32-NEXT: fcmp.clt.s $fcc0, $fa2, $fa3
-; LA32-NEXT: or $a2, $a3, $a2
-; LA32-NEXT: movcf2gr $a3, $fcc0
-; LA32-NEXT: masknez $a4, $a2, $a3
-; LA32-NEXT: lu12i.w $a2, 524287
-; LA32-NEXT: ori $a2, $a2, 4095
-; LA32-NEXT: maskeqz $a3, $a2, $a3
-; LA32-NEXT: fcmp.cun.s $fcc0, $fa3, $fa3
-; LA32-NEXT: or $a3, $a3, $a4
-; LA32-NEXT: movcf2gr $a4, $fcc0
-; LA32-NEXT: xvpickve.w $xr3, $xr0, 4
-; LA32-NEXT: fcmp.cult.s $fcc0, $fa3, $fa1
-; LA32-NEXT: masknez $a3, $a3, $a4
-; LA32-NEXT: movcf2gr $a4, $fcc0
-; LA32-NEXT: maskeqz $a5, $a1, $a4
-; LA32-NEXT: ftintrz.w.s $fa4, $fa3
-; LA32-NEXT: movfr2gr.s $a6, $fa4
-; LA32-NEXT: masknez $a4, $a6, $a4
-; LA32-NEXT: fcmp.clt.s $fcc0, $fa2, $fa3
-; LA32-NEXT: or $a4, $a5, $a4
-; LA32-NEXT: movcf2gr $a5, $fcc0
-; LA32-NEXT: masknez $a4, $a4, $a5
-; LA32-NEXT: maskeqz $a5, $a2, $a5
-; LA32-NEXT: fcmp.cun.s $fcc0, $fa3, $fa3
-; LA32-NEXT: or $a4, $a5, $a4
-; LA32-NEXT: movcf2gr $a5, $fcc0
-; LA32-NEXT: masknez $a4, $a4, $a5
-; LA32-NEXT: vinsgr2vr.w $vr3, $a4, 0
-; LA32-NEXT: xvpickve.w $xr4, $xr0, 6
-; LA32-NEXT: fcmp.cult.s $fcc0, $fa4, $fa1
-; LA32-NEXT: vinsgr2vr.w $vr3, $a3, 1
-; LA32-NEXT: movcf2gr $a3, $fcc0
-; LA32-NEXT: maskeqz $a4, $a1, $a3
-; LA32-NEXT: ftintrz.w.s $fa5, $fa4
-; LA32-NEXT: movfr2gr.s $a5, $fa5
-; LA32-NEXT: masknez $a3, $a5, $a3
-; LA32-NEXT: fcmp.clt.s $fcc0, $fa2, $fa4
-; LA32-NEXT: or $a3, $a4, $a3
-; LA32-NEXT: movcf2gr $a4, $fcc0
-; LA32-NEXT: masknez $a3, $a3, $a4
-; LA32-NEXT: maskeqz $a4, $a2, $a4
-; LA32-NEXT: fcmp.cun.s $fcc0, $fa4, $fa4
-; LA32-NEXT: or $a3, $a4, $a3
-; LA32-NEXT: movcf2gr $a4, $fcc0
-; LA32-NEXT: masknez $a3, $a3, $a4
-; LA32-NEXT: xvpickve.w $xr4, $xr0, 7
-; LA32-NEXT: fcmp.cult.s $fcc0, $fa4, $fa1
-; LA32-NEXT: vinsgr2vr.w $vr3, $a3, 2
-; LA32-NEXT: movcf2gr $a3, $fcc0...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/233760
More information about the llvm-branch-commits
mailing list