// Lower to the GORCI encoding for orc.b with the operand extended.
SDValue NewOp =
DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(1));
- SDValue Res = DAG.getNode(RISCVISD::GORCI, DL, MVT::i64, NewOp,
+ // If Zbp is enabled, use GORCIW which will sign extend the result.
+ unsigned Opc =
+ Subtarget.hasStdExtZbp() ? RISCVISD::GORCIW : RISCVISD::GORCI;
+ SDValue Res = DAG.getNode(Opc, DL, MVT::i64, NewOp,
DAG.getTargetConstant(7, DL, MVT::i64));
Results.push_back(DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Res));
return;
define signext i32 @orcb32(i32 signext %a) nounwind {
; RV64IB-LABEL: orcb32:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: orc.b a0, a0
-; RV64IB-NEXT: sext.w a0, a0
+; RV64IB-NEXT: gorciw a0, a0, 7
; RV64IB-NEXT: ret
;
; RV64IBB-LABEL: orcb32: