blob: 646b16cf7bf536902a1e6f908f903f6a0fcd27d0 [file] [log] [blame]
Thomas Livelyd99af232019-02-05 00:49:55 +00001// WebAssemblyInstrBulkMemory.td - bulk memory codegen support --*- tablegen -*-
2//
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
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// WebAssembly bulk memory codegen constructs.
11///
12//===----------------------------------------------------------------------===//
13
14// Instruction requiring HasBulkMemory and the bulk memory prefix byte
15multiclass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
16 list<dag> pattern_r, string asmstr_r = "",
17 string asmstr_s = "", bits<32> simdop = -1> {
18 defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s,
19 !or(0xfc00, !and(0xff, simdop))>,
20 Requires<[HasBulkMemory]>;
21}
22
23// Bespoke types and nodes for bulk memory ops
Thomas Livelyde7a0a12019-02-13 22:11:16 +000024def wasm_memcpy_t : SDTypeProfile<0, 5,
25 [SDTCisInt<0>, SDTCisInt<1>, SDTCisPtrTy<2>, SDTCisPtrTy<3>, SDTCisInt<4>]
Thomas Livelyd99af232019-02-05 00:49:55 +000026>;
27def wasm_memcpy : SDNode<"WebAssemblyISD::MEMORY_COPY", wasm_memcpy_t,
28 [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>;
29
30//===----------------------------------------------------------------------===//
Thomas Livelyde7a0a12019-02-13 22:11:16 +000031// memory.init
32//===----------------------------------------------------------------------===//
33
34let mayStore = 1 in
35defm MEMORY_INIT :
36 BULK_I<(outs),
37 (ins i32imm_op:$seg, i32imm_op:$idx, I32:$dest,
38 I32:$offset, I32:$size),
39 (outs), (ins i32imm_op:$seg, i32imm_op:$idx),
40 [(int_wasm_memory_init (i32 imm:$seg), (i32 imm:$idx), I32:$dest,
41 I32:$offset, I32:$size
42 )],
43 "memory.init\t$seg, $idx, $dest, $offset, $size",
44 "memory.init\t$seg, $idx", 0x08>;
45
46//===----------------------------------------------------------------------===//
47// data.drop
48//===----------------------------------------------------------------------===//
49
50defm DATA_DROP :
51 BULK_I<(outs), (ins i32imm_op:$seg), (outs), (ins i32imm_op:$seg),
52 [(int_wasm_data_drop (i32 imm:$seg))],
53 "data.drop\t$seg", "data.drop\t$seg", 0x09>;
54
55//===----------------------------------------------------------------------===//
Thomas Livelyd99af232019-02-05 00:49:55 +000056// memory.copy
57//===----------------------------------------------------------------------===//
58
59let mayLoad = 1, mayStore = 1 in
Thomas Livelyde7a0a12019-02-13 22:11:16 +000060defm MEMORY_COPY :
61 BULK_I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx,
62 I32:$dst, I32:$src, I32:$len),
63 (outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx),
64 [(wasm_memcpy (i32 imm:$src_idx), (i32 imm:$dst_idx),
65 I32:$dst, I32:$src, I32:$len
66 )],
67 "memory.copy\t$src_idx, $dst_idx, $dst, $src, $len",
68 "memory.copy\t$src_idx, $dst_idx", 0x0a>;