Mercurial > libavcodec.hg
comparison x86/h264_i386.h @ 8430:7768bdfd4f7b libavcodec
Rename libavcodec/i386/ --> libavcodec/x86/.
It contains optimizations that are not specific to i386 and
libavutil uses this naming scheme already.
author | diego |
---|---|
date | Mon, 22 Dec 2008 09:12:42 +0000 |
parents | |
children | 7a463923ecd1 |
comparison
equal
deleted
inserted
replaced
8429:b3ecaba81501 | 8430:7768bdfd4f7b |
---|---|
1 /* | |
2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
23 * @file h264_i386.h | |
24 * H.264 / AVC / MPEG4 part10 codec. | |
25 * non-MMX i386-specific optimizations for H.264 | |
26 * @author Michael Niedermayer <michaelni@gmx.at> | |
27 */ | |
28 | |
29 #ifndef AVCODEC_X86_H264_I386_H | |
30 #define AVCODEC_X86_H264_I386_H | |
31 | |
32 #include "libavcodec/cabac.h" | |
33 | |
34 //FIXME use some macros to avoid duplicating get_cabac (cannot be done yet | |
35 //as that would make optimization work hard) | |
36 #if defined(ARCH_X86) && defined(HAVE_7REGS) && \ | |
37 defined(HAVE_EBX_AVAILABLE) && \ | |
38 !defined(BROKEN_RELOCATIONS) | |
39 static int decode_significance_x86(CABACContext *c, int max_coeff, | |
40 uint8_t *significant_coeff_ctx_base, | |
41 int *index){ | |
42 void *end= significant_coeff_ctx_base + max_coeff - 1; | |
43 int minusstart= -(int)significant_coeff_ctx_base; | |
44 int minusindex= 4-(int)index; | |
45 int coeff_count; | |
46 __asm__ volatile( | |
47 "movl "RANGE "(%3), %%esi \n\t" | |
48 "movl "LOW "(%3), %%ebx \n\t" | |
49 | |
50 "2: \n\t" | |
51 | |
52 BRANCHLESS_GET_CABAC("%%edx", "%3", "(%1)", "%%ebx", | |
53 "%%bx", "%%esi", "%%eax", "%%al") | |
54 | |
55 "test $1, %%edx \n\t" | |
56 " jz 3f \n\t" | |
57 | |
58 BRANCHLESS_GET_CABAC("%%edx", "%3", "61(%1)", "%%ebx", | |
59 "%%bx", "%%esi", "%%eax", "%%al") | |
60 | |
61 "mov %2, %%"REG_a" \n\t" | |
62 "movl %4, %%ecx \n\t" | |
63 "add %1, %%"REG_c" \n\t" | |
64 "movl %%ecx, (%%"REG_a") \n\t" | |
65 | |
66 "test $1, %%edx \n\t" | |
67 " jnz 4f \n\t" | |
68 | |
69 "add $4, %%"REG_a" \n\t" | |
70 "mov %%"REG_a", %2 \n\t" | |
71 | |
72 "3: \n\t" | |
73 "add $1, %1 \n\t" | |
74 "cmp %5, %1 \n\t" | |
75 " jb 2b \n\t" | |
76 "mov %2, %%"REG_a" \n\t" | |
77 "movl %4, %%ecx \n\t" | |
78 "add %1, %%"REG_c" \n\t" | |
79 "movl %%ecx, (%%"REG_a") \n\t" | |
80 "4: \n\t" | |
81 "add %6, %%eax \n\t" | |
82 "shr $2, %%eax \n\t" | |
83 | |
84 "movl %%esi, "RANGE "(%3) \n\t" | |
85 "movl %%ebx, "LOW "(%3) \n\t" | |
86 :"=&a"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index) | |
87 :"r"(c), "m"(minusstart), "m"(end), "m"(minusindex) | |
88 : "%"REG_c, "%ebx", "%edx", "%esi", "memory" | |
89 ); | |
90 return coeff_count; | |
91 } | |
92 | |
93 static int decode_significance_8x8_x86(CABACContext *c, | |
94 uint8_t *significant_coeff_ctx_base, | |
95 int *index, const uint8_t *sig_off){ | |
96 int minusindex= 4-(int)index; | |
97 int coeff_count; | |
98 x86_reg last=0; | |
99 __asm__ volatile( | |
100 "movl "RANGE "(%3), %%esi \n\t" | |
101 "movl "LOW "(%3), %%ebx \n\t" | |
102 | |
103 "mov %1, %%"REG_D" \n\t" | |
104 "2: \n\t" | |
105 | |
106 "mov %6, %%"REG_a" \n\t" | |
107 "movzbl (%%"REG_a", %%"REG_D"), %%edi \n\t" | |
108 "add %5, %%"REG_D" \n\t" | |
109 | |
110 BRANCHLESS_GET_CABAC("%%edx", "%3", "(%%"REG_D")", "%%ebx", | |
111 "%%bx", "%%esi", "%%eax", "%%al") | |
112 | |
113 "mov %1, %%edi \n\t" | |
114 "test $1, %%edx \n\t" | |
115 " jz 3f \n\t" | |
116 | |
117 "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%%edi), %%edi\n\t" | |
118 "add %5, %%"REG_D" \n\t" | |
119 | |
120 BRANCHLESS_GET_CABAC("%%edx", "%3", "15(%%"REG_D")", "%%ebx", | |
121 "%%bx", "%%esi", "%%eax", "%%al") | |
122 | |
123 "mov %2, %%"REG_a" \n\t" | |
124 "mov %1, %%edi \n\t" | |
125 "movl %%edi, (%%"REG_a") \n\t" | |
126 | |
127 "test $1, %%edx \n\t" | |
128 " jnz 4f \n\t" | |
129 | |
130 "add $4, %%"REG_a" \n\t" | |
131 "mov %%"REG_a", %2 \n\t" | |
132 | |
133 "3: \n\t" | |
134 "addl $1, %%edi \n\t" | |
135 "mov %%edi, %1 \n\t" | |
136 "cmpl $63, %%edi \n\t" | |
137 " jb 2b \n\t" | |
138 "mov %2, %%"REG_a" \n\t" | |
139 "movl %%edi, (%%"REG_a") \n\t" | |
140 "4: \n\t" | |
141 "addl %4, %%eax \n\t" | |
142 "shr $2, %%eax \n\t" | |
143 | |
144 "movl %%esi, "RANGE "(%3) \n\t" | |
145 "movl %%ebx, "LOW "(%3) \n\t" | |
146 :"=&a"(coeff_count),"+m"(last), "+m"(index) | |
147 :"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off) | |
148 : "%"REG_c, "%ebx", "%edx", "%esi", "%"REG_D, "memory" | |
149 ); | |
150 return coeff_count; | |
151 } | |
152 #endif /* defined(ARCH_X86) && defined(HAVE_7REGS) && */ | |
153 /* defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) */ | |
154 | |
155 #endif /* AVCODEC_X86_H264_I386_H */ |