[PATCH] D113420: [WebAssembly] Implementation of intrinsics for table.fill and table.copy
Paulo Matos via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 8 10:30:30 PST 2021
pmatos created this revision.
pmatos added a reviewer: tlively.
Herald added subscribers: ecnelises, sunfish, hiraditya, jgravelle-google, sbc100, dschuff.
pmatos requested review of this revision.
Herald added subscribers: llvm-commits, aheejin.
Herald added a project: LLVM.
This follows up work from D111227 <https://reviews.llvm.org/D111227> and completes the set of intrinsics
for table operations by implementing intrinsics to generate
`table.fill` and `table.copy` instructions.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D113420
Files:
llvm/include/llvm/IR/IntrinsicsWebAssembly.td
llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
llvm/test/CodeGen/WebAssembly/table-copy.ll
llvm/test/CodeGen/WebAssembly/table-fill.ll
Index: llvm/test/CodeGen/WebAssembly/table-fill.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/table-fill.ll
@@ -0,0 +1,22 @@
+; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s
+
+%extern = type opaque
+%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
+
+ at externref_table = local_unnamed_addr addrspace(1) global [0 x %externref] undef
+
+declare void @llvm.wasm.table.fill.externref(i8 addrspace(1)*, i32, %externref, i32) nounwind readonly
+
+define void @table_fill(i32 %start, i32 %len, %externref %val) {
+; CHECK-LABEL: table_fill:
+; CHECK-NEXT: .functype table_fill (i32, i32, externref) -> ()
+; CHECK-NEXT: local.get 0
+; CHECK-NEXT: local.get 2
+; CHECK-NEXT: local.get 1
+; CHECK-NEXT: table.fill externref_table
+; CHECK-NEXT: end_function
+ %tableptr = getelementptr [0 x %externref], [0 x %externref] addrspace(1)* @externref_table, i32 0, i32 0
+ %tb = bitcast %externref addrspace(1)* %tableptr to i8 addrspace(1)*
+ call void @llvm.wasm.table.fill.externref(i8 addrspace(1)* %tb, i32 %start, %externref %val, i32 %len)
+ ret void
+}
Index: llvm/test/CodeGen/WebAssembly/table-copy.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/table-copy.ll
@@ -0,0 +1,25 @@
+; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s
+
+%extern = type opaque
+%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
+
+ at externref_table1 = local_unnamed_addr addrspace(1) global [0 x %externref] undef
+ at externref_table2 = local_unnamed_addr addrspace(1) global [0 x %externref] undef
+
+declare void @llvm.wasm.table.copy(i8 addrspace(1)*, i8 addrspace(1)*, i32, i32, i32) nounwind readonly
+
+define void @table_copy(i32 %dst, i32 %src, i32 %len) {
+; CHECK-LABEL: table_copy:
+; CHECK-NEXT: .functype table_copy (i32, i32, i32) -> ()
+; CHECK-NEXT: local.get 0
+; CHECK-NEXT: local.get 1
+; CHECK-NEXT: local.get 2
+; CHECK-NEXT: table.copy externref_table1, externref_table2
+; CHECK-NEXT: end_function
+ %tableptr1 = getelementptr [0 x %externref], [0 x %externref] addrspace(1)* @externref_table1, i32 0, i32 0
+ %tb1 = bitcast %externref addrspace(1)* %tableptr1 to i8 addrspace(1)*
+ %tableptr2 = getelementptr [0 x %externref], [0 x %externref] addrspace(1)* @externref_table2, i32 0, i32 0
+ %tb2 = bitcast %externref addrspace(1)* %tableptr2 to i8 addrspace(1)*
+ call void @llvm.wasm.table.copy(i8 addrspace(1)* %tb1, i8 addrspace(1)* %tb2, i32 %dst, i32 %src, i32 %len)
+ ret void
+}
Index: llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
+++ llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
@@ -46,7 +46,7 @@
defm TABLE_FILL_#rc : I<(outs), (ins table32_op:$table, I32:$i, rc:$val, I32:$n),
(outs), (ins table32_op:$table),
- [],
+ [(int_wasm_table_fill (WebAssemblyWrapper tglobaladdr:$table), I32:$i, rc:$val, I32:$n)],
"table.fill\t$table, $i, $val, $n",
"table.fill\t$table",
0xfc11>;
@@ -80,7 +80,9 @@
defm TABLE_COPY : I<(outs), (ins table32_op:$table1, table32_op:$table2, I32:$d, I32:$s, I32:$n),
(outs), (ins table32_op:$table1, table32_op:$table2),
- [],
+ [(int_wasm_table_copy (WebAssemblyWrapper tglobaladdr:$table1),
+ (WebAssemblyWrapper tglobaladdr:$table2),
+ I32:$d, I32:$s, I32:$n)],
"table.copy\t$table1, $table2, $d, $s, $n",
"table.copy\t$table1, $table2",
0xfc0e>,
Index: llvm/include/llvm/IR/IntrinsicsWebAssembly.td
===================================================================
--- llvm/include/llvm/IR/IntrinsicsWebAssembly.td
+++ llvm/include/llvm/IR/IntrinsicsWebAssembly.td
@@ -44,6 +44,12 @@
def int_wasm_table_grow : Intrinsic<[llvm_i32_ty],
[llvm_table_ty, llvm_anyref_ty, llvm_i32_ty],
[]>;
+def int_wasm_table_fill : Intrinsic<[],
+ [llvm_table_ty, llvm_i32_ty, llvm_anyref_ty, llvm_i32_ty],
+ []>;
+def int_wasm_table_copy : Intrinsic<[],
+ [llvm_table_ty, llvm_table_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
+ []>;
//===----------------------------------------------------------------------===//
// Trapping float-to-int conversions
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113420.385555.patch
Type: text/x-patch
Size: 4945 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211108/846bcfda/attachment.bin>
More information about the llvm-commits
mailing list