Во-первых, даже если это и был когда-то глюк, то он давно не глюк :-) The 8086 does not mask the shift count. However, all other IA-32 processors (starting with the
Intel 286 processor) do mask the shift count to 5 bits, resulting in a maximum count of 31. This
masking is done in all operating modes (including the virtual-8086 mode) to reduce the maximum execution time of the instruction.
Так что AMD обязан делать так же, ибо это уже не баг, а фича :-).
Во вторых, как я уже писал, если бы стандарт нормировал, что будет что-то конкретное (0 или не 0 -- не важно), то можно было бы обсуждать компиялтор. Впрочем, что "тут он ни при чём", мы вроде бы как согласны оба. Но я утверждаю, что тут ни при чём и x86 архитектура.
Тот же avr-gcc на
unsigned foo(unsigned val) {
return val << 16;
}
хоть и просто грузит в возврат константу 0 без никаких сдвигов, но
выдаёт предупреждение
warning: left shift count >= width of type
т.е. он не обещает, что во всех последующих версиях он будет при компиляции данного куска вести себя так же, как в этой.