Hi Peter, on 2024/7/13 05:48, Peter Bergner wrote: > René's patch seems to have stalled, so here is an updated version of the > patch with the requested changes to his patch. > > I'll note I have added an additional code change, which is to also emit a > ".machine altivec" if Altivec is enabled. The problem this fixes is for > cpus like the G5, which is basically a power4 plus an Altivec unit, its > ".machine power4" doesn't enable the assembler to recognize Altivec insns. > That isn't a problem if you use gcc -mcpu=G5 to assemble the assembler file, > since gcc passes -maltivec to the assembler. However, if you try to assemble > the assembler file with as by hand, you'll get "unrecognized opcode" errors. > I did not do the same for VSX, since all ".machine <cpu>" for cpus that > support VSX already enable VSX insn recognition, so it's not needed.
Sounds great, thanks for improving it. > > > rs6000: Fix .machine cpu selection w/ altivec [PR97367] > > There are various non-IBM CPUs with altivec, so we cannot use that > flag to determine which .machine cpu to use, so ignore it. > Emit an additional ".machine altivec" if Altivec is enabled so > that the assembler doesn't require an explicit -maltivec option > to assemble any Altivec instructions for those targets where > the ".machine cpu" is insufficient to enable Altivec. For example, > -mcpu=G5 emits a ".machine power4". > > This passed bootstrap and regtesting on powrpc64-linux (running the testsuite > in both 32-bit and 64-bit modes) with no regressions. > > Ok for trunk and the release branches after some trunk burn-in time? OK for all with/without the below minor nit tweaked. > > Peter > > > 2024-07-12 René Rebe <r...@exactcode.de> > Peter Bergner <berg...@linux.ibm.com> > > gcc/ > PR target/97367 > * config/rs6000/rs6000.c (rs6000_machine_from_flags): Do not consider > OPTION_MASK_ALTIVEC. > (emit_asm_machine): For Altivec compiles, emit a ".machine altivec". > > gcc/testsuite/ > PR target/97367 > * gcc.target/powerpc/pr97367.c: New test. > > Signed-of-by: René Rebe <r...@exactcode.de> > --- > gcc/config/rs6000/rs6000.cc | 5 ++++- > gcc/testsuite/gcc.target/powerpc/pr97367.c | 13 +++++++++++++ > 2 files changed, 17 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.target/powerpc/pr97367.c > > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index 2cbea6ea2d7..2cb8f35739b 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -5888,7 +5888,8 @@ rs6000_machine_from_flags (void) > HOST_WIDE_INT flags = rs6000_isa_flags; > > /* Disable the flags that should never influence the .machine selection. > */ > - flags &= ~(OPTION_MASK_PPC_GFXOPT | OPTION_MASK_PPC_GPOPT | > OPTION_MASK_ISEL); > + flags &= ~(OPTION_MASK_PPC_GFXOPT | OPTION_MASK_PPC_GPOPT | > OPTION_MASK_ISEL > + | OPTION_MASK_ALTIVEC); > > if ((flags & (ISA_3_1_MASKS_SERVER & ~ISA_3_0_MASKS_SERVER)) != 0) > return "power10"; > @@ -5913,6 +5914,8 @@ void > emit_asm_machine (void) > { > fprintf (asm_out_file, "\t.machine %s\n", rs6000_machine); > + if (TARGET_ALTIVEC) > + fprintf (asm_out_file, "\t.machine altivec\n"); > } > #endif > > diff --git a/gcc/testsuite/gcc.target/powerpc/pr97367.c > b/gcc/testsuite/gcc.target/powerpc/pr97367.c > new file mode 100644 > index 00000000000..f9118dbcdec > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr97367.c > @@ -0,0 +1,13 @@ > +/* PR target/97367 */ > +/* { dg-options "-mdejagnu-cpu=G5" } */ > + > +/* Verify we emit a ".machine power4" and ".machine altivec" rather > + than a ".machine power7". */ > + > +int dummy (void) > +{ > + return 0; > +} > + > +/* { dg-final { scan-assembler {\.\mmachine power4\M} } } */ > +/* { dg-final { scan-assembler {\.\mmachine altivec\M} } } */ Nit: Both \m looks useless and can be removed. BR, Kewen