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?
> -# 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.
> 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.
> +# 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.
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 don't understand why we test both pli and pld.
> +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?
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?
> +# 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?
Segher