|
From: Stepan D. <stp...@na...> - 2013-06-25 12:55:31
|
Hi Borja.
This is new patch. Seems I've moved memory constraint implementation to
the same level like all other constraints. Note avr-gcc has buggy
implementation of memory constraint, that's why *avr-libc doesn't use it*.
I removed restriction for Y,Z in getLargestLegalSuperClass, so these
registers could be inflated now. But there was unimplemented
getPointerRegClass method in AVRRegistersInfo. So currently I have
restricted it to Y and Z. Though suppose we can extend it in future to
XYZ set.
Look changes in inline-asm.ll to see what exactly is supported now.
About clang.
May be we ask John Myers to fix clang support for inline asm?
-Stepan.
Stepan Dyatkovskiy wrote:
> The patch. Forgot to attach it.
> -Stepan.
> Stepan Dyatkovskiy wrote:
>> Hi Borja,
>>
>> > What happens in your example above when you use a real instruction
>> like
>>> for example LDD? Does it still use GPR8 regs? To me it's weird that if
>>> you use a real instruction where operands are clearly defined in the td
>>> file the instruction selector uses an invalid regclass.
>>
>> There are two kinds of inline asm support in LLVM:
>> 1. You just support all the constraints and pastes inline-asm contents
>> as-is. That's why its still allowed to use names like "some_instr".
>> 2. You may expand inline-asm strings set, or in another words just parse
>> it onto set of instructions. In this case you have to implement
>> TargetLowering::ExpandInlineAsm method.
>> I'd want to start it on this week though...
>>
>> But first we have to get avr-libc compilable (perhpas I read you
>> thoughts ;-) )
>>
>> Relative to memory constrains. I implemented initial version it can
>> catch simplest cases (from test-case):
>>
>> @a = internal global i16 0, align 4
>> @b = internal global i16 0, align 4
>> define void @mem() {
>> ;CHECK: some_instr Z, Y
>> call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* @a, i16* @b)
>> ret void
>> }
>>
>> The patch is attached.
>>
>> Its in my todo yet, to handle local variables. They could be emitted as
>> Y+q expression. Hope to present this support tomorrow. So if 'a' and 'b'
>> from example above would be local we could get "some_instr Y, Y+2"
>>
>> -Stepan.
>>
>>
>
|