00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include "gcc_fixes.h"
00028
00029 typedef union {
00030 vector unsigned char v;
00031 unsigned char c[16];
00032 } vec_uc_t;
00033
00034 typedef union {
00035 vector signed short v;
00036 signed short s[8];
00037 } vec_ss_t;
00038
00039 void v_resample16_altivec(uint8_t *dst, int dst_width, const uint8_t *src,
00040 int wrap, int16_t *filter)
00041 {
00042 int sum, i;
00043 const uint8_t *s;
00044 vector unsigned char *tv, tmp, dstv, zero;
00045 vec_ss_t srchv[4], srclv[4], fv[4];
00046 vector signed short zeros, sumhv, sumlv;
00047 s = src;
00048
00049 for(i=0;i<4;i++)
00050 {
00051
00052
00053
00054
00055
00056
00057 fv[i].s[0] = filter[i] << (15-FILTER_BITS);
00058 fv[i].v = vec_splat(fv[i].v, 0);
00059 }
00060
00061 zero = vec_splat_u8(0);
00062 zeros = vec_splat_s16(0);
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 i = (-(int)dst) & 0xf;
00073 while(i>0) {
00074 sum = s[0 * wrap] * filter[0] +
00075 s[1 * wrap] * filter[1] +
00076 s[2 * wrap] * filter[2] +
00077 s[3 * wrap] * filter[3];
00078 sum = sum >> FILTER_BITS;
00079 if (sum<0) sum = 0; else if (sum>255) sum=255;
00080 dst[0] = sum;
00081 dst++;
00082 s++;
00083 dst_width--;
00084 i--;
00085 }
00086
00087
00088 while(dst_width>=16) {
00089
00090
00091
00092
00093
00094
00095
00096 tv = (vector unsigned char *) &s[0 * wrap];
00097 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[i * wrap]));
00098 srchv[0].v = (vector signed short) vec_mergeh(zero, tmp);
00099 srclv[0].v = (vector signed short) vec_mergel(zero, tmp);
00100 sumhv = vec_madds(srchv[0].v, fv[0].v, zeros);
00101 sumlv = vec_madds(srclv[0].v, fv[0].v, zeros);
00102
00103 tv = (vector unsigned char *) &s[1 * wrap];
00104 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[1 * wrap]));
00105 srchv[1].v = (vector signed short) vec_mergeh(zero, tmp);
00106 srclv[1].v = (vector signed short) vec_mergel(zero, tmp);
00107 sumhv = vec_madds(srchv[1].v, fv[1].v, sumhv);
00108 sumlv = vec_madds(srclv[1].v, fv[1].v, sumlv);
00109
00110 tv = (vector unsigned char *) &s[2 * wrap];
00111 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[2 * wrap]));
00112 srchv[2].v = (vector signed short) vec_mergeh(zero, tmp);
00113 srclv[2].v = (vector signed short) vec_mergel(zero, tmp);
00114 sumhv = vec_madds(srchv[2].v, fv[2].v, sumhv);
00115 sumlv = vec_madds(srclv[2].v, fv[2].v, sumlv);
00116
00117 tv = (vector unsigned char *) &s[3 * wrap];
00118 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[3 * wrap]));
00119 srchv[3].v = (vector signed short) vec_mergeh(zero, tmp);
00120 srclv[3].v = (vector signed short) vec_mergel(zero, tmp);
00121 sumhv = vec_madds(srchv[3].v, fv[3].v, sumhv);
00122 sumlv = vec_madds(srclv[3].v, fv[3].v, sumlv);
00123
00124
00125
00126
00127
00128 dstv = vec_packsu(sumhv, sumlv) ;
00129 vec_st(dstv, 0, (vector unsigned char *) dst);
00130
00131 dst+=16;
00132 s+=16;
00133 dst_width-=16;
00134 }
00135
00136
00137
00138
00139
00140 while(dst_width>0) {
00141 sum = s[0 * wrap] * filter[0] +
00142 s[1 * wrap] * filter[1] +
00143 s[2 * wrap] * filter[2] +
00144 s[3 * wrap] * filter[3];
00145 sum = sum >> FILTER_BITS;
00146 if (sum<0) sum = 0; else if (sum>255) sum=255;
00147 dst[0] = sum;
00148 dst++;
00149 s++;
00150 dst_width--;
00151 }
00152 }
00153