__restrict, architecture intrinsics vs asm, consoles, and other

Peter Alexander peter.alexander.au at gmail.com
Thu Sep 22 10:26:47 PDT 2011


On 22/09/11 7:39 AM, Don wrote:
> On 22.09.2011 05:24, a wrote:
>> How would one do something like this without intrinsics (the code is
>> c++ using
>> gcc vector extensions):
>
> [snip]
> At present, you can't do it without ultimately resorting to inline asm.
> But, what we've done is to move SIMD into the machine model: the D
> machine model assumes that float[4] + float[4] is a more efficient
> operation than a loop.
> Currently, only arithmetic operations are implemented, and on DMD at
> least, they're still not proper intrinsics. So in the long term it'll be
> possible to do it directly, but not yet.
>
> At various times, several of us have implemented 'swizzle' using CTFE,
> giving you a syntax like:
>
> float[4] x, y;
> x[] = y[].swizzle!"cdcd"();
> // x[0]=y[2], x[1]=y[3], x[2]=y[2], x[3]=y[3]
>
> which compiles to a single shufps instruction.

How can it compile into a single shufps? x and y would need to already 
be in vector registers, and unless I've missed something, they won't be. 
You'll need instructions for loading into registers (using the slow 
movups because 16-byte alignment isn't guaranteed) then do the shufps, 
then load back out again.

This is too slow for performance critical code.

Being stored in XMM registers from creation, passed and returned in XMM 
registers to/from functions is a key requirement for this sort of code. 
If you have to keep loading in and out of memory then you lose all 
performance.




More information about the Digitalmars-d mailing list