/+ Copyright (c) 2008, Trevor Parscal Module: Prototype Application +/ module demos.Vector; /* Imports */ import tango.io.Stdout; /* Structures */ // Struct with an Array struct float4a { align(16) float[4] v; static float4a opCall(float x, float y, float z, float w) { float4a v; v.v[0] = x; v.v[1] = y; v.v[2] = z; v.v[3] = w; return v; } } // Struct with Fields struct float4f { align(16) { float x; float y; float z; float w; } static float4f opCall(float x, float y, float z, float w) { float4f v; v.x = x; v.y = y; v.z = z; v.w = w; return v; } } /* Functions */ void main() { Stdout.formatln("ASM Paralell Operations"); // ASM with Dynamic Arrays { float[] a = [1.1, 2.2, 3.3, 4.4]; float[] b = [100.0, 200.0, 300.0, 400.0]; float[] c = [0.0, 0.0, 0.0, 0.0]; try { asm { mov EAX, a + 4; movaps XMM1, [EAX]; mov EAX, b + 4; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov c + 4, EAX; } Stdout.formatln("\tDynamic Array\t\t{}", c); } catch(Exception e) { Stdout.formatln("\tDynamic Array\t\t{}", e.toString); } } // ASM with Static Arrays { float[4] a = [1.1, 2.2, 3.3, 4.4]; float[4] b = [100.0, 200.0, 300.0, 400.0]; float[4] c = [0.0, 0.0, 0.0, 0.0]; float* _a = a.ptr; float* _b = b.ptr; float* _c = c.ptr; try { asm { mov EAX, _a; movaps XMM1, [EAX]; mov EAX, _b; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov _c, EAX; } Stdout.formatln("\tStatic Array\t\t{}", c); } catch(Exception e) { Stdout.formatln("\tStatic Array\t\t{}", e.toString); } } // ASM with Structs of Static Arrays on the heap { float4a* a = new float4a; float4a* b = new float4a; float4a* c = new float4a; *a = float4a(1.1, 2.2, 3.3, 4.4); *b = float4a(100.0, 200.0, 300.0, 400.0); *c = float4a(0.0, 0.0, 0.0, 0.0); try { asm { mov EAX, a; movaps XMM1, [EAX]; mov EAX, b; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov c, EAX; } Stdout.formatln("\tStruct->Array on Heap\t{}", c.v); } catch(Exception e) { Stdout.formatln("\tStruct->Array on Heap\t{}", e.toString); } } // ASM with Structs of Fields on the heap { float4f* a = new float4f; float4f* b = new float4f; float4f* c = new float4f; *a = float4f(1.1, 2.2, 3.3, 4.4); *b = float4f(100.0, 200.0, 300.0, 400.0); *c = float4f(0.0, 0.0, 0.0, 0.0); try { asm { mov EAX, a; movaps XMM1, [EAX]; mov EAX, b; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov c, EAX; } Stdout.formatln("\tStruct->Fields on Heap\t[ {}, {}, {}, {} ]", c.x, c.y, c.z, c.w); } catch(Exception e) { Stdout.formatln("\tStruct->Fields on Heap\t{}", e.toString); } } // ASM with Structs of Static Arrays on the stack { float4a a = float4a(1.1, 2.2, 3.3, 4.4); float4a b = float4a(100.0, 200.0, 300.0, 400.0); float4a c = float4a(0.0, 0.0, 0.0, 0.0); float* _a = cast(float*)&a; float* _b = cast(float*)&b; float* _c = cast(float*)&c; try { asm { mov EAX, _a; movaps XMM1, [EAX]; mov EAX, _b; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov _c, EAX; } Stdout.formatln("\tStruct->Array on Stack\t{}", c.v); } catch(Exception e) { Stdout.formatln("\tStruct->Array on Stack\t{}", e.toString); } } // ASM with Structs of Fields on the stack { float4f a = float4f(1.1, 2.2, 3.3, 4.4); float4f b = float4f(100.0, 200.0, 300.0, 400.0); float4f c = float4f(0.0, 0.0, 0.0, 0.0); float* _a = cast(float*)&a; float* _b = cast(float*)&b; float* _c = cast(float*)&c; try { asm { mov EAX, _a; movaps XMM1, [EAX]; mov EAX, _b; movaps XMM2, [EAX]; addps XMM1, XMM2; movaps [EAX], XMM1; mov _c, EAX; } Stdout.formatln("\tStruct->Fields on Stack\t[ {}, {}, {}, {} ]", c.x, c.y, c.z, c.w); } catch(Exception e) { Stdout.formatln("\tStruct->Fields on Stack\t{}", e.toString); } } Stdout.formatln("D Serial Operations"); // D with Dynamic Arrays { float[] a = [1.1, 2.2, 3.3, 4.4]; float[] b = [100.0, 200.0, 300.0, 400.0]; float[] c = [0.0, 0.0, 0.0, 0.0]; c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; c[3] = a[3] + b[3]; Stdout.formatln("\tDynamic Array\t\t{}", c); } // D with Static Arrays { float[4] a = [1.1, 2.2, 3.3, 4.4]; float[4] b = [100.0, 200.0, 300.0, 400.0]; float[4] c = [0.0, 0.0, 0.0, 0.0]; c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; c[3] = a[3] + b[3]; Stdout.formatln("\tStatic Array\t\t{}", c); } // D with Structs of Static Arrays on the heap { float4a* a = new float4a; float4a* b = new float4a; float4a* c = new float4a; *a = float4a(1.1, 2.2, 3.3, 4.4); *b = float4a(100.0, 200.0, 300.0, 400.0); *c = float4a(0.0, 0.0, 0.0, 0.0); c.v[0] = a.v[0] + b.v[0]; c.v[1] = a.v[1] + b.v[1]; c.v[2] = a.v[2] + b.v[2]; c.v[3] = a.v[3] + b.v[3]; Stdout.formatln("\tStruct->Array on Heap\t{}", c.v); } // D with Structs of Fields on the heap { float4f* a = new float4f; float4f* b = new float4f; float4f* c = new float4f; *a = float4f(1.1, 2.2, 3.3, 4.4); *b = float4f(100.0, 200.0, 300.0, 400.0); *c = float4f(0.0, 0.0, 0.0, 0.0); c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; c.w = a.w + b.w; Stdout.formatln("\tStruct->Fields on Heap\t[ {}, {}, {}, {} ]", c.x, c.y, c.z, c.w); } // D with Structs of Static Arrays on the stack { float4a a = float4a(1.1, 2.2, 3.3, 4.4); float4a b = float4a(100.0, 200.0, 300.0, 400.0); float4a c = float4a(0.0, 0.0, 0.0, 0.0); c.v[0] = a.v[0] + b.v[0]; c.v[1] = a.v[1] + b.v[1]; c.v[2] = a.v[2] + b.v[2]; c.v[3] = a.v[3] + b.v[3]; Stdout.formatln("\tStruct->Array on Stack\t{}", c.v); } // D with Structs of Fields on the stack { float4f a = float4f(1.1, 2.2, 3.3, 4.4); float4f b = float4f(100.0, 200.0, 300.0, 400.0); float4f c = float4f(0.0, 0.0, 0.0, 0.0); c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; c.w = a.w + b.w; Stdout.formatln("\tStruct->Fields on Stack\t[ {}, {}, {}, {} ]", c.x, c.y, c.z, c.w); } }