Inline assembler in D and LDC, round 2

Don nospam at nospam.com
Thu Feb 5 08:46:57 PST 2009


Tomas Lindquist Olsen wrote:
> On Thu, Feb 5, 2009 at 2:42 PM, Frits van Bommel
> <fvbommel at remwovexcapss.nl> wrote:
>> Don wrote:
>>> Frits van Bommel wrote:
>>>> Walter Bright wrote:
>>>>> Frits van Bommel wrote:
>>>>>> Is it really that hard? Can't you just detect this case (non-void
>>>>>> function without a 'return' at the end but with inline asm inside)?
>>>>>>
>>>>>> Since the compiler should know the calling convention[1], the register
>>>>>> that will contain the return value of the function should be a simple lookup
>>>>>> (based on target architecture, cc and return type).
>>>>>> Just add that register as an output of the inline asm and return it...
>>>>> dmd doesn't attempt to figure out which register is the return value. It
>>>>> just assumes that the registers specified by the ABI for the function's
>>>>> return type have the proper return value in them.
>>>> That isn't an option for LDC, which is why I suggested another approach.
>>> What's the difference? Walter's approach assumes there's a "return EAX;"
>>> at the end of every function returning an int, for example; your approach
>>> seems to be to add it.
>> His approach depends on DMD directly emitting x86 machine code, so it can
>> just emit 'RET' and be done with it.
>>
>> LDC on the other hand needs to emit LLVM asm, which requires it to specify
>> an explicit return value. My approach is a way to extract that return value
>> from the inline asm, allowing it to emulate DMD behavior within the LLVM IR.
>>
> 
> I had really hoped I didn't have to do something like this, but I
> can't come up with a better approach. I just hope it actually works
> when I'm done ...
> Also I have no idea if code quality is going to be optimal. I imagine
> people write code like this for efficiency, if LLVM adds extra
> instructions there is little point in writing code like this for LDC,
> and we'd want to version things in any case, providing a true naked
> version for LDC. In this case I'm not sure it's worth it to actually
> do this work in the first place.

The only reason a function like this isn't written as naked, is so that 
it has a chance to be inlined. If that's impossible with this syntax on 
all compilers, there doesn't seem much point - it might as well be illegal.

If D provided a "return EAX,EDX;" fake asm instruction, would inlining 
be possible?



More information about the Digitalmars-d mailing list