Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2416,11 +2416,16 @@ unsigned RISCVTargetLowering::getVectorTypeBreakdownForCallingConv(
// with 1/-1.
static void translateSetCCForBranch(const SDLoc &DL, SDValue &LHS, SDValue &RHS,
ISD::CondCode &CC, SelectionDAG &DAG) {
const RISCVSubtarget &Subtarget =
DAG.getMachineFunction().getSubtarget<RISCVSubtarget>();

// If this is a single bit test that can't be handled by ANDI, shift the
// bit to be tested to the MSB and perform a signed compare with 0.
if (isIntEqualitySetCC(CC) && isNullConstant(RHS) &&
LHS.getOpcode() == ISD::AND && LHS.hasOneUse() &&
isa<ConstantSDNode>(LHS.getOperand(1))) {
isa<ConstantSDNode>(LHS.getOperand(1)) &&
// XAndesPerf supports branch on test bit.
!Subtarget.hasVendorXAndesPerf()) {
uint64_t Mask = LHS.getConstantOperandVal(1);
if ((isPowerOf2_64(Mask) || isMask_64(Mask)) && !isInt<12>(Mask)) {
unsigned ShAmt = 0;
Expand All @@ -2441,8 +2446,6 @@ static void translateSetCCForBranch(const SDLoc &DL, SDValue &LHS, SDValue &RHS,

if (auto *RHSC = dyn_cast<ConstantSDNode>(RHS)) {
int64_t C = RHSC->getSExtValue();
const RISCVSubtarget &Subtarget =
DAG.getMachineFunction().getSubtarget<RISCVSubtarget>();
switch (CC) {
default: break;
case ISD::SETGT:
Expand Down Expand Up @@ -18262,6 +18265,14 @@ static bool combine_CC(SDValue &LHS, SDValue &RHS, SDValue &CC, const SDLoc &DL,
uint64_t Mask = LHS0.getConstantOperandVal(1);
uint64_t ShAmt = LHS.getConstantOperandVal(1);
if (isPowerOf2_64(Mask) && Log2_64(Mask) == ShAmt) {
// XAndesPerf supports branch on test bit.
if (Subtarget.hasVendorXAndesPerf()) {
LHS =
DAG.getNode(ISD::AND, DL, LHS.getValueType(), LHS0.getOperand(0),
DAG.getConstant(Mask, DL, LHS.getValueType()));
return true;
}

CCVal = CCVal == ISD::SETEQ ? ISD::SETGE : ISD::SETLT;
CC = DAG.getCondCode(CCVal);

Expand Down Expand Up @@ -21788,6 +21799,8 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
case RISCV::Select_GPRNoX0_Using_CC_UImm5NonZero_QC:
case RISCV::Select_GPRNoX0_Using_CC_SImm16NonZero_QC:
case RISCV::Select_GPRNoX0_Using_CC_UImm16NonZero_QC:
case RISCV::Select_GPR_Using_CC_UImmLog2XLen_NDS:
case RISCV::Select_GPR_Using_CC_UImm7_NDS:
case RISCV::Select_FPR16_Using_CC_GPR:
case RISCV::Select_FPR16INX_Using_CC_GPR:
case RISCV::Select_FPR32_Using_CC_GPR:
Expand Down
41 changes: 41 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -966,11 +966,15 @@ RISCVCC::CondCode RISCVInstrInfo::getCondFromBranchOpc(unsigned Opc) {
case RISCV::CV_BEQIMM:
case RISCV::QC_BEQI:
case RISCV::QC_E_BEQI:
case RISCV::NDS_BBC:
case RISCV::NDS_BEQC:
return RISCVCC::COND_EQ;
case RISCV::BNE:
case RISCV::QC_BNEI:
case RISCV::QC_E_BNEI:
case RISCV::CV_BNEIMM:
case RISCV::NDS_BBS:
case RISCV::NDS_BNEC:
return RISCVCC::COND_NE;
case RISCV::BLT:
case RISCV::QC_BLTI:
Expand Down Expand Up @@ -1103,6 +1107,26 @@ unsigned RISCVCC::getBrCond(RISCVCC::CondCode CC, unsigned SelectOpc) {
return RISCV::QC_E_BGEUI;
}
break;
case RISCV::Select_GPR_Using_CC_UImmLog2XLen_NDS:
switch (CC) {
default:
llvm_unreachable("Unexpected condition code!");
case RISCVCC::COND_EQ:
return RISCV::NDS_BBC;
case RISCVCC::COND_NE:
return RISCV::NDS_BBS;
}
break;
case RISCV::Select_GPR_Using_CC_UImm7_NDS:
switch (CC) {
default:
llvm_unreachable("Unexpected condition code!");
case RISCVCC::COND_EQ:
return RISCV::NDS_BEQC;
case RISCVCC::COND_NE:
return RISCV::NDS_BNEC;
}
break;
}
}

Expand Down Expand Up @@ -1400,6 +1424,18 @@ bool RISCVInstrInfo::reverseBranchCondition(
case RISCV::QC_E_BLTUI:
Cond[0].setImm(RISCV::QC_E_BGEUI);
break;
case RISCV::NDS_BBC:
Cond[0].setImm(RISCV::NDS_BBS);
break;
case RISCV::NDS_BBS:
Cond[0].setImm(RISCV::NDS_BBC);
break;
case RISCV::NDS_BEQC:
Cond[0].setImm(RISCV::NDS_BNEC);
break;
case RISCV::NDS_BNEC:
Cond[0].setImm(RISCV::NDS_BEQC);
break;
}

return false;
Expand Down Expand Up @@ -1572,6 +1608,11 @@ bool RISCVInstrInfo::isBranchOffsetInRange(unsigned BranchOp,
switch (BranchOp) {
default:
llvm_unreachable("Unexpected opcode!");
case RISCV::NDS_BBC:
case RISCV::NDS_BBS:
case RISCV::NDS_BEQC:
case RISCV::NDS_BNEC:
return isInt<11>(BrOffset);
case RISCV::BEQ:
case RISCV::BNE:
case RISCV::BLT:
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/RISCV/RISCVInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ def uimm6 : RISCVUImmLeafOp<6>;
def uimm7_opcode : RISCVUImmOp<7> {
let ParserMatchClass = InsnDirectiveOpcode;
}
def uimm7 : RISCVUImmOp<7>;
def uimm7 : RISCVUImmLeafOp<7>;
def uimm8 : RISCVUImmOp<8>;
def uimm16 : RISCVUImmOp<16>;
def uimm32 : RISCVUImmOp<32>;
Expand Down
47 changes: 47 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,17 @@ def simm20_lsb000 : Operand<XLenVT> {
let DecoderMethod = "decodeSImmOperandAndLslN<20, 3>";
}

// Predicate: True if immediate is a power of 2.
def PowerOf2 : PatLeaf<(imm), [{
return isPowerOf2_64(N->getZExtValue());
}]>;

// Transformation function: Get log2 of immediate.
def Log2 : SDNodeXForm<imm, [{
uint64_t Imm = Log2_64(N->getZExtValue());
return CurDAG->getTargetConstant(Imm, SDLoc(N), N->getValueType(0));
}]>;

//===----------------------------------------------------------------------===//
// Instruction Class Templates
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -556,8 +567,44 @@ def NDS_VD4DOTSU_VV : NDSRVInstVD4DOT<0b000101, "nds.vd4dotsu">;
// Pseudo-instructions and codegen patterns
//===----------------------------------------------------------------------===//

class NDS_BBPat<CondCode Cond, NDSRVInstBB Inst>
: Pat<(riscv_brcc (and(XLenVT GPR:$rs1), PowerOf2:$mask), 0, Cond,
bb:$imm10),
(Inst GPR:$rs1, (Log2 PowerOf2:$mask), bare_simm11_lsb0:$imm10)>;

class NDS_BCPat<CondCode Cond, NDSRVInstBC Inst>
: Pat<(riscv_brcc (XLenVT GPR:$rs1), uimm7:$cimm, Cond, bb:$imm10),
(Inst GPR:$rs1, uimm7:$cimm, bare_simm11_lsb0:$imm10)>;

defm CC_UImmLog2XLen_NDS : SelectCC_GPR_riirr<GPR, uimmlog2xlen>;
defm CC_UImm7_NDS : SelectCC_GPR_riirr<GPR, uimm7>;

class SelectNDS_BB<CondCode Cond>
: Pat<(riscv_selectcc_frag:$cc (and(XLenVT GPR:$lhs), PowerOf2:$mask), 0,
Cond, (XLenVT GPR:$truev), GPR:$falsev),
(Select_GPR_Using_CC_UImmLog2XLen_NDS GPR:$lhs, (Log2 PowerOf2:$mask),
(IntCCtoRISCVCC $cc), GPR:$truev, GPR:$falsev)>;

class SelectNDS_BC<CondCode Cond>
: Pat<(riscv_selectcc_frag:$cc (XLenVT GPR:$lhs), uimm7:$cimm, Cond,
(XLenVT GPR:$truev), GPR:$falsev),
(Select_GPR_Using_CC_UImm7_NDS GPR:$lhs, uimm7:$cimm,
(IntCCtoRISCVCC $cc), GPR:$truev, GPR:$falsev)>;

let Predicates = [HasVendorXAndesPerf] in {

def : NDS_BBPat<SETEQ, NDS_BBC>;
def : NDS_BBPat<SETNE, NDS_BBS>;

def : SelectNDS_BB<SETEQ>;
def : SelectNDS_BB<SETNE>;

def : NDS_BCPat<SETEQ, NDS_BEQC>;
def : NDS_BCPat<SETNE, NDS_BNEC>;

def : SelectNDS_BC<SETEQ>;
def : SelectNDS_BC<SETNE>;

def : Pat<(sext_inreg (XLenVT GPR:$rs1), i16), (NDS_BFOS GPR:$rs1, 15, 0)>;
def : Pat<(sext_inreg (XLenVT GPR:$rs1), i8), (NDS_BFOS GPR:$rs1, 7, 0)>;
def : Pat<(sext_inreg (XLenVT GPR:$rs1), i1), (NDS_BFOS GPR:$rs1, 0, 0)>;
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrPredicates.td
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ def isSelectPseudo
Select_GPRNoX0_Using_CC_UImm5NonZero_QC,
Select_GPRNoX0_Using_CC_SImm16NonZero_QC,
Select_GPRNoX0_Using_CC_UImm16NonZero_QC,
Select_GPR_Using_CC_UImmLog2XLen_NDS,
Select_GPR_Using_CC_UImm7_NDS,
Select_FPR16_Using_CC_GPR,
Select_FPR16INX_Using_CC_GPR,
Select_FPR32_Using_CC_GPR,
Expand Down
164 changes: 164 additions & 0 deletions llvm/test/CodeGen/RISCV/rv32xandesperf.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,170 @@
; RUN: llc -O0 -mtriple=riscv32 -mattr=+xandesperf -verify-machineinstrs < %s \
; RUN: | FileCheck %s

; NDS.BBC

define i32 @bbc(i32 %a) nounwind {
; CHECK-LABEL: bbc:
; CHECK: # %bb.0:
; CHECK-NEXT: nds.bbc a0, 16, .LBB0_2
; CHECK-NEXT: j .LBB0_1
; CHECK-NEXT: .LBB0_1: # %f
; CHECK-NEXT: li a0, 0
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB0_2: # %t
; CHECK-NEXT: li a0, 1
; CHECK-NEXT: ret
%and = and i32 %a, 65536
%tst = icmp eq i32 %and, 0
br i1 %tst, label %t, label %f
f:
ret i32 0
t:
ret i32 1
}

define i32 @select_bbc(i32 %a, i32 %b, i32 %c) nounwind {
; CHECK-LABEL: select_bbc:
; CHECK: # %bb.0:
; CHECK-NEXT: addi sp, sp, -16
; CHECK-NEXT: sw a2, 8(sp) # 4-byte Folded Spill
; CHECK-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: nds.bbc a0, 16, .LBB1_2
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: lw a0, 8(sp) # 4-byte Folded Reload
; CHECK-NEXT: sw a0, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: .LBB1_2:
; CHECK-NEXT: lw a0, 12(sp) # 4-byte Folded Reload
; CHECK-NEXT: addi sp, sp, 16
; CHECK-NEXT: ret
%and = and i32 %a, 65536
%tst = icmp eq i32 %and, 0
%ret = select i1 %tst, i32 %b, i32 %c
ret i32 %ret
}

; NDS.BBS

define i32 @bbs(i32 %a) nounwind {
; CHECK-LABEL: bbs:
; CHECK: # %bb.0:
; CHECK-NEXT: nds.bbs a0, 16, .LBB2_2
; CHECK-NEXT: j .LBB2_1
; CHECK-NEXT: .LBB2_1: # %f
; CHECK-NEXT: li a0, 0
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB2_2: # %t
; CHECK-NEXT: li a0, 1
; CHECK-NEXT: ret
%and = and i32 %a, 65536
%tst = icmp ne i32 %and, 0
br i1 %tst, label %t, label %f
f:
ret i32 0
t:
ret i32 1
}

define i32 @select_bbs(i32 %a, i32 %b, i32 %c) nounwind {
; CHECK-LABEL: select_bbs:
; CHECK: # %bb.0:
; CHECK-NEXT: addi sp, sp, -16
; CHECK-NEXT: sw a2, 8(sp) # 4-byte Folded Spill
; CHECK-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: nds.bbs a0, 16, .LBB3_2
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: lw a0, 8(sp) # 4-byte Folded Reload
; CHECK-NEXT: sw a0, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: .LBB3_2:
; CHECK-NEXT: lw a0, 12(sp) # 4-byte Folded Reload
; CHECK-NEXT: addi sp, sp, 16
; CHECK-NEXT: ret
%and = and i32 %a, 65536
%tst = icmp ne i32 %and, 0
%ret = select i1 %tst, i32 %b, i32 %c
ret i32 %ret
}

; NDS.BEQC

define i32 @beqc(i32 %a) nounwind {
; CHECK-LABEL: beqc:
; CHECK: # %bb.0:
; CHECK-NEXT: nds.beqc a0, 5, .LBB4_2
; CHECK-NEXT: j .LBB4_1
; CHECK-NEXT: .LBB4_1: # %f
; CHECK-NEXT: li a0, 0
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB4_2: # %t
; CHECK-NEXT: li a0, 1
; CHECK-NEXT: ret
%tst = icmp eq i32 %a, 5
br i1 %tst, label %t, label %f
f:
ret i32 0
t:
ret i32 1
}

define i32 @select_beqc(i32 %a, i32 %b, i32 %c) nounwind {
; CHECK-LABEL: select_beqc:
; CHECK: # %bb.0:
; CHECK-NEXT: addi sp, sp, -16
; CHECK-NEXT: sw a2, 8(sp) # 4-byte Folded Spill
; CHECK-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: nds.beqc a0, 5, .LBB5_2
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: lw a0, 8(sp) # 4-byte Folded Reload
; CHECK-NEXT: sw a0, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: .LBB5_2:
; CHECK-NEXT: lw a0, 12(sp) # 4-byte Folded Reload
; CHECK-NEXT: addi sp, sp, 16
; CHECK-NEXT: ret
%tst = icmp eq i32 %a, 5
%ret = select i1 %tst, i32 %b, i32 %c
ret i32 %ret
}

; NDS.BNEC

define i32 @bnec(i32 %a) nounwind {
; CHECK-LABEL: bnec:
; CHECK: # %bb.0:
; CHECK-NEXT: nds.bnec a0, 5, .LBB6_2
; CHECK-NEXT: j .LBB6_1
; CHECK-NEXT: .LBB6_1: # %f
; CHECK-NEXT: li a0, 0
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB6_2: # %t
; CHECK-NEXT: li a0, 1
; CHECK-NEXT: ret
%tst = icmp ne i32 %a, 5
br i1 %tst, label %t, label %f
f:
ret i32 0
t:
ret i32 1
}

define i32 @select_bnec(i32 %a, i32 %b, i32 %c) nounwind {
; CHECK-LABEL: select_bnec:
; CHECK: # %bb.0:
; CHECK-NEXT: addi sp, sp, -16
; CHECK-NEXT: sw a2, 8(sp) # 4-byte Folded Spill
; CHECK-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: nds.bnec a0, 5, .LBB7_2
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: lw a0, 8(sp) # 4-byte Folded Reload
; CHECK-NEXT: sw a0, 12(sp) # 4-byte Folded Spill
; CHECK-NEXT: .LBB7_2:
; CHECK-NEXT: lw a0, 12(sp) # 4-byte Folded Reload
; CHECK-NEXT: addi sp, sp, 16
; CHECK-NEXT: ret
%tst = icmp ne i32 %a, 5
%ret = select i1 %tst, i32 %b, i32 %c
ret i32 %ret
}

; NDS.BFOZ

; MSB >= LSB
Expand Down
Loading