meson: Split test for __int128_t type from __int128_t arithmetic
Older versions of clang have missing runtime functions for arithmetic with -fsanitize=undefined (see 464e3671f9d5c), so we cannot use __int128_t for implementing Int128. But __int128_t is present, data movement works, and it can be used for atomic128. Probe for both CONFIG_INT128_TYPE and CONFIG_INT128, adjust qemu/int128.h to define Int128Alias if CONFIG_INT128_TYPE, and adjust the meson probe for atomics to use has_int128_type. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
9e0e6a7e8e
commit
6479dd74f1
@ -481,7 +481,7 @@ static inline void bswap128s(Int128 *s)
|
||||
* a possible structure and the native types. Ease parameter passing
|
||||
* via use of the transparent union extension.
|
||||
*/
|
||||
#ifdef CONFIG_INT128
|
||||
#ifdef CONFIG_INT128_TYPE
|
||||
typedef union {
|
||||
__uint128_t u;
|
||||
__int128_t i;
|
||||
@ -489,6 +489,6 @@ typedef union {
|
||||
} Int128Alias __attribute__((transparent_union));
|
||||
#else
|
||||
typedef Int128 Int128Alias;
|
||||
#endif /* CONFIG_INT128 */
|
||||
#endif /* CONFIG_INT128_TYPE */
|
||||
|
||||
#endif /* INT128_H */
|
||||
|
15
meson.build
15
meson.build
@ -2543,7 +2543,13 @@ config_host_data.set('CONFIG_ATOMIC64', cc.links('''
|
||||
return 0;
|
||||
}'''))
|
||||
|
||||
has_int128 = cc.links('''
|
||||
has_int128_type = cc.compiles('''
|
||||
__int128_t a;
|
||||
__uint128_t b;
|
||||
int main(void) { b = a; }''')
|
||||
config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
|
||||
|
||||
has_int128 = has_int128_type and cc.links('''
|
||||
__int128_t a;
|
||||
__uint128_t b;
|
||||
int main (void) {
|
||||
@ -2552,10 +2558,9 @@ has_int128 = cc.links('''
|
||||
a = a * a;
|
||||
return 0;
|
||||
}''')
|
||||
|
||||
config_host_data.set('CONFIG_INT128', has_int128)
|
||||
|
||||
if has_int128
|
||||
if has_int128_type
|
||||
# "do we have 128-bit atomics which are handled inline and specifically not
|
||||
# via libatomic". The reason we can't use libatomic is documented in the
|
||||
# comment starting "GCC is a house divided" in include/qemu/atomic128.h.
|
||||
@ -2564,7 +2569,7 @@ if has_int128
|
||||
# __alignof(unsigned __int128) for the host.
|
||||
atomic_test_128 = '''
|
||||
int main(int ac, char **av) {
|
||||
unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], 16);
|
||||
__uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
|
||||
p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
|
||||
__atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
|
||||
__atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
|
||||
@ -2586,7 +2591,7 @@ if has_int128
|
||||
config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
|
||||
int main(void)
|
||||
{
|
||||
unsigned __int128 x = 0, y = 0;
|
||||
__uint128_t x = 0, y = 0;
|
||||
__sync_val_compare_and_swap_16(&x, y, x);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user