case BUILT_IN_BITREVERSE16:
case BUILT_IN_BITREVERSE32:
case BUILT_IN_BITREVERSE64:
+ case BUILT_IN_BITREVERSE128:
target = expand_builtin_unop (target_mode, exp, target, subtarget,
bitreverse_optab);
if (target)
case BUILT_IN_BITREVERSE16:
case BUILT_IN_BITREVERSE32:
case BUILT_IN_BITREVERSE64:
+ case BUILT_IN_BITREVERSE128:
case BUILT_IN_CLZ:
case BUILT_IN_CLZIMAX:
case BUILT_IN_CLZL:
DEF_GCC_BUILTIN (BUILT_IN_BITREVERSE16, "bitreverse16", BT_FN_UINT16_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
DEF_GCC_BUILTIN (BUILT_IN_BITREVERSE32, "bitreverse32", BT_FN_UINT32_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
DEF_GCC_BUILTIN (BUILT_IN_BITREVERSE64, "bitreverse64", BT_FN_UINT64_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN (BUILT_IN_BITREVERSE128, "bitreverse128", BT_FN_UINT128_UINT128, ATTR_CONST_NOTHROW_LEAF_LIST)
DEF_EXT_LIB_BUILTIN (BUILT_IN_CLEAR_CACHE, "__clear_cache", BT_FN_VOID_PTR_PTR, ATTR_NOTHROW_LEAF_LIST)
/* [trans-mem]: Adjust BUILT_IN_TM_CALLOC if BUILT_IN_CALLOC is changed. */
@enddefbuiltin
@defbuiltin{uint32_t __builtin_bitreverse32 (uint32_t @var{x})}
-Similar to @code{__builtin_bitreverse8}, except the argument and return types
+Similar to @code{__builtin_bitreverse16}, except the argument and return types
are 32-bit.
@enddefbuiltin
@defbuiltin{uint64_t __builtin_bitreverse64 (uint64_t @var{x})}
-Similar to @code{__builtin_bitreverse8}, except the argument and return types
+Similar to @code{__builtin_bitreverse32}, except the argument and return types
are 64-bit.
@enddefbuiltin
+@defbuiltin{uint128_t __builtin_bitreverse128 (uint128_t @var{x})}
+Similar to @code{__builtin_bitreverse64}, except the argument and return types
+are 128-bit. Only supported on targets when 128-bit types are supported.
+@enddefbuiltin
+
@node CRC Builtins
@subsection CRC Builtins
@cindex CRC builtins
case CFN_BUILT_IN_BITREVERSE16:
case CFN_BUILT_IN_BITREVERSE32:
case CFN_BUILT_IN_BITREVERSE64:
+ case CFN_BUILT_IN_BITREVERSE128:
*result = wi::bitreverse (wide_int::from (arg, precision,
TYPE_SIGN (arg_type)));
return true;
case CFN_BUILT_IN_BITREVERSE16:
case CFN_BUILT_IN_BITREVERSE32:
case CFN_BUILT_IN_BITREVERSE64:
+ case CFN_BUILT_IN_BITREVERSE128:
/* Always true. */
return true;
return __builtin_bitreverse64 (x);
}
+#if __SIZEOF_INT128__ == 16
+[[gnu::noipa]] static unsigned __int128
+br128 (unsigned __int128 x)
+{
+ return __builtin_bitreverse128 (x);
+}
+#endif
+
int
main ()
{
if (br64 (0xffffffffffffffffull) != 0xffffffffffffffffull)
__builtin_abort ();
#endif
+#if __SIZEOF_INT128__ == 16
+ if (br128 (0) != 0)
+ __builtin_abort ();
+ if (br128 (1) != (unsigned __int128) 1 << 127)
+ __builtin_abort ();
+ if (br128 (((unsigned __int128) 0x0123456789abcdefull << 64)
+ | 0x2468ace013579bdfull)
+ != (((unsigned __int128) 0xfbd9eac807351624ull << 64)
+ | 0xf7b3d591e6a2c480ull))
+ __builtin_abort ();
+ if (br128 (~(unsigned __int128) 0) != ~(unsigned __int128) 0)
+ __builtin_abort ();
+#endif
#endif
}
#endif
#if __SIZEOF_LONG_LONG__ == 8
_Static_assert (__builtin_bitreverse64 (0x0123456789abcdefull)
- == 0xf7b3d591e6a2c480ull, "bitreverse64");
+ == 0xf7b3d591e6a2c480ull, "bitreverse64");
+#endif
+#if __SIZEOF_INT128__ == 16
+_Static_assert (__builtin_bitreverse128 (((unsigned __int128)
+ 0x0123456789abcdefull << 64)
+ | 0x2468ace013579bdfull)
+ == (((unsigned __int128) 0xfbd9eac807351624ull << 64)
+ | 0xf7b3d591e6a2c480ull), "bitreverse128");
#endif
#endif
case BUILT_IN_BITREVERSE16:
case BUILT_IN_BITREVERSE32:
case BUILT_IN_BITREVERSE64:
+ case BUILT_IN_BITREVERSE128:
val = get_value_for_expr (gimple_call_arg (stmt, 0), true);
if (val.lattice_val == UNDEFINED)
break;
case CFN_BUILT_IN_BITREVERSE16:
case CFN_BUILT_IN_BITREVERSE32:
case CFN_BUILT_IN_BITREVERSE64:
+ case CFN_BUILT_IN_BITREVERSE128:
CASE_CFN_FFS:
CASE_CFN_PARITY:
CASE_CFN_POPCOUNT:
case CFN_BUILT_IN_BITREVERSE16:
case CFN_BUILT_IN_BITREVERSE32:
case CFN_BUILT_IN_BITREVERSE64:
+ case CFN_BUILT_IN_BITREVERSE128:
CASE_CFN_FFS:
CASE_CFN_PARITY:
CASE_CFN_POPCOUNT: