>From c3cf6716e144709af7e3768e7ba37697ba3fee7d Mon Sep 17 00:00:00 2001
From: SO_Random_User <weavbd@sovmp224.lop.siteox.com>
Date: Sat, 7 Feb 2015 03:00:10 +0000
Subject: [PATCH] avutil/ppc: Add macro defination of vector types and vector
 base types. Add function printv for dev purpose.

---
 libavutil/ppc/types_altivec.h |  20 +++++-
 libavutil/ppc/util_altivec.h  | 143 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+), 2 deletions(-)

diff --git a/libavutil/ppc/types_altivec.h b/libavutil/ppc/types_altivec.h
index 69d8957..b39f25a 100644
--- a/libavutil/ppc/types_altivec.h
+++ b/libavutil/ppc/types_altivec.h
@@ -30,18 +30,34 @@
 #define vec_s16 vector signed short
 #define vec_u32 vector unsigned int
 #define vec_s32 vector signed int
+#define vec_u64 vector unsigned long long
+#define vec_s64 vector signed long long
 #define vec_f   vector float
-
+#define vec_d   vector double
 /***********************************************************************
+ * Vector base types
+ **********************************************************************/
+#define u8i            unsigned char
+#define s8i            signed char
+#define u16i           unsigned short
+#define s16i           signed short
+#define u32i           unsigned int
+#define s32i           signed int
+#define u64i           unsigned long long
+#define s64i           signed long long
+/**********************************************************************
  * Null vector
  **********************************************************************/
 #define LOAD_ZERO const vec_u8 zerov = vec_splat_u8( 0 )
-
 #define zero_u8v  (vec_u8)  zerov
 #define zero_s8v  (vec_s8)  zerov
 #define zero_u16v (vec_u16) zerov
 #define zero_s16v (vec_s16) zerov
 #define zero_u32v (vec_u32) zerov
 #define zero_s32v (vec_s32) zerov
+#define zero_u64v (vec_u64) zerov
+#define zero_s64v (vec_s64) zerov
+#define zero_fv   (vec_f)   zerov
+#define zero_dv   (vec_d)   zerov
 
 #endif /* AVUTIL_PPC_TYPES_ALTIVEC_H */
diff --git a/libavutil/ppc/util_altivec.h b/libavutil/ppc/util_altivec.h
index 51a4e8c..89427c2 100644
--- a/libavutil/ppc/util_altivec.h
+++ b/libavutil/ppc/util_altivec.h
@@ -160,6 +160,149 @@ static inline vec_u8 load_with_perm_vec(int offset, const uint8_t *src, vec_u8 p
 #define VEC_SLD16(a,b,c) vec_sld(b, a, c)
 #endif
 
+/**
+ * printf for vector
+ * fmt : u8v, s8v, u16v, s16v, u32v, s32v, u64v, s64v, fv, dv
+ */
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+static inline void printfv(char *fmt, ...)
+{
+    int    i         = 0;
+    int    fmt_len   = strlen(fmt);
+    
+    int    j         = 0;
+    char   bt_str[5] = {0};
+    int    bt_flg    = 1;
+    
+    int    k         = 0;
+
+    
+    vec_u8 v;
+
+    va_list argptr;
+    va_start(argptr, fmt);
+
+    for ( i = 0; i < fmt_len; i++ )
+    {
+        if ( fmt[i] == '%' )
+        {
+            j = 0;
+            v = (vec_u8)va_arg(argptr, vec_u8);
+            bt_flg = 1;
+            while ( bt_flg )
+            {
+                i++;
+                switch( fmt[i] )
+                {
+                    case 'u':
+                    case 's':
+                    case 'f':
+                    case 'd':
+                    case '1':
+                    case '2':
+                    case '3':
+                    case '4':
+                    case '6':
+                    case '8':
+                    case 'v': bt_str[j++] = fmt[i]; bt_str[j] = '\0'; break;
+                    default: bt_flg = 0; break;
+                }
+          
+                if (j == 2)
+                {
+                    if ( strcmp(bt_str, "fv") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(float) - 1; k++)
+                            printf("%.7f,", *((float*)&v + k));
+                        printf("%.7f}", *((float*)&v + k));
+                        break;
+                    }
+                    else if ( strcmp(bt_str, "dv") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(double) - 1; k++)
+                            printf("%.15f,", *((double*)&v + k));
+                        printf("%.15f}", *((double*)&v + k));
+                        break;
+                    }
+                }
+                else if (j == 3)
+                {
+                    if ( strcmp(bt_str, "u8v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(u8i) - 1; k++)
+                            printf("%4u,", (u32i)(*((u8i*)&v + k)));
+                        printf("%4u}", (u32i)(*((u8i*)&v + k)));
+                        break;
+                    }
+                    else if ( strcmp(bt_str, "s8v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_s8) / sizeof(s8i) - 1; k++)
+                            printf("%4d,", (s32i)(*((s8i*)&v + k)));
+                        printf("%4d}", (s32i)(*((s8i*)&v + k)));
+                        break;
+                    }
+                }
+                else if (j == 4)
+                {
+                    if ( strcmp(bt_str, "u16v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_s8) / sizeof(u16i) - 1; k++)
+                            printf("%8u,", (u32i)(*((u16i*)&v + k)));
+                        printf("%8u}", (u32i)(*((u16i*)&v + k)));        
+                    }
+                    else if ( strcmp(bt_str, "s16v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_s8) / sizeof(s16i) - 1; k++)
+                            printf("%8d,", (s32i)(*((s16i*)&v + k)));
+                        printf("%8d}", (s32i)(*((s16i*)&v + k)));
+                    }
+                    else if ( strcmp(bt_str, "u32v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(u32i) - 1; k++)
+                            printf("%8u,", *((u32i*)&v + k));
+                        printf("%8u}", *((u32i*)&v + k));
+                    }
+                    else if ( strcmp(bt_str, "s32v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_s8) / sizeof(s32i) - 1; k++)
+                            printf("%8d,", *((s32i*)&v + k));
+                        printf("%8d}", *((s32i*)&v + k));
+                    }
+                    else if ( strcmp(bt_str, "u64v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(u64i) - 1; k++)
+                            printf("%8llu,", *((u64i*)&v + k));
+                        printf("%8llu}", *((u64i*)&v + k));
+                    }
+                    else if ( strcmp(bt_str, "s64v") == 0 )
+                    {
+                        printf("{");
+                        for(k = 0; k < sizeof(vec_u8) / sizeof(s64i) - 1; k++)
+                            printf("%8lld,", *((s64i*)&v + k));
+                        printf("%8lld}", *((s64i*)&v + k));
+                    }
+                    break;
+                }
+            }
+        }
+        else
+        {
+            printf("%c", fmt[i]);
+        }
+    }
+}
+
 #endif /* HAVE_ALTIVEC */
 
 #endif /* AVUTIL_PPC_UTIL_ALTIVEC_H */
-- 
1.9.1

