Subject: Re: I want to rid ugly float load/stores used only for data movement
To: None <tech-toolchain@netbsd.org, port-powerpc@netbsd.org>
From: M L Riechers Mlr <mlr@sun.rse.com>
List: tech-toolchain
Date: 02/23/2003 00:15:32
On Sun, 23 Feb 2003 13:19:06 +1100 Simon Burge
<simonb@wasabisystems.com> asked:

> [ Dropping port-macppc for this reply ]
> 
> On Sat, Feb 22, 2003 at 05:16:25PM -0500, M L Riechers wrote:
> 
> > Until the "soft-float" options work altogether properly for powerpc,
> > which, it looks like at the very least waiting for gcc-3.3, I've
> > adapted the floating point kernel emulation routines from Walnut.  It
> > more or less works (shot 1 bug, diddled another, and at least 1 more
> > identified but not located), but it's molasses slow. Ok, I understand
> > that trips to the kernel are expensive.
> 
> I'm curious about this bit more than the generic gcc+FP issues.  I'm
> using a "MKSOFTFLOAT=yes" built world on my walnut and haven't noticed
> anything wrong in day-to-day usage.  Could you please give some details
> on what bugs you've seen (and the fixes you have!), and also describe
> ``Until the "soft-float" options work altogether properly for powerpc''?

Yes, certainly, and thank you for your interest.

I used the term "work altogether properly for powerpc" with a bit of
trepidition.  Actually, it works well, almost all of the time.
However, there are some key failure points, at least with the 1.5v
version I started with.

I built the first mpc860 from the Tsubai Masanari/David
Querbach/Arne(arne@die-jansens.de) development line in August 2001,
and changed and added to it.  (I have a Netbsd macppc 7500 that I use
for development, and for this early work I gave the mpc860 its own
disc network mounted from the 7500.  To compile I chroot the 7500 to
the mpc860 disc and compile away.) The build was NetBSD current 1.5v,
and used soft_float universally, and for the most part worked.
However, when run from the mpc860 ld would core-dump, although gcc
seemed to run ok, rwhod would core-dump by (probably recursively)
overflowing the stack, and awk failed unless statically linked.  There
were other failures that I didn't track.  At the time I chalked it all
up to some failure passing float values in GP regs.  But I no longer
think that it was that simple.

Also, Perl would not compile, because of other failures.

Progressing on, in June-July-August I attempted to upgrade to NetBSD
release 1.6 -- both the 7500 and the mbx together.  The Mac went fine,
but the mbx (attempting to build the world with SOFT_FLOAT) did not.
The 1.6 build system forced a situation that both gcc and the float
libraries attempted to provide, for example, the "__divsf3" support
routine, and I couldn't figure out how to make the one or the other
win.  If you're interested, check my post to tech-toolchain 08/10/2002
02:47:54 "using _SOFT_FLOAT and MKSOFTFLOAT=yes with build.sh".  It
gives a bit more history and background.

Getting no response to my post, I decided to leave the perplexities of
soft-float for the time being, and import the Walnut emulator.  After
that, everything seemed to work fine, only much more slowly.

Except, there were, bugs:

1.  There was a mistake in the 1.6 libc bzero.S routine using the
    cache for 128-bit cache line machines.  There is also at least one
    other error in bzero that I've yet to identify.  I simply
    commented out all of the cache stuff.

2.  There is a grizzly error in the powerpc mmmmap in mem.c: should be
    returning "atop(off)" instead of "off" (right? or is this just a
    side effect of mine? Need time to analize.)

3.  The dbtst (don't kick me if that instruction isn't right -- I'm
    seat-of-pants here) in ld_elf.so caused a bizarre dsi exception.

4.  The float emulator didn't handle single precision float loads
    properly. 

5.  The float emulator corrupted the CR register because of a (int)
    type that should be (u_int) (negative bit propagation problem).

There are some other bugs I half-remember I found.  There is another
bug in the FP emulation I haven't found.  I promise, as soon as
someone doesn't have a gun to my head to finish this project, I'll
hunt down and file PR's with fixes on all of these bugs.  But I gotta
get my customers off my back.

Now from here, I added PCI support, Keyboard, mouse, IDE support, a
crt driver, X windows using a Chips (Asiliant) 69000, support for the
4 scc ports, and whipped the pmap into reasonable shape.  The kernel
uses Instruction Caching, and limited Data Caching, but userland is
still uncached. Touchscreen is next.

It's the X windows server and clients that seem to tip the bugs.

It takes 3 or 4 minutes (instead of 3 or 4 seconds) to load the X
server.  The majority of that time seems to be the float load/store
thing, although X tends to use floating point a good deal more than
your average program.


 
> >From a toolchain POV, the biggest problem is no way of identifying
> soft-float objects from hard-float objects.  This pretty much
> means that I've had to be careful with package builds, but keeping
> "MKSOFTFLOAT=yes" in /etc/mk.conf helps....

Yes.  That's why, up to this point, I've resisted mixing systems,
sticking entirely to all soft-float or emulation.  But selectively
I've compiled programs -static under 1.6v soft-float environment and
installed them in the 1.6 emulation world.  I did this to top.  It
runs fine, uses only 2% of available resources (vs the top with
emuated FP instructions), but, of course, doesn't have the new top's
info concerning 1.6.  Interestingly, I have a dynamic bash shell left
over from 1.5v, soft-float, and it too runs well.  It links with older
libraries which are compatible.  A left-over emacs, however, didn't
work worth a hoot.  That sort of things' a crap-shoot.

I believe that the mpc823/mpc860 and probably the ibm 405 _world_
ought to be built SOFT-FLOAT, but I lack the confidence to bet the
farm on it at the crunch.  I would love to build the X server, and
some clients, SOFT-FLOAT, (-static would be ok), but, short of a total
system build, I don't know how.  I'm gun-shy at the moment, preferring
the devil I know to the one I don't.  I think there might be compiler
problems with 2.92 (NetBSD 1.5v), and 2.95, and possibly some work
with the soft-float libraries; however, Jason says that gcc 3.2
doesn't work for powerpc, but 3.3 should.  That's March 1, if all goes
well, and I'm running out of time.

But having said that, I would gratefully appreciate any tips you could
pass on for me to successfully build SOFT-FLOAT programs outside of
the way I'm doing it now.  Please understand I'm a relative newbe at
that sort of thing.

> ...This is something I keep
> meaning to look at one day, but still haven't gotten around to.
> The fact that there appears to be no powerpc elf supplement owner
> didn't help :-(
> 
> Simon.
> --
> Simon Burge                                   <simonb@wasabisystems.com>
> NetBSD Development, Support and Service:   http://www.wasabisystems.com/

Puzzlement here.  I'm aware of the powerpc elf EABI, but I don't know
what a powerpc elf supplement owner is.

Anyway, I hope this rambling discourse has answered some of your
questions.  Please feel free to inquire further if you feel so moved.

Yours,

-Mike