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
, unsigned Align
, bool IsVolatile
, bool AlwaysInline
,
24 MachinePointerInfo DstPtrInfo
, MachinePointerInfo SrcPtrInfo
) const {
25 if (!DAG
.getMachineFunction()
26 .getSubtarget
<WebAssemblySubtarget
>()
30 SDValue MemIdx
= DAG
.getConstant(0, DL
, MVT::i32
);
31 return DAG
.getNode(WebAssemblyISD::MEMORY_COPY
, DL
, MVT::Other
,
32 {Chain
, MemIdx
, MemIdx
, Dst
, Src
,
33 DAG
.getZExtOrTrunc(Size
, DL
, MVT::i32
)});
36 SDValue
WebAssemblySelectionDAGInfo::EmitTargetCodeForMemmove(
37 SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Chain
, SDValue Op1
, SDValue Op2
,
38 SDValue Op3
, unsigned Align
, bool IsVolatile
,
39 MachinePointerInfo DstPtrInfo
, MachinePointerInfo SrcPtrInfo
) const {
40 return EmitTargetCodeForMemcpy(DAG
, DL
, Chain
, Op1
, Op2
, Op3
, Align
,
41 IsVolatile
, false, DstPtrInfo
,
45 SDValue
WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset(
46 SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Chain
, SDValue Dst
, SDValue Val
,
47 SDValue Size
, unsigned Align
, bool IsVolatile
,
48 MachinePointerInfo DstPtrInfo
) const {
49 if (!DAG
.getMachineFunction()
50 .getSubtarget
<WebAssemblySubtarget
>()
54 SDValue MemIdx
= DAG
.getConstant(0, DL
, 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
, MVT::i32
));