I mention intrinsics because, according to Florian, someone is already developing support for them, although I can't remember the SVN repository off-hand.
P.S. If such generics were to be supported with my code, it would have to be akin to:
generic function ShufPS(aArg: TM128): TM128; vectorcall; assembler; nostackframe; inline; { I know, that's a lot of directives! } asm
SHUFPS XMM0, XMM0, N
end;
That may get messy in the compiler source very quickly, but depending on how well-liked my inline assembler code is, it might be something to look into and experiment with. One step at a time though.
There is an example of an intrinsic in one of the regression tests actually... tests/test/cg/tvectorcall3.pp contains a function that just calls ADDPS and has the "inline" directive - until now, "inline" was ignored with a compiler hint, but with my additions, now actually inlines the instruction.
Gareth aka. Kit
On Fri 15/03/19 13:37 , "Sven Barth" sent:
J. Gareth Moreton schrieb am Fr., 15. März 2019, 12:33: P.S. Though this feature can be used for implementing intrinsics, it is not a direct replacement for them because instructions like SHUFPS cannot be flexibly encoded due to its immediate operand (i.e. it has to be a raw number... it can't take its value from a parameter). That could maybe be managed once the support for constants as parameter for generics is added (note: I don't know right now how SHUFPS works, so take the following as pseudo code):
=== code begin ===
generic function ShufPS(aArg: Whatever): Whatever; inline;begin asm SHUFPS %xmm1, %xmm2, N end;end;
=== code end ===
As long as the assembler reader correctly handles constants for those parameters this could work as for each N the compiler creates a new function...
Regards,Sven
