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
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel