From 530456bf31a794c3bf5eb0fc888e1ac65dac8e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Rullg=C3=A5rd?= Date: Thu, 28 May 2009 23:19:35 +0000 Subject: [PATCH] MIPS: inline asm for intreadwrite.h Originally committed as revision 18980 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavutil/intreadwrite.h | 2 + libavutil/mips/intreadwrite.h | 94 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 libavutil/mips/intreadwrite.h diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h index 5e55327ff9..ee597937b9 100644 --- a/libavutil/intreadwrite.h +++ b/libavutil/intreadwrite.h @@ -31,6 +31,8 @@ #if ARCH_ARM # include "arm/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" #elif ARCH_PPC # include "ppc/intreadwrite.h" #endif diff --git a/libavutil/mips/intreadwrite.h b/libavutil/mips/intreadwrite.h new file mode 100644 index 0000000000..56df931d96 --- /dev/null +++ b/libavutil/mips/intreadwrite.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2009 Mans Rullgard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_MIPS_INTREADWRITE_H +#define AVUTIL_MIPS_INTREADWRITE_H + +#include +#include "config.h" + +#define AV_RN32 AV_RN32 +static inline uint32_t AV_RN32(const void *p) +{ + uint32_t v; + __asm__ ("lwl %0, %1 \n\t" + "lwr %0, %2 \n\t" + : "=&r"(v) + : "m"(*(const uint32_t *)((const uint8_t *)p+3*!HAVE_BIGENDIAN)), + "m"(*(const uint32_t *)((const uint8_t *)p+3*HAVE_BIGENDIAN))); + return v; +} + +#define AV_WN32 AV_WN32 +static inline void AV_WN32(void *p, uint32_t v) +{ + __asm__ ("swl %2, %0 \n\t" + "swr %2, %1 \n\t" + : "=m"(*(uint32_t *)((uint8_t *)p+3*!HAVE_BIGENDIAN)), + "=m"(*(uint32_t *)((uint8_t *)p+3*HAVE_BIGENDIAN)) + : "r"(v)); +} + +#if ARCH_MIPS64 + +#define AV_RN64 AV_RN64 +static inline uint64_t AV_RN64(const void *p) +{ + uint64_t v; + __asm__ ("lwl %0, %1 \n\t" + "lwr %0, %2 \n\t" + : "=&r"(v) + : "m"(*(const uint64_t *)((const uint8_t *)p+3*!HAVE_BIGENDIAN)), + "m"(*(const uint64_t *)((const uint8_t *)p+3*HAVE_BIGENDIAN))); + return v; +} + +#define AV_WN64 AV_WN64 +static inline void AV_WN64(void *p, uint64_t v) +{ + __asm__ ("swl %2, %0 \n\t" + "swr %2, %1 \n\t" + : "=m"(*(uint64_t *)((uint8_t *)p+7*!HAVE_BIGENDIAN)), + "=m"(*(uint64_t *)((uint8_t *)p+7*HAVE_BIGENDIAN)) + : "r"(v)); +} + +#else + +#define AV_RN64 AV_RN64 +static inline uint64_t AV_RN64(const void *p) +{ + union { uint64_t v; uint32_t hl[2]; } v; + v.hl[0] = AV_RN32(p); + v.hl[1] = AV_RN32((const uint8_t *)p + 4); + return v.v; +} + +#define AV_WN64 AV_WN64 +static inline void AV_WN64(void *p, uint64_t v) +{ + union { uint64_t v; uint32_t hl[2]; } vv = { v }; + AV_WN32(p, vv.hl[0]); + AV_WN32((uint8_t *)p + 4, vv.hl[1]); +} + +#endif /* ARCH_MIPS64 */ + +#endif /* AVUTIL_MIPS_INTREADWRITE_H */