mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +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;
|
||||
}
|
||||
|
||||
#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
|
||||
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)
|
||||
{
|
||||
#if defined(__BIG_ENDIAN__)
|
||||
return vec_xxpermdi(__v, __v, 0x0)[1];
|
||||
#else
|
||||
return vec_xxpermdi(__v, __v, 0x0)[0];
|
||||
#else
|
||||
return vec_xxpermdi(__v, __v, 0x3)[0];
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -72,9 +77,9 @@ static inline
|
|||
unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v)
|
||||
{
|
||||
#if defined(__BIG_ENDIAN__)
|
||||
return vec_xxpermdi(__v, __v, 0x3)[1];
|
||||
#else
|
||||
return vec_xxpermdi(__v, __v, 0x3)[0];
|
||||
#else
|
||||
return vec_xxpermdi(__v, __v, 0x0)[0];
|
||||
#endif
|
||||
}
|
||||
#endif /* vec_xxpermdi */
|
||||
|
|
Loading…
Reference in a new issue