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. 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