diff mbox

PATCH [1/n] X32: Add initial -x32 support

Message ID CAMe9rOrCWLnyO=hcK2CHajBEoj8XQmx7mCPW-22g87uR3oXxmw@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu July 5, 2011, 6:49 p.m. UTC
On Tue, Jul 5, 2011 at 11:14 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Tue, Jul 5, 2011 at 7:54 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>
>>>> I'd like to start submitting a series of patches to enable x32:
>>>>
>>>> https://sites.google.com/site/x32abi/
>>>>
>>>> The GCC x32 branch is very stable. There are no unexpected failures in
>>>> C, C++, Fortran and Objective C testsuites.  SPEC CPU 2K/2006 compile
>>>> and run correctly at -O2 and -O3.
>>>>
>>>> More than 90% of changes are in x86 backend.  I have submitted non-x86
>>>> backend patches.  Most of them have been reviewed and checked in.  Only
>>>> 4 patches are pending for review/approval.
>>>>
>>>> This is the first x86 backend patch to support x32.  By default, x32 is
>>>> disabled and x32 run-time support isn't required.  OK for trunk?
>>>
>>> Please strip out --enable-ia32 stuff, it complicates things ATM.  I
>>> assume that --enable-x32 applies only to 64bit targets, so this part
>
>
> I think that better name of the file would be "t-linux64-x32".
>
> @@ -2631,6 +2640,7 @@ esac
>  case ${target} in
>  i[34567]86-*-linux* | x86_64-*-linux*)
>        tmake_file="${tmake_file} i386/t-pmm_malloc i386/t-i386"
> +       libgcc_tm_file="${libgcc_tm_file} i386/value-unwind.h"
>
> Not yet.

Removed.

> @@ -58,25 +58,31 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
>
>  #if TARGET_64BIT_DEFAULT
>  #define SPEC_32 "m32"
> -#define SPEC_64 "!m32"
> +#define SPEC_64 "m32|mx32:;"
> +#define SPEC_X32 "mx32"
>  #else
> -#define SPEC_32 "!m64"
> +#define SPEC_32 "m64|mx32:;"
>  #define SPEC_64 "m64"
> +#define SPEC_X32 "mx32"
>  #endif
>
> I really think that "!(m64|mx32)" is more descriptive and clear...

I don't know if gcc spec supports it.  I just followed mips backend.

>  #undef LINK_SPEC
>  #define LINK_SPEC "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \
>                    %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
> +                   %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
>   %{shared:-shared} \
>   %{!shared: \
>     %{!static: \
>       %{rdynamic:-export-dynamic} \
>       %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \
> -      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
> +      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \
> +      %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}} \
>     %{static:-static}}"
>
> On the border of bikesheding, GNU_USER_LINK_EMULATION64_X32 and
> GNU_USER_DYNAMIC_LINKER64_X32 sounds better to me.
>
> Same with the below:
>
> +#define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2"
> +#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
> +#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
>
> +++ b/gcc/config/i386/t-linux-x32
>
> Please rename above file to t-linux64-x32.

X32 is the name of the psABI:

https://sites.google.com/site/x32abi/

We have -mx32, -m32 and -m64 command line options and
There are macros like TARGET_X32. I'd like to be consistent
and avoid "64" when referring to x32 if possible. But I won't
insist.  Please let me know that you really won't like x32 without
64.

> With above small changes, the patch looks OK to me. Please also wait
> for build and options maintainer (CC'd) approvals.
>
> Thanks,
> Uros.
>

Thanks.

Comments

Joseph Myers July 5, 2011, 7:09 p.m. UTC | #1
On Tue, 5 Jul 2011, H.J. Lu wrote:

> > I really think that "!(m64|mx32)" is more descriptive and clear...
> 
> I don't know if gcc spec supports it.  I just followed mips backend.

Indeed, I don't think any such grouping construct exists in specs.

The .opt changes look fine to me.
Uros Bizjak July 5, 2011, 7:36 p.m. UTC | #2
On Tue, Jul 5, 2011 at 8:49 PM, H.J. Lu <hjl.tools@gmail.com> wrote:

>>  #undef LINK_SPEC
>>  #define LINK_SPEC "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \
>>                    %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
>> +                   %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
>>   %{shared:-shared} \
>>   %{!shared: \
>>     %{!static: \
>>       %{rdynamic:-export-dynamic} \
>>       %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \
>> -      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
>> +      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \
>> +      %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}} \
>>     %{static:-static}}"
>>
>> On the border of bikesheding, GNU_USER_LINK_EMULATION64_X32 and
>> GNU_USER_DYNAMIC_LINKER64_X32 sounds better to me.
>>
>> Same with the below:
>>
>> +#define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2"
>> +#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
>> +#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
>>
>> +++ b/gcc/config/i386/t-linux-x32
>>
>> Please rename above file to t-linux64-x32.
>
> X32 is the name of the psABI:
>
> https://sites.google.com/site/x32abi/
>
> We have -mx32, -m32 and -m64 command line options and
> There are macros like TARGET_X32. I'd like to be consistent
> and avoid "64" when referring to x32 if possible. But I won't
> insist.  Please let me know that you really won't like x32 without
> 64.

I would like to point out that the base target is in fact 64 bit and a
subtarget is x32, so ...64-x32. I could read this as 64bit target with
x32 ABI. Perhaps we will have 64-xxx or whatever different ABIs that
all apply to the same 64bit hardware.

These are my personal preferences, so I will leave the final decision
about names of defines and file names to you.

Thanks,
Uros.
diff mbox

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index c77f40b..4787d6b 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1279,7 +1279,11 @@  i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i
 		if test x$enable_targets = xall; then
 			tm_file="${tm_file} i386/x86-64.h i386/gnu-user64.h i386/linux64.h"
 			tm_defines="${tm_defines} TARGET_BI_ARCH=1"
-			tmake_file="${tmake_file} i386/t-linux64"
+			if test x${enable_x32} = xyes; then
+				tmake_file="${tmake_file} i386/t-linux-x32"
+			else
+				tmake_file="${tmake_file} i386/t-linux64"
+			fi
 			need_64bit_hwint=yes
 			need_64bit_isa=yes
 			case X"${with_cpu}" in
@@ -1317,7 +1321,12 @@  x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu)
 	x86_64-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h" ;;
 	x86_64-*-knetbsd*-gnu) tm_file="${tm_file} knetbsd-gnu.h" ;;
 	esac
-	tmake_file="${tmake_file} i386/t-linux64 i386/t-crtstuff i386/t-crtpc i386/t-crtfm t-dfprules"
+	if test x${enable_x32} = xyes; then
+		tmake_file="${tmake_file} i386/t-linux-x32"
+	else
+		tmake_file="${tmake_file} i386/t-linux64"
+	fi
+	tmake_file="${tmake_file} i386/t-crtstuff i386/t-crtpc i386/t-crtfm t-dfprules"
 	;;
 i[34567]86-pc-msdosdjgpp*)
 	xm_file=i386/xm-djgpp.h
diff --git a/gcc/config/i386/gnu-user64.h b/gcc/config/i386/gnu-user64.h
index b069975..954f3b2 100644
--- a/gcc/config/i386/gnu-user64.h
+++ b/gcc/config/i386/gnu-user64.h
@@ -58,25 +58,31 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #if TARGET_64BIT_DEFAULT
 #define SPEC_32 "m32"
-#define SPEC_64 "!m32"
+#define SPEC_64 "m32|mx32:;"
+#define SPEC_X32 "mx32"
 #else
-#define SPEC_32 "!m64"
+#define SPEC_32 "m64|mx32:;"
 #define SPEC_64 "m64"
+#define SPEC_X32 "mx32"
 #endif
 
 #undef ASM_SPEC
-#define ASM_SPEC "%{" SPEC_32 ":--32} %{" SPEC_64 ":--64} \
+#define ASM_SPEC "%{" SPEC_32 ":--32} \
+ %{" SPEC_64 ":--64} \
+ %{" SPEC_X32 ":--x32} \
  %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}"
 
 #undef	LINK_SPEC
 #define LINK_SPEC "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \
                    %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
+                   %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
   %{shared:-shared} \
   %{!shared: \
     %{!static: \
       %{rdynamic:-export-dynamic} \
       %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \
-      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
+      %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \
+      %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}} \
     %{static:-static}}"
 
 /* Similar to standard GNU userspace, but adding -ffast-math support.  */
@@ -110,10 +116,13 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #ifdef TARGET_LIBC_PROVIDES_SSP
 /* i386 glibc provides __stack_chk_guard in %gs:0x14,
+   x32 glibc provides it in %fs:0x18. 
    x86_64 glibc provides it in %fs:0x28.  */
-#define TARGET_THREAD_SSP_OFFSET	(TARGET_64BIT ? 0x28 : 0x14)
+#define TARGET_THREAD_SSP_OFFSET \
+  (TARGET_64BIT ? (TARGET_X32 ? 0x18 : 0x28) : 0x14)
 
 /* We steal the last transactional memory word.  */
 #define TARGET_CAN_SPLIT_STACK
-#define TARGET_THREAD_SPLIT_STACK_OFFSET (TARGET_64BIT ? 0x70 : 0x30)
+#define TARGET_THREAD_SPLIT_STACK_OFFSET \
+  (TARGET_64BIT ? (TARGET_X32 ? 0x40 : 0x70) : 0x30)
 #endif
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index a1ac6b6..8cef4e7 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -42,6 +42,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 /* Redefines for option macros.  */
 
 #define TARGET_64BIT	OPTION_ISA_64BIT
+#define TARGET_X32	OPTION_ISA_X32
 #define TARGET_MMX	OPTION_ISA_MMX
 #define TARGET_3DNOW	OPTION_ISA_3DNOW
 #define TARGET_3DNOW_A	OPTION_ISA_3DNOW_A
@@ -72,6 +73,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define TARGET_RDRND	OPTION_ISA_RDRND
 #define TARGET_F16C	OPTION_ISA_F16C
 
+#define TARGET_LP64	(TARGET_64BIT && !TARGET_X32)
 
 /* SSE4.1 defines round instructions */
 #define	OPTION_MASK_ISA_ROUND	OPTION_MASK_ISA_SSE4_1
@@ -516,8 +518,8 @@  extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define OPT_ARCH64 "!m32"
 #define OPT_ARCH32 "m32"
 #else
-#define OPT_ARCH64 "m64"
-#define OPT_ARCH32 "!m64"
+#define OPT_ARCH64 "m64|mx32"
+#define OPT_ARCH32 "m64|mx32:;"
 #endif
 
 /* Support for configure-time defaults of some command line options.
@@ -637,6 +639,8 @@  enum target_cpu_default
 
 #define SHORT_TYPE_SIZE 16
 #define INT_TYPE_SIZE 32
+#define LONG_TYPE_SIZE (TARGET_X32 ? 32 : BITS_PER_WORD)
+#define POINTER_SIZE (TARGET_X32 ? 32 : BITS_PER_WORD)
 #define LONG_LONG_TYPE_SIZE 64
 #define FLOAT_TYPE_SIZE 32
 #define DOUBLE_TYPE_SIZE 64
@@ -1742,6 +1746,13 @@  do {							\
    between pointers and any other objects of this machine mode.  */
 #define Pmode (TARGET_64BIT ? 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
+   greater then zero if they are zero-extended and less then zero if the
+   ptr_extend instruction should be used.  */
+
+#define POINTERS_EXTEND_UNSIGNED 1
+
 /* A function address in a call instruction
    is a byte address (for indexing purposes)
    so give the MEM rtx a byte's mode.  */
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 9886b7b..8dea93e 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -398,9 +398,13 @@  Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_f
 Generate 32bit i386 code
 
 m64
-Target RejectNegative Negative(m32) Report Mask(ISA_64BIT) Var(ix86_isa_flags) Save
+Target RejectNegative Negative(mx32) Report Mask(ISA_64BIT) Var(ix86_isa_flags) Save
 Generate 64bit x86-64 code
 
+mx32
+Target RejectNegative Negative(m32) Report Mask(ISA_X32) Var(ix86_isa_flags) Save
+Generate 32bit x86-64 code
+
 mmmx
 Target Report Mask(ISA_MMX) Var(ix86_isa_flags) Save
 Support MMX built-in functions
diff --git a/gcc/config/i386/kfreebsd-gnu64.h b/gcc/config/i386/kfreebsd-gnu64.h
index c3798a5..2085ca5 100644
--- a/gcc/config/i386/kfreebsd-gnu64.h
+++ b/gcc/config/i386/kfreebsd-gnu64.h
@@ -21,6 +21,8 @@  along with GCC; see the file COPYING3.  If not see
 
 #define GNU_USER_LINK_EMULATION32 "elf_i386_fbsd"
 #define GNU_USER_LINK_EMULATION64 "elf_x86_64_fbsd"
+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64_fbsd"
 
 #define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
 #define GLIBC_DYNAMIC_LINKER64 "/lib/ld-kfreebsd-x86-64.so.1"
+#define GLIBC_DYNAMIC_LINKERX32 "/lib/ld-kfreebsd-x32.so.1"
diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
index 5d33224..5b0a212 100644
--- a/gcc/config/i386/linux64.h
+++ b/gcc/config/i386/linux64.h
@@ -26,6 +26,8 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #define GNU_USER_LINK_EMULATION32 "elf_i386"
 #define GNU_USER_LINK_EMULATION64 "elf_x86_64"
+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
 
 #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
 #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2"
+#define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2"
diff --git a/gcc/config/i386/t-linux-x32 b/gcc/config/i386/t-linux-x32
new file mode 100644
index 0000000..92acf91
--- /dev/null
+++ b/gcc/config/i386/t-linux-x32
@@ -0,0 +1,42 @@ 
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# On Debian, Ubuntu and other derivative distributions, the 32bit libraries
+# are found in /lib32 and /usr/lib32, /lib64 and /usr/lib64 are symlinks to
+# /lib and /usr/lib, while other distributions install libraries into /lib64
+# and /usr/lib64.  The LSB does not enforce the use of /lib64 and /usr/lib64,
+# it doesn't tell anything about the 32bit libraries on those systems.  Set
+# MULTILIB_OSDIRNAMES according to what is found on the target.
+
+# To support i386, x86-64 and x32 libraries, the directory structrue
+# should be:
+#
+# 	/lib has i386 libraries.
+# 	/lib64 has x86-64 libraries.
+# 	/libx32 has x32 libraries.
+#
+MULTILIB_OPTIONS = m64/m32/mx32
+MULTILIB_DIRNAMES = 64 32 x32
+MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) ../libx32
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o \
+		     crtbeginT.o crtprec32.o crtprec64.o crtprec80.o \
+		     crtfastmath.o
diff --git a/gcc/config/linux.h b/gcc/config/linux.h
index fc897b1..dbbeea5 100644
--- a/gcc/config/linux.h
+++ b/gcc/config/linux.h
@@ -77,9 +77,11 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
 #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
 #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
+#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
 #define BIONIC_DYNAMIC_LINKER "/system/bin/linker"
 #define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker"
 #define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64"
+#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
 
 #define GNU_USER_DYNAMIC_LINKER						\
   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER,	\
@@ -90,6 +92,9 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define GNU_USER_DYNAMIC_LINKER64					\
   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
 			 BIONIC_DYNAMIC_LINKER64)
+#define GNU_USER_DYNAMIC_LINKERX32					\
+  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
+			 BIONIC_DYNAMIC_LINKERX32)
 
 /* Determine whether the entire c99 runtime
    is present in the runtime library.  */
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 5f3641b..bddabeb 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -611,6 +611,11 @@  AC_ARG_ENABLE(multilib,
 [], [enable_multilib=yes])
 AC_SUBST(enable_multilib)
 
+# With x32 support
+AC_ARG_ENABLE(x32,
+[  --enable-x32            enable x32 library support for multiple ABIs],
+[], [enable_x32=no])
+
 # Enable __cxa_atexit for C++.
 AC_ARG_ENABLE(__cxa_atexit,
 [AS_HELP_STRING([--enable-__cxa_atexit], [enable __cxa_atexit for C++])],
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 49aac95..e89c396 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1161,6 +1161,11 @@  assumptions made by the configure test are incorrect.
 Specify that the target does not support TLS.
 This is an alias for @option{--enable-tls=no}.
 
+@item --enable-x32
+This option enables x32 library support for multiple ABIs. By
+default, x32 library support is disabled.  It is only supported for
+x86-64.
+
 @item --with-cpu=@var{cpu}
 @itemx --with-cpu-32=@var{cpu}
 @itemx --with-cpu-64=@var{cpu}
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 1fc4038..fd6711c 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -610,7 +610,7 @@  Objective-C and Objective-C++ Dialects}.
 -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
--m32  -m64 -mlarge-data-threshold=@var{num} @gol
+-m32 -m64 -mx32 -mlarge-data-threshold=@var{num} @gol
 -msse2avx -mfentry -m8bit-idiv @gol
 -mavx256-split-unaligned-load -mavx256-split-unaligned-store}
 
@@ -12851,15 +12851,19 @@  on AMD x86-64 processors in 64-bit environments.
 @table @gcctabopt
 @item -m32
 @itemx -m64
+@itemx -mx32
 @opindex m32
 @opindex m64
+@opindex mx32
 Generate code for a 32-bit or 64-bit environment.
-The 32-bit environment sets int, long and pointer to 32 bits and
+The @option{-m32} option sets int, long and pointer to 32 bits and
 generates code that runs on any i386 system.
-The 64-bit environment sets int to 32 bits and long and pointer
-to 64 bits and generates code for AMD's x86-64 architecture. For
-darwin only the -m64 option turns off the @option{-fno-pic} and
-@option{-mdynamic-no-pic} options.
+The @option{-m64} option sets int to 32 bits and long and pointer
+to 64 bits and generates code for AMD's x86-64 architecture.
+The @option{-mx32} option sets int, long and pointer to 32 bits and
+generates code for AMD's x86-64 architecture.
+For darwin only the @option{-m64} option turns off the @option{-fno-pic}
+and @option{-mdynamic-no-pic} options.
 
 @item -mno-red-zone
 @opindex mno-red-zone