[llvm] [Xtensa] Implement lowering SELECT_CC/BRCC for Xtensa FP Option. (PR #145544)
Andrei Safronov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 27 07:02:44 PDT 2025
================
@@ -841,21 +847,94 @@ static unsigned getBranchOpcode(ISD::CondCode Cond) {
}
}
+static void GetFPBranchKind(ISD::CondCode Cond, unsigned &BrKind,
+ unsigned &CmpKind) {
+ switch (Cond) {
+ case ISD::SETUNE:
+ BrKind = Xtensa::BF;
+ CmpKind = Xtensa::OEQ_S;
+ break;
+ case ISD::SETUO:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::UN_S;
+ break;
+ case ISD::SETO:
+ BrKind = Xtensa::BF;
+ CmpKind = Xtensa::UN_S;
+ break;
+ case ISD::SETUEQ:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::UEQ_S;
+ break;
+ case ISD::SETULE:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::ULE_S;
+ break;
+ case ISD::SETULT:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::ULT_S;
+ break;
+ case ISD::SETEQ:
+ case ISD::SETOEQ:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::OEQ_S;
+ break;
+ case ISD::SETNE:
+ BrKind = Xtensa::BF;
+ CmpKind = Xtensa::OEQ_S;
+ break;
+ case ISD::SETLE:
+ case ISD::SETOLE:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::OLE_S;
+ break;
+ case ISD::SETLT:
+ case ISD::SETOLT:
+ BrKind = Xtensa::BT;
+ CmpKind = Xtensa::OLT_S;
+ break;
+ case ISD::SETGE:
+ BrKind = Xtensa::BF;
+ CmpKind = Xtensa::OLT_S;
+ break;
+ case ISD::SETGT:
+ BrKind = Xtensa::BF;
+ CmpKind = Xtensa::OLE_S;
+ break;
+ default:
+ llvm_unreachable("Invalid condition!");
+ break;
+ }
+}
+
SDValue XtensaTargetLowering::LowerSELECT_CC(SDValue Op,
SelectionDAG &DAG) const {
SDLoc DL(Op);
- EVT Ty = Op.getOperand(0).getValueType();
+ EVT Ty = Op.getValueType();
SDValue LHS = Op.getOperand(0);
SDValue RHS = Op.getOperand(1);
SDValue TrueValue = Op.getOperand(2);
SDValue FalseValue = Op.getOperand(3);
ISD::CondCode CC = cast<CondCodeSDNode>(Op->getOperand(4))->get();
- unsigned BrOpcode = getBranchOpcode(CC);
- SDValue TargetCC = DAG.getConstant(BrOpcode, DL, MVT::i32);
+ if (LHS.getValueType() == MVT::i32) {
+ unsigned BrOpcode = getBranchOpcode(CC);
+ SDValue TargetCC = DAG.getConstant(BrOpcode, DL, MVT::i32);
- return DAG.getNode(XtensaISD::SELECT_CC, DL, Ty, LHS, RHS, TrueValue,
- FalseValue, TargetCC);
+ SDValue Res = DAG.getNode(XtensaISD::SELECT_CC, DL, Ty, LHS, RHS, TrueValue,
+ FalseValue, TargetCC);
----------------
andreisfr wrote:
Fixed, I hope I understood your suggestion correctly.
https://github.com/llvm/llvm-project/pull/145544
More information about the llvm-commits
mailing list