Here you go ,

a)define  new field in the struct "CUMULATIVE_ARGS" says as int long_call;

b)set the field long_call to known vlaue@ init_cumulative_args() .

c)In the TARGET_FUNCTION_ARG hook
                The last time this MACRO is called, it is called with
MODE == VOIDmode, and its result is passed to the call or call_value
pattern as operands 2 and 3 respectively.
                if(VOIDmode == MODE)
             return  INTVAL(CUMULATIVE_ARGS->long_call);
d)Handle operands[2] for call  pattern  as

(define_insn "call_name"
                [(call (mem:SI (match_operand:MODE 0 "" ""))
          (match_operand 1 "" ""))
                (use (match_operand:SI 2 "immediate_operand" ""))
 "
{
                if (INTVAL (operands[2]) & long_call)
                {
                                return "branch long"
                }
                else
                {
                                return "branch other"
                }
}
")
e)same for call_value ,where you ended to check the operands[3]


Hope this helps you there

Thanks
~Umesh


On Wed, Oct 16, 2013 at 2:26 PM, Nagaraju Mekala <gnuuser....@gmail.com> wrote:
> Yes.. I still had no luck.
> Do you have any thoughts on this??
>
> On Wed, Oct 16, 2013 at 2:05 PM, Umesh Kalappa <umesh.kalap...@gmail.com> 
> wrote:
>> You still stuck with this issue ???
>>
>> ~Umesh
>>
>> On Tue, Oct 15, 2013 at 9:08 PM, Ian Lance Taylor <i...@google.com> wrote:
>>> On Tue, Oct 15, 2013 at 8:04 AM, Nagaraju Mekala <gnuuser....@gmail.com> 
>>> wrote:
>>>>  Hi Ian,
>>>>
>>>>   Thanks for the reply.
>>>>
>>>> On Fri, Oct 11, 2013 at 10:31 PM, Ian Lance Taylor <i...@google.com> wrote:
>>>>> On Fri, Oct 11, 2013 at 9:20 AM, Nagaraju Mekala <gnuuser....@gmail.com> 
>>>>> wrote:
>>>>>>
>>>>>> I observed that in rs6000 port longcall is implemented by using
>>>>>> CALL_LONG define.
>>>>>> #define CALL_LONG 0x00000008 /* always call indirect */
>>>>>> In the md file they are checking the operand with CALL_LONG
>>>>>> if (INTVAL (operands[3]) & CALL_LONG)
>>>>>> operands[1] = rs6000_longcall_ref (operands[1]);
>>>>>> In my port I dont have suchthing to compare. Can we somehow parse the
>>>>>> tree chain and check the attributes of the functions..
>>>>>
>>>>> Look at init_cumulative_args in rs6000.c to see how CALL_LONG is set
>>>>> based on the function attribute.
>>>>
>>>> I was able to get the function attribute from the init_cumulative_args
>>>> function.  I have used the fndecl tree to get the attribute details
>>>> but I have failed to stop generating br instruction. It should print
>>>> bk instruction.
>>>> I was unable to relate the super attribute from init_cumulative_args
>>>> to the branch pattern in md file to generate bk instruction.
>>>> I have intialized a global variable to 1 if super is detected and
>>>> checking the same in my pattern.
>>>>  My branch pattern looks like below
>>>> (define_insn "call_int1"
>>>>   [(call (mem (match_operand:SI 0 "call_insn_simple_operand" "ri"))
>>>>          (match_operand:SI 1 "" "i"))
>>>>   (clobber (reg:SI R_RS))]
>>>>  ""
>>>>   {
>>>>     register rtx t = operands[0];
>>>>     register rtx t2 = gen_rtx_REG (Pmode,
>>>>                               GP_REG_FIRST + RETURN_ADDR_REGNUM);
>>>>     if (GET_CODE (t) == SYMBOL_REF) {
>>>>         if(super_var())             ---------------> Here I am
>>>> checking for global variable
>>>>         {
>>>>         return "bk\tr1,8\;%#";
>>>>         }
>>>>         else {
>>>>         gen_rtx_CLOBBER (VOIDmode, t2);
>>>>         return "br\tr1,%0\;%#";
>>>>
>>>> I observed that init_cumulative_args is called first for all the
>>>> functions once they are done then the above pattern for all the
>>>> instructions are called so my global variable is not useful.
>>>>
>>>> Can you help me how to exactly emit bk instruction from the pattern
>>>> when super function is called.
>>>
>>>
>>> Again I just have to say: look at the rs6000 port.  Look at the rs6000
>>> call instruction.  Look at how it decides whether to do a longcall or
>>> not.
>>>
>>> Ian

Reply via email to