This is the mail archive of the
mailing list for the GCC project.
Re: Replacing certain operations with function calls
I have looked at how other targest use the
init_builtins/expand_builtins. Of course, I don't understand
everything there but it seems indeed to be more for generating a
series of instructions instead of a function call. I haven't seen
anything resembling what I want to do.
I had also first thought of going directly in the define_expand and
expanding to the function call I would want. The problem I have is
that it is unclear to me how to handle (set-up) the arguments of the
builtin_function I am trying to define.
To go from no function call to :
- Potentially spill output registers
- Potentially spill scratch registers
- Setup output registers with the operands
- Perform function call
- Copy return to output operand
- Potentially restore scratch registers
- Potentially restore output registers
Seems a bit difficult to do at the define_expand level and might not
generate good code. I guess I could potentially perform a pass in the
tree representation to do what I am looking for but I am not sure that
that is the best solution either.
For the moment, I will continue looking at what you suggest and also
see if my solution works. I see that, for example, the compiler will
not always generate the call I need to change. Therefore, it does seem
that I need another solution than the one I propose.
I'm more and more considering a pass in the middle-end to get what I
need. Do you think this is better?
Thanks for your input,
On Tue, Sep 1, 2009 at 12:34 PM, Ian Lance Taylor<email@example.com> wrote:
> Jean Christophe Beyler <firstname.lastname@example.org> writes:
>> I have been also been looking into how to generate a function call for
>> certain operations. I've looked at various other targets for a similar
>> problem/solution but have not seen anything. On my target
>> architecture, we have certain optimized versions of the multiplication
>> for example.
>> I wanted to replace certain mutliplications with a function call. The
>> solution I found was to do perform a FAIL on the define_expand of the
>> multiplication for these cases. This forces the compiler to generate a
>> function call to __multdi3.
>> I then go in the define_expand of the function call and check the
>> symbol_ref to see what function is called. I can then modify the call
>> at that point.
>> My question is: is this a good approach or is there another solution
>> that you would use?
> I think that what you describe will work. ?I would probably generate a
> call to a builtin function in the define_expand. ?Look for the way
> targets use init_builtins and expand_builtin. ?Normally expand_builtin
> expands to some target-specific RTL, but it can expand to a function
> call too.