diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gcc.target/powerpc/altivec-consts.c | |
download | cbb-gcc-4.6.4-upstream.tar.bz2 cbb-gcc-4.6.4-upstream.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gcc.target/powerpc/altivec-consts.c')
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/altivec-consts.c | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-consts.c b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c new file mode 100644 index 000000000..2c5bc99cf --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c @@ -0,0 +1,318 @@ +/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ +/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -mabi=altivec -O2" } */ + +/* Check that "easy" AltiVec constants are correctly synthesized. */ + +extern void abort (void); + +typedef __attribute__ ((vector_size (16))) unsigned char v16qi; +typedef __attribute__ ((vector_size (16))) unsigned short v8hi; +typedef __attribute__ ((vector_size (16))) unsigned int v4si; + +char w[16] __attribute__((aligned(16))); + + +/* Emulate the vspltis? instructions on a 16-byte array of chars. */ + +void vspltisb (char *v, int val) +{ + int i; + for (i = 0; i < 16; i++) + v[i] = val; +} + +void vspltish (char *v, int val) +{ + int i; + for (i = 0; i < 16; i += 2) + v[i] = val >> 7, v[i + 1] = val; +} + +void vspltisw (char *v, int val) +{ + int i; + for (i = 0; i < 16; i += 4) + v[i] = v[i + 1] = v[i + 2] = val >> 7, v[i + 3] = val; +} + + +/* Use three different check functions for each mode-instruction pair. + The callers have no typecasting and no addressable vectors, to make + the test more robust. */ + +void __attribute__ ((noinline)) check_v16qi (v16qi v1, char *v2) +{ + if (memcmp (&v1, v2, 16)) + abort (); +} + +void __attribute__ ((noinline)) check_v8hi (v8hi v1, char *v2) +{ + if (memcmp (&v1, v2, 16)) + abort (); +} + +void __attribute__ ((noinline)) check_v4si (v4si v1, char *v2) +{ + if (memcmp (&v1, v2, 16)) + abort (); +} + + +/* V16QI tests. */ + +void v16qi_vspltisb () +{ + v16qi v = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }; + vspltisb (w, 15); + check_v16qi (v, w); +} + +void v16qi_vspltisb_neg () +{ + v16qi v = { -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5 }; + vspltisb (w, -5); + check_v16qi (v, w); +} + +void v16qi_vspltisb_addself () +{ + v16qi v = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 }; + vspltisb (w, 30); + check_v16qi (v, w); +} + +void v16qi_vspltisb_neg_addself () +{ + v16qi v = { -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24 }; + vspltisb (w, -24); + check_v16qi (v, w); +} + +void v16qi_vspltish () +{ + v16qi v = { 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15 }; + vspltish (w, 15); + check_v16qi (v, w); +} + +void v16qi_vspltish_addself () +{ + v16qi v = { 0, 30, 0, 30, 0, 30, 0, 30, 0, 30, 0, 30, 0, 30, 0, 30 }; + vspltish (w, 30); + check_v16qi (v, w); +} + +void v16qi_vspltish_neg () +{ + v16qi v = { -1, -5, -1, -5, -1, -5, -1, -5, -1, -5, -1, -5, -1, -5, -1, -5 }; + vspltish (w, -5); + check_v16qi (v, w); +} + +void v16qi_vspltisw () +{ + v16qi v = { 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15 }; + vspltisw (w, 15); + check_v16qi (v, w); +} + +void v16qi_vspltisw_addself () +{ + v16qi v = { 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 30 }; + vspltisw (w, 30); + check_v16qi (v, w); +} + +void v16qi_vspltisw_neg () +{ + v16qi v = { -1, -1, -1, -5, -1, -1, -1, -5, -1, -1, -1, -5, -1, -1, -1, -5 }; + vspltisw (w, -5); + check_v16qi (v, w); +} + + +/* V8HI tests. */ + +void v8hi_vspltisb () +{ + v8hi v = { 0x0F0F, 0x0F0F, 0x0F0F, 0x0F0F, 0x0F0F, 0x0F0F, 0x0F0F, 0x0F0F }; + vspltisb (w, 15); + check_v8hi (v, w); +} + +void v8hi_vspltisb_addself () +{ + v8hi v = { 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E }; + vspltisb (w, 30); + check_v8hi (v, w); +} + +void v8hi_vspltisb_neg () +{ + v8hi v = { 0xFBFB, 0xFBFB, 0xFBFB, 0xFBFB, 0xFBFB, 0xFBFB, 0xFBFB, 0xFBFB }; + vspltisb (w, -5); + check_v8hi (v, w); +} + +void v8hi_vspltish () +{ + v8hi v = { 15, 15, 15, 15, 15, 15, 15, 15 }; + vspltish (w, 15); + check_v8hi (v, w); +} + +void v8hi_vspltish_neg () +{ + v8hi v = { -5, -5, -5, -5, -5, -5, -5, -5 }; + vspltish (w, -5); + check_v8hi (v, w); +} + +void v8hi_vspltish_addself () +{ + v8hi v = { 30, 30, 30, 30, 30, 30, 30, 30 }; + vspltish (w, 30); + check_v8hi (v, w); +} + +void v8hi_vspltish_neg_addself () +{ + v8hi v = { -24, -24, -24, -24, -24, -24, -24, -24 }; + vspltish (w, -24); + check_v8hi (v, w); +} + +void v8hi_vspltisw () +{ + v8hi v = { 0, 15, 0, 15, 0, 15, 0, 15 }; + vspltisw (w, 15); + check_v8hi (v, w); +} + +void v8hi_vspltisw_addself () +{ + v8hi v = { 0, 30, 0, 30, 0, 30, 0, 30 }; + vspltisw (w, 30); + check_v8hi (v, w); +} + +void v8hi_vspltisw_neg () +{ + v8hi v = { -1, -5, -1, -5, -1, -5, -1, -5 }; + vspltisw (w, -5); + check_v8hi (v, w); +} + +/* V4SI tests. */ + +void v4si_vspltisb () +{ + v4si v = { 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F }; + vspltisb (w, 15); + check_v4si (v, w); +} + +void v4si_vspltisb_addself () +{ + v4si v = { 0x1E1E1E1E, 0x1E1E1E1E, 0x1E1E1E1E, 0x1E1E1E1E }; + vspltisb (w, 30); + check_v4si (v, w); +} + +void v4si_vspltisb_neg () +{ + v4si v = { 0xFBFBFBFB, 0xFBFBFBFB, 0xFBFBFBFB, 0xFBFBFBFB }; + vspltisb (w, -5); + check_v4si (v, w); +} + +void v4si_vspltish () +{ + v4si v = { 0x000F000F, 0x000F000F, 0x000F000F, 0x000F000F }; + vspltish (w, 15); + check_v4si (v, w); +} + +void v4si_vspltish_addself () +{ + v4si v = { 0x001E001E, 0x001E001E, 0x001E001E, 0x001E001E }; + vspltish (w, 30); + check_v4si (v, w); +} + +void v4si_vspltish_neg () +{ + v4si v = { 0xFFFBFFFB, 0xFFFBFFFB, 0xFFFBFFFB, 0xFFFBFFFB }; + vspltish (w, -5); + check_v4si (v, w); +} + +void v4si_vspltisw () +{ + v4si v = { 15, 15, 15, 15 }; + vspltisw (w, 15); + check_v4si (v, w); +} + +void v4si_vspltisw_neg () +{ + v4si v = { -5, -5, -5, -5 }; + vspltisw (w, -5); + check_v4si (v, w); +} + +void v4si_vspltisw_addself () +{ + v4si v = { 30, 30, 30, 30 }; + vspltisw (w, 30); + check_v4si (v, w); +} + +void v4si_vspltisw_neg_addself () +{ + v4si v = { -24, -24, -24, -24 }; + vspltisw (w, -24); + check_v4si (v, w); +} + + + +int main () +{ + v16qi_vspltisb (); + v16qi_vspltisb_neg (); + v16qi_vspltisb_addself (); + v16qi_vspltisb_neg_addself (); + v16qi_vspltish (); + v16qi_vspltish_addself (); + v16qi_vspltish_neg (); + v16qi_vspltisw (); + v16qi_vspltisw_addself (); + v16qi_vspltisw_neg (); + + v8hi_vspltisb (); + v8hi_vspltisb_addself (); + v8hi_vspltisb_neg (); + v8hi_vspltish (); + v8hi_vspltish_neg (); + v8hi_vspltish_addself (); + v8hi_vspltish_neg_addself (); + v8hi_vspltisw (); + v8hi_vspltisw_addself (); + v8hi_vspltisw_neg (); + + v4si_vspltisb (); + v4si_vspltisb_addself (); + v4si_vspltisb_neg (); + v4si_vspltish (); + v4si_vspltish_addself (); + v4si_vspltish_neg (); + v4si_vspltisw (); + v4si_vspltisw_neg (); + v4si_vspltisw_addself (); + v4si_vspltisw_neg_addself (); + return 0; +} |