Date: Sun, 14 Oct 2012 12:53:50 +0300 From: Andriy Gapon <avg@FreeBSD.org> To: freebsd-arch@FreeBSD.org Cc: Dimitry Andric <dimitry@andric.com> Subject: Re: x86 boot code build Message-ID: <507A8BAE.5060304@FreeBSD.org> In-Reply-To: <506DEB4C.5020508@andric.com> References: <506C385C.3020400@FreeBSD.org> <506DEB4C.5020508@andric.com>
next in thread | previous in thread | raw e-mail | index | archive | help
on 04/10/2012 23:02 Dimitry Andric said the following: > On 2012-10-03 15:06, Andriy Gapon wrote: >> Currently we produce "slightly" different binaries for x86 boot code depending >> whether MACHINE_CPUARCH is i386 or amd64. I think that there is no good reason >> for this, since in both cases we use exactly the same code and target the same >> classes of machines. In other words, the binaries should be interchangeable[*]. >> >> The difference boils down to using -march=i386 on amd64 while i386 uses default >> compiler flags, which are equivalent to -march=i486 -mtune=generic. > > Yes, I also noticed this inconsistency during some other work in > sys/boot, and I ended up with this diff in my backlog: > > Index: sys/boot/i386/Makefile.inc > =================================================================== > --- sys/boot/i386/Makefile.inc (revision 241194) > +++ sys/boot/i386/Makefile.inc (working copy) > @@ -5,12 +5,13 @@ > BINDIR?= /boot > > LOADER_ADDRESS?=0x200000 > -CFLAGS+= -ffreestanding -mpreferred-stack-boundary=2 \ > +CFLAGS+= -march=i386 -ffreestanding -mpreferred-stack-boundary=2 \ > -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float > +NO_CPU_CFLAGS= > LDFLAGS+= -nostdlib > > .if ${MACHINE_CPUARCH} == "amd64" > -CFLAGS+= -m32 -march=i386 > +CFLAGS+= -m32 > ACFLAGS+= -m32 > LDFLAGS+= -m elf_i386_fbsd > AFLAGS+= --32 > > >> If my analysis is correct, the only thing affected by the flags in the boot code >> is use of leave instruction when -Os is _not_ specified. >> For -march=i386 our gcc prefers using leave. For -march=i486 it thinks that >> movs+pops are faster than leave and so prefers to not use it. If -Os is >> specified, then leave is always used because it results in smaller machine code. >> >> So, as it is now, on amd64 we produce slightly smaller boot binaries where size >> doesn't matter. Where size really matters (-Os) we produce identical binaries. >> >> If we decide that it makes sense to converge i386 and amd64 boot build options, >> which should we pick? > > Well, do we still officially support any real i386 machines? If so, we > should still use -march=i386 for the boot code. Otherwise, let's start > using -march=i486 explicitly. So like: Thank you for the patch! Here is a slightly larger one (including some commented out changes in userboot): http://people.freebsd.org/~avg/boot-march%3di386.diff > Index: sys/boot/i386/Makefile.inc > =================================================================== > --- sys/boot/i386/Makefile.inc (revision 241194) > +++ sys/boot/i386/Makefile.inc (working copy) > @@ -5,12 +5,13 @@ > BINDIR?= /boot > > LOADER_ADDRESS?=0x200000 > -CFLAGS+= -ffreestanding -mpreferred-stack-boundary=2 \ > +CFLAGS+= -march=i486 -ffreestanding -mpreferred-stack-boundary=2 \ > -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float > +NO_CPU_CFLAGS= > LDFLAGS+= -nostdlib > > .if ${MACHINE_CPUARCH} == "amd64" > -CFLAGS+= -m32 -march=i386 > +CFLAGS+= -m32 > ACFLAGS+= -m32 > LDFLAGS+= -m elf_i386_fbsd > AFLAGS+= --32 -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?507A8BAE.5060304>