1 //===-- WebAssemblySelectionDAGInfo.cpp - WebAssembly SelectionDAG Info ---===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file implements the WebAssemblySelectionDAGInfo class.
12 //===----------------------------------------------------------------------===//
14 #include "WebAssemblyTargetMachine.h"
17 #define DEBUG_TYPE "wasm-selectiondag-info"
19 WebAssemblySelectionDAGInfo::~WebAssemblySelectionDAGInfo() = default; // anchor
21 SDValue
WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy(
22 SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Chain
, SDValue Dst
, SDValue Src
,
23 SDValue Size
, Align Alignment
, bool IsVolatile
, bool AlwaysInline
,
24 MachinePointerInfo DstPtrInfo
, MachinePointerInfo SrcPtrInfo
) const {
25 auto &ST
= DAG
.getMachineFunction().getSubtarget
<WebAssemblySubtarget
>();
26 if (!ST
.hasBulkMemory())
29 SDValue MemIdx
= DAG
.getConstant(0, DL
, MVT::i32
);
30 auto LenMVT
= ST
.hasAddr64() ? MVT::i64
: MVT::i32
;
31 return DAG
.getNode(WebAssemblyISD::MEMORY_COPY
, DL
, MVT::Other
,
32 {Chain
, MemIdx
, MemIdx
, Dst
, Src
,
33 DAG
.getZExtOrTrunc(Size
, DL
, LenMVT
)});
36 SDValue
WebAssemblySelectionDAGInfo::EmitTargetCodeForMemmove(
37 SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Chain
, SDValue Op1
, SDValue Op2
,
38 SDValue Op3
, Align Alignment
, bool IsVolatile
,
39 MachinePointerInfo DstPtrInfo
, MachinePointerInfo SrcPtrInfo
) const {
40 return EmitTargetCodeForMemcpy(DAG
, DL
, Chain
, Op1
, Op2
, Op3
,
41 Alignment
, IsVolatile
, false,
42 DstPtrInfo
, SrcPtrInfo
);
45 SDValue
WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset(
46 SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Chain
, SDValue Dst
, SDValue Val
,
47 SDValue Size
, Align Alignment
, bool IsVolatile
,
48 MachinePointerInfo DstPtrInfo
) const {
49 auto &ST
= DAG
.getMachineFunction().getSubtarget
<WebAssemblySubtarget
>();
50 if (!ST
.hasBulkMemory())
53 SDValue MemIdx
= DAG
.getConstant(0, DL
, MVT::i32
);
54 auto LenMVT
= ST
.hasAddr64() ? MVT::i64
: MVT::i32
;
55 // Only low byte matters for val argument, so anyext the i8
56 return DAG
.getNode(WebAssemblyISD::MEMORY_FILL
, DL
, MVT::Other
, Chain
, MemIdx
,
57 Dst
, DAG
.getAnyExtOrTrunc(Val
, DL
, MVT::i32
),
58 DAG
.getZExtOrTrunc(Size
, DL
, LenMVT
));