10b57cec5SDimitry Andric// WebAssemblyInstrBulkMemory.td - bulk memory codegen support --*- tablegen -*- 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric/// 90b57cec5SDimitry Andric/// \file 100b57cec5SDimitry Andric/// WebAssembly bulk memory codegen constructs. 110b57cec5SDimitry Andric/// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric// Instruction requiring HasBulkMemory and the bulk memory prefix byte 150b57cec5SDimitry Andricmulticlass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s, 160b57cec5SDimitry Andric list<dag> pattern_r, string asmstr_r = "", 170b57cec5SDimitry Andric string asmstr_s = "", bits<32> simdop = -1> { 180b57cec5SDimitry Andric defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s, 190b57cec5SDimitry Andric !or(0xfc00, !and(0xff, simdop))>, 200b57cec5SDimitry Andric Requires<[HasBulkMemory]>; 210b57cec5SDimitry Andric} 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric// Bespoke types and nodes for bulk memory ops 240b57cec5SDimitry Andricdef wasm_memcpy_t : SDTypeProfile<0, 5, 250b57cec5SDimitry Andric [SDTCisInt<0>, SDTCisInt<1>, SDTCisPtrTy<2>, SDTCisPtrTy<3>, SDTCisInt<4>] 260b57cec5SDimitry Andric>; 270b57cec5SDimitry Andricdef wasm_memcpy : SDNode<"WebAssemblyISD::MEMORY_COPY", wasm_memcpy_t, 280b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andricdef wasm_memset_t : SDTypeProfile<0, 4, 310b57cec5SDimitry Andric [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisInt<2>, SDTCisInt<3>] 320b57cec5SDimitry Andric>; 330b57cec5SDimitry Andricdef wasm_memset : SDNode<"WebAssemblyISD::MEMORY_FILL", wasm_memset_t, 340b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore]>; 350b57cec5SDimitry Andric 365ffd83dbSDimitry Andricmulticlass BulkMemoryOps<WebAssemblyRegClass rc, string B> { 375ffd83dbSDimitry Andric 380b57cec5SDimitry Andriclet mayStore = 1, hasSideEffects = 1 in 395ffd83dbSDimitry Andricdefm MEMORY_INIT_A#B : 400b57cec5SDimitry Andric BULK_I<(outs), 415ffd83dbSDimitry Andric (ins i32imm_op:$seg, i32imm_op:$idx, rc:$dest, 42*e8d8bef9SDimitry Andric I32:$offset, I32:$size), 430b57cec5SDimitry Andric (outs), (ins i32imm_op:$seg, i32imm_op:$idx), 445ffd83dbSDimitry Andric [], 450b57cec5SDimitry Andric "memory.init\t$seg, $idx, $dest, $offset, $size", 460b57cec5SDimitry Andric "memory.init\t$seg, $idx", 0x08>; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andriclet hasSideEffects = 1 in 490b57cec5SDimitry Andricdefm DATA_DROP : 500b57cec5SDimitry Andric BULK_I<(outs), (ins i32imm_op:$seg), (outs), (ins i32imm_op:$seg), 515ffd83dbSDimitry Andric [], 520b57cec5SDimitry Andric "data.drop\t$seg", "data.drop\t$seg", 0x09>; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1 in 555ffd83dbSDimitry Andricdefm MEMORY_COPY_A#B : 560b57cec5SDimitry Andric BULK_I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx, 575ffd83dbSDimitry Andric rc:$dst, rc:$src, rc:$len), 580b57cec5SDimitry Andric (outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx), 590b57cec5SDimitry Andric [(wasm_memcpy (i32 imm:$src_idx), (i32 imm:$dst_idx), 605ffd83dbSDimitry Andric rc:$dst, rc:$src, rc:$len 610b57cec5SDimitry Andric )], 620b57cec5SDimitry Andric "memory.copy\t$src_idx, $dst_idx, $dst, $src, $len", 630b57cec5SDimitry Andric "memory.copy\t$src_idx, $dst_idx", 0x0a>; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andriclet mayStore = 1 in 665ffd83dbSDimitry Andricdefm MEMORY_FILL_A#B : 675ffd83dbSDimitry Andric BULK_I<(outs), (ins i32imm_op:$idx, rc:$dst, I32:$value, rc:$size), 680b57cec5SDimitry Andric (outs), (ins i32imm_op:$idx), 695ffd83dbSDimitry Andric [(wasm_memset (i32 imm:$idx), rc:$dst, I32:$value, rc:$size)], 700b57cec5SDimitry Andric "memory.fill\t$idx, $dst, $value, $size", 710b57cec5SDimitry Andric "memory.fill\t$idx", 0x0b>; 725ffd83dbSDimitry Andric} 735ffd83dbSDimitry Andric 745ffd83dbSDimitry Andricdefm : BulkMemoryOps<I32, "32">; 755ffd83dbSDimitry Andricdefm : BulkMemoryOps<I64, "64">; 76