On Mon, Jul 25, 2011 at 12:59 PM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Mon, Jul 25, 2011 at 3:30 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > >>> Attached patch implements -fpic handling for x32. In x32 mode, we now >>> use x86_64_general_operand and corresponding "e" constraints for adds >>> in SImode, since it looks that invalid addresses can only be generated >>> through adds. This avoids a whole bunch of new predicates and >>> constraints. > >> X32 glibc is miscompiled: >> >> CPP='/export/build/gnu/gcc-x32/release/usr/gcc-4.7.0-x32/bin/gcc -mx32 >> -E -x c-header' >> /export/build/gnu/glibc-x32/build-x86_64-linux/elf/ld-linux-x32.so.2 >> --library-path >> /export/build/gnu/glibc-x32/build-x86_64-linux:/export/build/gnu/glibc-x32/build-x86_64-linux/math:/export/build/gnu/glibc-x32/build-x86_64-linux/elf:/export/build/gnu/glibc-x32/build-x86_64-linux/dlfcn:/export/build/gnu/glibc-x32/build-x86_64-linux/nss:/export/build/gnu/glibc-x32/build-x86_64-linux/nis:/export/build/gnu/glibc-x32/build-x86_64-linux/rt:/export/build/gnu/glibc-x32/build-x86_64-linux/resolv:/export/build/gnu/glibc-x32/build-x86_64-linux/crypt:/export/build/gnu/glibc-x32/build-x86_64-linux/nptl >> /export/build/gnu/glibc-x32/build-x86_64-linux/sunrpc/rpcgen -Y >> ../scripts -h rpcsvc/yppasswd.x -o >> /export/build/gnu/glibc-x32/build-x86_64-linux/sunrpc/rpcsvc/yppasswd.T >> make[5]: *** >> [/export/build/gnu/glibc-x32/build-x86_64-linux/sunrpc/rpcsvc/yppasswd.stmp] >> Segmentation fault (core dumped) >> >> Some LEA patterns are wrong for x32. I will investigate. > > We have to prevent symbols from entering general_operand predicated > SImode operands. Fortunatelly, x86_64_general_operand works OK for > x32, while both for i686 and x86_64 are unaffected due to early bypass > (i686) and due to the fact that all symbols are DImode (x86_64). > > 2011-07-25 Uros Bizjak <ubiz...@gmail.com> > H.J. Lu <hongjiu...@intel.com> > > PR target/47381 > PR target/49832 > PR target/49833 > * config/i386/i386.md (i): Change SImode attribute to "e". > (g): Change SImode attribute to "rme". > (di): Change SImode attribute to "nF". > (general_operand): Change SImode attribute to x86_64_general_operand. > (general_szext_operand): Change SImode attribute to > x86_64_szext_general_operand. > (immediate_operand): Change SImode attribute to > x86_64_immediate_operand- > (*movdi_internal_rex64): Remove mode from pic_32bit_operand check. > (*movsi_internal): Ditto. Use "e" constraint in alternative 2. > (*lea_1): Use SWI48 mode iterator. > (*lea_1_zext): New insn pattern. > (*add<mode>1): Use x86_64_general_operand predicate for operand 2. > Update operand constraints. > (addsi_1_zext): Ditto. > (*add<mode>2): Ditto. > (*addsi_3_zext): Ditto. > (*subsi_1_zext): Ditto. > (*subsi_2_zext): Ditto. > (*subsi_3_zext): Ditto. > (*addsi3_carry_zext): Ditto. > (*<plusminus_insn>si3_zext_cc_overflow): Ditto. > (*mulsi3_1_zext): Ditto. > (*andsi_1): Ditto. > (*andsi_1_zext): Ditto. > (*andsi_2_zext): Ditto. > (*<any_or:code>si_1_zext): Ditto. > (*<any_or:code>si_2_zext): Ditto. > (*test<mode>_1): Use <general_operand> predicate for operand 1. > (*and<mode>_2): Ditto. > (add->lea splitter): Check operand modes in insn constraint. Extend > operands less than SImode wide to SImode. > (add->lea zext splitter): Do not extend input operands to DImode. > (*lea_general_1): Handle only QImode and HImode operands. > (*lea_general_2): Ditto. > (*lea_general_3): Ditto. > (*lea_general_1_zext): Remove. > (*lea_general_2_zext): Ditto. > (*lea_general_3_zext): Ditto. > (*lea_general_4): Check operand modes in insn constraint. Extend > operands less than SImode wide to SImode. > (ashift->lea splitter): Ditto. > * config/i386/i386.c (ix86_print_operand_address): Print address > registers with 'q' modifier on 64bit targets. > * config/i386/predicates.md (pic_32bit_opreand): Define as special > predicate. Reject non-SI and non-DI modes. > > Bootstrapped and regression ested on x86_64-pc-linux-gnu {,-m32}. > > Uros. >
GCC and glibc testsuites are clean on x32. Can you check it in? Thanks. -- H.J.