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 Libav. 6 * 7 * Libav 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 * Libav 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 Libav; 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 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 <stddef.h> 33 34#include "libavcodec/cabac.h" 35#include "cabac.h" 36 37//FIXME use some macros to avoid duplicating get_cabac (cannot be done yet 38//as that would make optimization work hard) 39#if HAVE_7REGS && !defined(BROKEN_RELOCATIONS) 40static int decode_significance_x86(CABACContext *c, int max_coeff, 41 uint8_t *significant_coeff_ctx_base, 42 int *index, x86_reg last_off){ 43 void *end= significant_coeff_ctx_base + max_coeff - 1; 44 int minusstart= -(intptr_t)significant_coeff_ctx_base; 45 int minusindex= 4-(intptr_t)index; 46 int bit; 47 x86_reg coeff_count; 48 __asm__ volatile( 49 "2: \n\t" 50 51 BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", 52 "%w3", "%5", "%k0", "%b0", "%6") 53 54 "test $1, %4 \n\t" 55 " jz 3f \n\t" 56 "add %10, %1 \n\t" 57 58 BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", 59 "%w3", "%5", "%k0", "%b0", "%6") 60 61 "sub %10, %1 \n\t" 62 "mov %2, %0 \n\t" 63 "movl %7, %%ecx \n\t" 64 "add %1, %%"REG_c" \n\t" 65 "movl %%ecx, (%0) \n\t" 66 67 "test $1, %4 \n\t" 68 " jnz 4f \n\t" 69 70 "add"OPSIZE" $4, %2 \n\t" 71 72 "3: \n\t" 73 "add $1, %1 \n\t" 74 "cmp %8, %1 \n\t" 75 " jb 2b \n\t" 76 "mov %2, %0 \n\t" 77 "movl %7, %%ecx \n\t" 78 "add %1, %%"REG_c" \n\t" 79 "movl %%ecx, (%0) \n\t" 80 "4: \n\t" 81 "add %9, %k0 \n\t" 82 "shr $2, %k0 \n\t" 83 :"=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index), 84 "+&r"(c->low), "=&r"(bit), "+&r"(c->range), 85 "+m"(c->bytestream) 86 :"m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off) 87 : "%"REG_c, "memory" 88 ); 89 return coeff_count; 90} 91 92static int decode_significance_8x8_x86(CABACContext *c, 93 uint8_t *significant_coeff_ctx_base, 94 int *index, uint8_t *last_coeff_ctx_base, const uint8_t *sig_off){ 95 int minusindex= 4-(intptr_t)index; 96 int bit; 97 x86_reg coeff_count; 98 x86_reg last=0; 99 x86_reg state; 100 __asm__ volatile( 101 "mov %1, %6 \n\t" 102 "2: \n\t" 103 104 "mov %10, %0 \n\t" 105 "movzbl (%0, %6), %k6 \n\t" 106 "add %9, %6 \n\t" 107 108 BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", 109 "%w3", "%5", "%k0", "%b0", "%7") 110 111 "mov %1, %k6 \n\t" 112 "test $1, %4 \n\t" 113 " jz 3f \n\t" 114 115 "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t" 116 "add %11, %6 \n\t" 117 118 BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", 119 "%w3", "%5", "%k0", "%b0", "%7") 120 121 "mov %2, %0 \n\t" 122 "mov %1, %k6 \n\t" 123 "movl %k6, (%0) \n\t" 124 125 "test $1, %4 \n\t" 126 " jnz 4f \n\t" 127 128 "add"OPSIZE" $4, %2 \n\t" 129 130 "3: \n\t" 131 "addl $1, %k6 \n\t" 132 "mov %k6, %1 \n\t" 133 "cmpl $63, %k6 \n\t" 134 " jb 2b \n\t" 135 "mov %2, %0 \n\t" 136 "movl %k6, (%0) \n\t" 137 "4: \n\t" 138 "addl %8, %k0 \n\t" 139 "shr $2, %k0 \n\t" 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) 143 : "%"REG_c, "memory" 144 ); 145 return coeff_count; 146} 147#endif /* HAVE_7REGS && !defined(BROKEN_RELOCATIONS) */ 148 149#endif /* AVCODEC_X86_H264_I386_H */ 150