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

Vladimir 'φ-coder/phcoder' Serbinenko phcoder at gmail.com
Fri Feb 20 07:26:07 PST 2015


On 20.02.2015 15:58, 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.
> source:
> 	movl	LOCAL(kernel_sector), %ebx
> 	movl	%ebx, 8(%si)
> clang:
>     7cbc:	67 66 8b 1d 5c 7c 00 	addr32 mov 0x7c5c,%ebx
>     7cc3:	00
>     7cc4:	66 89 5c 08          	mov    %ebx,0x8(%si)
> 
> gas:
>     7cbc:	66 8b 1e 5c 7c       	mov    0x7c5c,%ebx
>     7cc1:	66 89 5c 08          	mov    %ebx,0x8(%si)
> 32-bit jump.
> source:
> 	jnb	LOCAL(floppy_probe)
> 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>
Minimal example would be:
	.code16
	jmp 1f
	.space 256
1:	nop
clang:
   0:	66 e9 00 01 00 00    	jmpl   0x106
	...
 106:	90                   	nop
gcc:
   0:	e9 00 01             	jmp    0x103
	...
 103:	90                   	nop

> The last one is particularly problematic as it never makes sense to
> issue 32-bit jump if %ip is only 16 bits and it eats 3 extra bytes per
> jump. Is it possible to force clang to generate 16-bit jumps?
> On bright side if I remove error strings the code is functional.
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 213 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150220/65c8af1f/attachment.sig>


More information about the llvm-dev mailing list