169e2797eSPaulo Matos// WebAssemblyInstrTable.td - WebAssembly Table codegen support -*- tablegen -*- 269e2797eSPaulo Matos// 369e2797eSPaulo Matos// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 469e2797eSPaulo Matos// See https://llvm.org/LICENSE.txt for license information. 569e2797eSPaulo Matos// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 669e2797eSPaulo Matos// 769e2797eSPaulo Matos//===----------------------------------------------------------------------===// 869e2797eSPaulo Matos/// 969e2797eSPaulo Matos/// \file 1069e2797eSPaulo Matos/// WebAssembly Table operand code-gen constructs. 1169e2797eSPaulo Matos/// Instructions that handle tables 1269e2797eSPaulo Matos//===----------------------------------------------------------------------===// 1369e2797eSPaulo Matos 146d0c7bc1SPaulo Matosdef WebAssemblyTableSet_t : SDTypeProfile<0, 3, [SDTCisPtrTy<1>]>; 156d0c7bc1SPaulo Matosdef WebAssemblyTableSet : SDNode<"WebAssemblyISD::TABLE_SET", WebAssemblyTableSet_t, 166d0c7bc1SPaulo Matos [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 176d0c7bc1SPaulo Matos 186d0c7bc1SPaulo Matosdef WebAssemblyTableGet_t : SDTypeProfile<1, 2, [SDTCisPtrTy<1>]>; 196d0c7bc1SPaulo Matosdef WebAssemblyTableGet : SDNode<"WebAssemblyISD::TABLE_GET", WebAssemblyTableGet_t, 206d0c7bc1SPaulo Matos [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 216d0c7bc1SPaulo Matos 226d0c7bc1SPaulo Matos 232fd634a5SPaulo Matosmulticlass TABLE<WebAssemblyRegClass rc, string suffix> { 2446667a10SPaulo Matos let mayLoad = 1 in 256d0c7bc1SPaulo Matos defm TABLE_GET_#rc : I<(outs rc:$res), (ins table32_op:$table, I32:$i), 2669e2797eSPaulo Matos (outs), (ins table32_op:$table), 271bd1a440SPaulo Matos [(set rc:$res, (!cast<Intrinsic>("int_wasm_table_get_" # suffix) (WebAssemblyWrapper tglobaladdr:$table), I32:$i))], 289647a6f7SWouter van Oortmerssen "table.get\t$res, $table, $i", 2969e2797eSPaulo Matos "table.get\t$table", 3069e2797eSPaulo Matos 0x25>; 3169e2797eSPaulo Matos 3246667a10SPaulo Matos let mayStore = 1 in 336d0c7bc1SPaulo Matos defm TABLE_SET_#rc : I<(outs), (ins table32_op:$table, I32:$i, rc:$val), 3469e2797eSPaulo Matos (outs), (ins table32_op:$table), 351bd1a440SPaulo Matos [(!cast<Intrinsic>("int_wasm_table_set_" # suffix) (WebAssemblyWrapper tglobaladdr:$table), I32:$i, rc:$val)], 36cd460c4dSPaulo Matos "table.set\t$table, $i, $val", 3769e2797eSPaulo Matos "table.set\t$table", 3869e2797eSPaulo Matos 0x26>; 3969e2797eSPaulo Matos 406d0c7bc1SPaulo Matos defm TABLE_GROW_#rc : I<(outs I32:$sz), (ins table32_op:$table, rc:$val, I32:$n), 4169e2797eSPaulo Matos (outs), (ins table32_op:$table), 422fd634a5SPaulo Matos [(set I32:$sz, (!cast<Intrinsic>("int_wasm_table_grow_" # suffix) (WebAssemblyWrapper tglobaladdr:$table), rc:$val, I32:$n))], 43cd460c4dSPaulo Matos "table.grow\t$sz, $table, $val, $n", 4469e2797eSPaulo Matos "table.grow\t$table", 4569e2797eSPaulo Matos 0xfc0f>; 4669e2797eSPaulo Matos 476d0c7bc1SPaulo Matos defm TABLE_FILL_#rc : I<(outs), (ins table32_op:$table, I32:$i, rc:$val, I32:$n), 4869e2797eSPaulo Matos (outs), (ins table32_op:$table), 492fd634a5SPaulo Matos [(!cast<Intrinsic>("int_wasm_table_fill_" # suffix) (WebAssemblyWrapper tglobaladdr:$table), I32:$i, rc:$val, I32:$n)], 50cd460c4dSPaulo Matos "table.fill\t$table, $i, $val, $n", 5169e2797eSPaulo Matos "table.fill\t$table", 5269e2797eSPaulo Matos 0xfc11>; 5369e2797eSPaulo Matos 546d0c7bc1SPaulo Matos foreach vt = rc.RegTypes in { 556d0c7bc1SPaulo Matos def : Pat<(vt (WebAssemblyTableGet (WebAssemblyWrapper tglobaladdr:$table), i32:$idx)), 566d0c7bc1SPaulo Matos (!cast<NI>("TABLE_GET_" # rc) tglobaladdr:$table, i32:$idx)>; 576d0c7bc1SPaulo Matos def : Pat<(WebAssemblyTableSet 586d0c7bc1SPaulo Matos (WebAssemblyWrapper tglobaladdr:$table), 596d0c7bc1SPaulo Matos i32:$idx, 606d0c7bc1SPaulo Matos vt:$src), 616d0c7bc1SPaulo Matos (!cast<NI>("TABLE_SET_" # rc) tglobaladdr:$table, i32:$idx, vt:$src)>; 626d0c7bc1SPaulo Matos } 6369e2797eSPaulo Matos} 6469e2797eSPaulo Matos 652fd634a5SPaulo Matosdefm "" : TABLE<FUNCREF, "funcref">, Requires<[HasReferenceTypes]>; 662fd634a5SPaulo Matosdefm "" : TABLE<EXTERNREF, "externref">, Requires<[HasReferenceTypes]>; 67*c179d50fSHeejin Ahndefm "" : TABLE<EXNREF, "exnref">, 68*c179d50fSHeejin Ahn Requires<[HasReferenceTypes, HasExceptionHandling]>; 6969e2797eSPaulo Matos 706d0c7bc1SPaulo Matosdef : Pat<(WebAssemblyTableSet mcsym:$table, i32:$idx, funcref:$r), 716d0c7bc1SPaulo Matos (TABLE_SET_FUNCREF mcsym:$table, i32:$idx, funcref:$r)>, 7246667a10SPaulo Matos Requires<[HasReferenceTypes]>; 7346667a10SPaulo Matos 7469e2797eSPaulo Matosdefm TABLE_SIZE : I<(outs I32:$sz), (ins table32_op:$table), 7569e2797eSPaulo Matos (outs), (ins table32_op:$table), 762fd634a5SPaulo Matos [(set I32:$sz, (int_wasm_table_size (WebAssemblyWrapper tglobaladdr:$table)))], 7769e2797eSPaulo Matos "table.size\t$sz, $table", 7869e2797eSPaulo Matos "table.size\t$table", 7969e2797eSPaulo Matos 0xfc10>, 8069e2797eSPaulo Matos Requires<[HasReferenceTypes]>; 8169e2797eSPaulo Matos 8269e2797eSPaulo Matos 83cd460c4dSPaulo Matosdefm TABLE_COPY : I<(outs), (ins table32_op:$table1, table32_op:$table2, I32:$d, I32:$s, I32:$n), 8469e2797eSPaulo Matos (outs), (ins table32_op:$table1, table32_op:$table2), 852fd634a5SPaulo Matos [(int_wasm_table_copy (WebAssemblyWrapper tglobaladdr:$table1), 862fd634a5SPaulo Matos (WebAssemblyWrapper tglobaladdr:$table2), 872fd634a5SPaulo Matos I32:$d, I32:$s, I32:$n)], 88cd460c4dSPaulo Matos "table.copy\t$table1, $table2, $d, $s, $n", 8969e2797eSPaulo Matos "table.copy\t$table1, $table2", 9069e2797eSPaulo Matos 0xfc0e>, 9169e2797eSPaulo Matos Requires<[HasReferenceTypes]>; 92