Cross module inlining in runtime
Iain Buclaw
ibuclaw at ubuntu.com
Tue Jan 10 15:30:56 PST 2012
On 10 January 2012 19:49, Artur Skawina <art.08.09 at gmail.com> wrote:
>> I have porting the runtime/phobos asms to gcc asm on my to-do list, will
>> try to get to that within two weeks. What would be the preferred way -
>> version() guards? if yes - what version? Or would you prefer replacing
>> the asms, if the changes are not going to be merged upstream anyway?
>
> So i decided to start with this today. As i have a case where turning on
> logging increases a programs run time from seconds to hours, while it
> spends most of the time in the GC, thought gcbits would be a good place
> to start.
>
> But after adding gdc asm support to GCBits.testClear() the only thing that
> changed was this:
>
> XXXXXXXX <uint gc.gcbits.GCBits.testClear(uint)>:
> push %eRX
> mov %eRX,%eRX
> mov XX(%eRX),%eRX
> - push %eRX
> - mov %eRX,%eRX
> - shr $0x5,%eRX
> - lea XX(,%eRX,4),%eRX
> - mov XX(%eRX),%eRX
> - add (%eRX),%eRX
> - mov $0x1,%eRX
> - shl %Rl,%eRX
> - mov %eRX,%eRX
> mov (%eRX),%eRX
> - not %eRX
> - and %eRX,%eRX
> - and %eRX,%eRX
> - mov %eRX,(%eRX)
> - pop %eRX
> + mov XX(%eRX),%eRX
> + btr %eRX,XX(%eRX)
> + sbb %eRX,%eRX
> pop %eRX
> ret
>
> OK, the function turned into ~ three instructions, good, but why didn't it
> then get inlined into any of the callers? Trying to force things with an
> attribute turned up this:
>
four instructions. :~)
> ../../../libphobos/gc/gcx.d: In member function 'gc.gcx.Gcx.fullcollect':
> BUILD32/gdc/dev/gcc-4.6.1/libphobos/gc/gcbits.d:119:0: sorry, unimplemented: inlining failed in call to 'testClear': function body not available
> ../../../libphobos/gc/gcx.d:2647:0: sorry, unimplemented: called from here
> BUILD32/gdc/dev/gcc-4.6.1/libphobos/gc/gcbits.d:119:0: sorry, unimplemented: inlining failed in call to 'testClear': function body not available
> ../../../libphobos/gc/gcx.d:2729:0: sorry, unimplemented: called from here
> make[3]: *** [gc/gcx.o] Error 1
>
> Any way to make this work? Much of the asm gains will be lost when the code
> isn't inlined.
>
> artur
>
How is the function written?
--
Iain Buclaw
*(p < e ? p++ : p) = (c & 0x0f) + '0';
More information about the D.gnu
mailing list