mpegvideo: Move OutFormat enum to mpegutils.h
[ffmpeg.git] / libavcodec / x86 / svq1enc.c
1 /*
2  * This file is part of Libav.
3  *
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.
8  *
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.
13  *
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
17  */
18
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"
25
26 #if HAVE_INLINE_ASM
27
28 static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2,
29                                  int size)
30 {
31     int sum;
32     x86_reg i = size;
33
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));
58
59     return sum;
60 }
61
62 #endif /* HAVE_INLINE_ASM */
63
64 av_cold void ff_svq1enc_init_x86(SVQ1EncContext *c)
65 {
66 #if HAVE_INLINE_ASM
67     int cpu_flags = av_get_cpu_flags();
68
69     if (INLINE_MMX(cpu_flags)) {
70         c->ssd_int8_vs_int16 = ssd_int8_vs_int16_mmx;
71     }
72 #endif /* HAVE_INLINE_ASM */
73 }