id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
860	32-bit x86 assembler uses sib byte encoding for 32-bit displacements	rme	rme	"r11754 is workaround for a bug in how the lisp assembler encodes memory operands that are just a displacement.

To elaborate on that commit message, there are two ways on 32-bit x86 to encode a memory operand that's just a displacement.

For example, take the instruction:
{{{
0x806e6db:	mov    %fs:0x84,%ecx
}}}

The lisp assembler encodes this as:
{{{
0x806e6db:	0x64	0x8b	0x0c	0x25	0x84	0x00	0x00	0x00
}}}

Note that the modrm byte of 0x0c (00 001 100) means that a sib byte follows.

This could also be encoded as this shorter sequence (and the Unix assembler does so):
{{{
0x806e6db:	0x64	0x8b	0x0d	0x84	0x00	0x00	0x00
}}}

The modrm byte of 0x0d (00 001 101) here means that the displacement follows.

The reason that the lisp assembler selects the longer encoding is because it targeted x86-64 first.  On x86-64, the modrm byte in the shorter sequence is redefined to mean that the displacement is RIP-relative.  Therefore, the longer sib byte encoding is used to specify just a displacement.

The lisp assembler needs to be persuaded to emit the shorter encoding for 32-bit x86.  When it does, we can recompile and bump fasl versions, etc., and remove the workaround in pc_luser_xp().
"	task	closed	minor		Compiler	trunk	fixed	x86	
