| @@ -2,6 +2,7 @@ OBJS-$(CONFIG_H264CHROMA) += aarch64/h264chroma_init_aarch64.o | |||
| OBJS-$(CONFIG_H264DSP) += aarch64/h264dsp_init_aarch64.o | |||
| OBJS-$(CONFIG_H264QPEL) += aarch64/h264qpel_init_aarch64.o | |||
| OBJS-$(CONFIG_HPELDSP) += aarch64/hpeldsp_init_aarch64.o | |||
| OBJS-$(CONFIG_NEON_CLOBBER_TEST) += aarch64/neontest.o | |||
| OBJS-$(CONFIG_RV40_DECODER) += aarch64/rv40dsp_init_aarch64.o | |||
| OBJS-$(CONFIG_VC1_DECODER) += aarch64/vc1dsp_init_aarch64.o | |||
| @@ -0,0 +1,79 @@ | |||
| /* | |||
| * check NEON registers for clobbers | |||
| * Copyright (c) 2013 Martin Storsjo | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 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 | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "libavcodec/avcodec.h" | |||
| #include "libavutil/aarch64/neontest.h" | |||
| wrap(avcodec_open2(AVCodecContext *avctx, | |||
| AVCodec *codec, | |||
| AVDictionary **options)) | |||
| { | |||
| testneonclobbers(avcodec_open2, avctx, codec, options); | |||
| } | |||
| wrap(avcodec_decode_audio4(AVCodecContext *avctx, | |||
| AVFrame *frame, | |||
| int *got_frame_ptr, | |||
| AVPacket *avpkt)) | |||
| { | |||
| testneonclobbers(avcodec_decode_audio4, avctx, frame, | |||
| got_frame_ptr, avpkt); | |||
| } | |||
| wrap(avcodec_decode_video2(AVCodecContext *avctx, | |||
| AVFrame *picture, | |||
| int *got_picture_ptr, | |||
| AVPacket *avpkt)) | |||
| { | |||
| testneonclobbers(avcodec_decode_video2, avctx, picture, | |||
| got_picture_ptr, avpkt); | |||
| } | |||
| wrap(avcodec_decode_subtitle2(AVCodecContext *avctx, | |||
| AVSubtitle *sub, | |||
| int *got_sub_ptr, | |||
| AVPacket *avpkt)) | |||
| { | |||
| testneonclobbers(avcodec_decode_subtitle2, avctx, sub, | |||
| got_sub_ptr, avpkt); | |||
| } | |||
| wrap(avcodec_encode_audio2(AVCodecContext *avctx, | |||
| AVPacket *avpkt, | |||
| const AVFrame *frame, | |||
| int *got_packet_ptr)) | |||
| { | |||
| testneonclobbers(avcodec_encode_audio2, avctx, avpkt, frame, | |||
| got_packet_ptr); | |||
| } | |||
| wrap(avcodec_encode_subtitle(AVCodecContext *avctx, | |||
| uint8_t *buf, int buf_size, | |||
| const AVSubtitle *sub)) | |||
| { | |||
| testneonclobbers(avcodec_encode_subtitle, avctx, buf, buf_size, sub); | |||
| } | |||
| wrap(avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, | |||
| const AVFrame *frame, int *got_packet_ptr)) | |||
| { | |||
| testneonclobbers(avcodec_encode_video2, avctx, avpkt, frame, got_packet_ptr); | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| OBJS-$(CONFIG_NEON_CLOBBER_TEST) += aarch64/neontest.o | |||
| @@ -0,0 +1,31 @@ | |||
| /* | |||
| * check NEON registers for clobbers | |||
| * Copyright (c) 2013 Martin Storsjo | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 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 | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "libavresample/avresample.h" | |||
| #include "libavutil/aarch64/neontest.h" | |||
| wrap(avresample_convert(AVAudioResampleContext *avr, uint8_t **output, | |||
| int out_plane_size, int out_samples, uint8_t **input, | |||
| int in_plane_size, int in_samples)) | |||
| { | |||
| testneonclobbers(avresample_convert, avr, output, out_plane_size, | |||
| out_samples, input, in_plane_size, in_samples); | |||
| } | |||
| @@ -0,0 +1,65 @@ | |||
| /* | |||
| * check NEON registers for clobbering | |||
| * Copyright (c) 2008 Ramiro Polla <ramiro.polla@gmail.com> | |||
| * Copyright (c) 2013 Martin Storsjo | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 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 | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include <inttypes.h> | |||
| #include <stdint.h> | |||
| #include <stdlib.h> | |||
| #include <stdarg.h> | |||
| #include <string.h> | |||
| #include "libavutil/bswap.h" | |||
| #define storeneonregs(mem) \ | |||
| __asm__ volatile( \ | |||
| "stp d8, d9, [%0]\n\t" \ | |||
| "stp d10, d11, [%0, #16]\n\t" \ | |||
| "stp d12, d13, [%0, #32]\n\t" \ | |||
| "stp d14, d15, [%0, #48]\n\t" \ | |||
| :: "r"(mem) : "memory") | |||
| #define testneonclobbers(func, ctx, ...) \ | |||
| uint64_t neon[2][8]; \ | |||
| int ret; \ | |||
| storeneonregs(neon[0]); \ | |||
| ret = __real_ ## func(ctx, __VA_ARGS__); \ | |||
| storeneonregs(neon[1]); \ | |||
| if (memcmp(neon[0], neon[1], sizeof(neon[0]))) { \ | |||
| int i; \ | |||
| av_log(ctx, AV_LOG_ERROR, \ | |||
| "NEON REGS CLOBBERED IN %s!\n", #func); \ | |||
| for (i = 0; i < 8; i ++) \ | |||
| if (neon[0][i] != neon[1][i]) { \ | |||
| av_log(ctx, AV_LOG_ERROR, \ | |||
| "d%-2d = %016"PRIx64"\n", \ | |||
| 8 + i, av_bswap64(neon[0][i])); \ | |||
| av_log(ctx, AV_LOG_ERROR, \ | |||
| " -> %016"PRIx64"\n", \ | |||
| av_bswap64(neon[1][i])); \ | |||
| } \ | |||
| abort(); \ | |||
| } \ | |||
| return ret | |||
| #define wrap(func) \ | |||
| int __real_ ## func; \ | |||
| int __wrap_ ## func; \ | |||
| int __wrap_ ## func | |||