annotate libmpeg2/motion_comp_mmx.c @ 1:3b5f5d1c5041

Initial revision
author arpi_esp
date Sat, 24 Feb 2001 20:28:24 +0000
parents
children 846535ace7a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 * motion_comp_mmx.c
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 * mpeg2dec is free software; you can redistribute it and/or modify
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 * (at your option) any later version.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 * mpeg2dec is distributed in the hope that it will be useful,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 * GNU General Public License for more details.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 #include "config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 #ifdef ARCH_X86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 #include <inttypes.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 #include "mpeg2_internal.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29 #include "attributes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 #include "mmx.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 #define CPU_MMXEXT 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 #define CPU_3DNOW 1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 //MMX code - needs a rewrite
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 // some rounding constants
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 mmx_t round1 = {0x0001000100010001LL};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 mmx_t round4 = {0x0002000200020002LL};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 * This code should probably be compiled with loop unrolling
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 * (ie, -funroll-loops in gcc)becuase some of the loops
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 * use a small static number of iterations. This was written
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 * with the assumption the compiler knows best about when
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 * unrolling will help
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 static inline void mmx_zero_reg ()
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 // load 0 into mm0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 pxor_r2r (mm0, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 static inline void mmx_average_2_U8 (uint8_t * dest,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 uint8_t * src1, uint8_t * src2)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 // *dest = (*src1 + *src2 + 1)/ 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 movq_m2r (*src1, mm1); // load 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 movq_r2r (mm1, mm2); // copy 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 movq_m2r (*src2, mm3); // load 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 movq_r2r (mm3, mm4); // copy 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 punpcklbw_r2r (mm0, mm1); // unpack low src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 punpckhbw_r2r (mm0, mm2); // unpack high src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 punpcklbw_r2r (mm0, mm3); // unpack low src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 punpckhbw_r2r (mm0, mm4); // unpack high src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 paddw_r2r (mm3, mm1); // add lows to mm1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 paddw_m2r (round1, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 psraw_i2r (1, mm1); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 paddw_r2r (mm4, mm2); // add highs to mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 paddw_m2r (round1, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 psraw_i2r (1, mm2); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 packuswb_r2r (mm2, mm1); // pack (w/ saturation)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 movq_r2m (mm1, *dest); // store result in dest
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 static inline void mmx_interp_average_2_U8 (uint8_t * dest,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 uint8_t * src1, uint8_t * src2)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 // *dest = (*dest + (*src1 + *src2 + 1)/ 2 + 1)/ 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 movq_m2r (*dest, mm1); // load 8 dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 movq_r2r (mm1, mm2); // copy 8 dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 movq_m2r (*src1, mm3); // load 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 movq_r2r (mm3, mm4); // copy 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 movq_m2r (*src2, mm5); // load 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 movq_r2r (mm5, mm6); // copy 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 punpcklbw_r2r (mm0, mm1); // unpack low dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 punpckhbw_r2r (mm0, mm2); // unpack high dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 punpcklbw_r2r (mm0, mm3); // unpack low src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 punpckhbw_r2r (mm0, mm4); // unpack high src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 punpcklbw_r2r (mm0, mm5); // unpack low src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 punpckhbw_r2r (mm0, mm6); // unpack high src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 paddw_r2r (mm5, mm3); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 paddw_m2r (round1, mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 psraw_i2r (1, mm3); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 paddw_r2r (mm6, mm4); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 paddw_m2r (round1, mm4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 psraw_i2r (1, mm4); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 paddw_m2r (round1, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 psraw_i2r (1, mm1); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 paddw_m2r (round1, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 psraw_i2r (1, mm2); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 packuswb_r2r (mm2, mm1); // pack (w/ saturation)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 movq_r2m (mm1, *dest); // store result in dest
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 static inline void mmx_average_4_U8 (uint8_t * dest,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 uint8_t * src1, uint8_t * src2,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 uint8_t * src3, uint8_t * src4)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 // *dest = (*src1 + *src2 + *src3 + *src4 + 2)/ 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 movq_m2r (*src1, mm1); // load 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 movq_r2r (mm1, mm2); // copy 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 punpcklbw_r2r (mm0, mm1); // unpack low src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 punpckhbw_r2r (mm0, mm2); // unpack high src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 movq_m2r (*src2, mm3); // load 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 movq_r2r (mm3, mm4); // copy 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 punpcklbw_r2r (mm0, mm3); // unpack low src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 punpckhbw_r2r (mm0, mm4); // unpack high src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 // now have partials in mm1 and mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 movq_m2r (*src3, mm3); // load 8 src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 movq_r2r (mm3, mm4); // copy 8 src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 punpcklbw_r2r (mm0, mm3); // unpack low src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 punpckhbw_r2r (mm0, mm4); // unpack high src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 movq_m2r (*src4, mm5); // load 8 src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 movq_r2r (mm5, mm6); // copy 8 src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 punpcklbw_r2r (mm0, mm5); // unpack low src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 punpckhbw_r2r (mm0, mm6); // unpack high src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 paddw_r2r (mm5, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 paddw_r2r (mm6, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 // now have subtotal in mm1 and mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 paddw_m2r (round4, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 psraw_i2r (2, mm1); // /4
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 paddw_m2r (round4, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 psraw_i2r (2, mm2); // /4
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 packuswb_r2r (mm2, mm1); // pack (w/ saturation)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 movq_r2m (mm1, *dest); // store result in dest
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 static inline void mmx_interp_average_4_U8 (uint8_t * dest,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 uint8_t * src1, uint8_t * src2,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 uint8_t * src3, uint8_t * src4)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 // *dest = (*dest + (*src1 + *src2 + *src3 + *src4 + 2)/ 4 + 1)/ 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 movq_m2r (*src1, mm1); // load 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 movq_r2r (mm1, mm2); // copy 8 src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 punpcklbw_r2r (mm0, mm1); // unpack low src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 punpckhbw_r2r (mm0, mm2); // unpack high src1 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 movq_m2r (*src2, mm3); // load 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 movq_r2r (mm3, mm4); // copy 8 src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 punpcklbw_r2r (mm0, mm3); // unpack low src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 punpckhbw_r2r (mm0, mm4); // unpack high src2 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 // now have partials in mm1 and mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 movq_m2r (*src3, mm3); // load 8 src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 movq_r2r (mm3, mm4); // copy 8 src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 punpcklbw_r2r (mm0, mm3); // unpack low src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 punpckhbw_r2r (mm0, mm4); // unpack high src3 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 movq_m2r (*src4, mm5); // load 8 src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 movq_r2r (mm5, mm6); // copy 8 src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 punpcklbw_r2r (mm0, mm5); // unpack low src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 punpckhbw_r2r (mm0, mm6); // unpack high src4 bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 paddw_r2r (mm5, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 paddw_r2r (mm6, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 paddw_m2r (round4, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 psraw_i2r (2, mm1); // /4
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 paddw_m2r (round4, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 psraw_i2r (2, mm2); // /4
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 // now have subtotal/4 in mm1 and mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 movq_m2r (*dest, mm3); // load 8 dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 movq_r2r (mm3, mm4); // copy 8 dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 punpcklbw_r2r (mm0, mm3); // unpack low dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 punpckhbw_r2r (mm0, mm4); // unpack high dest bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 paddw_r2r (mm3, mm1); // add lows
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 paddw_r2r (mm4, mm2); // add highs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 paddw_m2r (round1, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 psraw_i2r (1, mm1); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 paddw_m2r (round1, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 psraw_i2r (1, mm2); // /2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 // now have end value in mm1 and mm2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 packuswb_r2r (mm2, mm1); // pack (w/ saturation)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 movq_r2m (mm1,*dest); // store result in dest
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 static inline void MC_avg_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 mmx_average_2_U8 (dest, dest, ref);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 mmx_average_2_U8 (dest+8, dest+8, ref+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 static void MC_avg_16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 MC_avg_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 static void MC_avg_8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 MC_avg_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 static inline void MC_put_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 movq_m2r (* ref, mm1); // load 8 ref bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 movq_r2m (mm1,* dest); // store 8 bytes at curr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 movq_m2r (* (ref+8), mm1); // load 8 ref bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 movq_r2m (mm1,* (dest+8)); // store 8 bytes at curr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 static void MC_put_16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 MC_put_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 static void MC_put_8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 MC_put_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 // Half pixel interpolation in the x direction
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 static inline void MC_avg_x_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 mmx_interp_average_2_U8 (dest, ref, ref+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 mmx_interp_average_2_U8 (dest+8, ref+8, ref+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 static void MC_avg_x16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 MC_avg_x_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 static void MC_avg_x8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 MC_avg_x_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 static inline void MC_put_x_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365 mmx_average_2_U8 (dest, ref, ref+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 mmx_average_2_U8 (dest+8, ref+8, ref+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 static void MC_put_x16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378 MC_put_x_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 static void MC_put_x8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384 MC_put_x_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
386
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
387 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389 static inline void MC_avg_xy_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
390 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
391 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 uint8_t * ref_next = ref+stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 mmx_interp_average_4_U8 (dest, ref, ref+1, ref_next, ref_next+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 mmx_interp_average_4_U8 (dest+8, ref+8, ref+9,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
401 ref_next+8, ref_next+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
402
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 ref_next += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
408
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
409 static void MC_avg_xy16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
410 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
411 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
412 MC_avg_xy_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
413 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
414
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
415 static void MC_avg_xy8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418 MC_avg_xy_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
423 static inline void MC_put_xy_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 uint8_t * ref_next = ref+stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
431 mmx_average_4_U8 (dest, ref, ref+1, ref_next, ref_next+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
432
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
434 mmx_average_4_U8 (dest+8, ref+8, ref+9, ref_next+8, ref_next+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 ref_next += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 static void MC_put_xy16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
445 MC_put_xy_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 static void MC_put_xy8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 MC_put_xy_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
453
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
454 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
456 static inline void MC_avg_y_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
457 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 uint8_t * ref_next = ref+stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
460
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
461 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
462
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464 mmx_interp_average_2_U8 (dest, ref, ref_next);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467 mmx_interp_average_2_U8 (dest+8, ref+8, ref_next+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
470 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471 ref_next += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
472 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
473 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
474
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475 static void MC_avg_y16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 MC_avg_y_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
481 static void MC_avg_y8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
484 MC_avg_y_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
485 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
486
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487 //-----------------------------------------------------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
488
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
489 static inline void MC_put_y_mmx (int width, int height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490 uint8_t * dest, uint8_t * ref, int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 uint8_t * ref_next = ref+stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494 mmx_zero_reg ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 mmx_average_2_U8 (dest, ref, ref_next);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 if (width == 16)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 mmx_average_2_U8 (dest+8, ref+8, ref_next+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 ref_next += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508 static void MC_put_y16_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 MC_put_y_mmx (16, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 static void MC_put_y8_mmx (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 MC_put_y_mmx (8, height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
519
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
521 MOTION_COMP_EXTERN (mmx)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
523
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 //CPU_MMXEXT/CPU_3DNOW adaptation layer
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531 #define pavg_r2r(src,dest) \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
532 do { \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533 if (cpu == CPU_MMXEXT) \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 pavgb_r2r (src, dest); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 else \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536 pavgusb_r2r (src, dest); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 } while (0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539 #define pavg_m2r(src,dest) \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 do { \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 if (cpu == CPU_MMXEXT) \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 pavgb_m2r (src, dest); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 else \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544 pavgusb_m2r (src, dest); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
545 } while (0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 //CPU_MMXEXT code
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 static inline void MC_put1_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
557 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
558 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 static inline void MC_put1_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 int stride)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
567 movq_m2r (*(ref+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 movq_r2m (mm1, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
571 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
572 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
573 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
574
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
575 static inline void MC_avg1_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
576 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
578 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
579 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
580 pavg_m2r (*dest, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
583 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
584 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
585 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
586
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
587 static inline void MC_avg1_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
588 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
589 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
590 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
591 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
592 movq_m2r (*(ref+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
593 pavg_m2r (*dest, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
594 pavg_m2r (*(dest+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
595 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
596 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
597 movq_r2m (mm1, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
598 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
599 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
600 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
601
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
602 static inline void MC_put2_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
603 int stride, int offset, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
604 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
605 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
606 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
607 pavg_m2r (*(ref+offset), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
608 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
609 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
610 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
611 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
612 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
613
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
614 static inline void MC_put2_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
615 int stride, int offset, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
616 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
617 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
618 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
619 movq_m2r (*(ref+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
620 pavg_m2r (*(ref+offset), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
621 pavg_m2r (*(ref+offset+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
622 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
623 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
624 movq_r2m (mm1, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
625 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
626 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
627 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
628
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
629 static inline void MC_avg2_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
630 int stride, int offset, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
631 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
632 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
633 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
634 pavg_m2r (*(ref+offset), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
635 pavg_m2r (*dest, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
636 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
637 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
638 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
639 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
640 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
641
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
642 static inline void MC_avg2_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
643 int stride, int offset, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
644 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
645 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
646 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
647 movq_m2r (*(ref+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
648 pavg_m2r (*(ref+offset), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
649 pavg_m2r (*(ref+offset+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
650 pavg_m2r (*dest, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
651 pavg_m2r (*(dest+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
652 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
653 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
654 movq_r2m (mm1, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
655 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
656 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
657 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
658
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
659 static mmx_t mask_one = {0x0101010101010101LL};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
660
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
661 static inline void MC_put4_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
662 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
663 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
664 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
665 movq_m2r (*(ref+1), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
666 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
667 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
668 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
669 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
670
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
671 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
672 movq_m2r (*ref, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
673 movq_r2r (mm0, mm5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
674
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
675 movq_m2r (*(ref+1), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
676 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
677
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
678 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
679 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
680
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
681 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
682 pxor_r2r (mm2, mm5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
683
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
684 pand_r2r (mm5, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
685 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
686
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
687 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
688
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
689 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
690
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
691 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
692 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
693 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
694
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
695 movq_r2r (mm6, mm7); // unroll !
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
696 movq_r2r (mm2, mm0); // unroll !
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
697 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
698 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
699
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
700 static inline void MC_put4_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
701 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
702 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
703 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
704 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
705 movq_m2r (*(ref+stride+1), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
706 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
707 movq_m2r (*(ref+1), mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
708 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
709 movq_m2r (*(ref+stride), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
710 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
711 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
712 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
713 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
714 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
715 movq_r2r (mm0, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
716 pxor_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
717 pand_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
718 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
719 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
720 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
721 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
722
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
723 movq_m2r (*(ref+8), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
724 movq_m2r (*(ref+stride+9), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
725 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
726 movq_m2r (*(ref+9), mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
727 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
728 movq_m2r (*(ref+stride+8), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
729 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
730 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
731 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
732 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
733 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
734 movq_r2r (mm0, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
735 pxor_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
736 pand_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
737 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
738 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
739 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
740 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
741 movq_r2m (mm0, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
742 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
743 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
744 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
745
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
746 static inline void MC_avg4_8 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
747 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
748 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
749 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
750 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
751 movq_m2r (*(ref+stride+1), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
752 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
753 movq_m2r (*(ref+1), mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
754 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
755 movq_m2r (*(ref+stride), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
756 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
757 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
758 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
759 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
760 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
761 movq_r2r (mm0, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
762 pxor_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
763 pand_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
764 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
765 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
766 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
767 movq_m2r (*dest, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
768 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
769 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
770 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
771 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
772 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
773 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
774
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
775 static inline void MC_avg4_16 (int height, uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
776 int stride, int cpu)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
777 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
778 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
779 movq_m2r (*ref, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
780 movq_m2r (*(ref+stride+1), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
781 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
782 movq_m2r (*(ref+1), mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
783 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
784 movq_m2r (*(ref+stride), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
785 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
786 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
787 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
788 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
789 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
790 movq_r2r (mm0, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
791 pxor_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
792 pand_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
793 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
794 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
795 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
796 movq_m2r (*dest, mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
797 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
798 movq_r2m (mm0, *dest);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
799
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
800 movq_m2r (*(ref+8), mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
801 movq_m2r (*(ref+stride+9), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
802 movq_r2r (mm0, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
803 movq_m2r (*(ref+9), mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
804 pxor_r2r (mm1, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
805 movq_m2r (*(ref+stride+8), mm3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
806 movq_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
807 pxor_r2r (mm3, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
808 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
809 pavg_r2r (mm3, mm2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
810 por_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
811 movq_r2r (mm0, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
812 pxor_r2r (mm2, mm6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
813 pand_r2r (mm6, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
814 pand_m2r (mask_one, mm7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
815 pavg_r2r (mm2, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
816 psubusb_r2r (mm7, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
817 movq_m2r (*(dest+8), mm1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
818 pavg_r2r (mm1, mm0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
819 ref += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
820 movq_r2m (mm0, *(dest+8));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
821 dest += stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
822 } while (--height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
823 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
824
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
825 static void MC_avg_16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
826 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
827 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
828 MC_avg1_16 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
829 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
830
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
831 static void MC_avg_8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
832 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
833 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
834 MC_avg1_8 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
835 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
836
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
837 static void MC_put_16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
838 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
839 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
840 MC_put1_16 (height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
841 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
842
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
843 static void MC_put_8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
844 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
845 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
846 MC_put1_8 (height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
847 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
848
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
849 static void MC_avg_x16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
850 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
851 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
852 MC_avg2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
853 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
854
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
855 static void MC_avg_x8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
856 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
857 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
858 MC_avg2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
859 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
860
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
861 static void MC_put_x16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
862 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
863 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
864 MC_put2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
865 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
866
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
867 static void MC_put_x8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
868 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
869 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
870 MC_put2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
871 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
872
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
873 static void MC_avg_y16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
874 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
875 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
876 MC_avg2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
877 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
878
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
879 static void MC_avg_y8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
880 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
881 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
882 MC_avg2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
883 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
884
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
885 static void MC_put_y16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
886 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
887 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
888 MC_put2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
889 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
890
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
891 static void MC_put_y8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
892 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
893 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
894 MC_put2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
895 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
896
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
897 static void MC_avg_xy16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
898 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
899 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
900 MC_avg4_16 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
901 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
902
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
903 static void MC_avg_xy8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
904 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
905 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
906 MC_avg4_8 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
907 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
908
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
909 static void MC_put_xy16_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
910 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
911 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
912 MC_put4_16 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
913 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
914
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
915 static void MC_put_xy8_mmxext (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
916 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
917 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
918 MC_put4_8 (height, dest, ref, stride, CPU_MMXEXT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
919 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
920
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
921
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
922 MOTION_COMP_EXTERN (mmxext)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
923
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
924
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
925
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
926 static void MC_avg_16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
927 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
928 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
929 MC_avg1_16 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
930 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
931
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
932 static void MC_avg_8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
933 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
934 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
935 MC_avg1_8 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
936 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
937
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
938 static void MC_put_16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
939 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
940 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
941 MC_put1_16 (height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
942 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
943
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
944 static void MC_put_8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
945 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
946 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
947 MC_put1_8 (height, dest, ref, stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
948 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
949
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
950 static void MC_avg_x16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
951 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
952 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
953 MC_avg2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
954 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
955
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
956 static void MC_avg_x8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
957 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
958 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
959 MC_avg2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
960 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
961
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
962 static void MC_put_x16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
963 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
964 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
965 MC_put2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
966 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
967
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
968 static void MC_put_x8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
969 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
970 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
971 MC_put2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
972 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
973
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
974 static void MC_avg_y16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
975 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
976 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
977 MC_avg2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
978 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
979
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
980 static void MC_avg_y8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
981 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
982 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
983 MC_avg2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
984 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
985
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
986 static void MC_put_y16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
987 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
988 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
989 MC_put2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
990 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
991
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
992 static void MC_put_y8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
993 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
994 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
995 MC_put2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
996 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
997
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
998 static void MC_avg_xy16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
999 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1000 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1001 MC_avg4_16 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1002 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1003
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1004 static void MC_avg_xy8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1005 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1006 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1007 MC_avg4_8 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1008 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1009
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1010 static void MC_put_xy16_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1011 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1012 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1013 MC_put4_16 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1014 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1015
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1016 static void MC_put_xy8_3dnow (uint8_t * dest, uint8_t * ref,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1017 int stride, int height)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1018 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1019 MC_put4_8 (height, dest, ref, stride, CPU_3DNOW);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1020 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1021
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1022
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1023 MOTION_COMP_EXTERN (3dnow)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1024
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1025 #endif