data.s revision 2d4be7aab5a43b4b2bf4e1b527dcddb9bff39ee6
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2012, Richard Lowe.
*/
#define FUNC(x) \
.text; \
.align 16; \
.globl x; \
.type x, @function; \
x:
#define SET_SIZE(x, x_size) \
.size x, [.-x]; \
.globl x_size; \
.type x_size, @object; \
x_size:
/*
* Extracted versions of the functional tests
*
* Named of the form <compiler>-<prologue style>-<nature of test>
* basic -- A regular function
* align -- odd number of arguments needing save-area
* alignment
* big-struct-ret -- returns a > 16byte structure by value
* big-struct-ret-and-spill -- returns a > 16byte structure by value and
* spills args to the stack
* small-struct-ret -- returns a < 16byte structure by value
* small-struct-ret-and-spill -- returns a < 16byte structure by value and
* spills args to the stack
* stack-spill -- spills arguments to the stack
*/
FUNC(gcc_mov_align)
pushq %rbp
movq %rsp, %rbp
movq %rbx, -0x38(%rbp)
movq %r8, -0x28(%rbp)
movq %rcx, -0x20(%rbp)
movq %rdx, -0x18(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdi, -0x8(%rbp)
subq $0x70, %rsp
SET_SIZE(gcc_mov_align, gcc_mov_align_end)
FUNC(gcc_mov_basic)
pushq %rbp
movq %rsp, %rbp
movq %rbx,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(gcc_mov_basic, gcc_mov_basic_end)
FUNC(gcc_mov_big_struct_ret)
pushq %rbp
movq %rsp,%rbp
movq %rbx,-0x28(%rbp)
movq %r8,-0x20(%rbp)
movq %rcx,-0x18(%rbp)
movq %rdx,-0x10(%rbp)
movq %rsi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(gcc_mov_big_struct_ret, gcc_mov_big_struct_ret_end)
FUNC(gcc_mov_big_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
movq %rbx,-0x38(%rbp)
movq %r9,-0x28(%rbp)
movq %r8,-0x20(%rbp)
movq %rcx,-0x18(%rbp)
movq %rdx,-0x10(%rbp)
movq %rsi,-0x8(%rbp)
subq $0x90,%rsp
SET_SIZE(gcc_mov_big_struct_ret_and_spill, gcc_mov_big_struct_ret_and_spill_end)
FUNC(gcc_mov_small_struct_ret)
pushq %rbp
movq %rsp,%rbp
movq %rbx,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(gcc_mov_small_struct_ret, gcc_mov_small_struct_ret_end)
FUNC(gcc_mov_small_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
movq %rbx,-0x38(%rbp)
movq %r9,-0x30(%rbp)
movq %r8,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x90,%rsp
SET_SIZE(gcc_mov_small_struct_ret_and_spill, gcc_mov_small_struct_ret_and_spill_end)
FUNC(gcc_mov_stack_spill)
pushq %rbp
movq %rsp,%rbp
movq %rbx,-0x38(%rbp)
movq %r9,-0x30(%rbp)
movq %r8,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x90,%rsp
SET_SIZE(gcc_mov_stack_spill, gcc_mov_stack_spill_end)
FUNC(gcc_push_align)
pushq %rbp
movq %rsp,%rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
subq $0x8,%rsp
subq $0x30,%rsp
SET_SIZE(gcc_push_align, gcc_push_align_end)
FUNC(gcc_push_basic)
pushq %rbp
movq %rsp,%rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
subq $0x20,%rsp
SET_SIZE(gcc_push_basic, gcc_push_basic_end)
FUNC(gcc_push_big_struct_ret)
pushq %rbp
movq %rsp,%rbp
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
subq $0x30,%rsp
SET_SIZE(gcc_push_big_struct_ret, gcc_push_big_struct_ret_end)
FUNC(gcc_push_big_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
pushq %r9
subq $0x8,%rsp
subq $0x50,%rsp
SET_SIZE(gcc_push_big_struct_ret_and_spill, gcc_push_big_struct_ret_and_spill_end)
FUNC(gcc_push_small_struct_ret)
pushq %rbp
movq %rsp,%rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
subq $0x20,%rsp
SET_SIZE(gcc_push_small_struct_ret, gcc_push_small_struct_ret_end)
FUNC(gcc_push_small_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
pushq %r9
subq $0x50,%rsp
SET_SIZE(gcc_push_small_struct_ret_and_spill, gcc_push_small_struct_ret_and_spill_end)
FUNC(gcc_push_stack_spill)
pushq %rbp
movq %rsp,%rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
pushq %r9
subq $0x50,%rsp
SET_SIZE(gcc_push_stack_spill, gcc_push_stack_spill_end)
FUNC(ss_mov_align)
pushq %rbp
movq %rsp,%rbp
subq $0x30,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
movq %r8,-0x28(%rbp)
SET_SIZE(ss_mov_align, ss_mov_align_end)
FUNC(ss_mov_basic)
pushq %rbp
movq %rsp,%rbp
subq $0x20,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
SET_SIZE(ss_mov_basic, ss_mov_basic_end)
FUNC(ss_mov_big_struct_ret)
pushq %rbp
movq %rsp,%rbp
subq $0x30,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
movq %r8,-0x28(%rbp)
SET_SIZE(ss_mov_big_struct_ret, ss_mov_big_struct_ret_end)
FUNC(ss_mov_big_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
subq $0x50,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
movq %r8,-0x28(%rbp)
movq %r9,-0x30(%rbp)
SET_SIZE(ss_mov_big_struct_ret_and_spill, ss_mov_big_struct_ret_and_spill_end)
FUNC(ss_mov_small_struct_ret)
pushq %rbp
movq %rsp,%rbp
subq $0x20,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
SET_SIZE(ss_mov_small_struct_ret, ss_mov_small_struct_ret_end)
FUNC(ss_mov_small_struct_ret_and_spill)
pushq %rbp
movq %rsp,%rbp
subq $0x50,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
movq %r8,-0x28(%rbp)
movq %r9,-0x30(%rbp)
SET_SIZE(ss_mov_small_struct_ret_and_spill, ss_mov_small_struct_ret_and_spill_end)
FUNC(ss_mov_stack_spill)
pushq %rbp
movq %rsp,%rbp
subq $0x50,%rsp
movq %rdi,-0x8(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdx,-0x18(%rbp)
movq %rcx,-0x20(%rbp)
movq %r8,-0x28(%rbp)
movq %r9,-0x30(%rbp)
SET_SIZE(ss_mov_stack_spill, ss_mov_stack_spill_end)
/* DTrace instrumentation */
FUNC(dtrace_instrumented)
int $0x3
movq %rsp, %rbp
movq %rbx,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(dtrace_instrumented, dtrace_instrumented_end)
/*
* System functions with special characteristics, be they non-initial FP save,
* gaps between FP save and argument saving, or gaps between saved arguments.
*/
FUNC(kmem_alloc)
leaq -0x1(%rdi),%rax
pushq %rbp
movq %rax,%rdx
movq %rsp,%rbp
subq $0x30,%rsp
shrq $0x3,%rdx
movq %r12,-0x28(%rbp)
movq %rbx,-0x30(%rbp)
cmpq $0x1ff,%rdx
movq %r13,-0x20(%rbp)
movq %r14,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
movq %rdi,%r12
SET_SIZE(kmem_alloc, kmem_alloc_end)
FUNC(uts_kill)
pushq %rbp
movq %rsp,%rbp
subq $0x50,%rsp
movq %rbx,-0x28(%rbp)
leaq -0x50(%rbp),%rbx
movq %r12,-0x20(%rbp)
movq %r13,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movl %edi,%r12d
movq %rdi,-0x8(%rbp)
SET_SIZE(uts_kill, uts_kill_end)
FUNC(av1394_ic_bitreverse)
movq %rdi,%rdx
movq $0x5555555555555555,%rax
movq $0x3333333333333333,%rcx
shrq $0x1,%rdx
pushq %rbp
andq %rax,%rdx
andq %rdi,%rax
addq %rax,%rax
movq %rsp,%rbp
subq $0x10,%rsp
orq %rdx,%rax
movq %rdi,-0x8(%rbp)
SET_SIZE(av1394_ic_bitreverse, av1394_ic_bitreverse_end)
/* Problematic functions which should not match */
FUNC(no_fp) /* No frame pointer */
movq %rdi, %rsi
movq %rsi, %rdi
movq %rbx,-0x28(%rbp)
movq %rcx,-0x20(%rbp)
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(no_fp, no_fp_end)
/* Small structure return, but with an SSE type (thus forcing it to the stack) */
FUNC(small_struct_ret_w_float)
pushq %rbp
movq %rsp,%rbp
movq %rdi,-0x8(%rbp)
subq $0x30,%rsp
SET_SIZE(small_struct_ret_w_float, small_struct_ret_w_float_end)
/* Big structure return, but with an SSE type */
FUNC(big_struct_ret_w_float)
pushq %rbp
movq %rsp,%rbp
movq %rsi,-0x8(%rbp)
subq $0x50,%rsp
movq %rsi,-0x48(%rbp)
movq -0x48(%rbp),%rax
movq %rax,%rsi
movl $0x400f60,%edi
movl $0x0,%eax
movl $0x1770,%edi
movl $0x0,%eax
leave
ret
SET_SIZE(big_struct_ret_w_float, big_struct_ret_w_float_end)
FUNC(big_struct_arg_by_value)
pushq %rbp
movq %rsp,%rbp
movq %rdi,-0x8(%rbp)
subq $0x40,%rsp
SET_SIZE(big_struct_arg_by_value, big_struct_arg_by_value_end)
FUNC(small_struct_arg_by_value)
pushq %rbp
movq %rsp,%rbp
movq %rdx,-0x18(%rbp)
movq %rsi,-0x10(%rbp)
movq %rdi,-0x8(%rbp)
subq $0x50,%rsp
SET_SIZE(small_struct_arg_by_value, small_struct_arg_by_value_end)