Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 3 additions & 0 deletions llvm/include/llvm/IR/IntrinsicsRISCVXCV.td
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,7 @@ let TargetPrefix = "riscv" in {
def int_riscv_cv_mac_machhuRN : ScalarCoreVMacGprGprGprImmIntrinsic;
def int_riscv_cv_mac_macsRN : ScalarCoreVMacGprGprGprImmIntrinsic;
def int_riscv_cv_mac_machhsRN : ScalarCoreVMacGprGprGprImmIntrinsic;

def int_riscv_cv_elw_elw
: Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
} // TargetPrefix = "riscv"
3 changes: 3 additions & 0 deletions llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3919,6 +3919,9 @@ bool RISCVAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,

return false;
}
case RISCV::PseudoCV_ELW:
emitLoadStoreSymbol(Inst, RISCV::CV_ELW, IDLoc, Out, /*HasTmpReg=*/false);
return false;
}

emitToStreamer(Out, Inst);
Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,7 @@ class CVLoad_ri<bits<3> funct3, string opcodestr>

let Predicates = [HasVendorXCVelw, IsRV32], hasSideEffects = 0,
mayLoad = 1, mayStore = 0 in {
def PseudoCV_ELW : PseudoLoad<"cv.elw">;
// Event load
def CV_ELW : CVLoad_ri<0b011, "cv.elw">;
}
Expand Down Expand Up @@ -707,6 +708,12 @@ let Predicates = [HasVendorXCVmem, IsRV32], AddedComplexity = 1 in {
def : CVStrrPat<store, CV_SW_rr>;
}

let Predicates = [HasVendorXCVelw, IsRV32] in {
def : Pat<(int_riscv_cv_elw_elw (XLenVT GPR:$rs1)), (PseudoCV_ELW GPR:$rs1)>;
def : Pat<(int_riscv_cv_elw_elw (AddrRegImm (XLenVT GPR:$rs1), simm12:$imm12)),
(CV_ELW GPR:$rs1, simm12:$imm12)>;
}

def cv_tuimm2 : TImmLeaf<XLenVT, [{return isUInt<2>(Imm);}]>;
def cv_tuimm5 : TImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]>;
def cv_uimm10 : ImmLeaf<XLenVT, [{return isUInt<10>(Imm);}]>;
Expand Down
27 changes: 27 additions & 0 deletions llvm/test/CodeGen/RISCV/xcvelw.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvelw -verify-machineinstrs < %s \
; RUN: | FileCheck %s

declare i32 @llvm.riscv.cv.elw.elw(i8*)

define i32 @test.cv.elw.elw(i8* %a) {
; CHECK-LABEL: test.cv.elw.elw:
; CHECK: # %bb.0:
; CHECK-NEXT: cv.elw a0, 0(a0)
; CHECK-NEXT: ret
%1 = call i32 @llvm.riscv.cv.elw.elw(i8* %a)
ret i32 %1
}

define i32 @test.cv.elw.elw2(i8* %a, i32 %b) {
; CHECK-LABEL: test.cv.elw.elw2:
; CHECK: # %bb.0:
; CHECK-NEXT: add a0, a1, a0
; CHECK-NEXT: cv.elw a0, 7(a0)
; CHECK-NEXT: ret
%c = add i32 %b, 4
%d = add i32 %c, 3
%e = getelementptr i8, i8* %a, i32 %d
%1 = call i32 @llvm.riscv.cv.elw.elw(i8* %e)
ret i32 %1
}