blob: b9792b661a74253699c0475a71b638e4904e8e2a [file]
; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s --check-prefix=CHECK64
%funcref = type target("wasm.funcref")
declare %funcref @llvm.wasm.ptr.to_funcref(ptr) nounwind
; CHECK: .tabletype __indirect_function_table, funcref
; Converting a function pointer to a funcref is a table.get from the
; __indirect_function_table.
define %funcref @ptr_to_funcref(ptr %p) {
; CHECK-LABEL: ptr_to_funcref:
; CHECK: .functype ptr_to_funcref (i32) -> (funcref)
; CHECK-NEXT: local.get 0
; CHECK-NEXT: table.get __indirect_function_table
; CHECK-NEXT: end_function
;
; On wasm64 the function pointer is an i64 and must be wrapped to i32 first.
; CHECK64-LABEL: ptr_to_funcref:
; CHECK64: .functype ptr_to_funcref (i64) -> (funcref)
; CHECK64-NEXT: local.get 0
; CHECK64-NEXT: i32.wrap_i64
; CHECK64-NEXT: table.get __indirect_function_table
; CHECK64-NEXT: end_function
%ref = call %funcref @llvm.wasm.ptr.to_funcref(ptr %p)
ret %funcref %ref
}