/* * check NEON registers for clobbering * Copyright (c) 2008 Ramiro Polla * 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 #include #include #include #include #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