This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Add OPTION_MASK_ISA_X86_64 and support TARGET_BI_ARCH == 2


On Sat, Mar 24, 2012 at 03:42:29PM -0700, H.J. Lu wrote:
> Hi,
> 
> In i386 option mask, there is OPTION_MASK_ISA_64BIT for -m64 or -mx32
> code generations and OPTION_MASK_ISA_X32 for -mx32 code generation. We
> support
> 
> -m64: OPTION_MASK_ISA_64BIT && !OPTION_MASK_ISA_X32
> -mx32: OPTION_MASK_ISA_64BIT && OPTION_MASK_ISA_X32
> -m32: !OPTION_MASK_ISA_64BIT
> 
> i386.opt has
> 
> -m64: Turn on OPTION_MASK_ISA_64BIT
> -mx32: Turn on OPTION_MASK_ISA_X32
> -m32: Turn off OPTION_MASK_ISA_64BIT
> 
> So it isn't possible to make -mx32 as default -m64 just turns on
> OPTION_MASK_ISA_64BIT and doesn't change anything.  This option adds
> OPTION_MASK_ISA_X86_64 so that we can have
> 
> OPTION_MASK_ISA_64BIT 		32bit x86-64 code or 64bit x86-64 code
> OPTION_MASK_ISA_X86_64		64bit x86-64 code
> OPTION_MASK_ISA_X32		32bit x86-64 code
> 
> and i386.opt becomes
> 
> -m64: Turn on OPTION_MASK_ISA_X86_64 
> -mx32: Turn on OPTION_MASK_ISA_X32
> -m32: Turn off OPTION_MASK_ISA_64BIT
> 
> Both OPTION_MASK_ISA_X32 and OPTION_MASK_ISA_X86_64 imply
> OPTION_MASK_ISA_64BIT. OPTION_MASK_ISA_X32 clears OPTION_MASK_ISA_X86_64
> and vice versa.
> 
> I added a dummy command line option, -mx86-64, since we don't support
> ISA_64BIT in
> 
> m32
> Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_flags) Save
> Generate 32bit i386 code
> 
> without a place holder for Mask(ISA_64BIT).
> 
> Currectly when TARGET_BI_ARCH is defined, i386 backend will set the
> OPTION_MASK_ISA_64BIT bit by default to make -m64 as the default.  This
> patch extends TARGET_BI_ARCH to support:
> 
> 1. TARGET_BI_ARCH == 1: -m64 is the default by setting the
> OPTION_MASK_ISA_64BIT and OPTION_MASK_ISA_X86_64 bits.
> 2. TARGET_BI_ARCH == 2: -mx32 is the default by setting the
> OPTION_MASK_ISA_64BIT and OPTION_MASK_ISA_X32 bits.
> 
> I will send a sparate patch to define TARGET_BI_ARCH to 2.  Tested on
> Linux/x86-64.  OK to install?
> 

Here is the updated patch without the undocumented -mx86-64 option.
Tested on Linux/x86-64.  OK to install?

Thanks.

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

	* config/i386/biarch64.h (TARGET_64BIT_DEFAULT): Add
	OPTION_MASK_ISA_X86_64.

	* config/i386/gnu-user64.h (SPEC_64): Support TARGET_BI_ARCH == 2.
	(SPEC_X32): Likewise.
	(MULTILIB_DEFAULTS): Likewise.

	* config/i386/i386.c (ix86_option_override_internal): Properly
	set OPTION_MASK_ISA_64BIT and OPTION_MASK_ISA_X32 as well as
	handle -m32, -m64 and -mx32.

	* config/i386/i386.h (TARGET_X86_64): New.
	(TARGET_LP64): Changed to TARGET_X86_64.

	* config/i386/i386.opt (m64): Replace ISA_64BIT with ISA_X86_64.

diff --git a/gcc/config/i386/biarch64.h b/gcc/config/i386/biarch64.h
index 629ec98..3dc9889 100644
--- a/gcc/config/i386/biarch64.h
+++ b/gcc/config/i386/biarch64.h
@@ -25,5 +25,5 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
-#define TARGET_64BIT_DEFAULT OPTION_MASK_ISA_64BIT
+#define TARGET_64BIT_DEFAULT (OPTION_MASK_ISA_64BIT | OPTION_MASK_ISA_X86_64)
 #define TARGET_BI_ARCH 1
diff --git a/gcc/config/i386/gnu-user64.h b/gcc/config/i386/gnu-user64.h
index 954f3b2..6f7b5de 100644
--- a/gcc/config/i386/gnu-user64.h
+++ b/gcc/config/i386/gnu-user64.h
@@ -58,8 +58,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #if TARGET_64BIT_DEFAULT
 #define SPEC_32 "m32"
+#if TARGET_BI_ARCH == 2
+#define SPEC_64 "m64"
+#define SPEC_X32 "m32|m64:;"
+#else
 #define SPEC_64 "m32|mx32:;"
 #define SPEC_X32 "mx32"
+#endif
 #else
 #define SPEC_32 "m64|mx32:;"
 #define SPEC_64 "m64"
@@ -95,7 +100,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
 
 #if TARGET_64BIT_DEFAULT
+#if TARGET_BI_ARCH == 2
+#define MULTILIB_DEFAULTS { "mx32" }
+#else
 #define MULTILIB_DEFAULTS { "m64" }
+#endif
 #else
 #define MULTILIB_DEFAULTS { "m32" }
 #endif
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 18172a1..4e29b06 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3102,8 +3102,45 @@ ix86_option_override_internal (bool main_args_p)
   SUBSUBTARGET_OVERRIDE_OPTIONS;
 #endif
 
+  /* Turn off both OPTION_MASK_ISA_X86_64 and OPTION_MASK_ISA_X32 if
+     TARGET_64BIT is false.  */
+  if (!TARGET_64BIT)
+    ix86_isa_flags &= ~(OPTION_MASK_ISA_X86_64 | OPTION_MASK_ISA_X32);
+#ifdef TARGET_BI_ARCH
+  else
+    {
+#if TARGET_BI_ARCH == 1
+      /* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ISA_X86_64
+	 is on and OPTION_MASK_ISA_X32 is off.  We turn off
+	 OPTION_MASK_ISA_X86_64 if OPTION_MASK_ISA_X32 is turned on by
+	 -mx32.  */
+      if (TARGET_X32)
+	ix86_isa_flags &= ~OPTION_MASK_ISA_X86_64;
+#else
+      /* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ISA_X32 is
+	 on and OPTION_MASK_ISA_X86_64 is off.  We turn off
+	 OPTION_MASK_ISA_X32 if OPTION_MASK_ISA_X86_64 is turned on by
+	 -m64.  */
+      if (TARGET_X86_64)
+	ix86_isa_flags &= ~OPTION_MASK_ISA_X32;
+#endif
+    }
+#endif
+
   if (TARGET_X32)
-    ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
+    {
+      /* Always turn on OPTION_MASK_ISA_64BIT and turn off
+	 OPTION_MASK_ISA_X86_64 for TARGET_X32.  */
+      ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
+      ix86_isa_flags &= ~OPTION_MASK_ISA_X86_64;
+    }
+  else if (TARGET_X86_64)
+    {
+      /* Always turn on OPTION_MASK_ISA_64BIT and turn off
+	 OPTION_MASK_ISA_X32 for TARGET_X86_64.  */
+      ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
+      ix86_isa_flags &= ~OPTION_MASK_ISA_X32;
+    }
 
   /* -fPIC is the default for x86_64.  */
   if (TARGET_MACHO && TARGET_64BIT)
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index a53c70a..644e05f 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -41,6 +41,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 /* Redefines for option macros.  */
 
+#define TARGET_X86_64	OPTION_ISA_X86_64
 #define TARGET_64BIT	OPTION_ISA_64BIT
 #define TARGET_X32	OPTION_ISA_X32
 #define TARGET_MMX	OPTION_ISA_MMX
@@ -77,7 +78,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define TARGET_F16C	OPTION_ISA_F16C
 #define TARGET_RTM      OPTION_ISA_RTM
 
-#define TARGET_LP64	(TARGET_64BIT && !TARGET_X32)
+#define TARGET_LP64	TARGET_X86_64
 
 /* SSE4.1 defines round instructions */
 #define	OPTION_MASK_ISA_ROUND	OPTION_MASK_ISA_SSE4_1
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 29f1082..ad36489 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -425,7 +425,7 @@ Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_f
 Generate 32bit i386 code
 
 m64
-Target RejectNegative Negative(mx32) Report Mask(ISA_64BIT) Var(ix86_isa_flags) Save
+Target RejectNegative Negative(mx32) Report Mask(ISA_X86_64) Var(ix86_isa_flags) Save
 Generate 64bit x86-64 code
 
 mx32


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]