diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/vmx/7-01a.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/vmx/7-01a.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vmx/7-01a.c b/gcc/testsuite/gcc.dg/vmx/7-01a.c new file mode 100644 index 000000000..c09835b43 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vmx/7-01a.c @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +#include <altivec.h> +extern vector signed short image[]; +extern vector signed short band[]; + +#define load(a,b) vec_ld((b)*16, a) +#define store(v,a,b) vec_st(v,(b)*16,a) + +void +haar (vector signed char a, vector signed char b, vector signed char c, + vector signed char d, unsigned int N, int XX) +{ + unsigned int i; + vector unsigned char high, low; + vector signed int zero = ((vector signed int){0,0,0,0}); + + for (i = 0; i < N; i++) { + high = (vector unsigned char) (vec_vmrghh (load(image, i+XX), + load(image, i))); + low = (vector unsigned char) (vec_vmrglh (load(image, i+XX), + load(image, i))); + + store (vec_vpkswss (vec_vmsummbm (a, high, zero), + vec_vmsummbm (a, low, zero)), + band, i); + store (vec_vpkswss (vec_vmsummbm (b, high, zero), + vec_vmsummbm (b, low, zero)), + band, i+1); + store(vec_vpkswss (vec_vmsummbm (c, high, zero), + vec_vmsummbm (c, low, zero)), + band, i+2); + store(vec_vpkswss (vec_vmsummbm (d, high, zero), + vec_vmsummbm (d, low, zero)), + band, i+3); + } +} |