1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2010 Alexander Strange <astrange@ithinksw.com> 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 AVUTIL_X86_INTREADWRITE_H 22cabdff1aSopenharmony_ci#define AVUTIL_X86_INTREADWRITE_H 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <stdint.h> 25cabdff1aSopenharmony_ci#include "config.h" 26cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#if HAVE_MMX 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#if !HAVE_FAST_64BIT && defined(__MMX__) 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define AV_COPY64 AV_COPY64 33cabdff1aSopenharmony_cistatic av_always_inline void AV_COPY64(void *d, const void *s) 34cabdff1aSopenharmony_ci{ 35cabdff1aSopenharmony_ci __asm__("movq %1, %%mm0 \n\t" 36cabdff1aSopenharmony_ci "movq %%mm0, %0 \n\t" 37cabdff1aSopenharmony_ci : "=m"(*(uint64_t*)d) 38cabdff1aSopenharmony_ci : "m" (*(const uint64_t*)s) 39cabdff1aSopenharmony_ci : "mm0"); 40cabdff1aSopenharmony_ci} 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define AV_SWAP64 AV_SWAP64 43cabdff1aSopenharmony_cistatic av_always_inline void AV_SWAP64(void *a, void *b) 44cabdff1aSopenharmony_ci{ 45cabdff1aSopenharmony_ci __asm__("movq %1, %%mm0 \n\t" 46cabdff1aSopenharmony_ci "movq %0, %%mm1 \n\t" 47cabdff1aSopenharmony_ci "movq %%mm0, %0 \n\t" 48cabdff1aSopenharmony_ci "movq %%mm1, %1 \n\t" 49cabdff1aSopenharmony_ci : "+m"(*(uint64_t*)a), "+m"(*(uint64_t*)b) 50cabdff1aSopenharmony_ci ::"mm0", "mm1"); 51cabdff1aSopenharmony_ci} 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci#define AV_ZERO64 AV_ZERO64 54cabdff1aSopenharmony_cistatic av_always_inline void AV_ZERO64(void *d) 55cabdff1aSopenharmony_ci{ 56cabdff1aSopenharmony_ci __asm__("pxor %%mm0, %%mm0 \n\t" 57cabdff1aSopenharmony_ci "movq %%mm0, %0 \n\t" 58cabdff1aSopenharmony_ci : "=m"(*(uint64_t*)d) 59cabdff1aSopenharmony_ci :: "mm0"); 60cabdff1aSopenharmony_ci} 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci#endif /* !HAVE_FAST_64BIT && defined(__MMX__) */ 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci#ifdef __SSE__ 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci#define AV_COPY128 AV_COPY128 67cabdff1aSopenharmony_cistatic av_always_inline void AV_COPY128(void *d, const void *s) 68cabdff1aSopenharmony_ci{ 69cabdff1aSopenharmony_ci struct v {uint64_t v[2];}; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci __asm__("movaps %1, %%xmm0 \n\t" 72cabdff1aSopenharmony_ci "movaps %%xmm0, %0 \n\t" 73cabdff1aSopenharmony_ci : "=m"(*(struct v*)d) 74cabdff1aSopenharmony_ci : "m" (*(const struct v*)s) 75cabdff1aSopenharmony_ci : "xmm0"); 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci#endif /* __SSE__ */ 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci#ifdef __SSE2__ 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci#define AV_ZERO128 AV_ZERO128 83cabdff1aSopenharmony_cistatic av_always_inline void AV_ZERO128(void *d) 84cabdff1aSopenharmony_ci{ 85cabdff1aSopenharmony_ci struct v {uint64_t v[2];}; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci __asm__("pxor %%xmm0, %%xmm0 \n\t" 88cabdff1aSopenharmony_ci "movdqa %%xmm0, %0 \n\t" 89cabdff1aSopenharmony_ci : "=m"(*(struct v*)d) 90cabdff1aSopenharmony_ci :: "xmm0"); 91cabdff1aSopenharmony_ci} 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci#endif /* __SSE2__ */ 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci#endif /* HAVE_MMX */ 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci#endif /* AVUTIL_X86_INTREADWRITE_H */ 98