mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 01:04:19 +01:00
MDEV-21984: POWER crc32 acceleration - fix clang's behavior on versions >= 7
Clang 7 changed the behavior of vec_xxpermdi in order to match GCC's
behavior. After this change, code that used to work on Clang 6 stopped
to work on Clang >= 7.
Tested on Clang 6, 7, 8 and 9.
Reference: https://bugs.llvm.org/show_bug.cgi?id=38192
Upstream fix: 361aaf77a5
This commit is contained in:
parent
811e4409ce
commit
9aacda409d
1 changed files with 10 additions and 5 deletions
|
@ -39,7 +39,12 @@ __vector unsigned long long __builtin_pack_vector (unsigned long __a,
|
||||||
return __v;
|
return __v;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef vec_xxpermdi
|
/*
|
||||||
|
* Clang 7 changed the behavior of vec_xxpermdi in order to provide the same
|
||||||
|
* behavior of GCC. That means code adapted to Clang >= 7 does not work on
|
||||||
|
* Clang <= 6. So, fallback to __builtin_unpack_vector() on Clang <= 6.
|
||||||
|
*/
|
||||||
|
#if !defined vec_xxpermdi || __clang_major__ <= 6
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
unsigned long __builtin_unpack_vector (__vector unsigned long long __v,
|
unsigned long __builtin_unpack_vector (__vector unsigned long long __v,
|
||||||
|
@ -62,9 +67,9 @@ static inline
|
||||||
unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v)
|
unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v)
|
||||||
{
|
{
|
||||||
#if defined(__BIG_ENDIAN__)
|
#if defined(__BIG_ENDIAN__)
|
||||||
return vec_xxpermdi(__v, __v, 0x0)[1];
|
|
||||||
#else
|
|
||||||
return vec_xxpermdi(__v, __v, 0x0)[0];
|
return vec_xxpermdi(__v, __v, 0x0)[0];
|
||||||
|
#else
|
||||||
|
return vec_xxpermdi(__v, __v, 0x3)[0];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,9 +77,9 @@ static inline
|
||||||
unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v)
|
unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v)
|
||||||
{
|
{
|
||||||
#if defined(__BIG_ENDIAN__)
|
#if defined(__BIG_ENDIAN__)
|
||||||
return vec_xxpermdi(__v, __v, 0x3)[1];
|
|
||||||
#else
|
|
||||||
return vec_xxpermdi(__v, __v, 0x3)[0];
|
return vec_xxpermdi(__v, __v, 0x3)[0];
|
||||||
|
#else
|
||||||
|
return vec_xxpermdi(__v, __v, 0x0)[0];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* vec_xxpermdi */
|
#endif /* vec_xxpermdi */
|
||||||
|
|
Loading…
Add table
Reference in a new issue