xref: /llvm-project/llvm/test/CodeGen/WebAssembly/table-copy.ll (revision bab98395a103ac49aa3d8080565e2b8e99f112a5)
12fd634a5SPaulo Matos; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s
22fd634a5SPaulo Matos
380fb7823SAlex Bradbury%externref = type ptr addrspace(10) ;; addrspace 10 is nonintegral
42fd634a5SPaulo Matos
52fd634a5SPaulo Matos@externref_table1 = local_unnamed_addr addrspace(1) global [0 x %externref] undef
62fd634a5SPaulo Matos@externref_table2 = local_unnamed_addr addrspace(1) global [0 x %externref] undef
72fd634a5SPaulo Matos
880fb7823SAlex Bradburydeclare void @llvm.wasm.table.copy(ptr addrspace(1), ptr addrspace(1), i32, i32, i32) nounwind readonly
92fd634a5SPaulo Matos
102fd634a5SPaulo Matosdefine void @table_copy(i32 %dst, i32 %src, i32 %len) {
112fd634a5SPaulo Matos; CHECK-LABEL: table_copy:
122fd634a5SPaulo Matos; CHECK-NEXT:  .functype	table_copy (i32, i32, i32) -> ()
132fd634a5SPaulo Matos; CHECK-NEXT:  local.get    0
142fd634a5SPaulo Matos; CHECK-NEXT:  local.get    1
152fd634a5SPaulo Matos; CHECK-NEXT:  local.get    2
162fd634a5SPaulo Matos; CHECK-NEXT:  table.copy	externref_table1, externref_table2
172fd634a5SPaulo Matos; CHECK-NEXT:  end_function
18*bab98395SPaulo Matos  call void @llvm.wasm.table.copy(ptr addrspace(1) @externref_table1, ptr addrspace(1) @externref_table2, i32 %dst, i32 %src, i32 %len)
192fd634a5SPaulo Matos  ret void
202fd634a5SPaulo Matos}
212fd634a5SPaulo Matos
222fd634a5SPaulo Matos; Testing copying from a table to itself at different offsets
232fd634a5SPaulo Matos; Copies len items from table1 at src to table1 at src+off
242fd634a5SPaulo Matosdefine void @self_table_copy(i32 %src, i32 %off, i32 %len) {
252fd634a5SPaulo Matos; CHECK-LABEL: self_table_copy:
262fd634a5SPaulo Matos; CHECK-NEXT:  .functype	self_table_copy (i32, i32, i32) -> ()
272fd634a5SPaulo Matos; CHECK-NEXT:  local.get    0
282fd634a5SPaulo Matos; CHECK-NEXT:  local.get    1
292fd634a5SPaulo Matos; CHECK-NEXT:  i32.add
302fd634a5SPaulo Matos; CHECK-NEXT:  local.get    0
312fd634a5SPaulo Matos; CHECK-NEXT:  local.get    2
322fd634a5SPaulo Matos; CHECK-NEXT:  table.copy	externref_table1, externref_table1
332fd634a5SPaulo Matos; CHECK-NEXT:  end_function
342fd634a5SPaulo Matos  %dst = add nsw i32 %src, %off
35*bab98395SPaulo Matos  call void @llvm.wasm.table.copy(ptr addrspace(1) @externref_table1, ptr addrspace(1) @externref_table1, i32 %dst, i32 %src, i32 %len)
362fd634a5SPaulo Matos  ret void
372fd634a5SPaulo Matos}
38