diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2015-05-16 01:02:25 +0000 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2015-05-16 01:02:25 +0000 |
commit | 41e14c4dfa63c45271cb42368d09b5a94ee16e4f (patch) | |
tree | 5e7a107f111783e01368026e3abc381b83e59490 /clang/test/CodeGen/builtins-ppc-p8vector.c | |
parent | 5ed84cdba8351f86de6247410dcfc2ebdc88708c (diff) | |
download | bcm5719-llvm-41e14c4dfa63c45271cb42368d09b5a94ee16e4f.tar.gz bcm5719-llvm-41e14c4dfa63c45271cb42368d09b5a94ee16e4f.zip |
[PPC64] Add vector pack/unpack support from ISA 2.07
This patch adds support for the following new instructions in the
Power ISA 2.07:
vpksdss
vpksdus
vpkudus
vpkudum
vupkhsw
vupklsw
These instructions are available through the vec_packs, vec_packsu,
vec_unpackh, and vec_unpackl built-in interfaces. These are
lane-sensitive instructions, so the built-ins have different
implementations for big- and little-endian, and the instructions must
be marked as killing the vector swap optimization for now.
The first three instructions perform saturating pack operations. The
fourth performs a modulo pack operation, which means it can be
represented with a vector shuffle, and conversely the appropriate
vector shuffles may cause this instruction to be generated. The other
instructions are only generated via built-in support for now.
I noticed during patch preparation that the macro __VSX__ was not
previously predefined when the power8-vector or direct-move features
are requested. This is an error, and I've corrected that here as
well.
Appropriate tests have been added.
There is a companion patch to llvm for the rest of this support.
llvm-svn: 237500
Diffstat (limited to 'clang/test/CodeGen/builtins-ppc-p8vector.c')
-rw-r--r-- | clang/test/CodeGen/builtins-ppc-p8vector.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/clang/test/CodeGen/builtins-ppc-p8vector.c b/clang/test/CodeGen/builtins-ppc-p8vector.c index d3391b5ab35..c91686c0ea7 100644 --- a/clang/test/CodeGen/builtins-ppc-p8vector.c +++ b/clang/test/CodeGen/builtins-ppc-p8vector.c @@ -5,6 +5,7 @@ vector int vi = { -1, 2, -3, 4 }; vector unsigned int vui = { 1, 2, 3, 4 }; +vector bool int vbi = {0, -1, -1, 0}; vector bool long long vbll = { 1, 0 }; vector long long vll = { 1, 2 }; vector unsigned long long vull = { 1, 2 }; @@ -12,6 +13,7 @@ vector unsigned long long vull = { 1, 2 }; int res_i; vector int res_vi; vector unsigned int res_vui; +vector bool int res_vbi; vector long long res_vll; vector unsigned long long res_vull; vector bool long long res_vbll; @@ -558,6 +560,28 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vmuleuw // CHECK-PPC: error: call to 'vec_mulo' is ambiguous + /* vec_packs */ + res_vi = vec_packs(vll, vll); +// CHECK: @llvm.ppc.altivec.vpksdss +// CHECK-LE: @llvm.ppc.altivec.vpksdss +// CHECK-PPC: error: call to 'vec_packs' is ambiguous + + res_vui = vec_packs(vull, vull); +// CHECK: @llvm.ppc.altivec.vpkudus +// CHECK-LE: @llvm.ppc.altivec.vpkudus +// CHECK-PPC: error: call to 'vec_packs' is ambiguous + + /* vec_packsu */ + res_vui = vec_packsu(vll, vll); +// CHECK: @llvm.ppc.altivec.vpksdus +// CHECK-LE: @llvm.ppc.altivec.vpksdus +// CHECK-PPC: error: call to 'vec_packsu' is ambiguous + + res_vui = vec_packsu(vull, vull); +// CHECK: @llvm.ppc.altivec.vpkudus +// CHECK-LE: @llvm.ppc.altivec.vpkudus +// CHECK-PPC: error: call to 'vec_packsu' is ambiguous + /* vec_rl */ res_vll = vec_rl(vll, vull); // CHECK: @llvm.ppc.altivec.vrld @@ -602,4 +626,73 @@ void test1() { // CHECK-LE: ashr <2 x i64> // CHECK-PPC: error: call to 'vec_sra' is ambiguous + /* vec_unpackh */ + res_vll = vec_unpackh(vi); +// CHECK: llvm.ppc.altivec.vupkhsw +// CHECK-LE: llvm.ppc.altivec.vupklsw +// CHECK-PPC: error: call to 'vec_unpackh' is ambiguous + + res_vbll = vec_unpackh(vbi); +// CHECK: llvm.ppc.altivec.vupkhsw +// CHECK-LE: llvm.ppc.altivec.vupklsw +// CHECK-PPC: error: call to 'vec_unpackh' is ambiguous + + /* vec_unpackl */ + res_vll = vec_unpackl(vi); +// CHECK: llvm.ppc.altivec.vupklsw +// CHECK-LE: llvm.ppc.altivec.vupkhsw +// CHECK-PPC: error: call to 'vec_unpackl' is ambiguous + + res_vbll = vec_unpackl(vbi); +// CHECK: llvm.ppc.altivec.vupklsw +// CHECK-LE: llvm.ppc.altivec.vupkhsw +// CHECK-PPC: error: call to 'vec_unpackl' is ambiguous + + /* vec_vpksdss */ + res_vi = vec_vpksdss(vll, vll); +// CHECK: llvm.ppc.altivec.vpksdss +// CHECK-LE: llvm.ppc.altivec.vpksdss +// CHECK-PPC: warning: implicit declaration of function 'vec_vpksdss' + + /* vec_vpksdus */ + res_vui = vec_vpksdus(vll, vll); +// CHECK: llvm.ppc.altivec.vpksdus +// CHECK-LE: llvm.ppc.altivec.vpksdus +// CHECK-PPC: warning: implicit declaration of function 'vec_vpksdus' + + /* vec_vpkudum */ + res_vi = vec_vpkudum(vll, vll); +// CHECK: vperm +// CHECK-LE: vperm +// CHECK-PPC: warning: implicit declaration of function 'vec_vpkudum' + + res_vui = vec_vpkudum(vull, vull); +// CHECK: vperm +// CHECK-LE: vperm + + res_vui = vec_vpkudus(vull, vull); +// CHECK: llvm.ppc.altivec.vpkudus +// CHECK-LE: llvm.ppc.altivec.vpkudus +// CHECK-PPC: warning: implicit declaration of function 'vec_vpkudus' + + /* vec_vupkhsw */ + res_vll = vec_vupkhsw(vi); +// CHECK: llvm.ppc.altivec.vupkhsw +// CHECK-LE: llvm.ppc.altivec.vupklsw +// CHECK-PPC: warning: implicit declaration of function 'vec_vupkhsw' + + res_vbll = vec_vupkhsw(vbi); +// CHECK: llvm.ppc.altivec.vupkhsw +// CHECK-LE: llvm.ppc.altivec.vupklsw + + /* vec_vupklsw */ + res_vll = vec_vupklsw(vi); +// CHECK: llvm.ppc.altivec.vupklsw +// CHECK-LE: llvm.ppc.altivec.vupkhsw +// CHECK-PPC: warning: implicit declaration of function 'vec_vupklsw' + + res_vbll = vec_vupklsw(vbi); +// CHECK: llvm.ppc.altivec.vupklsw +// CHECK-LE: llvm.ppc.altivec.vupkhsw + } |