x86: Move duplicated put_pixels{8|16}_mmx functions into their own file
[ffmpeg.git] / libavcodec / x86 / fpel_mmx.c
1 /*
2  * MMX-optimized avg/put pixel routines
3  *
4  * Copyright (c) 2000, 2001 Fabrice Bellard
5  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6  *
7  * This file is part of Libav.
8  *
9  * Libav is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * Libav is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with Libav; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 #include <stddef.h>
25 #include <stdint.h>
26
27 #include "config.h"
28 #include "dsputil_mmx.h"
29
30 #if HAVE_MMX_INLINE
31
32 void ff_put_pixels8_mmx(uint8_t *block, const uint8_t *pixels,
33                         ptrdiff_t line_size, int h)
34 {
35     __asm__ volatile (
36         "lea   (%3, %3), %%"REG_a"      \n\t"
37         ".p2align     3                 \n\t"
38         "1:                             \n\t"
39         "movq  (%1    ), %%mm0          \n\t"
40         "movq  (%1, %3), %%mm1          \n\t"
41         "movq     %%mm0, (%2)           \n\t"
42         "movq     %%mm1, (%2, %3)       \n\t"
43         "add  %%"REG_a", %1             \n\t"
44         "add  %%"REG_a", %2             \n\t"
45         "movq  (%1    ), %%mm0          \n\t"
46         "movq  (%1, %3), %%mm1          \n\t"
47         "movq     %%mm0, (%2)           \n\t"
48         "movq     %%mm1, (%2, %3)       \n\t"
49         "add  %%"REG_a", %1             \n\t"
50         "add  %%"REG_a", %2             \n\t"
51         "subl        $4, %0             \n\t"
52         "jnz         1b                 \n\t"
53         : "+g"(h), "+r"(pixels),  "+r"(block)
54         : "r"((x86_reg)line_size)
55         : "%"REG_a, "memory"
56         );
57 }
58
59 void ff_put_pixels16_mmx(uint8_t *block, const uint8_t *pixels,
60                          ptrdiff_t line_size, int h)
61 {
62     __asm__ volatile (
63         "lea   (%3, %3), %%"REG_a"      \n\t"
64         ".p2align     3                 \n\t"
65         "1:                             \n\t"
66         "movq  (%1    ), %%mm0          \n\t"
67         "movq 8(%1    ), %%mm4          \n\t"
68         "movq  (%1, %3), %%mm1          \n\t"
69         "movq 8(%1, %3), %%mm5          \n\t"
70         "movq     %%mm0,  (%2)          \n\t"
71         "movq     %%mm4, 8(%2)          \n\t"
72         "movq     %%mm1,  (%2, %3)      \n\t"
73         "movq     %%mm5, 8(%2, %3)      \n\t"
74         "add  %%"REG_a", %1             \n\t"
75         "add  %%"REG_a", %2             \n\t"
76         "movq  (%1    ), %%mm0          \n\t"
77         "movq 8(%1    ), %%mm4          \n\t"
78         "movq  (%1, %3), %%mm1          \n\t"
79         "movq 8(%1, %3), %%mm5          \n\t"
80         "movq     %%mm0,  (%2)          \n\t"
81         "movq     %%mm4, 8(%2)          \n\t"
82         "movq     %%mm1,  (%2, %3)      \n\t"
83         "movq     %%mm5, 8(%2, %3)      \n\t"
84         "add  %%"REG_a", %1             \n\t"
85         "add  %%"REG_a", %2             \n\t"
86         "subl        $4, %0             \n\t"
87         "jnz         1b                 \n\t"
88         : "+g"(h), "+r"(pixels),  "+r"(block)
89         : "r"((x86_reg)line_size)
90         : "%"REG_a, "memory"
91         );
92 }
93
94 #endif /* HAVE_MMX_INLINE */