<p dir="ltr">Hi Ryan,</p>
<p dir="ltr">Do you mean something like this -</p>
<p dir="ltr">@a = local_unnamed_addr global i32 0, align 4<br>
@b = local_unnamed_addr global i32 0, align 4<br>
@c = local_unnamed_addr global i32 0, align 4</p>
<p dir="ltr">; Function Attrs: norecurse nounwind<br>
define void @foo() {<br>
entry:<br>
   %add = add nsw i32 @a, @b</p>
<p dir="ltr">   store i32 %add, i32* @c, align 4<br>
   ret void<br>
}</p>
<p dir="ltr">If yes, should this be done at IR level or SelectionDAG? Any side effect of doing it at IR level?</p>
<p dir="ltr">But above seems memory to memory without involving registers to point to memory locations, which doesn't match the addressing mode of my target.</p>
<p dir="ltr">Thanks.</p>
<p dir="ltr">Regards,<br>
Alex</p>
<p dir="ltr">> On 12 Oct 2016 11:09 p.m., "Ryan Taylor" <<a href="mailto:ryta1203@gmail.com">ryta1203@gmail.com</a>> wrote:<br>
>><br>
>> Could you eliminate the load in the DAG and propagate the address to the add? Have you tried this, I'm curious.<br>
>><br>
>> Then in table gen, just match the add appropriately.<br>
>><br>
>> -Ryan<br>
>><br>
>> On Mon, Oct 10, 2016 at 12:01 PM, Alex Bradley <<a href="mailto:alexbradley.bqc@gmail.com">alexbradley.bqc@gmail.com</a>> wrote:<br>
>>><br>
>>> Hi Ryan,<br>
>>><br>
>>> Somewhat yes. But the memory locations should be pointed by registers. Essentially, load the address of memory location onto the registers and then use them to point to memory location.<br>
>>><br>
>>> Regards,<br>
>>> Alex<br>
>>><br>
>>><br>
>>> On 10 Oct 2016 8:52 p.m., "Ryan Taylor" <<a href="mailto:ryta1203@gmail.com">ryta1203@gmail.com</a>> wrote:<br>
>>>><br>
>>>> Alex,<br>
>>>><br>
>>>>   So, you are trying to do direct mem to mem add?<br>
>>>><br>
>>>> Like: ADD A, B, C<br>
>>>><br>
>>>> -Ryan<br>
>>>><br>
>>>> On Mon, Oct 10, 2016 at 10:23 AM, Alex Bradley via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
>>>>><br>
>>>>> Hi All,<br>
>>>>><br>
>>>>> I am new to llvm backend. I am trying out few examples to understand backend codegen. I have ported llvm LEG @ <a href="https://github.com/frasercrmck/llvm-leg">https://github.com/frasercrmck/llvm-leg</a> to llvm 3.9 successfully. <br>
>>>>><br>
>>>>> Currently, the LEG instructions are RISC load-store type instruction. I want to generate some instructions for register indirect mode, like following:<br>
>>>>><br>
>>>>> IR: <br>
>>>>><br>
>>>>> @a = local_unnamed_addr global i32 0, align 4<br>
>>>>> @b = local_unnamed_addr global i32 0, align 4<br>
>>>>> @c = local_unnamed_addr global i32 0, align 4<br>
>>>>><br>
>>>>> ; Function Attrs: norecurse nounwind<br>
>>>>> define void @foo() {<br>
>>>>> entry:<br>
>>>>>   %0 = load i32, i32* @a, align 4<br>
>>>>>   %1 = load i32, i32* @b, align 4<br>
>>>>>   %add = add nsw i32 %1, %0<br>
>>>>>   store i32 %add, i32* @c, align 4<br>
>>>>>   ret void<br>
>>>>> }<br>
>>>>><br>
>>>>><br>
>>>>> Expected assembly instructions:<br>
>>>>> MOV R0, #A    // R0 pointing to address of A<br>
>>>>> MOV R1, #B    // R1 pointing to address of B<br>
>>>>> ADD *R0, *R1  // Adding both memory operands<br>
>>>>> MOV #C, *R0  // Moving result to address of C<br>
>>>>><br>
>>>>> How should i define such mov and add instruction in my .td files? How will ISD::LOAD be seleted in ISelDAGtoDAG in select() function? I want to start with simple .td definitions and would later like to encapsulate them in multiclass once basic example works.<br>
>>>>><br>
>>>>> Can someone please help how to achieve this?<br>
>>>>><br>
>>>>> Regards,<br>
>>>>> Alex <br>
>>>>><br>
>>>>><br>
>>>>> _______________________________________________<br>
>>>>> LLVM Developers mailing list<br>
>>>>> <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
>>>>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>>>>><br>
>>>><br>
>></p>