xref: /llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td (revision c179d50fd3d84311708701d84e3bca60570d3d7f)
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