2011/3/22 Ian Lance Taylor <i...@google.com>:
> roy rosen <roy.1ro...@gmail.com> writes:
>
>> 2010/10/26 Ian Lance Taylor <i...@google.com>:
>>> roy rosen <roy.1ro...@gmail.com> writes:
>>>
>>>> I am trying to demonstrate my port capabilities.
>>>> I am writing an application which needs to use instructions like max
>>>> a,b,c,d,e,f where a,b,c are inputs and d,e,f are outputs.
>>>> Is that possible to write an intrinsic function for that?
>>>> I think not because that means that I need to pass d,e,f by reference
>>>> which means that they would be in memory and not in a register as
>>>> meant by the instruction.
>>>
>>> That is correct.  An intrinsic function is a normal function.  If you
>>> want it to have multiple outputs, you need to pass in addresses, or you
>>> need to have it return a struct.
>>>
>>> I'm a bit curious as to why a function named max would have multiple
>>> outputs.
>>>
>>>> Is there any port with such an example?
>>>
>>> Not to my knowledge.  I wrote a private port in which some intrinsics
>>> returned a struct, and to keep everything out of memory I added
>>> additional intrinsics to retrieve elements of the struct.  It's awkward
>>> to use but the resulting code is fine.
>>>
>> Can you please explain how this solution should work?
>> First a code with memory accesses would be generated and then
>> optimizations would optimize it to use registers directly?
>
> You build a RECORD_TYPE holding the fields you want to return.  You
> define the appropriate builtin functions to return that record type.

How is that done? using define_insn? How do I tell it to return a struct?
Is there an example I can look at?

Roy.

> You define another builtin function for each field, which takes the
> RECORD_TYPE as its argument and returns the type of the field.  In
> TARGET_FOLD_BUILTIN you convert the per-field functions into
> COMPONENT_REFs.
>
> Ian
>

Reply via email to