On Tue, Jul 5, 2011 at 8:16 AM, Uros Bizjak wrote: > On Tue, Jul 5, 2011 at 4:39 PM, H.J. Lu 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 Done. >> @@ -1232,7 +1232,17 @@ 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" >> +                       case x${enable_x32}${enable_ia32} in >> +                       xyesyes) >> +                               tmake_file="${tmake_file} i386/t-linux-x32" >> +                               ;; >> +                       xyesno) >> +                               tmake_file="${tmake_file} i386/t-linux64-x32" >> +                               ;; >> +                       *) >> +                               tmake_file="${tmake_file} i386/t-linux64" >> +                               ;; >> +                       esac > > should be simplified to something: > > if (enable_x32) >  tmake_file = "... i386/t-linux64-x32" > else >  tmake_file = "... i386/t-linux64" Done. > > >> 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}}" > > Are you sure that above is correct? AFAICS, you are enabling SPEC_64 > for m32 in case of TARGET_64BIT_DEFAULT. I have #define SPEC_64 "m32|mx32:;" There are ":;". This is similar to "if then else". SPEC_64 will be false if -m32 or -mx32 is used. >>  /* SSE4.1 defines round instructions */ >>  #define        OPTION_MASK_ISA_ROUND   OPTION_MASK_ISA_SSE4_1 >> @@ -517,8 +519,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 > > Same here. > See above. Here is the updated patch. OK for trunk? Thanks. -- H.J. --- 2011-07-05 H.J. Lu * config.gcc: Support --enable-x32 for x86 Linux targets. * configure.ac: Support --enable-x32. * configure: Regenerated. * config/i386/gnu-user64.h (SPEC_64): Support x32. (SPEC_32): Likewise. (ASM_SPEC): Likewise. (LINK_SPEC): Likewise. (TARGET_THREAD_SSP_OFFSET): Likewise. (TARGET_THREAD_SPLIT_STACK_OFFSET): Likewise. (SPEC_X32): New. * config/i386/i386.h (TARGET_X32): New. (TARGET_LP64): New. (LONG_TYPE_SIZE): Likewise. (POINTER_SIZE): Likewise. (POINTERS_EXTEND_UNSIGNED): Likewise. (OPT_ARCH64): Support x32. (OPT_ARCH32): Likewise. * config/i386/i386.opt (mx32): New. * config/i386/kfreebsd-gnu64.h (GNU_USER_LINK_EMULATIONX32): New. (GLIBC_DYNAMIC_LINKERX32): Likewise. * config/i386/linux64.h (GNU_USER_LINK_EMULATIONX32): Likewise. (GLIBC_DYNAMIC_LINKERX32): Likewise. * config/i386/t-linux-x32: New. * config/linux.h (UCLIBC_DYNAMIC_LINKERX32): New. (BIONIC_DYNAMIC_LINKERX32): Likewise. (GNU_USER_DYNAMIC_LINKERX32): Likewise. * doc/install.texi: Document --enable-x32. * doc/invoke.texi: Document -mx32.