On Tue, Jul 5, 2011 at 4:39 PM, H.J. Lu <hongjiu...@intel.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 > @@ -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" > 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. > /* 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. Uros.