You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
62 lines
1.7 KiB
/* Return the largest absolute value of a vector of signed shorts
|
|
|
|
* This is the Altivec SIMD version.
|
|
|
|
* Copyright 2004 Phil Karn, KA9Q
|
|
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
|
*/
|
|
|
|
#include "fec.h"
|
|
|
|
signed short peakval_av(signed short *in,int cnt){
|
|
vector signed short x;
|
|
int pad;
|
|
union { vector signed char cv; vector signed short hv; signed short s[8]; signed char c[16];} s;
|
|
vector signed short smallest,largest;
|
|
|
|
smallest = (vector signed short)(0);
|
|
largest = (vector signed short)(0);
|
|
if((pad = (int)in & 15)!=0){
|
|
/* Load unaligned leading word */
|
|
x = vec_perm(vec_ld(0,in),(vector signed short)(0),vec_lvsl(0,in));
|
|
if(cnt < 8){ /* Shift right to chop stuff beyond end of short block */
|
|
s.c[15] = (8-cnt)<<4;
|
|
x = vec_sro(x,s.cv);
|
|
}
|
|
smallest = vec_min(smallest,x);
|
|
largest = vec_max(largest,x);
|
|
in += 8-pad/2;
|
|
cnt -= 8-pad/2;
|
|
}
|
|
/* Everything is now aligned, rip through most of the block */
|
|
while(cnt >= 8){
|
|
x = vec_ld(0,in);
|
|
smallest = vec_min(smallest,x);
|
|
largest = vec_max(largest,x);
|
|
in += 8;
|
|
cnt -= 8;
|
|
}
|
|
/* Handle trailing fragment, if any */
|
|
if(cnt > 0){
|
|
x = vec_ld(0,in);
|
|
s.c[15] = (8-cnt)<<4;
|
|
x = vec_sro(x,s.cv);
|
|
smallest = vec_min(smallest,x);
|
|
largest = vec_max(largest,x);
|
|
}
|
|
/* Combine and extract result */
|
|
largest = vec_max(largest,vec_abs(smallest));
|
|
|
|
s.c[15] = 64; /* Shift right four 16-bit words */
|
|
largest = vec_max(largest,vec_sro(largest,s.cv));
|
|
|
|
s.c[15] = 32; /* Shift right two 16-bit words */
|
|
largest = vec_max(largest,vec_sro(largest,s.cv));
|
|
|
|
s.c[15] = 16; /* Shift right one 16-bit word */
|
|
largest = vec_max(largest,vec_sro(largest,s.cv));
|
|
|
|
s.hv = largest;
|
|
return s.s[7];
|
|
}
|