diff options
| author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-06-11 15:48:46 +0000 |
|---|---|---|
| committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-06-11 15:48:46 +0000 |
| commit | 56a696700083896f6f0534c22200671fbb80b51d (patch) | |
| tree | fa0ae726c3eaca8e630fcf0eab978f9c6e494421 /clang/lib/Headers/altivec.h | |
| parent | 8bb4c858bc9b82810b69846c3d5a51844a6de0ec (diff) | |
| download | bcm5719-llvm-56a696700083896f6f0534c22200671fbb80b51d.tar.gz bcm5719-llvm-56a696700083896f6f0534c22200671fbb80b51d.zip | |
[PPC64LE] Fix vec_sld and vec_vsldoi for little endian
The vec_sld and vec_vsldoi interfaces perform a left-shift on vector
arguments for both big and little endian. However, because they rely
on the vec_perm interface which is endian-dependent, the permutation
vector needs to be reversed for LE to get the proper shift direction.
I've added some extra testing for these interfaces for LE in the
builtins-ppc-altivec.c.
llvm-svn: 210657
Diffstat (limited to 'clang/lib/Headers/altivec.h')
| -rw-r--r-- | clang/lib/Headers/altivec.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h index bda5a0ea396..bee9e2de8a5 100644 --- a/clang/lib/Headers/altivec.h +++ b/clang/lib/Headers/altivec.h @@ -5224,65 +5224,113 @@ vec_vslw(vector unsigned int __a, vector unsigned int __b) static vector signed char __ATTRS_o_ai vec_sld(vector signed char __a, vector signed char __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned char __ATTRS_o_ai vec_sld(vector unsigned char __a, vector unsigned char __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector short __ATTRS_o_ai vec_sld(vector short __a, vector short __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned short __ATTRS_o_ai vec_sld(vector unsigned short __a, vector unsigned short __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector pixel __ATTRS_o_ai vec_sld(vector pixel __a, vector pixel __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector int __ATTRS_o_ai vec_sld(vector int __a, vector int __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned int __ATTRS_o_ai vec_sld(vector unsigned int __a, vector unsigned int __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector float __ATTRS_o_ai vec_sld(vector float __a, vector float __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } /* vec_vsldoi */ @@ -5290,65 +5338,113 @@ vec_sld(vector float __a, vector float __b, unsigned char __c) static vector signed char __ATTRS_o_ai vec_vsldoi(vector signed char __a, vector signed char __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned char __ATTRS_o_ai vec_vsldoi(vector unsigned char __a, vector unsigned char __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector short __ATTRS_o_ai vec_vsldoi(vector short __a, vector short __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned short __ATTRS_o_ai vec_vsldoi(vector unsigned short __a, vector unsigned short __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector pixel __ATTRS_o_ai vec_vsldoi(vector pixel __a, vector pixel __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector int __ATTRS_o_ai vec_vsldoi(vector int __a, vector int __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector unsigned int __ATTRS_o_ai vec_vsldoi(vector unsigned int __a, vector unsigned int __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } static vector float __ATTRS_o_ai vec_vsldoi(vector float __a, vector float __b, unsigned char __c) { +#ifdef __LITTLE_ENDIAN__ + return vec_perm(__a, __b, (vector unsigned char) + (__c, __c-1, __c-2, __c-3, __c-4, __c-5, __c-6, __c-7, + __c-8, __c-9, __c-10, __c-11, __c-12, __c-13, __c-14, __c-15)); +#else return vec_perm(__a, __b, (vector unsigned char) (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7, __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15)); +#endif } /* vec_sll */ |

