diff mbox

RFC: PATCH: Add -maddress-mode=short|long for x86

Message ID 20120312174806.GA22970@intel.com
State New
Headers show

Commit Message

H.J. Lu March 12, 2012, 5:48 p.m. UTC
Hi,

Trunk can now use SImode or DImode for Pmode with -mx32.  Pmode == SImode
will avoid many conversions from SImode to DImode:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50797

It will use 0x67 address size prefix instead.  This patch adds a new
command line option, -maddress-mode=short|long, for x86.  Any comments?

Thanks.


H.J.
----
2012-03-12  H.J. Lu  <hongjiu.lu@intel.com>

	* config/i386/i386-opts.h (pmode): New.

	* config/i386/i386.c (ix86_option_override_internal): Properly
	check and set ix86_pmode.

	* config/i386/i386.h (Pmode): Check ix86_pmode instead of
	TARGET_64BIT.

	* config/i386/i386.opt (maddress-mode=): New.

	* doc/invoke.texi: Document -maddress-mode=short|long for x86.

Comments

Uros Bizjak March 14, 2012, 7:07 p.m. UTC | #1
On Mon, Mar 12, 2012 at 6:48 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:

> Trunk can now use SImode or DImode for Pmode with -mx32.  Pmode == SImode
> will avoid many conversions from SImode to DImode:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50797
>
> It will use 0x67 address size prefix instead.  This patch adds a new
> command line option, -maddress-mode=short|long, for x86.  Any comments?

I think this is good option, I as a developer will be able to
benchmark different approaches for new target with this flag.

> 2012-03-12  H.J. Lu  <hongjiu.lu@intel.com>
>
>        * config/i386/i386-opts.h (pmode): New.
>
>        * config/i386/i386.c (ix86_option_override_internal): Properly
>        check and set ix86_pmode.
>
>        * config/i386/i386.h (Pmode): Check ix86_pmode instead of
>        TARGET_64BIT.
>
>        * config/i386/i386.opt (maddress-mode=): New.
>
>        * doc/invoke.texi: Document -maddress-mode=short|long for x86.

Please refer to PR target/50797 in the ChangeLog.

The patch is technically OK for mainline, Joseph - can you please
review option stuff?

I have also added Gerald to CC, to check if everything is OK with
added documentation.

Thanks,
Uros.
Joseph Myers March 14, 2012, 8:13 p.m. UTC | #2
On Wed, 14 Mar 2012, Uros Bizjak wrote:

> The patch is technically OK for mainline, Joseph - can you please
> review option stuff?

The option changes look fine to me.
Gerald Pfeifer March 14, 2012, 9:57 p.m. UTC | #3
On Wed, 14 Mar 2012, Uros Bizjak wrote:
> I have also added Gerald to CC, to check if everything is OK with
> added documentation.

Joseph is better with that than I am, but I'll give it a try. :-)

+@item -maddress-mode=long
+@opindex maddress-mode=long
+Generate code for long address mode.  It is only supported for 64-bit
+and x32 environments.  This is the default address mode for 64-bit
+environment.

I cannot formally explain why, but would swap "It" and "This" in
this paragraph and the other.

In any case "64-bit environments" (Plural).

Fine with these changes.


Apart from the above, at least invoke.texi does not define what an x32 
environment is.  Shouldn't that done somewhere (before this terminology
is used)?

Gerald
diff mbox

Patch

diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h
index 3cc2253..eea85fd 100644
--- a/gcc/config/i386/i386-opts.h
+++ b/gcc/config/i386/i386-opts.h
@@ -71,6 +71,11 @@  enum cmodel {
   CM_LARGE_PIC	/* No assumptions.  */
 };
 
+enum pmode {
+  PMODE_SI,	/* Pmode == SImode. */
+  PMODE_DI 	/* Pmode == DImode. */
+};
+
 enum asm_dialect {
   ASM_ATT,
   ASM_INTEL
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index dbcf5a9..8d9c801 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3172,6 +3172,17 @@  ix86_option_override_internal (bool main_args_p)
   else
     ix86_arch_specified = 1;
 
+  if (global_options_set.x_ix86_pmode)
+    {
+      if ((TARGET_LP64 && ix86_pmode == PMODE_SI)
+	   || (!TARGET_64BIT && ix86_pmode == PMODE_DI))
+	error ("address mode %qs not supported in the %s bit mode",
+	       TARGET_64BIT ? "short" : "long",
+	       TARGET_64BIT ? "64" : "32");
+    }
+  else
+    ix86_pmode = TARGET_LP64 ? PMODE_DI : PMODE_SI;
+
   if (!global_options_set.x_ix86_abi)
     ix86_abi = DEFAULT_ABI;
 
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index c77070b..3fcd209 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1745,7 +1745,7 @@  do {							\
 /* Specify the machine mode that pointers have.
    After generation of rtl, the compiler makes no further distinction
    between pointers and any other objects of this machine mode.  */
-#define Pmode (TARGET_64BIT ? DImode : SImode)
+#define Pmode (ix86_pmode == PMODE_DI ? DImode : SImode)
 
 /* A C expression whose value is zero if pointers that need to be extended
    from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 1d8dc44..29f1082 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -159,6 +159,20 @@  Enum(cmodel) String(32) Value(CM_32)
 EnumValue
 Enum(cmodel) String(kernel) Value(CM_KERNEL)
 
+maddress-mode=
+Target RejectNegative Joined Enum(pmode) Var(ix86_pmode) Init(PMODE_SI)
+Use given address mode
+
+Enum
+Name(pmode) Type(enum pmode)
+Known address mode (for use with the -maddress-mode= option):
+
+EnumValue
+Enum(pmode) String(short) Value(PMODE_SI)
+
+EnumValue
+Enum(pmode) String(long) Value(PMODE_DI)
+
 mcpu=
 Target RejectNegative Joined Undocumented Alias(mtune=) Warn(%<-mcpu=%> is deprecated; use %<-mtune=%> or %<-march=%> instead)
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 5f5397b..e9188db 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -634,7 +634,7 @@  Objective-C and Objective-C++ Dialects}.
 -mveclibabi=@var{type} -mvect8-ret-in-mem @gol
 -mpc32 -mpc64 -mpc80 -mstackrealign @gol
 -momit-leaf-frame-pointer  -mno-red-zone -mno-tls-direct-seg-refs @gol
--mcmodel=@var{code-model} -mabi=@var{name} @gol
+-mcmodel=@var{code-model} -mabi=@var{name} -maddress-mode=@var{mode} @gol
 -m32 -m64 -mx32 -mlarge-data-threshold=@var{num} @gol
 -msse2avx -mfentry -m8bit-idiv @gol
 -mavx256-split-unaligned-load -mavx256-split-unaligned-store}
@@ -13938,6 +13938,18 @@  be statically or dynamically linked.
 @opindex mcmodel=large
 Generate code for the large model.  This model makes no assumptions
 about addresses and sizes of sections.
+
+@item -maddress-mode=long
+@opindex maddress-mode=long
+Generate code for long address mode.  It is only supported for 64-bit
+and x32 environments.  This is the default address mode for 64-bit
+environment.
+
+@item -maddress-mode=short
+@opindex maddress-mode=short
+Generate code for short address mode.  It is only supported for 32-bit
+and x32 environments.  This is the default address mode for 32-bit and
+x32 environments.
 @end table
 
 @node i386 and x86-64 Windows Options