1351278Sdim// WebAssemblyInstrBulkMemory.td - bulk memory codegen support --*- tablegen -*- 2351278Sdim// 3351278Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4351278Sdim// See https://llvm.org/LICENSE.txt for license information. 5351278Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6351278Sdim// 7351278Sdim//===----------------------------------------------------------------------===// 8351278Sdim/// 9351278Sdim/// \file 10351278Sdim/// WebAssembly bulk memory codegen constructs. 11351278Sdim/// 12351278Sdim//===----------------------------------------------------------------------===// 13351278Sdim 14351278Sdim// Instruction requiring HasBulkMemory and the bulk memory prefix byte 15351278Sdimmulticlass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s, 16351278Sdim list<dag> pattern_r, string asmstr_r = "", 17351278Sdim string asmstr_s = "", bits<32> simdop = -1> { 18351278Sdim defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s, 19351278Sdim !or(0xfc00, !and(0xff, simdop))>, 20351278Sdim Requires<[HasBulkMemory]>; 21351278Sdim} 22351278Sdim 23351278Sdim// Bespoke types and nodes for bulk memory ops 24351278Sdimdef wasm_memcpy_t : SDTypeProfile<0, 5, 25351278Sdim [SDTCisInt<0>, SDTCisInt<1>, SDTCisPtrTy<2>, SDTCisPtrTy<3>, SDTCisInt<4>] 26351278Sdim>; 27351278Sdimdef wasm_memcpy : SDNode<"WebAssemblyISD::MEMORY_COPY", wasm_memcpy_t, 28351278Sdim [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>; 29351278Sdim 30351278Sdimdef wasm_memset_t : SDTypeProfile<0, 4, 31351278Sdim [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisInt<2>, SDTCisInt<3>] 32351278Sdim>; 33351278Sdimdef wasm_memset : SDNode<"WebAssemblyISD::MEMORY_FILL", wasm_memset_t, 34351278Sdim [SDNPHasChain, SDNPMayStore]>; 35351278Sdim 36351278Sdimlet mayStore = 1, hasSideEffects = 1 in 37351278Sdimdefm MEMORY_INIT : 38351278Sdim BULK_I<(outs), 39351278Sdim (ins i32imm_op:$seg, i32imm_op:$idx, I32:$dest, 40351278Sdim I32:$offset, I32:$size), 41351278Sdim (outs), (ins i32imm_op:$seg, i32imm_op:$idx), 42360784Sdim [(int_wasm_memory_init (i32 timm:$seg), (i32 timm:$idx), I32:$dest, 43351278Sdim I32:$offset, I32:$size 44351278Sdim )], 45351278Sdim "memory.init\t$seg, $idx, $dest, $offset, $size", 46351278Sdim "memory.init\t$seg, $idx", 0x08>; 47351278Sdim 48351278Sdimlet hasSideEffects = 1 in 49351278Sdimdefm DATA_DROP : 50351278Sdim BULK_I<(outs), (ins i32imm_op:$seg), (outs), (ins i32imm_op:$seg), 51360784Sdim [(int_wasm_data_drop (i32 timm:$seg))], 52351278Sdim "data.drop\t$seg", "data.drop\t$seg", 0x09>; 53351278Sdim 54351278Sdimlet mayLoad = 1, mayStore = 1 in 55351278Sdimdefm MEMORY_COPY : 56351278Sdim BULK_I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx, 57351278Sdim I32:$dst, I32:$src, I32:$len), 58351278Sdim (outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx), 59351278Sdim [(wasm_memcpy (i32 imm:$src_idx), (i32 imm:$dst_idx), 60351278Sdim I32:$dst, I32:$src, I32:$len 61351278Sdim )], 62351278Sdim "memory.copy\t$src_idx, $dst_idx, $dst, $src, $len", 63351278Sdim "memory.copy\t$src_idx, $dst_idx", 0x0a>; 64351278Sdim 65351278Sdimlet mayStore = 1 in 66351278Sdimdefm MEMORY_FILL : 67351278Sdim BULK_I<(outs), (ins i32imm_op:$idx, I32:$dst, I32:$value, I32:$size), 68351278Sdim (outs), (ins i32imm_op:$idx), 69351278Sdim [(wasm_memset (i32 imm:$idx), I32:$dst, I32:$value, I32:$size)], 70351278Sdim "memory.fill\t$idx, $dst, $value, $size", 71351278Sdim "memory.fill\t$idx", 0x0b>; 72