On Fri, Nov 8, 2024 at 6:52 AM Hongtao Liu <crazy...@gmail.com> wrote:

> > > >         PR target/117418
> > > >         * config/i386/i386-options.cc (ix86_option_override_internal): 
> > > > raise an
> > > >         error with option -mx32 -maddress-mode=long.
> > > >
> > > > gcc/testsuite/ChangeLog:
> > > >
> > > >         PR target/117418
> > > >         * gcc.target/i386/pr117418-1.c: New test.
> > > > ---
> > > >  gcc/config/i386/i386-options.cc            |  4 ++++
> > > >  gcc/testsuite/gcc.target/i386/pr117418-1.c | 13 +++++++++++++
> > > >  2 files changed, 17 insertions(+)
> > > >  create mode 100644 gcc/testsuite/gcc.target/i386/pr117418-1.c
> > > >
> > > > diff --git a/gcc/config/i386/i386-options.cc 
> > > > b/gcc/config/i386/i386-options.cc
> > > > index 239269ecbdd..ba1abea2537 100644
> > > > --- a/gcc/config/i386/i386-options.cc
> > > > +++ b/gcc/config/i386/i386-options.cc
> > > > @@ -2190,6 +2190,10 @@ ix86_option_override_internal (bool main_args_p,
> > > >         error ("address mode %qs not supported in the %s bit mode",
> > > >                TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "short" : 
> > > > "long",
> > > >                TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "64" : "32");
> > > > +
> > > > +      if (TARGET_X32_P (opts->x_ix86_isa_flags)
> > > > +         && opts_set->x_ix86_pmode == PMODE_DI)
> > > > +       error ("address mode 'long' not supported in the x32 ABI");
> > >
> > > This looks wrong.   Try the encoded patch.
> > >
> > So it means -maddress-mode=long will override x32 to use 64-bit pointer?
> No, answered by myself.
> The upper 32-bit is zero, so it's still 32-bit memory space although
> it uses a 64-bit register as a pointer.
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82267

Yes, ptr_mode and Pmode are two different things. ptr_mode is ABI
mandated pointer mode, while Pmode is an implementation detail. As
most of the targets, x32 used Pmode == ptr_mode, but as evident from
the quoted PR, it resulted in many 0x67 prefixes due to address size
overrides to handle SImode ptr_mode ABI requirements.

-maddress-mode=long was added just for x32 to mitigate this problem.
It was beneficial for some applications, thus the request to make it
the default, but it remained as it is.

Because this option is not the default one, it has (some) tendency to
bitrot, when some new committed code assumes ptr_mode == Pmode. IIRC,
HJ had a tester that exercised -maddress-mode=long for -mx32 to hunt
middle-end and back-end issues with ptr_mode != Pmode.

Uros.

Reply via email to