00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef FFMPEG_GCC_FIXES_H
00024 #define FFMPEG_GCC_FIXES_H
00025
00026 #ifdef HAVE_ALTIVEC_H
00027 #include <altivec.h>
00028 #endif
00029
00030 #if (__GNUC__ < 4)
00031 # define REG_v(a)
00032 #else
00033 # define REG_v(a) asm ( #a )
00034 #endif
00035
00036 #if (__GNUC__ * 100 + __GNUC_MINOR__ < 303)
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 static inline vector signed char ff_vmrglb (vector signed char const A,
00047 vector signed char const B)
00048 {
00049 static const vector unsigned char lowbyte = {
00050 0x08, 0x18, 0x09, 0x19, 0x0a, 0x1a, 0x0b, 0x1b,
00051 0x0c, 0x1c, 0x0d, 0x1d, 0x0e, 0x1e, 0x0f, 0x1f
00052 };
00053 return vec_perm (A, B, lowbyte);
00054 }
00055
00056 static inline vector signed short ff_vmrglh (vector signed short const A,
00057 vector signed short const B)
00058 {
00059 static const vector unsigned char lowhalf = {
00060 0x08, 0x09, 0x18, 0x19, 0x0a, 0x0b, 0x1a, 0x1b,
00061 0x0c, 0x0d, 0x1c, 0x1d, 0x0e, 0x0f, 0x1e, 0x1f
00062 };
00063 return vec_perm (A, B, lowhalf);
00064 }
00065
00066 static inline vector signed int ff_vmrglw (vector signed int const A,
00067 vector signed int const B)
00068 {
00069 static const vector unsigned char lowword = {
00070 0x08, 0x09, 0x0a, 0x0b, 0x18, 0x19, 0x1a, 0x1b,
00071 0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f
00072 };
00073 return vec_perm (A, B, lowword);
00074 }
00075
00076
00077
00078
00079 #undef vec_mergel
00080
00081 #define vec_mergel(a1, a2) \
00082 __ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
00083 ((vector signed char) ff_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
00084 __ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
00085 ((vector unsigned char) ff_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
00086 __ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
00087 ((vector signed short) ff_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
00088 __ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
00089 ((vector unsigned short) ff_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
00090 __ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
00091 ((vector float) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
00092 __ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
00093 ((vector signed int) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
00094 __ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
00095 ((vector unsigned int) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
00096 __altivec_link_error_invalid_argument ())))))))
00097
00098 #endif
00099
00100 #endif