annotate i386/vc1dsp_mmx.c @ 6024:151508a72dd7 libavcodec

Add 'l' suffix where it is necessary because type can not always be inferred from arguments. Fixes compilation with Intel compiler
author reimar
date Sat, 15 Dec 2007 23:08:15 +0000
parents db875a610973
children ed7190bd3530
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
1 /*
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
2 * VC-1 and WMV3 - DSP functions MMX-optimized
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
3 * Copyright (c) 2007 Christophe GISQUET <christophe.gisquet@free.fr>
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
4 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
5 * Permission is hereby granted, free of charge, to any person
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
6 * obtaining a copy of this software and associated documentation
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
7 * files (the "Software"), to deal in the Software without
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
8 * restriction, including without limitation the rights to use,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
9 * copy, modify, merge, publish, distribute, sublicense, and/or sell
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
11 * Software is furnished to do so, subject to the following
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
12 * conditions:
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
13 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
15 * included in all copies or substantial portions of the Software.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
16 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
24 * OTHER DEALINGS IN THE SOFTWARE.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
25 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
26
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
27 #include "dsputil.h"
5946
55251379b5b1 make ff_p* vars extern so that they can be used in various *_mmx.c files
aurel
parents: 5938
diff changeset
28 #include "dsputil_mmx.h"
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
29 #include "x86_cpu.h"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
30
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
31 /** Add rounder from mm7 to mm3 and pack result at destination */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
32 #define NORMALIZE_MMX(SHIFT) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
33 "paddw %%mm7, %%mm3 \n\t" /* +bias-r */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
34 "paddw %%mm7, %%mm4 \n\t" /* +bias-r */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
35 "psraw "SHIFT", %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
36 "psraw "SHIFT", %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
37
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
38 #define TRANSFER_DO_PACK \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
39 "packuswb %%mm4, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
40 "movq %%mm3, (%2) \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
41
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
42 #define TRANSFER_DONT_PACK \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
43 "movq %%mm3, 0(%2) \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
44 "movq %%mm4, 8(%2) \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
45
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
46 /** @see MSPEL_FILTER13_CORE for use as UNPACK macro */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
47 #define DO_UNPACK(reg) "punpcklbw %%mm0, " reg "\n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
48 #define DONT_UNPACK(reg)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
49
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
50 /** Compute the rounder 32-r or 8-r and unpacks it to mm7 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
51 #define LOAD_ROUNDER_MMX(ROUND) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
52 "movd "ROUND", %%mm7 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
53 "punpcklwd %%mm7, %%mm7 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
54 "punpckldq %%mm7, %%mm7 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
55
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
56 #define SHIFT2_LINE(OFF, R0,R1,R2,R3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
57 "paddw %%mm"#R2", %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
58 "movd (%1,%4), %%mm"#R0" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
59 "pmullw %%mm6, %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
60 "punpcklbw %%mm0, %%mm"#R0" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
61 "movd (%1,%3), %%mm"#R3" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
62 "psubw %%mm"#R0", %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
63 "punpcklbw %%mm0, %%mm"#R3" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
64 "paddw %%mm7, %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
65 "psubw %%mm"#R3", %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
66 "psraw %5, %%mm"#R1" \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
67 "movq %%mm"#R1", "#OFF"(%2) \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
68 "add %3, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
69
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
70 DECLARE_ALIGNED_16(static const uint64_t, fact_9) = 0x0009000900090009ULL;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
71
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
72 /** Sacrifying mm6 allows to pipeline loads from src */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
73 static void vc1_put_ver_16b_shift2_mmx(int16_t *dst,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
74 const uint8_t *src, long int stride,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
75 int rnd, int64_t shift)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
76 {
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
77 int w = 3;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
78
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
79 asm volatile(
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
80 LOAD_ROUNDER_MMX("%6")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
81 "movq %7, %%mm6 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
82 "1: \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
83 "movd (%1), %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
84 "add %3, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
85 "movd (%1), %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
86 "punpcklbw %%mm0, %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
87 "punpcklbw %%mm0, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
88 SHIFT2_LINE( 0, 1, 2, 3, 4)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
89 SHIFT2_LINE( 24, 2, 3, 4, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
90 SHIFT2_LINE( 48, 3, 4, 1, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
91 SHIFT2_LINE( 72, 4, 1, 2, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
92 SHIFT2_LINE( 96, 1, 2, 3, 4)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
93 SHIFT2_LINE(120, 2, 3, 4, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
94 SHIFT2_LINE(144, 3, 4, 1, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
95 SHIFT2_LINE(168, 4, 1, 2, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
96 "sub %8, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
97 "add $8, %2 \n\t"
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
98 "decl %0 \n\t"
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
99 "jnz 1b \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
100 : "+g"(w), "+r"(src), "+r"(dst)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
101 : "r"(stride), "r"(-2*stride), "m"(shift),
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
102 "m"(rnd), "m"(fact_9), "g"(9*stride-4)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
103 : "memory"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
104 );
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
105 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
106
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
107 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
108 * Data is already unpacked, so some operations can directly be made from
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
109 * memory.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
110 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
111 static void vc1_put_hor_16b_shift2_mmx(uint8_t *dst, long int stride,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
112 const int16_t *src, int rnd)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
113 {
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
114 int h = 8;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
115
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
116 src -= 1;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
117 rnd -= (-1+9+9-1)*1024; /* Add -1024 bias */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
118 asm volatile(
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
119 LOAD_ROUNDER_MMX("%4")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
120 "movq %6, %%mm6 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
121 "movq %5, %%mm5 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
122 "1: \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
123 "movq 2*0+0(%1), %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
124 "movq 2*0+8(%1), %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
125 "movq 2*1+0(%1), %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
126 "movq 2*1+8(%1), %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
127 "paddw 2*3+0(%1), %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
128 "paddw 2*3+8(%1), %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
129 "paddw 2*2+0(%1), %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
130 "paddw 2*2+8(%1), %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
131 "pmullw %%mm5, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
132 "pmullw %%mm5, %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
133 "psubw %%mm1, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
134 "psubw %%mm2, %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
135 NORMALIZE_MMX("$7")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
136 /* Remove bias */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
137 "paddw %%mm6, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
138 "paddw %%mm6, %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
139 TRANSFER_DO_PACK
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
140 "add $24, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
141 "add %3, %2 \n\t"
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
142 "decl %0 \n\t"
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
143 "jnz 1b \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
144 : "+g"(h), "+r" (src), "+r" (dst)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
145 : "g"(stride), "m"(rnd), "m"(fact_9), "m"(ff_pw_128)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
146 : "memory"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
147 );
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
148 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
149
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
150
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
151 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
152 * Purely vertical or horizontal 1/2 shift interpolation.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
153 * Sacrify mm6 for *9 factor.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
154 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
155 static void vc1_put_shift2_mmx(uint8_t *dst, const uint8_t *src,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
156 long int stride, int rnd, long int offset)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
157 {
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
158 int h = 8;
5936
1f3008bae163 Strip debug stuff from vc1dsp_mmx.c, patch by Christophe GISQUET %hristophe P gisquet A free P fr%
gpoirier
parents: 5933
diff changeset
159
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
160 rnd = 8-rnd;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
161 asm volatile(
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
162 LOAD_ROUNDER_MMX("%6")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
163 "movq %8, %%mm6 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
164 "1: \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
165 "movd 0(%1 ), %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
166 "movd 4(%1 ), %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
167 "movd 0(%1,%3), %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
168 "movd 4(%1,%3), %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
169 "add %3, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
170 "punpcklbw %%mm0, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
171 "punpcklbw %%mm0, %%mm4 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
172 "punpcklbw %%mm0, %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
173 "punpcklbw %%mm0, %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
174 "paddw %%mm1, %%mm3 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
175 "paddw %%mm2, %%mm4 \n\t"
5938
7bc05f20e435 Typo fix. Previous version had some picture error building up until next keyframe.
gpoirier
parents: 5936
diff changeset
176 "movd 0(%1,%4), %%mm1 \n\t"
7bc05f20e435 Typo fix. Previous version had some picture error building up until next keyframe.
gpoirier
parents: 5936
diff changeset
177 "movd 4(%1,%4), %%mm2 \n\t"
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
178 "pmullw %%mm6, %%mm3 \n\t" /* 0,9,9,0*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
179 "pmullw %%mm6, %%mm4 \n\t" /* 0,9,9,0*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
180 "punpcklbw %%mm0, %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
181 "punpcklbw %%mm0, %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
182 "psubw %%mm1, %%mm3 \n\t" /*-1,9,9,0*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
183 "psubw %%mm2, %%mm4 \n\t" /*-1,9,9,0*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
184 "movd 0(%1,%3), %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
185 "movd 4(%1,%3), %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
186 "punpcklbw %%mm0, %%mm1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
187 "punpcklbw %%mm0, %%mm2 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
188 "psubw %%mm1, %%mm3 \n\t" /*-1,9,9,-1*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
189 "psubw %%mm2, %%mm4 \n\t" /*-1,9,9,-1*/
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
190 NORMALIZE_MMX("$4")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
191 TRANSFER_DO_PACK
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
192 "add %7, %1 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
193 "add %5, %2 \n\t"
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
194 "decl %0 \n\t"
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
195 "jnz 1b \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
196 : "+g"(h), "+r"(src), "+r"(dst)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
197 : "r"(offset), "r"(-2*offset), "g"(stride), "m"(rnd),
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
198 "g"(stride-offset), "m"(fact_9)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
199 : "memory"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
200 );
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
201 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
202
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
203 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
204 * Filter coefficients made global to allow access by all 1 or 3 quarter shift
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
205 * interpolation functions.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
206 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
207 DECLARE_ALIGNED_16(static const uint64_t, fact_53) = 0x0035003500350035ULL;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
208 DECLARE_ALIGNED_16(static const uint64_t, fact_18) = 0x0012001200120012ULL;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
209
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
210 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
211 * Core of the 1/4 and 3/4 shift bicubic interpolation.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
212 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
213 * @param UNPACK Macro unpacking arguments from 8 to 16bits (can be empty).
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
214 * @param MOVQ "movd 1" or "movq 2", if data read is already unpacked.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
215 * @param A1 Address of 1st tap (beware of unpacked/packed).
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
216 * @param A2 Address of 2nd tap
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
217 * @param A3 Address of 3rd tap
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
218 * @param A4 Address of 4th tap
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
219 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
220 #define MSPEL_FILTER13_CORE(UNPACK, MOVQ, A1, A2, A3, A4, POS) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
221 MOVQ "*0+"A1", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
222 MOVQ "*4+"A1", %%mm2 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
223 UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
224 UNPACK("%%mm2") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
225 "pmullw "POS", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
226 "pmullw "POS", %%mm2 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
227 MOVQ "*0+"A2", %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
228 MOVQ "*4+"A2", %%mm4 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
229 UNPACK("%%mm3") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
230 UNPACK("%%mm4") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
231 "pmullw %%mm6, %%mm3 \n\t" /* *18 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
232 "pmullw %%mm6, %%mm4 \n\t" /* *18 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
233 "psubw %%mm1, %%mm3 \n\t" /* 18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
234 "psubw %%mm2, %%mm4 \n\t" /* 18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
235 MOVQ "*0+"A4", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
236 MOVQ "*4+"A4", %%mm2 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
237 UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
238 UNPACK("%%mm2") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
239 "psllw $2, %%mm1 \n\t" /* 4* */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
240 "psllw $2, %%mm2 \n\t" /* 4* */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
241 "psubw %%mm1, %%mm3 \n\t" /* -4,18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
242 "psubw %%mm2, %%mm4 \n\t" /* -4,18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
243 MOVQ "*0+"A3", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
244 MOVQ "*4+"A3", %%mm2 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
245 UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
246 UNPACK("%%mm2") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
247 "pmullw %%mm5, %%mm1 \n\t" /* *53 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
248 "pmullw %%mm5, %%mm2 \n\t" /* *53 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
249 "paddw %%mm1, %%mm3 \n\t" /* 4,53,18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
250 "paddw %%mm2, %%mm4 \n\t" /* 4,53,18,-3 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
251
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
252 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
253 * Macro to build the vertical 16bits version of vc1_put_shift[13].
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
254 * Here, offset=src_stride. Parameters passed A1 to A4 must use
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
255 * %3 (src_stride) and %4 (3*src_stride).
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
256 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
257 * @param NAME Either 1 or 3
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
258 * @see MSPEL_FILTER13_CORE for information on A1->A4
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
259 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
260 #define MSPEL_FILTER13_VER_16B(NAME, A1, A2, A3, A4) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
261 static void \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
262 vc1_put_ver_16b_ ## NAME ## _mmx(int16_t *dst, const uint8_t *src, \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
263 long int src_stride, \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
264 int rnd, int64_t shift) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
265 { \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
266 int h = 8; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
267 src -= src_stride; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
268 asm volatile( \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
269 LOAD_ROUNDER_MMX("%5") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
270 "movq %7, %%mm5 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
271 "movq %8, %%mm6 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
272 ASMALIGN(3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
273 "1: \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
274 MSPEL_FILTER13_CORE(DO_UNPACK, "movd 1", A1, A2, A3, A4, "%9") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
275 NORMALIZE_MMX("%6") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
276 TRANSFER_DONT_PACK \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
277 /* Last 3 (in fact 4) bytes on the line */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
278 "movd 8+"A1", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
279 DO_UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
280 "movq %%mm1, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
281 "paddw %%mm1, %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
282 "paddw %%mm3, %%mm1 \n\t" /* 3* */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
283 "movd 8+"A2", %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
284 DO_UNPACK("%%mm3") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
285 "pmullw %%mm6, %%mm3 \n\t" /* *18 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
286 "psubw %%mm1, %%mm3 \n\t" /*18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
287 "movd 8+"A3", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
288 DO_UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
289 "pmullw %%mm5, %%mm1 \n\t" /* *53 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
290 "paddw %%mm1, %%mm3 \n\t" /*53,18,-3 */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
291 "movd 8+"A4", %%mm1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
292 DO_UNPACK("%%mm1") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
293 "psllw $2, %%mm1 \n\t" /* 4* */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
294 "psubw %%mm1, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
295 "paddw %%mm7, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
296 "psraw %6, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
297 "movq %%mm3, 16(%2) \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
298 "add %3, %1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
299 "add $24, %2 \n\t" \
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
300 "decl %0 \n\t" \
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
301 "jnz 1b \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
302 : "+g"(h), "+r" (src), "+r" (dst) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
303 : "r"(src_stride), "r"(3*src_stride), \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
304 "m"(rnd), "m"(shift), \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
305 "m"(fact_53), "m"(fact_18), "m"(ff_pw_3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
306 : "memory" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
307 ); \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
308 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
309
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
310 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
311 * Macro to build the horizontal 16bits version of vc1_put_shift[13].
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
312 * Here, offset=16bits, so parameters passed A1 to A4 should be simple.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
313 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
314 * @param NAME Either 1 or 3
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
315 * @see MSPEL_FILTER13_CORE for information on A1->A4
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
316 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
317 #define MSPEL_FILTER13_HOR_16B(NAME, A1, A2, A3, A4) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
318 static void \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
319 vc1_put_hor_16b_ ## NAME ## _mmx(uint8_t *dst, long int stride, \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
320 const int16_t *src, int rnd) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
321 { \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
322 int h = 8; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
323 src -= 1; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
324 rnd -= (-4+58+13-3)*256; /* Add -256 bias */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
325 asm volatile( \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
326 LOAD_ROUNDER_MMX("%4") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
327 "movq %6, %%mm6 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
328 "movq %5, %%mm5 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
329 ASMALIGN(3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
330 "1: \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
331 MSPEL_FILTER13_CORE(DONT_UNPACK, "movq 2", A1, A2, A3, A4, "%8")\
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
332 NORMALIZE_MMX("$7") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
333 /* Remove bias */ \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
334 "paddw %7, %%mm3 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
335 "paddw %7, %%mm4 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
336 TRANSFER_DO_PACK \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
337 "add $24, %1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
338 "add %3, %2 \n\t" \
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
339 "decl %0 \n\t" \
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
340 "jnz 1b \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
341 : "+g"(h), "+r" (src), "+r" (dst) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
342 : "g"(stride), "m"(rnd), "m"(fact_53), "m"(fact_18), \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
343 "m"(ff_pw_128), "m"(ff_pw_3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
344 : "memory" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
345 ); \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
346 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
347
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
348 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
349 * Macro to build the 8bits, any direction, version of vc1_put_shift[13].
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
350 * Here, offset=src_stride. Parameters passed A1 to A4 must use
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
351 * %3 (offset) and %4 (3*offset).
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
352 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
353 * @param NAME Either 1 or 3
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
354 * @see MSPEL_FILTER13_CORE for information on A1->A4
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
355 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
356 #define MSPEL_FILTER13_8B(NAME, A1, A2, A3, A4) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
357 static void \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
358 vc1_put_## NAME ## _mmx(uint8_t *dst, const uint8_t *src, \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
359 long int stride, int rnd, long int offset) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
360 { \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
361 int h = 8; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
362 src -= offset; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
363 rnd = 32-rnd; \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
364 asm volatile ( \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
365 LOAD_ROUNDER_MMX("%6") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
366 "movq %7, %%mm5 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
367 "movq %8, %%mm6 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
368 ASMALIGN(3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
369 "1: \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
370 MSPEL_FILTER13_CORE(DO_UNPACK, "movd 1", A1, A2, A3, A4, "%9")\
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
371 NORMALIZE_MMX("$6") \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
372 TRANSFER_DO_PACK \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
373 "add %5, %1 \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
374 "add %5, %2 \n\t" \
6024
151508a72dd7 Add 'l' suffix where it is necessary because type can not always be
reimar
parents: 5948
diff changeset
375 "decl %0 \n\t" \
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
376 "jnz 1b \n\t" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
377 : "+g"(h), "+r" (src), "+r" (dst) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
378 : "r"(offset), "r"(3*offset), "g"(stride), "m"(rnd), \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
379 "m"(fact_53), "m"(fact_18), "m"(ff_pw_3) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
380 : "memory" \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
381 ); \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
382 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
383
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
384 /** 1/4 shift bicubic interpolation */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
385 MSPEL_FILTER13_8B (shift1, "0(%1,%4 )", "0(%1,%3,2)", "0(%1,%3 )", "0(%1 )")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
386 MSPEL_FILTER13_VER_16B(shift1, "0(%1,%4 )", "0(%1,%3,2)", "0(%1,%3 )", "0(%1 )")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
387 MSPEL_FILTER13_HOR_16B(shift1, "2*3(%1)", "2*2(%1)", "2*1(%1)", "2*0(%1)")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
388
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
389 /** 3/4 shift bicubic interpolation */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
390 MSPEL_FILTER13_8B (shift3, "0(%1 )", "0(%1,%3 )", "0(%1,%3,2)", "0(%1,%4 )")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
391 MSPEL_FILTER13_VER_16B(shift3, "0(%1 )", "0(%1,%3 )", "0(%1,%3,2)", "0(%1,%4 )")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
392 MSPEL_FILTER13_HOR_16B(shift3, "2*0(%1)", "2*1(%1)", "2*2(%1)", "2*3(%1)")
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
393
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
394 typedef void (*vc1_mspel_mc_filter_ver_16bits)(int16_t *dst, const uint8_t *src, long int src_stride, int rnd, int64_t shift);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
395 typedef void (*vc1_mspel_mc_filter_hor_16bits)(uint8_t *dst, long int dst_stride, const int16_t *src, int rnd);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
396 typedef void (*vc1_mspel_mc_filter_8bits)(uint8_t *dst, const uint8_t *src, long int stride, int rnd, long int offset);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
397
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
398 /**
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
399 * Interpolates fractional pel values by applying proper vertical then
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
400 * horizontal filter.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
401 *
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
402 * @param dst Destination buffer for interpolated pels.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
403 * @param src Source buffer.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
404 * @param stride Stride for both src and dst buffers.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
405 * @param hmode Horizontal filter (expressed in quarter pixels shift).
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
406 * @param hmode Vertical filter.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
407 * @param rnd Rounding bias.
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
408 */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
409 static void vc1_mspel_mc(uint8_t *dst, const uint8_t *src, int stride,
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
410 int hmode, int vmode, int rnd)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
411 {
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
412 static const vc1_mspel_mc_filter_ver_16bits vc1_put_shift_ver_16bits[] =
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
413 { NULL, vc1_put_ver_16b_shift1_mmx, vc1_put_ver_16b_shift2_mmx, vc1_put_ver_16b_shift3_mmx };
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
414 static const vc1_mspel_mc_filter_hor_16bits vc1_put_shift_hor_16bits[] =
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
415 { NULL, vc1_put_hor_16b_shift1_mmx, vc1_put_hor_16b_shift2_mmx, vc1_put_hor_16b_shift3_mmx };
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
416 static const vc1_mspel_mc_filter_8bits vc1_put_shift_8bits[] =
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
417 { NULL, vc1_put_shift1_mmx, vc1_put_shift2_mmx, vc1_put_shift3_mmx };
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
418
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
419 asm volatile(
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
420 "pxor %%mm0, %%mm0 \n\t"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
421 ::: "memory"
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
422 );
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
423
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
424 if (vmode) { /* Vertical filter to apply */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
425 if (hmode) { /* Horizontal filter to apply, output to tmp */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
426 static const int shift_value[] = { 0, 5, 1, 5 };
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
427 int shift = (shift_value[hmode]+shift_value[vmode])>>1;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
428 int r;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
429 DECLARE_ALIGNED_16(int16_t, tmp[12*8]);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
430
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
431 r = (1<<(shift-1)) + rnd-1;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
432 vc1_put_shift_ver_16bits[vmode](tmp, src-1, stride, r, shift);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
433
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
434 vc1_put_shift_hor_16bits[hmode](dst, stride, tmp+1, 64-rnd);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
435 return;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
436 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
437 else { /* No horizontal filter, output 8 lines to dst */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
438 vc1_put_shift_8bits[vmode](dst, src, stride, 1-rnd, stride);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
439 return;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
440 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
441 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
442
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
443 /* Horizontal mode with no vertical mode */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
444 vc1_put_shift_8bits[hmode](dst, src, stride, rnd, 1);
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
445 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
446
5948
db875a610973 build vc1dsp_mmx.c in its own compilation unit
aurel
parents: 5946
diff changeset
447 void ff_put_vc1_mspel_mc00_mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd);
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
448
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
449 /** Macro to ease bicubic filter interpolation functions declarations */
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
450 #define DECLARE_FUNCTION(a, b) \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
451 static void put_vc1_mspel_mc ## a ## b ## _mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd) { \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
452 vc1_mspel_mc(dst, src, stride, a, b, rnd); \
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
453 }
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
454
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
455 DECLARE_FUNCTION(0, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
456 DECLARE_FUNCTION(0, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
457 DECLARE_FUNCTION(0, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
458
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
459 DECLARE_FUNCTION(1, 0)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
460 DECLARE_FUNCTION(1, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
461 DECLARE_FUNCTION(1, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
462 DECLARE_FUNCTION(1, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
463
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
464 DECLARE_FUNCTION(2, 0)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
465 DECLARE_FUNCTION(2, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
466 DECLARE_FUNCTION(2, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
467 DECLARE_FUNCTION(2, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
468
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
469 DECLARE_FUNCTION(3, 0)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
470 DECLARE_FUNCTION(3, 1)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
471 DECLARE_FUNCTION(3, 2)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
472 DECLARE_FUNCTION(3, 3)
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
473
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
474 void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx) {
5948
db875a610973 build vc1dsp_mmx.c in its own compilation unit
aurel
parents: 5946
diff changeset
475 dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_vc1_mspel_mc00_mmx;
5933
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
476 dsp->put_vc1_mspel_pixels_tab[ 4] = put_vc1_mspel_mc01_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
477 dsp->put_vc1_mspel_pixels_tab[ 8] = put_vc1_mspel_mc02_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
478 dsp->put_vc1_mspel_pixels_tab[12] = put_vc1_mspel_mc03_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
479
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
480 dsp->put_vc1_mspel_pixels_tab[ 1] = put_vc1_mspel_mc10_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
481 dsp->put_vc1_mspel_pixels_tab[ 5] = put_vc1_mspel_mc11_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
482 dsp->put_vc1_mspel_pixels_tab[ 9] = put_vc1_mspel_mc12_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
483 dsp->put_vc1_mspel_pixels_tab[13] = put_vc1_mspel_mc13_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
484
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
485 dsp->put_vc1_mspel_pixels_tab[ 2] = put_vc1_mspel_mc20_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
486 dsp->put_vc1_mspel_pixels_tab[ 6] = put_vc1_mspel_mc21_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
487 dsp->put_vc1_mspel_pixels_tab[10] = put_vc1_mspel_mc22_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
488 dsp->put_vc1_mspel_pixels_tab[14] = put_vc1_mspel_mc23_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
489
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
490 dsp->put_vc1_mspel_pixels_tab[ 3] = put_vc1_mspel_mc30_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
491 dsp->put_vc1_mspel_pixels_tab[ 7] = put_vc1_mspel_mc31_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
492 dsp->put_vc1_mspel_pixels_tab[11] = put_vc1_mspel_mc32_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
493 dsp->put_vc1_mspel_pixels_tab[15] = put_vc1_mspel_mc33_mmx;
6ce8f15fc02b add VC-1 MMX DSP functions, under MIT license.
gpoirier
parents:
diff changeset
494 }