diff options
| author | Thomas Lively <tlively@google.com> | 2019-02-13 22:25:18 +0000 | 
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-02-13 22:25:18 +0000 | 
| commit | bba3f06d05e33ff113e17f85c34aa87c94d619e7 (patch) | |
| tree | 69aa8dcb991760a392020c71da2cef5be936992c /llvm/lib | |
| parent | 436fb2bd82a7816798b4f0c128b3be6760e49bbe (diff) | |
| download | bcm5719-llvm-bba3f06d05e33ff113e17f85c34aa87c94d619e7.tar.gz bcm5719-llvm-bba3f06d05e33ff113e17f85c34aa87c94d619e7.zip | |
[WebAssembly] memory.fill
Summary:
memset lowering, fix argument types in memcpy lowering, and
test encodings. Depends on D57736.
Reviewers: aheejin
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D57791
llvm-svn: 353986
Diffstat (limited to 'llvm/lib')
5 files changed, 39 insertions, 13 deletions
| diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def index 5f171550884..36b146498c3 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def @@ -26,5 +26,6 @@ HANDLE_NODETYPE(VEC_SHR_S)  HANDLE_NODETYPE(VEC_SHR_U)  HANDLE_NODETYPE(THROW)  HANDLE_NODETYPE(MEMORY_COPY) +HANDLE_NODETYPE(MEMORY_FILL)  // add memory opcodes starting at ISD::FIRST_TARGET_MEMORY_OPCODE here... diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index ca13161afb5..a4246eb8eb9 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -245,11 +245,13 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(    setMaxAtomicSizeInBitsSupported(64);    if (Subtarget->hasBulkMemory()) { -    // Using memory.copy is always better than using multiple loads and stores +    // Use memory.copy and friends over multiple loads and stores      MaxStoresPerMemcpy = 1;      MaxStoresPerMemcpyOptSize = 1;      MaxStoresPerMemmove = 1;      MaxStoresPerMemmoveOptSize = 1; +    MaxStoresPerMemset = 1; +    MaxStoresPerMemsetOptSize = 1;    }  } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td index 646b16cf7bf..f4352e3d12e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td @@ -27,11 +27,13 @@ def wasm_memcpy_t : SDTypeProfile<0, 5,  def wasm_memcpy : SDNode<"WebAssemblyISD::MEMORY_COPY", wasm_memcpy_t,                           [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>; -//===----------------------------------------------------------------------===// -// memory.init -//===----------------------------------------------------------------------===// +def wasm_memset_t : SDTypeProfile<0, 4, +  [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisInt<2>, SDTCisInt<3>] +>; +def wasm_memset : SDNode<"WebAssemblyISD::MEMORY_FILL", wasm_memset_t, +                         [SDNPHasChain, SDNPMayStore]>; -let mayStore = 1 in +let mayStore = 1, hasSideEffects = 1 in  defm MEMORY_INIT :    BULK_I<(outs),           (ins i32imm_op:$seg, i32imm_op:$idx, I32:$dest, @@ -43,19 +45,12 @@ defm MEMORY_INIT :           "memory.init\t$seg, $idx, $dest, $offset, $size",           "memory.init\t$seg, $idx", 0x08>; -//===----------------------------------------------------------------------===// -// data.drop -//===----------------------------------------------------------------------===// - +let hasSideEffects = 1 in  defm DATA_DROP :    BULK_I<(outs), (ins i32imm_op:$seg), (outs), (ins i32imm_op:$seg),           [(int_wasm_data_drop (i32 imm:$seg))],           "data.drop\t$seg", "data.drop\t$seg", 0x09>; -//===----------------------------------------------------------------------===// -// memory.copy -//===----------------------------------------------------------------------===// -  let mayLoad = 1, mayStore = 1 in  defm MEMORY_COPY :    BULK_I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx, @@ -66,3 +61,11 @@ defm MEMORY_COPY :           )],           "memory.copy\t$src_idx, $dst_idx, $dst, $src, $len",           "memory.copy\t$src_idx, $dst_idx", 0x0a>; + +let mayStore = 1 in +defm MEMORY_FILL : +  BULK_I<(outs), (ins i32imm_op:$idx, I32:$dst, I32:$value, I32:$size), +         (outs), (ins i32imm_op:$idx), +         [(wasm_memset (i32 imm:$idx), I32:$dst, I32:$value, I32:$size)], +         "memory.fill\t$idx, $dst, $value, $size", +         "memory.fill\t$idx", 0x0b>; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp index 34d93ecafce..890e4b8e4e2 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp @@ -41,3 +41,19 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemmove(                                   IsVolatile, false, DstPtrInfo,                                   SrcPtrInfo);  } + +SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset( +    SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Val, +    SDValue Size, unsigned Align, bool IsVolatile, +    MachinePointerInfo DstPtrInfo) const { +  if (!DAG.getMachineFunction() +           .getSubtarget<WebAssemblySubtarget>() +           .hasBulkMemory()) +    return SDValue(); + +  SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32); +  // Only low byte matters for val argument, so anyext the i8 +  return DAG.getNode(WebAssemblyISD::MEMORY_FILL, DL, MVT::Other, Chain, MemIdx, +                     Dst, DAG.getAnyExtOrTrunc(Val, DL, MVT::i32), +                     DAG.getZExtOrTrunc(Size, DL, MVT::i32)); +} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h index 29e23e96aeb..0b90ece27df 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h @@ -33,6 +33,10 @@ public:                                     SDValue Op3, unsigned Align, bool isVolatile,                                     MachinePointerInfo DstPtrInfo,                                     MachinePointerInfo SrcPtrInfo) const override; +  SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &DL, +                                  SDValue Chain, SDValue Op1, SDValue Op2, +                                  SDValue Op3, unsigned Align, bool IsVolatile, +                                  MachinePointerInfo DstPtrInfo) const override;  };  } // end namespace llvm | 

