29
29
#ifndef AVCODEC_X86_H264_I386_H
30
30
#define AVCODEC_X86_H264_I386_H
32
34
#include "libavcodec/cabac.h"
34
37
//FIXME use some macros to avoid duplicating get_cabac (cannot be done yet
35
38
//as that would make optimization work hard)
36
#if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
39
#if HAVE_7REGS && !defined(BROKEN_RELOCATIONS)
37
40
static int decode_significance_x86(CABACContext *c, int max_coeff,
38
41
uint8_t *significant_coeff_ctx_base,
39
42
int *index, x86_reg last_off){
40
43
void *end= significant_coeff_ctx_base + max_coeff - 1;
41
int minusstart= -(int)significant_coeff_ctx_base;
42
int minusindex= 4-(int)index;
44
int minusstart= -(intptr_t)significant_coeff_ctx_base;
45
int minusindex= 4-(intptr_t)index;
45
"movl "RANGE "(%3), %%esi \n\t"
46
"movl "LOW "(%3), %%ebx \n\t"
50
BRANCHLESS_GET_CABAC("%%edx", "%3", "(%1)", "%%ebx",
51
"%%bx", "%%esi", "%%eax", "%%al")
51
BRANCHLESS_GET_CABAC("%4", "(%1)", "%3",
52
"%w3", "%5", "%k0", "%b0", "%6")
57
BRANCHLESS_GET_CABAC("%%edx", "%3", "(%1)", "%%ebx",
58
"%%bx", "%%esi", "%%eax", "%%al")
61
"mov %2, %%"REG_a" \n\t"
58
BRANCHLESS_GET_CABAC("%4", "(%1)", "%3",
59
"%w3", "%5", "%k0", "%b0", "%6")
63
64
"add %1, %%"REG_c" \n\t"
64
"movl %%ecx, (%%"REG_a") \n\t"
65
"movl %%ecx, (%0) \n\t"
69
"add $4, %%"REG_a" \n\t"
70
"mov %%"REG_a", %2 \n\t"
70
"add"OPSIZE" $4, %2 \n\t"
76
"mov %2, %%"REG_a" \n\t"
78
78
"add %1, %%"REG_c" \n\t"
79
"movl %%ecx, (%%"REG_a") \n\t"
79
"movl %%ecx, (%0) \n\t"
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), "m"(last_off)
88
: "%"REG_c, "%ebx", "%edx", "%esi", "memory"
83
:"=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index),
84
"+&r"(c->low), "=&r"(bit), "+&r"(c->range),
86
:"m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off)
90
89
return coeff_count;
93
92
static int decode_significance_8x8_x86(CABACContext *c,
94
93
uint8_t *significant_coeff_ctx_base,
95
int *index, x86_reg last_off, const uint8_t *sig_off){
96
int minusindex= 4-(int)index;
94
int *index, uint8_t *last_coeff_ctx_base, const uint8_t *sig_off){
95
int minusindex= 4-(intptr_t)index;
100
"movl "RANGE "(%3), %%esi \n\t"
101
"movl "LOW "(%3), %%ebx \n\t"
103
"mov %1, %%"REG_D" \n\t"
106
"mov %6, %%"REG_a" \n\t"
107
"movzbl (%%"REG_a", %%"REG_D"), %%edi \n\t"
108
"add %5, %%"REG_D" \n\t"
110
BRANCHLESS_GET_CABAC("%%edx", "%3", "(%%"REG_D")", "%%ebx",
111
"%%bx", "%%esi", "%%eax", "%%al")
114
"test $1, %%edx \n\t"
105
"movzbl (%0, %6), %k6 \n\t"
108
BRANCHLESS_GET_CABAC("%4", "(%6)", "%3",
109
"%w3", "%5", "%k0", "%b0", "%7")
117
"movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%%edi), %%edi\n\t"
118
"add %5, %%"REG_D" \n\t"
119
"add %7, %%"REG_D" \n\t"
121
BRANCHLESS_GET_CABAC("%%edx", "%3", "(%%"REG_D")", "%%ebx",
122
"%%bx", "%%esi", "%%eax", "%%al")
124
"mov %2, %%"REG_a" \n\t"
126
"movl %%edi, (%%"REG_a") \n\t"
128
"test $1, %%edx \n\t"
115
"movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t"
118
BRANCHLESS_GET_CABAC("%4", "(%6)", "%3",
119
"%w3", "%5", "%k0", "%b0", "%7")
123
"movl %k6, (%0) \n\t"
131
"add $4, %%"REG_a" \n\t"
132
"mov %%"REG_a", %2 \n\t"
128
"add"OPSIZE" $4, %2 \n\t"
135
"addl $1, %%edi \n\t"
137
"cmpl $63, %%edi \n\t"
139
"mov %2, %%"REG_a" \n\t"
140
"movl %%edi, (%%"REG_a") \n\t"
136
"movl %k6, (%0) \n\t"
142
"addl %4, %%eax \n\t"
145
"movl %%esi, "RANGE "(%3) \n\t"
146
"movl %%ebx, "LOW "(%3) \n\t"
147
:"=&a"(coeff_count),"+m"(last), "+m"(index)
148
:"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_off)
149
: "%"REG_c, "%ebx", "%edx", "%esi", "%"REG_D, "memory"
140
:"=&q"(coeff_count),"+m"(last), "+m"(index), "+&r"(c->low), "=&r"(bit),
141
"+&r"(c->range), "=&r"(state), "+m"(c->bytestream)
142
:"m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_coeff_ctx_base)
151
145
return coeff_count;
153
#endif /* ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE */
154
/* !defined(BROKEN_RELOCATIONS) */
147
#endif /* HAVE_7REGS && !defined(BROKEN_RELOCATIONS) */
156
149
#endif /* AVCODEC_X86_H264_I386_H */