[llvm] [Mips] Set custom lowering for STRICT_FSETCC/STRICT_FSETCCS ops. (PR #168303)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 16 16:36:18 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-mips
Author: Erik Enikeev (Varnike)
<details>
<summary>Changes</summary>
---
Patch is 24.41 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/168303.diff
3 Files Affected:
- (modified) llvm/lib/Target/Mips/MipsISelLowering.cpp (+27-1)
- (modified) llvm/lib/Target/Mips/MipsISelLowering.h (+1)
- (added) llvm/test/CodeGen/Mips/fp-strict-intrinsics.ll (+586)
``````````diff
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp
index 2fd73275721b1..2bbc60c068108 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp
@@ -357,6 +357,11 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom);
setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
+ setOperationAction(ISD::STRICT_FSETCC, MVT::f32, Custom);
+ setOperationAction(ISD::STRICT_FSETCCS, MVT::f32, Custom);
+ setOperationAction(ISD::STRICT_FSETCC, MVT::f64, Custom);
+ setOperationAction(ISD::STRICT_FSETCCS, MVT::f64, Custom);
+
if (Subtarget.hasMips32r2() ||
getTargetMachine().getTargetTriple().isOSLinux())
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom);
@@ -661,7 +666,8 @@ static bool invertFPCondCodeUser(Mips::CondCode CC) {
// Returns Op if setcc is not a floating point comparison.
static SDValue createFPCmp(SelectionDAG &DAG, const SDValue &Op) {
// must be a SETCC node
- if (Op.getOpcode() != ISD::SETCC)
+ if (Op.getOpcode() != ISD::SETCC && Op.getOpcode() != ISD::STRICT_FSETCC
+ && Op.getOpcode() != ISD::STRICT_FSETCCS)
return Op;
SDValue LHS = Op.getOperand(0);
@@ -1338,6 +1344,8 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
case ISD::JumpTable: return lowerJumpTable(Op, DAG);
case ISD::SELECT: return lowerSELECT(Op, DAG);
case ISD::SETCC: return lowerSETCC(Op, DAG);
+ case ISD::STRICT_FSETCC:
+ case ISD::STRICT_FSETCCS: return lowerFSETCC(Op, DAG);
case ISD::VASTART: return lowerVASTART(Op, DAG);
case ISD::VAARG: return lowerVAARG(Op, DAG);
case ISD::FCOPYSIGN: return lowerFCOPYSIGN(Op, DAG);
@@ -2227,6 +2235,24 @@ SDValue MipsTargetLowering::lowerSETCC(SDValue Op, SelectionDAG &DAG) const {
return createCMovFP(DAG, Cond, True, False, DL);
}
+SDValue MipsTargetLowering::lowerFSETCC(SDValue Op, SelectionDAG &DAG) const {
+ assert(!Subtarget.hasMips32r6() && !Subtarget.hasMips64r6());
+
+ SDLoc DL(Op);
+ SDValue Chain = Op.getOperand(0);
+ SDValue LHS = Op.getOperand(1);
+ SDValue RHS = Op.getOperand(2);
+ ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(3))->get();
+
+ SDValue Cond = DAG.getNode(MipsISD::FPCmp, DL, MVT::Glue, LHS, RHS,
+ DAG.getConstant(condCodeToFCC(CC), DL, MVT::i32));
+ SDValue True = DAG.getConstant(1, DL, MVT::i32);
+ SDValue False = DAG.getConstant(0, DL, MVT::i32);
+ SDValue CMovFP = createCMovFP(DAG, Cond, True, False, DL);
+
+ return DAG.getMergeValues({CMovFP, Chain}, DL);
+}
+
SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
SelectionDAG &DAG) const {
EVT Ty = Op.getValueType();
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h
index 25a0bf9b797d5..68f62bb3d375e 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.h
+++ b/llvm/lib/Target/Mips/MipsISelLowering.h
@@ -572,6 +572,7 @@ class TargetRegisterClass;
SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
+ SDValue lowerFSETCC(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerVAARG(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
diff --git a/llvm/test/CodeGen/Mips/fp-strict-intrinsics.ll b/llvm/test/CodeGen/Mips/fp-strict-intrinsics.ll
new file mode 100644
index 0000000000000..5decd9c424f70
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/fp-strict-intrinsics.ll
@@ -0,0 +1,586 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=mips -mcpu=mips32r2 < %s | FileCheck %s
+
+define i32 @fcmp_olt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_olt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ole_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ole_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ogt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ogt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_oge_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_oge_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_oeq_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_oeq_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_one_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_one_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ult_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ult_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ule_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ule_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ugt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ugt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_uge_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_uge_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ueq_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_ueq_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_une_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmp_une_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_olt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_olt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ole_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ole_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ogt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ogt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_oge_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_oge_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_oeq_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_oeq_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_one_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_one_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ult_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ult_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ule_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ule_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ugt_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ugt_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_uge_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_uge_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ueq_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_ueq_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_une_f32(float %a, float %b) #0 {
+; CHECK-LABEL: fcmps_une_f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.s $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_olt_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_olt_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ole_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ole_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ogt_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ogt_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_oge_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_oge_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_oeq_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_oeq_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_one_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_one_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ult_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ult_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ult.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ule_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ule_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ugt_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ugt_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_uge_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_uge_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_ueq_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_ueq_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ueq.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmp_une_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmp_une_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.eq.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movt $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_olt_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmps_olt_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.olt.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ole_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmps_ole_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ole.d $f12, $f14
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: movf $2, $zero, $fcc0
+ %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") #0
+ %conv = zext i1 %cmp to i32
+ ret i32 %conv
+}
+
+define i32 @fcmps_ogt_f64(double %a, double %b) #0 {
+; CHECK-LABEL: fcmps_ogt_f64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $2, $zero, 1
+; CHECK-NEXT: c.ule.d $f12, $f1...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/168303
More information about the llvm-commits
mailing list