1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 19:52:54 +01:00
llvm-mirror/lib/Target/WebAssembly/WebAssemblyInstrTable.td
Paulo Matos f7fc888024 [WebAssembly] Implementation of (most) table instructions
Implementation of instructions table.get, table.set, table.grow,
table.size, table.fill, table.copy.

Missing instructions are table.init and elem.drop as they deal with
element sections which are not yet implemented.

Added more tests to tables.s

Differential Revision: https://reviews.llvm.org/D89797
2020-10-23 08:42:54 -07:00

65 lines
2.6 KiB
TableGen

// WebAssemblyInstrTable.td - WebAssembly Table codegen support -*- tablegen -*-
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// WebAssembly Table operand code-gen constructs.
/// Instructions that handle tables
//===----------------------------------------------------------------------===//
multiclass TABLE<WebAssemblyRegClass rt> {
defm TABLE_GET_#rt : I<(outs rt:$res), (ins table32_op:$table),
(outs), (ins table32_op:$table),
[],
"table.get\t$res, $table",
"table.get\t$table",
0x25>;
defm TABLE_SET_#rt : I<(outs), (ins table32_op:$table, rt:$val, I32:$i),
(outs), (ins table32_op:$table),
[],
"table.set\t$table, $val, $i",
"table.set\t$table",
0x26>;
defm TABLE_GROW_#rt : I<(outs I32:$sz), (ins table32_op:$table, I32:$n, rt:$val),
(outs), (ins table32_op:$table),
[],
"table.grow\t$sz, $table, $n, $val",
"table.grow\t$table",
0xfc0f>;
defm TABLE_FILL_#rt : I<(outs), (ins table32_op:$table, I32:$n, rt:$val, I32:$i),
(outs), (ins table32_op:$table),
[],
"table.fill\t$table, $n, $val, $i",
"table.fill\t$table",
0xfc11>;
}
defm "" : TABLE<FUNCREF>, Requires<[HasReferenceTypes]>;
defm "" : TABLE<EXTERNREF>, Requires<[HasReferenceTypes]>;
defm TABLE_SIZE : I<(outs I32:$sz), (ins table32_op:$table),
(outs), (ins table32_op:$table),
[],
"table.size\t$sz, $table",
"table.size\t$table",
0xfc10>,
Requires<[HasReferenceTypes]>;
defm TABLE_COPY : I<(outs), (ins table32_op:$table1, table32_op:$table2, I32:$n, I32:$s, I32:$d),
(outs), (ins table32_op:$table1, table32_op:$table2),
[],
"table.copy\t$table1, $table2, $n, $s, $d",
"table.copy\t$table1, $table2",
0xfc0e>,
Requires<[HasReferenceTypes]>;