diff options
author | Alexander Strange <astrange@ithinksw.com> | 2010-01-18 10:24:33 +0000 |
---|---|---|
committer | Alexander Strange <astrange@ithinksw.com> | 2010-01-18 10:24:33 +0000 |
commit | f6d039065715e4c7d2df37e62bbb6004ecd30509 (patch) | |
tree | baa2dede5593e67d7faa0a6a9319c6b36e8c5341 /libavutil/intreadwrite.h | |
parent | 3c52d4849f9cc8d5768a8ec67be7aabb4a0734b6 (diff) | |
download | ffmpeg-f6d039065715e4c7d2df37e62bbb6004ecd30509.tar.gz |
Add macros for 64- and 128-bit write-combining optimization to intreadwrite.h.
Add x86 implementation using MMX/SSE.
Originally committed as revision 21281 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavutil/intreadwrite.h')
-rw-r--r-- | libavutil/intreadwrite.h | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h index 78f83300bc..bdc3c4366a 100644 --- a/libavutil/intreadwrite.h +++ b/libavutil/intreadwrite.h @@ -25,8 +25,9 @@ /* * Arch-specific headers can provide any combination of - * AV_[RW][BLN](16|24|32|64) macros. Preprocessor symbols must be - * defined, even if these are implemented as inline functions. + * AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. */ #if ARCH_ARM @@ -37,6 +38,8 @@ # include "mips/intreadwrite.h" #elif ARCH_PPC # include "ppc/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" #endif /* @@ -397,4 +400,44 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed)); } while(0) #endif +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) (*(uint##n##_t*)(d) = *(const uint##n##_t*)(s)) + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(uint##n##_t, *(uint##n##_t*)(a), *(uint##n##_t*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (*(uint##n##_t*)(d) = 0) + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + #endif /* AVUTIL_INTREADWRITE_H */ |