On Sat, 18 Nov 2023, Jakub Jelinek wrote:

> +@defbuiltin{@var{type} __builtin_stdc_bit_ceil (@var{type} @var{arg})}
> +The @code{__builtin_stdc_bit_ceil} function is available only
> +in C.  It is type-generic, the argument can be any unsigned integer
> +(standard, extended or bit-precise).  No integral argument promotions are
> +performed on the argument.  It is equivalent to
> +@code{@var{arg} <= 1 ? (@var{type}) 1
> +: (@var{type}) 1 << (@var{prec} - __builtin_clzg ((@var{type}) (@var{arg} - 
> 1)))}
> +where @var{prec} is bit width of @var{type}, except that side-effects
> +in @var{arg} are evaluated just once.
> +@enddefbuiltin

Note that stdc_bit_ceil now has defined behavior (return 0) on overflow: 
CD2 comment FR-135 was accepted for the DIS at the June WG14 meeting.  
This affects both the documentation and the implementation, as they need 
to avoid an undefined shift by the width of the type.  That's why my 
stdbit.h implementations have two shifts (not claiming that's necessarily 
the optimal way of ensuring the correct result in the overflow case).

  return __x <= 1 ? 1 : ((uint64_t) 1) << (__bw64_inline (__x - 1) - 1) << 1;

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to