Re: [PATCH v3] x86: Don't enable UINTR in 32-bit mode

2021-07-13 Thread Uros Bizjak via Gcc-patches
On Tue, Jul 13, 2021 at 8:59 PM Jakub Jelinek  wrote:
>
> On Tue, Jul 13, 2021 at 09:35:18AM -0700, H.J. Lu wrote:
> > Here is the v3 patch.   OK for master?
>
> From my POV LGTM, but please give Uros a chance to chime in.
>
> > From ceab81ef97ab102c410830c41ba7fea911170d1a Mon Sep 17 00:00:00 2001
> > From: "H.J. Lu" 
> > Date: Fri, 9 Jul 2021 09:16:01 -0700
> > Subject: [PATCH v3] x86: Don't enable UINTR in 32-bit mode
> >
> > UINTR is available only in 64-bit mode.  Since the codegen target is
> > unknown when the the gcc driver is processing -march=native, to properly
> > handle UINTR for -march=native:
> >
> > 1. Pass "arch [32|64]" and "tune [32|64]" to host_detect_local_cpu to
> > indicate 32-bit and 64-bit codegen.
> > 2. Change ix86_option_override_internal to enable UINTR only in 64-bit
> > mode for -march=CPU when PTA_CPU includes PTA_UINTR.
> >
> > gcc/
> >
> >   PR target/101395
> >   * config/i386/driver-i386.c (host_detect_local_cpu): Check
> >   "arch [32|64]" and "tune [32|64]" for 32-bit and 64-bit codegen.
> >   Enable UINTR only for 64-bit codegen.
> >   * config/i386/i386-options.c
> >   (ix86_option_override_internal::DEF_PTA): Skip PTA_UINTR if not
> >   in 64-bit mode.
> >   * config/i386/i386.h (ARCH_ARG): New.
> >   (CC1_CPU_SPEC): Pass "[arch|tune] 32" for 32-bit codegen and
> >   "[arch|tune] 64" for 64-bit codegen.
> >
> > gcc/testsuite/
> >
> >   PR target/101395
> >   * gcc.target/i386/pr101395-1.c: New test.
> >   * gcc.target/i386/pr101395-2.c: Likewise.
> >   * gcc.target/i386/pr101395-3.c: Likewise.

OK.

Thanks,
Uros.


Re: [PATCH v3] x86: Don't enable UINTR in 32-bit mode

2021-07-13 Thread Jakub Jelinek via Gcc-patches
On Tue, Jul 13, 2021 at 09:35:18AM -0700, H.J. Lu wrote:
> Here is the v3 patch.   OK for master?

>From my POV LGTM, but please give Uros a chance to chime in.

> From ceab81ef97ab102c410830c41ba7fea911170d1a Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" 
> Date: Fri, 9 Jul 2021 09:16:01 -0700
> Subject: [PATCH v3] x86: Don't enable UINTR in 32-bit mode
> 
> UINTR is available only in 64-bit mode.  Since the codegen target is
> unknown when the the gcc driver is processing -march=native, to properly
> handle UINTR for -march=native:
> 
> 1. Pass "arch [32|64]" and "tune [32|64]" to host_detect_local_cpu to
> indicate 32-bit and 64-bit codegen.
> 2. Change ix86_option_override_internal to enable UINTR only in 64-bit
> mode for -march=CPU when PTA_CPU includes PTA_UINTR.
> 
> gcc/
> 
>   PR target/101395
>   * config/i386/driver-i386.c (host_detect_local_cpu): Check
>   "arch [32|64]" and "tune [32|64]" for 32-bit and 64-bit codegen.
>   Enable UINTR only for 64-bit codegen.
>   * config/i386/i386-options.c
>   (ix86_option_override_internal::DEF_PTA): Skip PTA_UINTR if not
>   in 64-bit mode.
>   * config/i386/i386.h (ARCH_ARG): New.
>   (CC1_CPU_SPEC): Pass "[arch|tune] 32" for 32-bit codegen and
>   "[arch|tune] 64" for 64-bit codegen.
> 
> gcc/testsuite/
> 
>   PR target/101395
>   * gcc.target/i386/pr101395-1.c: New test.
>   * gcc.target/i386/pr101395-2.c: Likewise.
>   * gcc.target/i386/pr101395-3.c: Likewise.

Jakub



[PATCH v3] x86: Don't enable UINTR in 32-bit mode

2021-07-13 Thread H.J. Lu via Gcc-patches
On Mon, Jul 12, 2021 at 11:56 PM Jakub Jelinek  wrote:
>
> On Mon, Jul 12, 2021 at 06:51:30PM -0700, H.J. Lu wrote:
> > @@ -404,9 +404,18 @@ const char *host_detect_local_cpu (int argc, const 
> > char **argv)
> >if (argc < 1)
> >  return NULL;
>
> I think it would be simpler to use 2 arguments instead of one.
> So change the above to if (argc < 2)

Fixed.

> >
> > -  arch = !strcmp (argv[0], "arch");
> > +  arch = !strncmp (argv[0], "arch", 4);
> >
> > -  if (!arch && strcmp (argv[0], "tune"))
> > +  if (!arch && strncmp (argv[0], "tune", 4))
> > +return NULL;
>
> Keep strcmp as is here.

Fixed.

> > +
> > +  bool codegen_x86_64;
> > +
> > +  if (!strcmp (argv[0] + 4, "32"))
> > +codegen_x86_64 = false;
> > +  else if (!strcmp (argv[0] + 4, "64"))
> > +codegen_x86_64 = true;
> > +  else
> >  return NULL;
>
> Check argv[1] here instead.

Fixed.

> > @@ -813,7 +826,8 @@ const char *host_detect_local_cpu (int argc, const char 
> > **argv)
> >  }
> >
> >  done:
> > -  return concat (cache, "-m", argv[0], "=", cpu, options, NULL);
> > +  const char *moption = arch ? "-march=" : "-mtune=";
> > +  return concat (cache, moption, cpu, options, NULL);
> >  }
> >  #else
>
> You don't need this change.

Fixed.

> > diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
> > index 7a35c468da3..7cba655595e 100644
> > --- a/gcc/config/i386/i386-options.c
> > +++ b/gcc/config/i386/i386-options.c
> > @@ -2109,6 +2109,7 @@ ix86_option_override_internal (bool main_args_p,
> >  #define DEF_PTA(NAME) \
> >   if (((processor_alias_table[i].flags & PTA_ ## NAME) != 0) \
> >   && PTA_ ## NAME != PTA_64BIT \
> > + && (TARGET_64BIT || PTA_ ## NAME != PTA_UINTR) \
> >   && !TARGET_EXPLICIT_ ## NAME ## _P (opts)) \
> > SET_TARGET_ ## NAME (opts);
> >  #include "i386-isa.def"
> > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> > index 8c3eace56da..ae9f455c48d 100644
> > --- a/gcc/config/i386/i386.h
> > +++ b/gcc/config/i386/i386.h
> > @@ -577,9 +577,12 @@ extern const char *host_detect_local_cpu (int argc, 
> > const char **argv);
> >  #define CC1_CPU_SPEC CC1_CPU_SPEC_1
> >  #else
> >  #define CC1_CPU_SPEC CC1_CPU_SPEC_1 \
> > -"%{march=native:%>march=native %:local_cpu_detect(arch) \
> > -  %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} \
> > -%{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
> > +"%{" OPT_ARCH32 ":%{march=native:%>march=native %:local_cpu_detect(arch32) 
> > \
> > +   %{!mtune=*:%>mtune=native %:local_cpu_detect(tune32)}}}" \
> > +"%{" OPT_ARCH32 ":%{mtune=native:%>mtune=native 
> > %:local_cpu_detect(tune32)}}" \
> > +"%{" OPT_ARCH64 ":%{march=native:%>march=native %:local_cpu_detect(arch64) 
> > \
> > +   %{!mtune=*:%>mtune=native %:local_cpu_detect(tune64)}}}" \
> > +"%{" OPT_ARCH64 ":%{mtune=native:%>mtune=native 
> > %:local_cpu_detect(tune64)}}"
>
> And you can use
> #define ARCH_ARG "%{" OPT_ARCH64 ":64;32}"

I added

#define ARCH_ARG "%{" OPT_ARCH64 ":64;:32}"

> %:local_cpu_detect(arch, " ARCH_ARG ")
> etc.
>
> Jakub
>

Here is the v3 patch.   OK for master?

Thanks.

-- 
H.J.
From ceab81ef97ab102c410830c41ba7fea911170d1a Mon Sep 17 00:00:00 2001
From: "H.J. Lu" 
Date: Fri, 9 Jul 2021 09:16:01 -0700
Subject: [PATCH v3] x86: Don't enable UINTR in 32-bit mode

UINTR is available only in 64-bit mode.  Since the codegen target is
unknown when the the gcc driver is processing -march=native, to properly
handle UINTR for -march=native:

1. Pass "arch [32|64]" and "tune [32|64]" to host_detect_local_cpu to
indicate 32-bit and 64-bit codegen.
2. Change ix86_option_override_internal to enable UINTR only in 64-bit
mode for -march=CPU when PTA_CPU includes PTA_UINTR.

gcc/

	PR target/101395
	* config/i386/driver-i386.c (host_detect_local_cpu): Check
	"arch [32|64]" and "tune [32|64]" for 32-bit and 64-bit codegen.
	Enable UINTR only for 64-bit codegen.
	* config/i386/i386-options.c
	(ix86_option_override_internal::DEF_PTA): Skip PTA_UINTR if not
	in 64-bit mode.
	* config/i386/i386.h (ARCH_ARG): New.
	(CC1_CPU_SPEC): Pass "[arch|tune] 32" for 32-bit codege