2014-08-28 17:01 GMT+04:00 Uros Bizjak <ubiz...@gmail.com>: > On Fri, Aug 22, 2014 at 2:21 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: >> Hi, >> >> On Cauldron 2014 we had a couple of talks about relaxation of ebx usage in >> 32bit PIC mode. It was decided that the best approach would be to not fix >> ebx register, use speudo register for GOT base address and let allocator do >> the rest. This should be similar to how clang and icc work with GOT base >> address. I've been working for some time on such patch and now want to >> share my results. > > +#define PIC_OFFSET_TABLE_REGNUM > \ > + ((TARGET_64BIT && (ix86_cmodel == CM_SMALL_PIC \ > + || TARGET_PECOFF)) > \ > + || !flag_pic ? INVALID_REGNUM \ > + : X86_TUNE_RELAX_PIC_REG ? (pic_offset_table_rtx ? INVALID_REGNUM \ > + : REAL_PIC_OFFSET_TABLE_REGNUM) \ > + : reload_completed ? REGNO (pic_offset_table_rtx) \ > : REAL_PIC_OFFSET_TABLE_REGNUM) > > I'd like to avoid X86_TUNE_RELAX_PIC_REG and always treat EBX as an > allocatable register. This way, we can avoid all mess with implicit > xchgs in atomic_compare_and_swap<dwi>_doubleword. Also, having > allocatable EBX would allow us to introduce __builtin_cpuid builtin > and cleanup cpiud.h.
We should show nice performance to have this feature enabled by default. Currently patch causes a set of performance losses. I have a version of this patch where EBX is relaxed by a compiler flag, not tune flag. Ilya