mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
[WebAssembly] memory.copy
Summary: Depends on D57495. Reviewers: aheejin, dschuff Subscribers: sbc100, jgravelle-google, hiraditya, sunfish Differential Revision: https://reviews.llvm.org/D57498 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353127 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -25,5 +25,6 @@ HANDLE_NODETYPE(VEC_SHL)
|
||||
HANDLE_NODETYPE(VEC_SHR_S)
|
||||
HANDLE_NODETYPE(VEC_SHR_U)
|
||||
HANDLE_NODETYPE(THROW)
|
||||
HANDLE_NODETYPE(MEMORY_COPY)
|
||||
|
||||
// add memory opcodes starting at ISD::FIRST_TARGET_MEMORY_OPCODE here...
|
||||
|
||||
@@ -243,6 +243,12 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
||||
setOperationAction(ISD::INTRINSIC_VOID, MVT::Other, Custom);
|
||||
|
||||
setMaxAtomicSizeInBitsSupported(64);
|
||||
|
||||
if (Subtarget->hasBulkMemory()) {
|
||||
// Using memory.copy is always better than using multiple loads and stores
|
||||
MaxStoresPerMemcpy = 1;
|
||||
MaxStoresPerMemcpyOptSize = 1;
|
||||
}
|
||||
}
|
||||
|
||||
TargetLowering::AtomicExpansionKind
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
// WebAssemblyInstrBulkMemory.td - bulk memory codegen support --*- tablegen -*-
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
///
|
||||
/// \file
|
||||
/// WebAssembly bulk memory codegen constructs.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Instruction requiring HasBulkMemory and the bulk memory prefix byte
|
||||
multiclass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
|
||||
list<dag> pattern_r, string asmstr_r = "",
|
||||
string asmstr_s = "", bits<32> simdop = -1> {
|
||||
defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s,
|
||||
!or(0xfc00, !and(0xff, simdop))>,
|
||||
Requires<[HasBulkMemory]>;
|
||||
}
|
||||
|
||||
// Bespoke types and nodes for bulk memory ops
|
||||
def wasm_memcpy_t : SDTypeProfile<0, 3,
|
||||
[SDTCisPtrTy<0>, SDTCisPtrTy<1>, SDTCisInt<2>]
|
||||
>;
|
||||
def wasm_memcpy : SDNode<"WebAssemblyISD::MEMORY_COPY", wasm_memcpy_t,
|
||||
[SDNPHasChain, SDNPMayLoad, SDNPMayStore]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// memory.copy
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
let mayLoad = 1, mayStore = 1 in
|
||||
defm MEMORY_COPY : BULK_I<(outs), (ins I32:$dst, I32:$src, I32:$len),
|
||||
(outs), (ins),
|
||||
[(wasm_memcpy I32:$dst, I32:$src, I32:$len)],
|
||||
"memory.copy\t$dst, $src, $len",
|
||||
"memory.copy", 0x0a>;
|
||||
@@ -315,3 +315,4 @@ include "WebAssemblyInstrFloat.td"
|
||||
include "WebAssemblyInstrAtomics.td"
|
||||
include "WebAssemblyInstrSIMD.td"
|
||||
include "WebAssemblyInstrExceptRef.td"
|
||||
include "WebAssemblyInstrBulkMemory.td"
|
||||
|
||||
@@ -17,3 +17,16 @@ using namespace llvm;
|
||||
#define DEBUG_TYPE "wasm-selectiondag-info"
|
||||
|
||||
WebAssemblySelectionDAGInfo::~WebAssemblySelectionDAGInfo() = default; // anchor
|
||||
|
||||
SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Op1, SDValue Op2,
|
||||
SDValue Op3, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
if (!DAG.getMachineFunction()
|
||||
.getSubtarget<WebAssemblySubtarget>()
|
||||
.hasBulkMemory())
|
||||
return SDValue();
|
||||
|
||||
return DAG.getNode(WebAssemblyISD::MEMORY_COPY, DL, MVT::Other, Chain, Op1,
|
||||
Op2, Op3);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,12 @@ namespace llvm {
|
||||
class WebAssemblySelectionDAGInfo final : public SelectionDAGTargetInfo {
|
||||
public:
|
||||
~WebAssemblySelectionDAGInfo() override;
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Op1, SDValue Op2,
|
||||
SDValue Op3, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
Reference in New Issue
Block a user