Hi!

On Thu, Jun 04, 2020 at 11:43:53PM +0200, Daniel Kolesa wrote:
> The thing is, I've yet to see in which way the ELFv2 ABI *actually* requires 
> VSX - I don't think compiling for 970 introduces any actual differences. 
> There will be omissions, yes - but then the more accurate thing would be to 
> say that a subset of ELFv2 is used, rather than it being a different ABI per 
> se.

Two big things are that binaries that someone else made are supposed to
work for you as well -- including binaries using VSX registers, or any
instructions that require ISA 2.07 (or some older ISA after 970).  This
includes DSOs (shared libraries).  So for a distribution this means that
they will not use VSX *anywhere*, or only in very specialised things.
That is a many-years setback, for people/situations where it could be
used.

> The ELFv2 document specifies things like passing of quadruple precision 
> floats. Indeed, VSX is needed there, but that's not a concern if you *don't* 
> use quadruple precision floats.

As Joseph says, QP float is passed in the VRs, so that works just fine
*if* you have AltiVec.  If not, you probably should pass such values in
the GPRs, or however a struct of 16 bytes is passed in whatever ABI you
use (this is a much more general problem than just BE ELFv2 ;-) )  And
then you have some kind of "partial soft float".  Fun!  (Or not...)

> > If you always use -mcpu=970 (or similar), then not very much is
> > different for you most likely -- except of course there is no promise
> > to the user that they can use VSX and all instructions in ISA 2.07,
> > which is a very useful promise to have normally.
> 
> Yes, -mcpu=970 is used for default packages. *However*, it is possible that 
> the user compiles their own packages with -mcpu=power9 or something similar, 
> and then it'll be possible to utilize VSX and all, and it should still work 
> with the existing userland. When speaking of ABI, what matters is... well, 
> the binary interface, which is the same - so I believe this is still ELFv2. A 
> subset is always compliant with the whole.

The same calling convention will probably work, yes.  An ABI is more
than that though.


> > Btw, if you use GCC, *please* send in testresults?  :-)
> 
> Yes, it's all gcc (we do have clang, but compiling repo packages with clang 
> is generally frowned upon in the project, as we have vast majority of 
> packages cross-compilable, and our cross-compiling infrastructure is 
> gcc-centric, plus we enable certain things by default such as hardening flags 
> that clang does not support). I'll try to remember next time I'm running 
> tests.

Thanks in advance!

> I have a feeling that glibc would object to such port, since it means it 
> would have to exist in parallel with a potential different ELFv2 port that 
> does have a POWER8 minimal requirement; gcc would need a way to tell them 
> apart, too (based on what would they be told apart? the simplest way would 
> probably be something like, if --with-abi=elfv2 { if --with-cpu < power8 -> 
> use glibc-novsx else use glibc-vsx } ...)

The target name allows to make such distinctions: this could for example
be  powerpc64-*-linux-void  (maybe I put the distinction in the wrong
part of the name here?  The glibc people will know better, and "void" is
probably not a great name anyway).


Segher

Reply via email to