Skip to content
Draft
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
6 changes: 6 additions & 0 deletions llvm/include/llvm/IR/IntrinsicsSystemZ.td
Original file line number Diff line number Diff line change
Expand Up @@ -462,3 +462,9 @@ let TargetPrefix = "s390" in {
def int_s390_tdc : Intrinsic<[llvm_i32_ty], [llvm_anyfloat_ty, llvm_i64_ty],
[IntrNoMem]>;
}

let TargetPrefix = "s390" in {
def int_s390_cksm : Intrinsic<[llvm_i32_ty, llvm_ptr_ty, llvm_i64_ty],
[llvm_i32_ty],
[IntrReadMem]>;
}
12 changes: 12 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,18 @@ void SystemZAsmPrinter::emitInstruction(const MachineInstr *MI) {

return;
}
case SystemZ::CKSMLoop: {
MCSymbol *DotSym = OutContext.createTempSymbol();
OutStreamer->emitLabel(DotSym);
EmitToStreamer(*OutStreamer, MCInstBuilder(SystemZ::CKSM))
.addReg(MI->getOperand(1).getReg()
.addReg(MI->getOperand(2).getReg()));
// Emit jo to label
LoweredMI = MCInstBuilder(SystemZ::BRC)
.addImm(MI->getOperand(0).getImm())
.addImm(MI->getOperand(1).getImm())
.addExpr(MCSymbolRefExpr::create(DotSym, Outcontext));
} break;
case SystemZ::CallBRASL:
LoweredMI = MCInstBuilder(SystemZ::BRASL)
.addReg(SystemZ::R14D)
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,14 @@ enum NodeType : unsigned {
// Operand 1: the bit mask
TDC,

// CheckSum Class
//
// Operand 0: output checksum
// Operand 1: input checksum
// Operand 2: memory of buffer
// Operand 3: length
CKSM,

// z/OS XPLINK ADA Entry
// Wraps a TargetGlobalAddress that should be loaded from a function's
// AssociatedData Area (ADA). Tha ADA is passed to the function by the
Expand Down
9 changes: 8 additions & 1 deletion llvm/lib/Target/SystemZ/SystemZInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -2103,7 +2103,14 @@ let mayLoad = 1, mayStore = 1, Defs = [CC, R0D, R1D, R2D, R3D, R5D],

// Checksum.
let mayLoad = 1, Defs = [CC] in
def CKSM : SideEffectBinaryMemMemRRE<"cksm", 0xB241, GR64, GR128>;
def CKSM : SideEffectBinaryMemMemRRE<"cksm", 0xB241, GR32, GR128>;

let usesCustomInserter = 1, mayLoad = 1, hasNoSchedulingInfo = 1, Defs = [CC] in
def CKSMLoop : Pseudo<(outs GR32:$cksmout),
(ins GR32:cksmin, GR128:$ptr_len)>;
// Look for intrinsic and replace with pseudo instruction
def Pat<(int_s390_cksm GR32:$cksmin, ADDR64:$ptr, GR64:$len),
(CKSMLoop GR32:$cksmin, PAIR128(ADDR64:$ptr, GR64:$len))>

// Compression call.
let mayLoad = 1, mayStore = 1, Defs = [CC, R1D], Uses = [R0L, R1D] in
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZOperators.td
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,11 @@ def SDT_ZVecQuaternaryIntCC : SDTypeProfile<2, 4,
def SDT_ZTest : SDTypeProfile<1, 2,
[SDTCisVT<0, i32>,
SDTCisVT<2, i64>]>;
def SDT_ZCKSM : SDTypeProfile<1, 3,
[SDTCisInt<0>,
SDTCisInt<1>,
SDTCisPtrTy<2>,
SDTCisInt<3>]>;

//===----------------------------------------------------------------------===//
// Node definitions
Expand Down Expand Up @@ -314,6 +319,9 @@ def z_stckf : SDNode<"SystemZISD::STCKF", SDT_ZStoreInherent,

def z_tdc : SDNode<"SystemZISD::TDC", SDT_ZTest>;

def z_cksm : SDNode<"SystemZISD::CKSM", SDT_ZCKSM,
[SDNPHasChain, SDNMayLoad]>

// Defined because the index is an i32 rather than a pointer.
def z_vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT",
SDT_ZInsertVectorElt>;
Expand Down
6 changes: 6 additions & 0 deletions llvm/test/CodeGen/SystemZ/cksm-intrinsic-01.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; RUN llc < %s -mtriple=s390x-ibm-zos -mcpu=z10 --stop-after=systemz-isel | FileCheck %s

define i32 @get_checksum(i32 %cksmin, ptr %mem, i64 %len) {
%res = call i32 @llvm.s390.cksm(i32 %cksmin, ptr %mem, i64 %len)
ret i32 %res
}