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".

2024-07-18  René Rebe  <rene@exactcode.de>
	    Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR target/97367
	* config/rs6000/rs6000.cc (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-off-by: René Rebe <rene@exactcode.de>
This commit is contained in:
René Rebe 2024-07-12 21:17:08 +00:00 committed by Peter Bergner
parent c19237614b
commit 6962835bca
2 changed files with 17 additions and 1 deletions

View File

@ -5896,7 +5896,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";
@ -5921,6 +5922,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

View File

@ -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 {\.machine power4\M} } } */
/* { dg-final { scan-assembler {\.machine altivec\M} } } */