On Mon, Nov 21, 2016 at 7:58 AM, H. Peter Anvin <h...@zytor.com> wrote: > On 11/20/16 20:54, h...@zytor.com wrote: >> >> I believe i686+ writes zero, older CPUs leave unchanged. > > I should point out that, at least from my memory, the same applies to > instructions like "movl <seg>". I can't even remember for sure how the > behavior differs between "movl <seg>,<reg32>" and "movl <seg>,<mem>"; > I'd have to do some digging.
I have this distinct feeling that there issues with *both* the register and memory versions. Because I have this dim memory that on early microarchitectures, even "mov segment to register" would always only do a 16-bit move, even if it was encoded as a 32-bit "movl". Although that may be partly because I know "gas" had some confusion about operand sizes and segment register instructions, so there might have been toolchain issues too. I just dug out my old 486 manual on _paper_ (Christ, I still had it): "Intel486(tm) Microprocessor Family Programmer's Reference Manual". The "mov" instruction is only documented for r/m16, and it has a footnote saying "In protected mode, use 16-bit operand size prefix". I definitely know that the "only write 16 bits" was the case for memory accesses, but I think it might have been the case even for register moves. After all, "mov segment register" is actually a completely different instruction from the normal "mov" instructions, even if it often shows up together with them in the instruction descriptions. The i686 cleaned up a lot of things, but I think this might be an area where there were differences between i486 and Pentium and all the clone chips too. Linus