// Currently `global_asm!` isn't stable on s390x, so this is an external
// assembler file built with the `build.rs`.
.machine z13
.text
.hidden host_to_wasm_trampoline
.globl host_to_wasm_trampoline
.type host_to_wasm_trampoline,@function
.p2align 2
host_to_wasm_trampoline:
.cfi_startproc
// Load the pointer to `VMRuntimeLimits` in `%r1`.
lg %r1, 8(%r3)
// Check to see if callee is a core `VMContext` (MAGIC == "core").
l %r0, 0(%r2)
cfi %r0, 0x65726f63
// Store the last Wasm SP into the `last_wasm_entry_sp` in the limits, if
// this was core Wasm, otherwise store an invalid sentinal value.
lgr %r0, %r15
locghine %r0, -1
stg %r0, 40(%r1)
// Tail call to the callee function pointer in the vmctx.
lg %r1, 16(%r3)
br %r1
.cfi_endproc
.size host_to_wasm_trampoline,.-host_to_wasm_trampoline
.hidden wasm_to_host_trampoline
.globl wasm_to_host_trampoline
.type wasm_to_host_trampoline,@function
.p2align 2
wasm_to_host_trampoline:
.cfi_startproc
// Load the pointer to `VMRuntimeLimits` in `%r1`.
lg %r1, 8(%r3)
// Store the last Wasm FP into the `last_wasm_exit_fp` in the limits.
lg %r0, 0(%r15)
stg %r0, 24(%r1)
// Store the last Wasm PC into the `last_wasm_exit_pc` in the limits.
stg %r14, 32(%r1)
// Tail call to the actual host function.
//
// This *must* be a tail call so that we do not push to the stack and mess
// up the offsets of stack arguments (if any).
lg %r1, 8(%r2)
br %r1
.cfi_endproc
.size wasm_to_host_trampoline,.-wasm_to_host_trampoline
#define LIBCALL_TRAMPOLINE(libcall, libcall_impl) \
.hidden libcall ; \
.globl libcall ; \
.type libcall,@function ; \
.p2align 2 ; \
libcall: ; \
.cfi_startproc ; \
\
/* Load the pointer to `VMRuntimeLimits` in `%r1`. */ \
lg %r1, 8(%r2) ; \
\
/* Store the last Wasm FP into the `last_wasm_exit_fp` in the limits. */ \
lg %r0, 0(%r15) ; \
stg %r0, 24(%r1) ; \
\
/* Store the last Wasm PC into the `last_wasm_exit_pc` in the limits. */ \
stg %r14, 32(%r1) ; \
\
/* Tail call to the actual implementation of this libcall. */ \
jg libcall_impl ; \
\
.cfi_endproc ; \
.size libcall,.-libcall
LIBCALL_TRAMPOLINE(memory32_grow, impl_memory32_grow)
LIBCALL_TRAMPOLINE(table_grow_funcref, impl_table_grow_funcref)
LIBCALL_TRAMPOLINE(table_grow_externref, impl_table_grow_externref)
LIBCALL_TRAMPOLINE(table_fill_funcref, impl_table_fill_funcref)
LIBCALL_TRAMPOLINE(table_fill_externref, impl_table_fill_externref)
LIBCALL_TRAMPOLINE(table_copy, impl_table_copy)
LIBCALL_TRAMPOLINE(table_init, impl_table_init)
LIBCALL_TRAMPOLINE(elem_drop, impl_elem_drop)
LIBCALL_TRAMPOLINE(memory_copy, impl_memory_copy)
LIBCALL_TRAMPOLINE(memory_fill, impl_memory_fill)
LIBCALL_TRAMPOLINE(memory_init, impl_memory_init)
LIBCALL_TRAMPOLINE(ref_func, impl_ref_func)
LIBCALL_TRAMPOLINE(data_drop, impl_data_drop)
LIBCALL_TRAMPOLINE(table_get_lazy_init_funcref, impl_table_get_lazy_init_funcref)
LIBCALL_TRAMPOLINE(drop_externref, impl_drop_externref)
LIBCALL_TRAMPOLINE(activations_table_insert_with_gc, impl_activations_table_insert_with_gc)
LIBCALL_TRAMPOLINE(externref_global_get, impl_externref_global_get)
LIBCALL_TRAMPOLINE(externref_global_set, impl_externref_global_set)
LIBCALL_TRAMPOLINE(memory_atomic_notify, impl_memory_atomic_notify)
LIBCALL_TRAMPOLINE(memory_atomic_wait32, impl_memory_atomic_wait32)
LIBCALL_TRAMPOLINE(memory_atomic_wait64, impl_memory_atomic_wait64)
LIBCALL_TRAMPOLINE(out_of_gas, impl_out_of_gas)
LIBCALL_TRAMPOLINE(new_epoch, impl_new_epoch)