00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef AVUTIL_ARM_INTMATH_H
00022 #define AVUTIL_ARM_INTMATH_H
00023
00024 #include <stdint.h>
00025
00026 #include "config.h"
00027 #include "libavutil/attributes.h"
00028
00029 #if HAVE_INLINE_ASM
00030
00031 #if HAVE_ARMV6_INLINE
00032
00033 #define av_clip_uint8 av_clip_uint8_arm
00034 static av_always_inline av_const unsigned av_clip_uint8_arm(int a)
00035 {
00036 unsigned x;
00037 __asm__ ("usat %0, #8, %1" : "=r"(x) : "r"(a));
00038 return x;
00039 }
00040
00041 #define av_clip_int8 av_clip_int8_arm
00042 static av_always_inline av_const int av_clip_int8_arm(int a)
00043 {
00044 int x;
00045 __asm__ ("ssat %0, #8, %1" : "=r"(x) : "r"(a));
00046 return x;
00047 }
00048
00049 #define av_clip_uint16 av_clip_uint16_arm
00050 static av_always_inline av_const unsigned av_clip_uint16_arm(int a)
00051 {
00052 unsigned x;
00053 __asm__ ("usat %0, #16, %1" : "=r"(x) : "r"(a));
00054 return x;
00055 }
00056
00057 #define av_clip_int16 av_clip_int16_arm
00058 static av_always_inline av_const int av_clip_int16_arm(int a)
00059 {
00060 int x;
00061 __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a));
00062 return x;
00063 }
00064
00065 #define av_clip_uintp2 av_clip_uintp2_arm
00066 static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p)
00067 {
00068 unsigned x;
00069 __asm__ ("usat %0, %2, %1" : "=r"(x) : "r"(a), "i"(p));
00070 return x;
00071 }
00072
00073 #define av_sat_add32 av_sat_add32_arm
00074 static av_always_inline int av_sat_add32_arm(int a, int b)
00075 {
00076 int r;
00077 __asm__ ("qadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
00078 return r;
00079 }
00080
00081 #define av_sat_dadd32 av_sat_dadd32_arm
00082 static av_always_inline int av_sat_dadd32_arm(int a, int b)
00083 {
00084 int r;
00085 __asm__ ("qdadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
00086 return r;
00087 }
00088
00089 #endif
00090
00091 #if HAVE_ASM_MOD_Q
00092
00093 #define av_clipl_int32 av_clipl_int32_arm
00094 static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
00095 {
00096 int x, y;
00097 __asm__ ("adds %1, %R2, %Q2, lsr #31 \n\t"
00098 "itet ne \n\t"
00099 "mvnne %1, #1<<31 \n\t"
00100 "moveq %0, %Q2 \n\t"
00101 "eorne %0, %1, %R2, asr #31 \n\t"
00102 : "=r"(x), "=&r"(y) : "r"(a) : "cc");
00103 return x;
00104 }
00105
00106 #endif
00107
00108 #endif
00109
00110 #endif