On 2016-01-01 22:42:47 +0200, Martin Storsjö wrote:
> This is disabled on iOS, since iOS uses a slightly different ABI
> for vararg parameters.
> ---
> Rebased on top of the updated arm version.
> ---
>  tests/checkasm/aarch64/Makefile   |    1 +
>  tests/checkasm/aarch64/checkasm.S |  148 
> +++++++++++++++++++++++++++++++++++++
>  tests/checkasm/checkasm.h         |    4 +
>  3 files changed, 153 insertions(+)
>  create mode 100644 tests/checkasm/aarch64/Makefile
>  create mode 100644 tests/checkasm/aarch64/checkasm.S
> 
> diff --git a/tests/checkasm/aarch64/Makefile b/tests/checkasm/aarch64/Makefile
> new file mode 100644
> index 0000000..02ba6ca
> --- /dev/null
> +++ b/tests/checkasm/aarch64/Makefile
> @@ -0,0 +1 @@
> +CHECKASMOBJS += aarch64/checkasm.o
> diff --git a/tests/checkasm/aarch64/checkasm.S 
> b/tests/checkasm/aarch64/checkasm.S
> new file mode 100644
> index 0000000..9668518c
> --- /dev/null
> +++ b/tests/checkasm/aarch64/checkasm.S
> @@ -0,0 +1,148 @@
> +/****************************************************************************
> + * Assembly testing and benchmarking tool
> + * Copyright (c) 2015 Martin Storsjo
> + * Copyright (c) 2015 Janne Grunau
> + *
> + * This file is part of Libav.
> + *
> + * Libav is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * Libav is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
> + 
> *****************************************************************************/
> +
> +#include "libavutil/aarch64/asm.S"
> +
> +const register_init
> +    .quad 0x21f86d66c8ca00ce
> +    .quad 0x75b6ba21077c48ad
> +    .quad 0xed56bb2dcb3c7736
> +    .quad 0x8bda43d3fd1a7e06
> +    .quad 0xb64a9c9e5d318408
> +    .quad 0xdf9a54b303f1d3a3
> +    .quad 0x4a75479abd64e097
> +    .quad 0x249214109d5d1c88
> +    .quad 0x1a1b2550a612b48c
> +    .quad 0x79445c159ce79064
> +    .quad 0x2eed899d5a28ddcd
> +    .quad 0x86b2536fcd8cf636
> +    .quad 0xb0856806085e7943
> +    .quad 0x3f2bf84fc0fcca4e
> +    .quad 0xacbd382dcf5b8de2
> +    .quad 0xd229e1f5b281303f
> +    .quad 0x71aeaff20b095fd9
> +    .quad 0xab63e2e11fa38ed9
> +endconst
> +
> +
> +const error_message
> +    .asciz "failed to preserve register"
> +endconst
> +
> +
> +// max number of args used by any asm function.
> +#define MAX_ARGS 15
> +
> +#define ARG_STACK ((8*(MAX_ARGS - 7) + 15) & ~15)
> +
> +function checkasm_checked_call, export=1
> +    stp         x29, x30, [sp, #-16]!
> +    mov         x29, sp
> +    stp         x19, x20, [sp, #-16]!
> +    stp         x21, x22, [sp, #-16]!
> +    stp         x23, x24, [sp, #-16]!
> +    stp         x25, x26, [sp, #-16]!
> +    stp         x27, x28, [sp, #-16]!
> +    stp         d8,  d9,  [sp, #-16]!
> +    stp         d10, d11, [sp, #-16]!
> +    stp         d12, d13, [sp, #-16]!
> +    stp         d14, d15, [sp, #-16]!
> +
> +    movrel      x9, register_init
> +    ldp         d8,  d9,  [x9], #16
> +    ldp         d10, d11, [x9], #16
> +    ldp         d12, d13, [x9], #16
> +    ldp         d14, d15, [x9], #16
> +    ldp         x19, x20, [x9], #16
> +    ldp         x21, x22, [x9], #16
> +    ldp         x23, x24, [x9], #16
> +    ldp         x25, x26, [x9], #16
> +    ldp         x27, x28, [x9], #16
> +
> +    sub         sp,  sp,  #ARG_STACK
> +.equ pos, 0
> +// the first stacked arg is copied to x7
> +.rept MAX_ARGS-7
> +    ldr         x9, [x29, #16 + 8 + pos]
> +    str         x9, [sp, #pos]
> +.equ pos, pos + 8
> +.endr
> +
> +    mov         x12, x0
> +    mov         x0,  x1
> +    mov         x1,  x2
> +    mov         x2,  x3
> +    mov         x3,  x4
> +    mov         x4,  x5
> +    mov         x5,  x6
> +    mov         x6,  x7
> +    ldr         x7,  [x29, #16]
> +    blr         x12
> +    add         sp,  sp,  #ARG_STACK
> +    stp         x0,  x1,  [sp, #-16]!
> +    movrel      x9, register_init
> +    movi        v3.8h,  #0
> +
> +.macro check_reg_neon reg1, reg2
> +    ldr         q0,  [x9], #16
> +    uzp1        v1.2d,  v\reg1\().2d, v\reg2\().2d
> +    eor         v0.16b, v0.16b, v1.16b
> +    orr         v3.16b, v3.16b, v0.16b
> +.endm
> +    check_reg_neon  8,  9
> +    check_reg_neon  10, 11
> +    check_reg_neon  12, 13
> +    check_reg_neon  14, 15
> +    uqxtn       v3.8b,  v3.8h
> +    umov        x3,  v3.d[0]
> +
> +.macro check_reg reg1, reg2
> +    ldp         x0,  x1,  [x9], #16
> +    eor         x0,  x0,  \reg1
> +    eor         x1,  x1,  \reg2
> +    orr         x3,  x3,  x0
> +    orr         x3,  x3,  x1
> +.endm
> +    check_reg   x19, x20
> +    check_reg   x21, x22
> +    check_reg   x23, x24
> +    check_reg   x25, x26
> +    check_reg   x27, x28
> +
> +    cbz         x3,  0f
> +
> +    movrel      x0, error_message
> +    bl          X(checkasm_fail_func)
> +0:
> +    ldp         x0,  x1,  [sp], #16
> +    ldp         d14, d15, [sp], #16
> +    ldp         d12, d13, [sp], #16
> +    ldp         d10, d11, [sp], #16
> +    ldp         d8,  d9,  [sp], #16
> +    ldp         x27, x28, [sp], #16
> +    ldp         x25, x26, [sp], #16
> +    ldp         x23, x24, [sp], #16
> +    ldp         x21, x22, [sp], #16
> +    ldp         x19, x20, [sp], #16
> +    ldp         x29, x30, [sp], #16
> +    ret
> +endfunc
> diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h
> index 2486cb5..543856c 100644
> --- a/tests/checkasm/checkasm.h
> +++ b/tests/checkasm/checkasm.h
> @@ -125,6 +125,10 @@ void checkasm_checked_call_novfp(void *func, int dummy, 
> ...);
>  extern void (*checkasm_checked_call)(void *func, int dummy, ...);
>  #define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, 
> __VA_ARGS__) = (void *)checkasm_checked_call;
>  #define call_new(...) checked_call(func_new, 0, __VA_ARGS__)
> +#elif ARCH_AARCH64 && !defined(__APPLE__)
> +void checkasm_checked_call(void *func, ...);
> +#define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = 
> (void *)checkasm_checked_call;
> +#define call_new(...) checked_call(func_new, __VA_ARGS__)

this looks much better, thanks. patch ok

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to