On Fri, Nov 22, 2019 at 08:11:16PM -0600, Segher Boessenkool wrote:
> On Thu, Nov 14, 2019 at 05:56:50PM -0500, Michael Meissner wrote:
> >     * lib/target-supports.exp
> >     (check_effective_target_powerpc_future_ok): Do not require 64-bit
> >     or Linux support before doing the test.  Use a 32-bit constant in
> >     PLI.
> 
> You changed from 0x12345 to 0x1234, instead -- why?

The last time I did the patch there was discussion about 32-bit support.  I
just rewrote the patch to accomidate possibly using -mcpu=future on a 32-bit
platform.  In particular, AIX.  So I rewrote the basic test so that in theory
it would run on a 32-bit platform.

> > -# Return 1 if this is a PowerPC target supporting -mfuture.
> > -# Limit this to 64-bit linux systems for now until other
> > -# targets support FUTURE.
> > +# Return 1 if this is a PowerPC target supporting -mcpu=future.
> 
> "Return 1 if the assembler supports Future instructions."
> 
> Please make it explicit that this isn't about the compiler.

Ok.

> >  proc check_effective_target_powerpc_future_ok { } {
> > -    if { ([istarget powerpc64*-*-linux*]) } {
> > +    if { ([istarget powerpc*-*-*]) } {
> >     return [check_no_compiler_messages powerpc_future_ok object {
> >         int main (void) {
> >             long e;
> > -           asm ("pli %0,%1" : "=r" (e) : "n" (0x12345));
> > +           asm ("pli %0,%1" : "=r" (e) : "n" (0x1234));
> >             return e;
> >         }
> >     } "-mfuture"]
> 
> You are still passing -mfuture.

All of the tests use the -m<flag> test and not -mcpu=<cpu> test
(i.e. -mpower9-vector instead of -mcpu=power9 or -mdejagnu-cpu=power9), so I
was being consistant with those tests.

> > +# Return 1 if this is a PowerPC target supporting -mcpu=future.  The 
> > compiler
> > +# must support large numeric prefixed addresses by default when -mfuture is
> > +# used.  We test loading up a large constant to verify that the full 34-bit
> > +# offset for prefixed instructions is supported and we check for a prefixed
> > +# load as well.
> 
> The comment says one thing.
> 
> -mfuture isn't a compiler option...  Well it still is, but that should
> be removed.

Again, I was just being consistant with the other tests.

> The actual test uses only 30 bits (and a positive number).  Which is fine,
> but the comment is misleading then: the code doesn't test "if the full
> 34-bit offset is supported".

I can fix the comment.

> I don't understand why we test both pli and pld.

Just being cautious.

> > +proc check_effective_target_powerpc_prefixed_addr_ok { } {
> 
> The name says another.
> 
> > +    if { ([istarget powerpc*-*-*]) } {
> 
> This part has no function?  Are there any testcases that test for our
> prefixed insns that are compiler for non-powerpc?

Probably not, but all of the other tests have the same prefix.

> If we want this at all, this test shouldn't be nested, just should be
> an early-out.
> 
> > +   return [check_no_compiler_messages powerpc_prefixed_addr_ok object {
> > +       int main (void) {
> > +           extern long l[];
> > +           long e, e2;
> > +           asm ("pli %0,%1" : "=r" (e) : "n" (0x12345678));
> > +           asm ("pld %0,0x12345678(%1)" : "=r" (e2) : "r" (& l[0]));
> 
> (should be "b" for the last constraint; and "&l[0]" is usually written
> just "l").
> 
> > +           return e - e2;
> > +       }
> > +   } "-mfuture"]
> 
> And the code tests two things.
> 
> -mcpu=future, instead?
>
> Does this need to be separate from check_effective_target_powerpc_future_ok
> at all?

This gets back to whether some port will eventually want to use FUTURE
instructions in a 32-bit context.  Linux will always be 64-bit little endian,
but there are other platforms out there that may want to generate FUTURE code.

> > +# Return 1 if this is a PowerPC target supporting -mfuture.  The compiler 
> > must
> 
> That is the third selector claiming to test the same thing ("target supports
> -mfuture").
> 
> > +# support PC-relative addressing when -mcpu=future is used to pass this 
> > test.
> > +
> > +proc check_effective_target_powerpc_pcrel_ok { } {
> > +    if { ([istarget powerpc*-*-*]) } {
> > +   return [check_no_compiler_messages powerpc_pcrel_ok object {
> > +         int main (void) {
> > +             static int s __attribute__((__used__));
> > +             int e;
> > +             asm ("plwa %0,s@pcrel(0),1" : "=r" (e));
> > +             return e;
> > +         }
> > +     } "-mfuture"]
> > +      } else {
> > +     return 0
> > +      }
> > +}
> 
> So every assembler will support either all three of these, or none.
> Can you simplify this please?

I can imagine for example AIX might support 64-bit 'future' but not support
PC-relative.  I believe you (or David) asked to split up the prefixed
addressing with numeric offets and PC-relative addressing, because ports might
not be able to support PC-relative addressing.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to