On 19/01/2018 20:30, Conrad Meyer wrote: > On Fri, Jan 19, 2018 at 9:37 AM, Rodney W. Grimes > <free...@pdx.rh.cn85.dnsmgr.net> wrote: >> If you think in assembler it is easy to understand why this is UB, >> most (all) architectures Right Logic or Arithmetic Shift only accept an >> operand that is a size that can hold log2(wordsize). > > This is a logical right shift by a constant larger than the width of > the left operand. As a result, it would a constant zero in any > emitted machine code. It is a bug in the C standard and a concession > to naive, non-optimizing compilers that this is considered UB. >
Are you sure? I seem to recall that the actual shift happens to be N % 32 for 32-bit registers (at least on some processors). [Goes to check AMD Programmer's manual] Ah, here you are: The processor masks the upper three bits of the count operand, thus restricting the count to a number between 0 and 31. When the destination is 64 bits wide, the processor masks the upper two bits of the count, providing a count in the range of 0 to 63. -- Andriy Gapon _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"