summaryrefslogtreecommitdiffstats
path: root/clang/lib/Headers/altivec.h
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>2014-06-11 15:48:46 +0000
committerBill Schmidt <wschmidt@linux.vnet.ibm.com>2014-06-11 15:48:46 +0000
commit56a696700083896f6f0534c22200671fbb80b51d (patch)
treefa0ae726c3eaca8e630fcf0eab978f9c6e494421 /clang/lib/Headers/altivec.h
parent8bb4c858bc9b82810b69846c3d5a51844a6de0ec (diff)
downloadbcm5719-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.h96
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 */
OpenPOWER on IntegriCloud