svn commit: r328159 - head/sys/modules
Andriy Gapon
avg at FreeBSD.org
Fri Jan 19 18:41:07 UTC 2018
On 19/01/2018 20:30, Conrad Meyer wrote:
> On Fri, Jan 19, 2018 at 9:37 AM, Rodney W. Grimes
> <freebsd at 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
More information about the svn-src-all
mailing list