Blame sysdeps/x86_64/fpu/svml_s_wrapper_impl.h

Packit 6c4009
/* Wrapper implementations of vector math functions.
Packit 6c4009
   Copyright (C) 2014-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
/* SSE2 ISA version as wrapper to scalar.  */
Packit 6c4009
.macro WRAPPER_IMPL_SSE2 callee
Packit 6c4009
        subq      $40, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(40)
Packit 6c4009
        movaps    %xmm0, (%rsp)
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 16(%rsp)
Packit 6c4009
        movss     4(%rsp), %xmm0
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 20(%rsp)
Packit 6c4009
        movss     8(%rsp), %xmm0
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 24(%rsp)
Packit 6c4009
        movss     12(%rsp), %xmm0
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     16(%rsp), %xmm3
Packit 6c4009
        movss     20(%rsp), %xmm2
Packit 6c4009
        movss     24(%rsp), %xmm1
Packit 6c4009
        movss     %xmm0, 28(%rsp)
Packit 6c4009
        unpcklps  %xmm1, %xmm3
Packit 6c4009
        unpcklps  %xmm0, %xmm2
Packit 6c4009
        unpcklps  %xmm2, %xmm3
Packit 6c4009
        movaps    %xmm3, %xmm0
Packit 6c4009
        addq      $40, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(-40)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 2 argument SSE2 ISA version as wrapper to scalar.  */
Packit 6c4009
.macro WRAPPER_IMPL_SSE2_ff callee
Packit 6c4009
        subq      $56, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(56)
Packit 6c4009
        movaps    %xmm0, (%rsp)
Packit 6c4009
        movaps    %xmm1, 16(%rsp)
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 32(%rsp)
Packit 6c4009
        movss     4(%rsp), %xmm0
Packit 6c4009
        movss     20(%rsp), %xmm1
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 36(%rsp)
Packit 6c4009
        movss     8(%rsp), %xmm0
Packit 6c4009
        movss     24(%rsp), %xmm1
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     %xmm0, 40(%rsp)
Packit 6c4009
        movss     12(%rsp), %xmm0
Packit 6c4009
        movss     28(%rsp), %xmm1
Packit 6c4009
        call      JUMPTARGET(\callee)
Packit 6c4009
        movss     32(%rsp), %xmm3
Packit 6c4009
        movss     36(%rsp), %xmm2
Packit 6c4009
        movss     40(%rsp), %xmm1
Packit 6c4009
        movss     %xmm0, 44(%rsp)
Packit 6c4009
        unpcklps  %xmm1, %xmm3
Packit 6c4009
        unpcklps  %xmm0, %xmm2
Packit 6c4009
        unpcklps  %xmm2, %xmm3
Packit 6c4009
        movaps    %xmm3, %xmm0
Packit 6c4009
        addq      $56, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(-56)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 3 argument SSE2 ISA version as wrapper to scalar.  */
Packit 6c4009
.macro WRAPPER_IMPL_SSE2_fFF callee
Packit 6c4009
        pushq   %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        pushq   %rbx
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbx, 0)
Packit 6c4009
        movq    %rdi, %rbp
Packit 6c4009
        movq    %rsi, %rbx
Packit 6c4009
        subq    $40, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(40)
Packit 6c4009
        leaq    24(%rsp), %rsi
Packit 6c4009
        leaq    28(%rsp), %rdi
Packit 6c4009
        movaps  %xmm0, (%rsp)
Packit 6c4009
        call    JUMPTARGET(\callee)
Packit 6c4009
        leaq    24(%rsp), %rsi
Packit 6c4009
        leaq    28(%rsp), %rdi
Packit 6c4009
        movss   28(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, 0(%rbp)
Packit 6c4009
        movaps  (%rsp), %xmm1
Packit 6c4009
        movss   24(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, (%rbx)
Packit 6c4009
        movaps  %xmm1, %xmm0
Packit 6c4009
        shufps  $85, %xmm1, %xmm0
Packit 6c4009
        call    JUMPTARGET(\callee)
Packit 6c4009
        movss   28(%rsp), %xmm0
Packit 6c4009
        leaq    24(%rsp), %rsi
Packit 6c4009
        movss   %xmm0, 4(%rbp)
Packit 6c4009
        leaq    28(%rsp), %rdi
Packit 6c4009
        movaps  (%rsp), %xmm1
Packit 6c4009
        movss   24(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, 4(%rbx)
Packit 6c4009
        movaps  %xmm1, %xmm0
Packit 6c4009
        unpckhps        %xmm1, %xmm0
Packit 6c4009
        call    JUMPTARGET(\callee)
Packit 6c4009
        movaps  (%rsp), %xmm1
Packit 6c4009
        leaq    24(%rsp), %rsi
Packit 6c4009
        leaq    28(%rsp), %rdi
Packit 6c4009
        movss   28(%rsp), %xmm0
Packit 6c4009
        shufps  $255, %xmm1, %xmm1
Packit 6c4009
        movss   %xmm0, 8(%rbp)
Packit 6c4009
        movss   24(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, 8(%rbx)
Packit 6c4009
        movaps  %xmm1, %xmm0
Packit 6c4009
        call    JUMPTARGET(\callee)
Packit 6c4009
        movss   28(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, 12(%rbp)
Packit 6c4009
        movss   24(%rsp), %xmm0
Packit 6c4009
        movss   %xmm0, 12(%rbx)
Packit 6c4009
        addq    $40, %rsp
Packit 6c4009
        cfi_adjust_cfa_offset(-40)
Packit 6c4009
        popq    %rbx
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbx)
Packit 6c4009
        popq    %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* AVX/AVX2 ISA version as wrapper to SSE ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX callee
Packit 6c4009
        pushq     	%rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq      	%rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      	$-32, %rsp
Packit 6c4009
        subq      	$32, %rsp
Packit 6c4009
        vextractf128 	$1, %ymm0, (%rsp)
Packit 6c4009
        vzeroupper
Packit 6c4009
        call      	HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   	%xmm0, 16(%rsp)
Packit 6c4009
        vmovaps   	(%rsp), %xmm0
Packit 6c4009
        call      	HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   	%xmm0, %xmm1
Packit 6c4009
        vmovaps   	16(%rsp), %xmm0
Packit 6c4009
        vinsertf128 	$1, %xmm1, %ymm0, %ymm0
Packit 6c4009
        movq      	%rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq      	%rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 2 argument AVX/AVX2 ISA version as wrapper to SSE ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX_ff callee
Packit 6c4009
        pushq     %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq      %rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      $-32, %rsp
Packit 6c4009
        subq      $64, %rsp
Packit 6c4009
        vextractf128 $1, %ymm0, 16(%rsp)
Packit 6c4009
        vextractf128 $1, %ymm1, (%rsp)
Packit 6c4009
        vzeroupper
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   %xmm0, 32(%rsp)
Packit 6c4009
        vmovaps   16(%rsp), %xmm0
Packit 6c4009
        vmovaps   (%rsp), %xmm1
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   %xmm0, %xmm1
Packit 6c4009
        vmovaps   32(%rsp), %xmm0
Packit 6c4009
        vinsertf128 $1, %xmm1, %ymm0, %ymm0
Packit 6c4009
        movq      %rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq      %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 3 argument AVX/AVX2 ISA version as wrapper to SSE ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX_fFF callee
Packit 6c4009
        pushq     %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq      %rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      $-32, %rsp
Packit 6c4009
        pushq     %r13
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%r13, 0)
Packit 6c4009
        pushq     %r14
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%r14, 0)
Packit 6c4009
        subq      $48, %rsp
Packit 6c4009
        movq      %rsi, %r14
Packit 6c4009
        vmovaps   %ymm0, (%rsp)
Packit 6c4009
        movq      %rdi, %r13
Packit 6c4009
        vmovaps   16(%rsp), %xmm1
Packit 6c4009
        vmovaps   %xmm1, 32(%rsp)
Packit 6c4009
        vzeroupper
Packit 6c4009
        vmovaps   (%rsp), %xmm0
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   32(%rsp), %xmm0
Packit 6c4009
        lea       (%rsp), %rdi
Packit 6c4009
        lea       16(%rsp), %rsi
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   (%rsp), %xmm0
Packit 6c4009
        vmovaps   16(%rsp), %xmm1
Packit 6c4009
        vmovaps   %xmm0, 16(%r13)
Packit 6c4009
        vmovaps   %xmm1, 16(%r14)
Packit 6c4009
        addq      $48, %rsp
Packit 6c4009
        popq      %r14
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%r14)
Packit 6c4009
        popq      %r13
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%r13)
Packit 6c4009
        movq      %rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq      %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* AVX512 ISA version as wrapper to AVX2 ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX512 callee
Packit 6c4009
        pushq     %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq      %rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      $-64, %rsp
Packit 6c4009
        subq      $128, %rsp
Packit 6c4009
        vmovups   %zmm0, (%rsp)
Packit 6c4009
        vmovupd   (%rsp), %ymm0
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovupd   %ymm0, 64(%rsp)
Packit 6c4009
        vmovupd   32(%rsp), %ymm0
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovupd   %ymm0, 96(%rsp)
Packit 6c4009
        vmovups   64(%rsp), %zmm0
Packit 6c4009
        movq      %rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq      %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 2 argument AVX512 ISA version as wrapper to AVX2 ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX512_ff callee
Packit 6c4009
        pushq     %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq      %rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      $-64, %rsp
Packit 6c4009
        subq      $192, %rsp
Packit 6c4009
        vmovups   %zmm0, (%rsp)
Packit 6c4009
        vmovups   %zmm1, 64(%rsp)
Packit 6c4009
        vmovups   (%rsp), %ymm0
Packit 6c4009
        vmovups   64(%rsp), %ymm1
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovups   %ymm0, 128(%rsp)
Packit 6c4009
        vmovups   32(%rsp), %ymm0
Packit 6c4009
        vmovups   96(%rsp), %ymm1
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovups   %ymm0, 160(%rsp)
Packit 6c4009
        vmovups   128(%rsp), %zmm0
Packit 6c4009
        movq      %rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq      %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
/* 3 argument AVX512 ISA version as wrapper to AVX2 ISA version.  */
Packit 6c4009
.macro WRAPPER_IMPL_AVX512_fFF callee
Packit 6c4009
        pushq     %rbp
Packit 6c4009
        cfi_adjust_cfa_offset (8)
Packit 6c4009
        cfi_rel_offset (%rbp, 0)
Packit 6c4009
        movq	%rsp, %rbp
Packit 6c4009
        cfi_def_cfa_register (%rbp)
Packit 6c4009
        andq      $-64, %rsp
Packit 6c4009
        pushq     %r12
Packit 6c4009
        pushq     %r13
Packit 6c4009
        subq      $176, %rsp
Packit 6c4009
        movq      %rsi, %r13
Packit 6c4009
        vmovaps   %zmm0, (%rsp)
Packit 6c4009
        movq      %rdi, %r12
Packit 6c4009
        vmovaps   (%rsp), %ymm0
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   32(%rsp), %ymm0
Packit 6c4009
        lea       64(%rsp), %rdi
Packit 6c4009
        lea       96(%rsp), %rsi
Packit 6c4009
        call      HIDDEN_JUMPTARGET(\callee)
Packit 6c4009
        vmovaps   64(%rsp), %ymm0
Packit 6c4009
        vmovaps   96(%rsp), %ymm1
Packit 6c4009
        vmovaps   %ymm0, 32(%r12)
Packit 6c4009
        vmovaps   %ymm1, 32(%r13)
Packit 6c4009
        addq      $176, %rsp
Packit 6c4009
        popq      %r13
Packit 6c4009
        popq      %r12
Packit 6c4009
        movq      %rbp, %rsp
Packit 6c4009
        cfi_def_cfa_register (%rsp)
Packit 6c4009
        popq	%rbp
Packit 6c4009
        cfi_adjust_cfa_offset (-8)
Packit 6c4009
        cfi_restore (%rbp)
Packit 6c4009
        ret
Packit 6c4009
.endm