core.simd woes

F i L witte2008 at gmail.com
Tue Aug 7 21:54:11 PDT 2012


F i L wrote:
> Okay, that makes a lot of sense and is inline with what I was 
> reading last night about FPU/SSE assembly code. However I'm 
> also a bit confused. At some point, like in your hightmap 
> example, I'm going to need to do arithmetic work on single 
> vector components. Is there some sort of SSE arithmetic/shuffle 
> instruction which uses "masking" that I should use to isolate 
> and manipulate components?
>
> If not, and manipulating components is just bad for performance 
> reasons, then I've figured out a solution to my original 
> concern. By using this code:
>
> @property @trusted pure nothrow
> {
>   auto ref x(T:float4)(auto ref T v) { return v.ptr[0]; }
>   auto ref y(T:float4)(auto ref T v) { return v.ptr[1]; }
>   auto ref z(T:float4)(auto ref T v) { return v.ptr[2]; }
>   auto ref w(T:float4)(auto ref T v) { return v.ptr[3]; }
>
>   void x(T:float4)(ref float4 v, float val) { v.ptr[0] = val; }
>   void y(T:float4)(ref float4 v, float val) { v.ptr[1] = val; }
>   void z(T:float4)(ref float4 v, float val) { v.ptr[2] = val; }
>   void w(T:float4)(ref float4 v, float val) { v.ptr[3] = val; }
> }
>
> I am able to perform arithmetic on single components:
>
>     auto vec = Vectors.float4(x, y, 0, 1); // factory
>     vec.x += scalar; // += components
>
> again, I'll abandon this approach if there's a better way to 
> manipulate single components, like you mentioned above. I'm 
> just not aware of how to do that using SSE instructions alone. 
> I'll do more research, but would appreciate any insight you can 
> give.


Okay, disregard this. I see you where talking about your function 
in std.simd (setY), and I'm referring to that for an example of 
the appropriate vector functions.


More information about the Digitalmars-d mailing list