aarch64: Add assembly support for -fsanitize=hwaddress tagged globals.
[libav.git] / libavcodec / x86 / svq1enc.c
blob02b0a84b8c9d92cc5f39609f8eb1e375f96148f4
1 /*
2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "config.h"
20 #include "libavutil/attributes.h"
21 #include "libavutil/cpu.h"
22 #include "libavutil/x86/asm.h"
23 #include "libavutil/x86/cpu.h"
24 #include "libavcodec/svq1enc.h"
26 #if HAVE_INLINE_ASM
28 static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2,
29 int size)
31 int sum;
32 x86_reg i = size;
34 __asm__ volatile (
35 "pxor %%mm4, %%mm4 \n"
36 "1: \n"
37 "sub $8, %0 \n"
38 "movq (%2, %0), %%mm2 \n"
39 "movq (%3, %0, 2), %%mm0 \n"
40 "movq 8(%3, %0, 2), %%mm1 \n"
41 "punpckhbw %%mm2, %%mm3 \n"
42 "punpcklbw %%mm2, %%mm2 \n"
43 "psraw $8, %%mm3 \n"
44 "psraw $8, %%mm2 \n"
45 "psubw %%mm3, %%mm1 \n"
46 "psubw %%mm2, %%mm0 \n"
47 "pmaddwd %%mm1, %%mm1 \n"
48 "pmaddwd %%mm0, %%mm0 \n"
49 "paddd %%mm1, %%mm4 \n"
50 "paddd %%mm0, %%mm4 \n"
51 "jg 1b \n"
52 "movq %%mm4, %%mm3 \n"
53 "psrlq $32, %%mm3 \n"
54 "paddd %%mm3, %%mm4 \n"
55 "movd %%mm4, %1 \n"
56 : "+r" (i), "=r" (sum)
57 : "r" (pix1), "r" (pix2));
59 return sum;
62 #endif /* HAVE_INLINE_ASM */
64 av_cold void ff_svq1enc_init_x86(SVQ1EncContext *c)
66 #if HAVE_INLINE_ASM
67 int cpu_flags = av_get_cpu_flags();
69 if (INLINE_MMX(cpu_flags)) {
70 c->ssd_int8_vs_int16 = ssd_int8_vs_int16_mmx;
72 #endif /* HAVE_INLINE_ASM */