1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#ifndef AVCODEC_X86_CABAC_H 22cabdff1aSopenharmony_ci#define AVCODEC_X86_CABAC_H 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <stddef.h> 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "libavcodec/cabac.h" 27cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 28cabdff1aSopenharmony_ci#include "libavutil/macros.h" 29cabdff1aSopenharmony_ci#include "libavutil/x86/asm.h" 30cabdff1aSopenharmony_ci#include "config.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#if (defined(__i386) && defined(__clang__) && (__clang_major__<2 || (__clang_major__==2 && __clang_minor__<10)))\ 33cabdff1aSopenharmony_ci || ( !defined(__clang__) && defined(__llvm__) && __GNUC__==4 && __GNUC_MINOR__==2 && __GNUC_PATCHLEVEL__<=1)\ 34cabdff1aSopenharmony_ci || (defined(__INTEL_COMPILER) && defined(_MSC_VER)) 35cabdff1aSopenharmony_ci# define BROKEN_COMPILER 1 36cabdff1aSopenharmony_ci#else 37cabdff1aSopenharmony_ci# define BROKEN_COMPILER 0 38cabdff1aSopenharmony_ci#endif 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci#if HAVE_INLINE_ASM 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#ifndef UNCHECKED_BITSTREAM_READER 43cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER 44cabdff1aSopenharmony_ci#endif 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#if UNCHECKED_BITSTREAM_READER 47cabdff1aSopenharmony_ci#define END_CHECK(end) "" 48cabdff1aSopenharmony_ci#else 49cabdff1aSopenharmony_ci#define END_CHECK(end) \ 50cabdff1aSopenharmony_ci "cmp "end" , %%"FF_REG_c" \n\t"\ 51cabdff1aSopenharmony_ci "jge 1f \n\t" 52cabdff1aSopenharmony_ci#endif 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci#ifdef BROKEN_RELOCATIONS 55cabdff1aSopenharmony_ci#define TABLES_ARG , "r"(tables) 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci#if HAVE_FAST_CMOV 58cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC_UPDATE(ret, retq, low, range, tmp) \ 59cabdff1aSopenharmony_ci "cmp "low" , "tmp" \n\t"\ 60cabdff1aSopenharmony_ci "cmova %%ecx , "range" \n\t"\ 61cabdff1aSopenharmony_ci "sbb %%rcx , %%rcx \n\t"\ 62cabdff1aSopenharmony_ci "and %%ecx , "tmp" \n\t"\ 63cabdff1aSopenharmony_ci "xor %%rcx , "retq" \n\t"\ 64cabdff1aSopenharmony_ci "sub "tmp" , "low" \n\t" 65cabdff1aSopenharmony_ci#else /* HAVE_FAST_CMOV */ 66cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC_UPDATE(ret, retq, low, range, tmp) \ 67cabdff1aSopenharmony_ci/* P4 Prescott has crappy cmov,sbb,64-bit shift so avoid them */ \ 68cabdff1aSopenharmony_ci "sub "low" , "tmp" \n\t"\ 69cabdff1aSopenharmony_ci "sar $31 , "tmp" \n\t"\ 70cabdff1aSopenharmony_ci "sub %%ecx , "range" \n\t"\ 71cabdff1aSopenharmony_ci "and "tmp" , "range" \n\t"\ 72cabdff1aSopenharmony_ci "add %%ecx , "range" \n\t"\ 73cabdff1aSopenharmony_ci "shl $17 , %%ecx \n\t"\ 74cabdff1aSopenharmony_ci "and "tmp" , %%ecx \n\t"\ 75cabdff1aSopenharmony_ci "sub %%ecx , "low" \n\t"\ 76cabdff1aSopenharmony_ci "xor "tmp" , "ret" \n\t"\ 77cabdff1aSopenharmony_ci "movslq "ret" , "retq" \n\t" 78cabdff1aSopenharmony_ci#endif /* HAVE_FAST_CMOV */ 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC(ret, retq, statep, low, lowword, range, rangeq, tmp, tmpbyte, byte, end, norm_off, lps_off, mlps_off, tables) \ 81cabdff1aSopenharmony_ci "movzbl "statep" , "ret" \n\t"\ 82cabdff1aSopenharmony_ci "mov "range" , "tmp" \n\t"\ 83cabdff1aSopenharmony_ci "and $0xC0 , "range" \n\t"\ 84cabdff1aSopenharmony_ci "lea ("ret", "range", 2), %%ecx \n\t"\ 85cabdff1aSopenharmony_ci "movzbl "lps_off"("tables", %%rcx), "range" \n\t"\ 86cabdff1aSopenharmony_ci "sub "range" , "tmp" \n\t"\ 87cabdff1aSopenharmony_ci "mov "tmp" , %%ecx \n\t"\ 88cabdff1aSopenharmony_ci "shl $17 , "tmp" \n\t"\ 89cabdff1aSopenharmony_ci BRANCHLESS_GET_CABAC_UPDATE(ret, retq, low, range, tmp) \ 90cabdff1aSopenharmony_ci "movzbl "norm_off"("tables", "rangeq"), %%ecx \n\t"\ 91cabdff1aSopenharmony_ci "shl %%cl , "range" \n\t"\ 92cabdff1aSopenharmony_ci "movzbl "mlps_off"+128("tables", "retq"), "tmp" \n\t"\ 93cabdff1aSopenharmony_ci "shl %%cl , "low" \n\t"\ 94cabdff1aSopenharmony_ci "mov "tmpbyte" , "statep" \n\t"\ 95cabdff1aSopenharmony_ci "test "lowword" , "lowword" \n\t"\ 96cabdff1aSopenharmony_ci "jnz 2f \n\t"\ 97cabdff1aSopenharmony_ci "mov "byte" , %%"FF_REG_c" \n\t"\ 98cabdff1aSopenharmony_ci END_CHECK(end)\ 99cabdff1aSopenharmony_ci "add"FF_OPSIZE" $2 , "byte" \n\t"\ 100cabdff1aSopenharmony_ci "1: \n\t"\ 101cabdff1aSopenharmony_ci "movzwl (%%"FF_REG_c") , "tmp" \n\t"\ 102cabdff1aSopenharmony_ci "lea -1("low") , %%ecx \n\t"\ 103cabdff1aSopenharmony_ci "xor "low" , %%ecx \n\t"\ 104cabdff1aSopenharmony_ci "shr $15 , %%ecx \n\t"\ 105cabdff1aSopenharmony_ci "bswap "tmp" \n\t"\ 106cabdff1aSopenharmony_ci "shr $15 , "tmp" \n\t"\ 107cabdff1aSopenharmony_ci "movzbl "norm_off"("tables", %%rcx), %%ecx \n\t"\ 108cabdff1aSopenharmony_ci "sub $0xFFFF , "tmp" \n\t"\ 109cabdff1aSopenharmony_ci "neg %%ecx \n\t"\ 110cabdff1aSopenharmony_ci "add $7 , %%ecx \n\t"\ 111cabdff1aSopenharmony_ci "shl %%cl , "tmp" \n\t"\ 112cabdff1aSopenharmony_ci "add "tmp" , "low" \n\t"\ 113cabdff1aSopenharmony_ci "2: \n\t" 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci#else /* BROKEN_RELOCATIONS */ 116cabdff1aSopenharmony_ci#define TABLES_ARG NAMED_CONSTRAINTS_ARRAY_ADD(ff_h264_cabac_tables) 117cabdff1aSopenharmony_ci#define RIP_ARG 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci#if HAVE_FAST_CMOV 120cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC_UPDATE(ret, low, range, tmp)\ 121cabdff1aSopenharmony_ci "mov "tmp" , %%ecx \n\t"\ 122cabdff1aSopenharmony_ci "shl $17 , "tmp" \n\t"\ 123cabdff1aSopenharmony_ci "cmp "low" , "tmp" \n\t"\ 124cabdff1aSopenharmony_ci "cmova %%ecx , "range" \n\t"\ 125cabdff1aSopenharmony_ci "sbb %%ecx , %%ecx \n\t"\ 126cabdff1aSopenharmony_ci "and %%ecx , "tmp" \n\t"\ 127cabdff1aSopenharmony_ci "xor %%ecx , "ret" \n\t"\ 128cabdff1aSopenharmony_ci "sub "tmp" , "low" \n\t" 129cabdff1aSopenharmony_ci#else /* HAVE_FAST_CMOV */ 130cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC_UPDATE(ret, low, range, tmp)\ 131cabdff1aSopenharmony_ci "mov "tmp" , %%ecx \n\t"\ 132cabdff1aSopenharmony_ci "shl $17 , "tmp" \n\t"\ 133cabdff1aSopenharmony_ci "sub "low" , "tmp" \n\t"\ 134cabdff1aSopenharmony_ci "sar $31 , "tmp" \n\t" /*lps_mask*/\ 135cabdff1aSopenharmony_ci "sub %%ecx , "range" \n\t" /*RangeLPS - range*/\ 136cabdff1aSopenharmony_ci "and "tmp" , "range" \n\t" /*(RangeLPS - range)&lps_mask*/\ 137cabdff1aSopenharmony_ci "add %%ecx , "range" \n\t" /*new range*/\ 138cabdff1aSopenharmony_ci "shl $17 , %%ecx \n\t"\ 139cabdff1aSopenharmony_ci "and "tmp" , %%ecx \n\t"\ 140cabdff1aSopenharmony_ci "sub %%ecx , "low" \n\t"\ 141cabdff1aSopenharmony_ci "xor "tmp" , "ret" \n\t" 142cabdff1aSopenharmony_ci#endif /* HAVE_FAST_CMOV */ 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci#define BRANCHLESS_GET_CABAC(ret, retq, statep, low, lowword, range, rangeq, tmp, tmpbyte, byte, end, norm_off, lps_off, mlps_off, tables) \ 145cabdff1aSopenharmony_ci "movzbl "statep" , "ret" \n\t"\ 146cabdff1aSopenharmony_ci "mov "range" , "tmp" \n\t"\ 147cabdff1aSopenharmony_ci "and $0xC0 , "range" \n\t"\ 148cabdff1aSopenharmony_ci "movzbl "MANGLE(ff_h264_cabac_tables)"+"lps_off"("ret", "range", 2), "range" \n\t"\ 149cabdff1aSopenharmony_ci "sub "range" , "tmp" \n\t"\ 150cabdff1aSopenharmony_ci BRANCHLESS_GET_CABAC_UPDATE(ret, low, range, tmp) \ 151cabdff1aSopenharmony_ci "movzbl "MANGLE(ff_h264_cabac_tables)"+"norm_off"("range"), %%ecx \n\t"\ 152cabdff1aSopenharmony_ci "shl %%cl , "range" \n\t"\ 153cabdff1aSopenharmony_ci "movzbl "MANGLE(ff_h264_cabac_tables)"+"mlps_off"+128("ret"), "tmp" \n\t"\ 154cabdff1aSopenharmony_ci "shl %%cl , "low" \n\t"\ 155cabdff1aSopenharmony_ci "mov "tmpbyte" , "statep" \n\t"\ 156cabdff1aSopenharmony_ci "test "lowword" , "lowword" \n\t"\ 157cabdff1aSopenharmony_ci " jnz 2f \n\t"\ 158cabdff1aSopenharmony_ci "mov "byte" , %%"FF_REG_c" \n\t"\ 159cabdff1aSopenharmony_ci END_CHECK(end)\ 160cabdff1aSopenharmony_ci "add"FF_OPSIZE" $2 , "byte" \n\t"\ 161cabdff1aSopenharmony_ci "1: \n\t"\ 162cabdff1aSopenharmony_ci "movzwl (%%"FF_REG_c") , "tmp" \n\t"\ 163cabdff1aSopenharmony_ci "lea -1("low") , %%ecx \n\t"\ 164cabdff1aSopenharmony_ci "xor "low" , %%ecx \n\t"\ 165cabdff1aSopenharmony_ci "shr $15 , %%ecx \n\t"\ 166cabdff1aSopenharmony_ci "bswap "tmp" \n\t"\ 167cabdff1aSopenharmony_ci "shr $15 , "tmp" \n\t"\ 168cabdff1aSopenharmony_ci "movzbl "MANGLE(ff_h264_cabac_tables)"+"norm_off"(%%ecx), %%ecx \n\t"\ 169cabdff1aSopenharmony_ci "sub $0xFFFF , "tmp" \n\t"\ 170cabdff1aSopenharmony_ci "neg %%ecx \n\t"\ 171cabdff1aSopenharmony_ci "add $7 , %%ecx \n\t"\ 172cabdff1aSopenharmony_ci "shl %%cl , "tmp" \n\t"\ 173cabdff1aSopenharmony_ci "add "tmp" , "low" \n\t"\ 174cabdff1aSopenharmony_ci "2: \n\t" 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci#endif /* BROKEN_RELOCATIONS */ 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci#if HAVE_7REGS && !BROKEN_COMPILER 179cabdff1aSopenharmony_ci#define get_cabac_inline get_cabac_inline_x86 180cabdff1aSopenharmony_cistatic 181cabdff1aSopenharmony_ci#if defined(_WIN32) && !defined(_WIN64) && defined(__clang__) 182cabdff1aSopenharmony_ciav_noinline 183cabdff1aSopenharmony_ci#else 184cabdff1aSopenharmony_ciav_always_inline 185cabdff1aSopenharmony_ci#endif 186cabdff1aSopenharmony_ciint get_cabac_inline_x86(CABACContext *c, uint8_t *const state) 187cabdff1aSopenharmony_ci{ 188cabdff1aSopenharmony_ci int bit, tmp; 189cabdff1aSopenharmony_ci#ifdef BROKEN_RELOCATIONS 190cabdff1aSopenharmony_ci void *tables; 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci __asm__ volatile( 193cabdff1aSopenharmony_ci "lea "MANGLE(ff_h264_cabac_tables)", %0 \n\t" 194cabdff1aSopenharmony_ci : "=&r"(tables) 195cabdff1aSopenharmony_ci : NAMED_CONSTRAINTS_ARRAY(ff_h264_cabac_tables) 196cabdff1aSopenharmony_ci ); 197cabdff1aSopenharmony_ci#endif 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci __asm__ volatile( 200cabdff1aSopenharmony_ci BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1", 201cabdff1aSopenharmony_ci "%2", "%q2", "%3", "%b3", 202cabdff1aSopenharmony_ci "%c6(%5)", "%c7(%5)", 203cabdff1aSopenharmony_ci AV_STRINGIFY(H264_NORM_SHIFT_OFFSET), 204cabdff1aSopenharmony_ci AV_STRINGIFY(H264_LPS_RANGE_OFFSET), 205cabdff1aSopenharmony_ci AV_STRINGIFY(H264_MLPS_STATE_OFFSET), 206cabdff1aSopenharmony_ci "%8") 207cabdff1aSopenharmony_ci : "=&r"(bit), "=&r"(c->low), "=&r"(c->range), "=&q"(tmp) 208cabdff1aSopenharmony_ci : "r"(state), "r"(c), 209cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream)), 210cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream_end)) 211cabdff1aSopenharmony_ci TABLES_ARG 212cabdff1aSopenharmony_ci ,"1"(c->low), "2"(c->range) 213cabdff1aSopenharmony_ci : "%"FF_REG_c, "memory" 214cabdff1aSopenharmony_ci ); 215cabdff1aSopenharmony_ci return bit & 1; 216cabdff1aSopenharmony_ci} 217cabdff1aSopenharmony_ci#endif /* HAVE_7REGS && !BROKEN_COMPILER */ 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci#if !BROKEN_COMPILER 220cabdff1aSopenharmony_ci#define get_cabac_bypass_sign get_cabac_bypass_sign_x86 221cabdff1aSopenharmony_cistatic av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val) 222cabdff1aSopenharmony_ci{ 223cabdff1aSopenharmony_ci x86_reg tmp; 224cabdff1aSopenharmony_ci __asm__ volatile( 225cabdff1aSopenharmony_ci "movl %c6(%2), %k1 \n\t" 226cabdff1aSopenharmony_ci "movl %c3(%2), %%eax \n\t" 227cabdff1aSopenharmony_ci "shl $17, %k1 \n\t" 228cabdff1aSopenharmony_ci "add %%eax, %%eax \n\t" 229cabdff1aSopenharmony_ci "sub %k1, %%eax \n\t" 230cabdff1aSopenharmony_ci "cdq \n\t" 231cabdff1aSopenharmony_ci "and %%edx, %k1 \n\t" 232cabdff1aSopenharmony_ci "add %k1, %%eax \n\t" 233cabdff1aSopenharmony_ci "xor %%edx, %%ecx \n\t" 234cabdff1aSopenharmony_ci "sub %%edx, %%ecx \n\t" 235cabdff1aSopenharmony_ci "test %%ax, %%ax \n\t" 236cabdff1aSopenharmony_ci "jnz 1f \n\t" 237cabdff1aSopenharmony_ci "mov %c4(%2), %1 \n\t" 238cabdff1aSopenharmony_ci "subl $0xFFFF, %%eax \n\t" 239cabdff1aSopenharmony_ci "movzwl (%1), %%edx \n\t" 240cabdff1aSopenharmony_ci "bswap %%edx \n\t" 241cabdff1aSopenharmony_ci "shrl $15, %%edx \n\t" 242cabdff1aSopenharmony_ci#if UNCHECKED_BITSTREAM_READER 243cabdff1aSopenharmony_ci "add $2, %1 \n\t" 244cabdff1aSopenharmony_ci "addl %%edx, %%eax \n\t" 245cabdff1aSopenharmony_ci "mov %1, %c4(%2) \n\t" 246cabdff1aSopenharmony_ci#else 247cabdff1aSopenharmony_ci "addl %%edx, %%eax \n\t" 248cabdff1aSopenharmony_ci "cmp %c5(%2), %1 \n\t" 249cabdff1aSopenharmony_ci "jge 1f \n\t" 250cabdff1aSopenharmony_ci "add"FF_OPSIZE" $2, %c4(%2) \n\t" 251cabdff1aSopenharmony_ci#endif 252cabdff1aSopenharmony_ci "1: \n\t" 253cabdff1aSopenharmony_ci "movl %%eax, %c3(%2) \n\t" 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci : "+c"(val), "=&r"(tmp) 256cabdff1aSopenharmony_ci : "r"(c), 257cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, low)), 258cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream)), 259cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream_end)), 260cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, range)) 261cabdff1aSopenharmony_ci : "%eax", "%edx", "memory" 262cabdff1aSopenharmony_ci ); 263cabdff1aSopenharmony_ci return val; 264cabdff1aSopenharmony_ci} 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci#define get_cabac_bypass get_cabac_bypass_x86 267cabdff1aSopenharmony_cistatic av_always_inline int get_cabac_bypass_x86(CABACContext *c) 268cabdff1aSopenharmony_ci{ 269cabdff1aSopenharmony_ci x86_reg tmp; 270cabdff1aSopenharmony_ci int res; 271cabdff1aSopenharmony_ci __asm__ volatile( 272cabdff1aSopenharmony_ci "movl %c6(%2), %k1 \n\t" 273cabdff1aSopenharmony_ci "movl %c3(%2), %%eax \n\t" 274cabdff1aSopenharmony_ci "shl $17, %k1 \n\t" 275cabdff1aSopenharmony_ci "add %%eax, %%eax \n\t" 276cabdff1aSopenharmony_ci "sub %k1, %%eax \n\t" 277cabdff1aSopenharmony_ci "cdq \n\t" 278cabdff1aSopenharmony_ci "and %%edx, %k1 \n\t" 279cabdff1aSopenharmony_ci "add %k1, %%eax \n\t" 280cabdff1aSopenharmony_ci "inc %%edx \n\t" 281cabdff1aSopenharmony_ci "test %%ax, %%ax \n\t" 282cabdff1aSopenharmony_ci "jnz 1f \n\t" 283cabdff1aSopenharmony_ci "mov %c4(%2), %1 \n\t" 284cabdff1aSopenharmony_ci "subl $0xFFFF, %%eax \n\t" 285cabdff1aSopenharmony_ci "movzwl (%1), %%ecx \n\t" 286cabdff1aSopenharmony_ci "bswap %%ecx \n\t" 287cabdff1aSopenharmony_ci "shrl $15, %%ecx \n\t" 288cabdff1aSopenharmony_ci "addl %%ecx, %%eax \n\t" 289cabdff1aSopenharmony_ci "cmp %c5(%2), %1 \n\t" 290cabdff1aSopenharmony_ci "jge 1f \n\t" 291cabdff1aSopenharmony_ci "add"FF_OPSIZE" $2, %c4(%2) \n\t" 292cabdff1aSopenharmony_ci "1: \n\t" 293cabdff1aSopenharmony_ci "movl %%eax, %c3(%2) \n\t" 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci : "=&d"(res), "=&r"(tmp) 296cabdff1aSopenharmony_ci : "r"(c), 297cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, low)), 298cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream)), 299cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, bytestream_end)), 300cabdff1aSopenharmony_ci "i"(offsetof(CABACContext, range)) 301cabdff1aSopenharmony_ci : "%eax", "%ecx", "memory" 302cabdff1aSopenharmony_ci ); 303cabdff1aSopenharmony_ci return res; 304cabdff1aSopenharmony_ci} 305cabdff1aSopenharmony_ci#endif /* !BROKEN_COMPILER */ 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci#endif /* HAVE_INLINE_ASM */ 308cabdff1aSopenharmony_ci#endif /* AVCODEC_X86_CABAC_H */ 309