[LLVMdev] clang .code16 with -Os producing larger code that it needs to

David Woodhouse dwmw2 at infradead.org
Fri Feb 20 07:38:05 PST 2015


On Fri, 2015-02-20 at 15:58 +0100, Vladimir 'φ-coder/phcoder' Serbinenko
wrote:
> When experimenting with compiling GRUB2 with clang using integrated as,
> I found out that it generates a 16-bit code bigger than gas counterpart
> and result gets too big for size constraints of bootsector. This was
> traced mainly to 2 problems.

...

> 32-bit access to 16-bit addresses.
> clang:
>     7cbc:	67 66 8b 1d 5c 7c 00 00	addr32 mov 0x7c5c,%ebx
> gas:
>     7cbc:	66 8b 1e 5c 7c       	mov    0x7c5c,%ebx

> 32-bit jump.
> clang:
> +    7cb5:	66 0f 83 07 01 00 00 	jae    7dc3 <L_floppy_probe>
> gas:
> -    7cb5:	0f 83 0a 01          	jae    7dc3 <L_floppy_probe>

To a large extent, those are the *same* problem. We don't know that it's
eventually going to fit into a 16-bit offset, so we emit it with a fixup
record which can cope with 32 bits.

Arguably, the jump is *particularly* gratuitous in many cases... but in
'big real' mode is the IP *really* limited to 16 bits?

We could make it default to 16-bit, as gas does. But then we'd be
screwed in the cases where we really *do* need 32-bit.

What we actually need to do is implement handling for the explicit
addr32 prefix. Then we can do what gas does and default to 16-bit but
*also* have a way to do 32-bit when it's needed.

-- 
dwmw2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5745 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150220/79c3eb88/attachment.bin>


More information about the llvm-dev mailing list