4 // Rodrigo Kumpera (rkumpera@novell.com)
6 // (C) 2008 Novell, Inc. (http://www.novell.com)
8 // Permission is hereby granted, free of charge, to any person obtaining
9 // a copy of this software and associated documentation files (the
10 // "Software"), to deal in the Software without restriction, including
11 // without limitation the rights to use, copy, modify, merge, publish,
12 // distribute, sublicense, and/or sell copies of the Software, and to
13 // permit persons to whom the Software is furnished to do so, subject to
14 // the following conditions:
16 // The above copyright notice and this permission notice shall be
17 // included in all copies or substantial portions of the Software.
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 using System.Runtime.InteropServices;
32 [StructLayout(LayoutKind.Explicit, Pack = 0, Size = 16)]
33 public struct Vector8s
52 public Vector8s (short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7)
64 public Vector8s (short s)
76 public short V0 { get { return v0; } set { v0 = value; } }
77 public short V1 { get { return v1; } set { v1 = value; } }
78 public short V2 { get { return v2; } set { v2 = value; } }
79 public short V3 { get { return v3; } set { v3 = value; } }
80 public short V4 { get { return v4; } set { v4 = value; } }
81 public short V5 { get { return v5; } set { v5 = value; } }
82 public short V6 { get { return v6; } set { v6 = value; } }
83 public short V7 { get { return v7; } set { v7 = value; } }
85 public static Vector8s Identity
87 get { return new Vector8s (1); }
90 public static Vector8s Zero
92 get { return new Vector8s (0); }
95 public static Vector8s MinusOne
97 get { return new Vector8s (-1); }
100 [System.Runtime.CompilerServices.IndexerName ("Component")]
101 public unsafe short this [int index]
104 if ((index | 0x7) != 0x7) //index < 0 || index > 7
105 throw new ArgumentOutOfRangeException ("index");
106 fixed (short *v = &v0) {
107 return * (v + index);
111 if ( (index | 0x7) != 0x7) //index < 0 || index > 7
112 throw new ArgumentOutOfRangeException ("index");
113 fixed (short *v = &v0) {
114 * (v + index) = value;
119 [Acceleration (AccelMode.SSE2)]
120 public static unsafe Vector8s operator + (Vector8s va, Vector8s vb)
122 Vector8s res = new Vector8s ();
126 for (int i = 0; i < 8; ++i)
127 *c++ = (short)(*a++ + *b++);
131 [Acceleration (AccelMode.SSE2)]
132 public static unsafe Vector8s operator - (Vector8s va, Vector8s vb)
134 Vector8s res = new Vector8s ();
138 for (int i = 0; i < 8; ++i)
139 *c++ = (short)(*a++ - *b++);
143 [Acceleration (AccelMode.SSE2)]
144 public static unsafe Vector8s operator * (Vector8s va, Vector8s vb)
146 Vector8s res = new Vector8s ();
150 for (int i = 0; i < 8; ++i)
151 *c++ = (short)(*a++ * (*b++));
155 [Acceleration (AccelMode.SSE2)]
156 public static unsafe Vector8s operator >> (Vector8s va, int amount)
158 Vector8s res = new Vector8s ();
161 for (int i = 0; i < 8; ++i)
162 *b++ = (short)(*a++ >> amount);
166 [Acceleration (AccelMode.SSE2)]
167 public static unsafe Vector8s operator << (Vector8s va, int amount)
169 Vector8s res = new Vector8s ();
172 for (int i = 0; i < 8; ++i)
173 *b++ = (short)(*a++ << amount);
177 [Acceleration (AccelMode.SSE2)]
178 public static unsafe Vector8s operator & (Vector8s va, Vector8s vb)
180 Vector8s res = new Vector8s ();
181 uint *a = (uint*) &va.v0;
182 uint *b = (uint*) &vb.v0;
183 uint *c = (uint*) &res.v0;
191 [Acceleration (AccelMode.SSE2)]
192 public static unsafe Vector8s operator | (Vector8s va, Vector8s vb)
194 Vector8s res = new Vector8s ();
195 uint *a = (uint*) &va.v0;
196 uint *b = (uint*) &vb.v0;
197 uint *c = (uint*) &res.v0;
205 [Acceleration (AccelMode.SSE2)]
206 public static unsafe Vector8s operator ^ (Vector8s va, Vector8s vb)
208 Vector8s res = new Vector8s ();
209 uint *a = (uint*) &va.v0;
210 uint *b = (uint*) &vb.v0;
211 uint *c = (uint*) &res.v0;
219 [Acceleration (AccelMode.SSE2)]
220 public unsafe static bool operator ==(Vector8s va, Vector8s vb)
224 for (int i = 0; i < 8; ++i)
230 [Acceleration (AccelMode.SSE2)]
231 public unsafe static bool operator !=(Vector8s va, Vector8s vb)
235 for (int i = 0; i < 8; ++i)
241 [Acceleration (AccelMode.SSE1)]
242 public static unsafe explicit operator Vector2d (Vector8s v)
244 Vector2d* p = (Vector2d*)&v;
248 [Acceleration (AccelMode.SSE1)]
249 public static unsafe explicit operator Vector4f (Vector8s v)
251 Vector4f* p = (Vector4f*)&v;
255 [Acceleration (AccelMode.SSE1)]
256 public static unsafe explicit operator Vector2l (Vector8s v)
258 Vector2l* p = (Vector2l*)&v;
262 [Acceleration (AccelMode.SSE1)]
263 [CLSCompliant(false)]
264 public static unsafe explicit operator Vector2ul (Vector8s v)
266 Vector2ul* p = (Vector2ul*)&v;
270 [Acceleration (AccelMode.SSE1)]
271 public static unsafe explicit operator Vector4i (Vector8s v)
273 Vector4i* p = (Vector4i*)&v;
277 [Acceleration (AccelMode.SSE1)]
278 [CLSCompliant(false)]
279 public static unsafe explicit operator Vector4ui (Vector8s v)
281 Vector4ui* p = (Vector4ui*)&v;
285 [Acceleration (AccelMode.SSE1)]
286 [CLSCompliant(false)]
287 public static unsafe explicit operator Vector8us (Vector8s v)
289 Vector8us* p = (Vector8us*)&v;
293 [Acceleration (AccelMode.SSE1)]
294 [CLSCompliant(false)]
295 public static unsafe explicit operator Vector16sb (Vector8s v)
297 Vector16sb* p = (Vector16sb*)&v;
301 [Acceleration (AccelMode.SSE1)]
302 public static unsafe explicit operator Vector16b (Vector8s v)
304 Vector16b* p = (Vector16b*)&v;
309 [Acceleration (AccelMode.SSE1)]
310 public static Vector8s LoadAligned (ref Vector8s v)
315 [Acceleration (AccelMode.SSE1)]
316 public static void StoreAligned (ref Vector8s res, Vector8s val)
321 [CLSCompliant(false)]
322 [Acceleration (AccelMode.SSE1)]
323 public static unsafe Vector8s LoadAligned (Vector8s *v)
328 [CLSCompliant(false)]
329 [Acceleration (AccelMode.SSE1)]
330 public static unsafe void StoreAligned (Vector8s *res, Vector8s val)
335 [Acceleration (AccelMode.SSE1)]
336 [CLSCompliant(false)]
337 public static void PrefetchTemporalAllCacheLevels (ref Vector8s res)
341 [Acceleration (AccelMode.SSE1)]
342 [CLSCompliant(false)]
343 public static void PrefetchTemporal1stLevelCache (ref Vector8s res)
347 [Acceleration (AccelMode.SSE1)]
348 [CLSCompliant(false)]
349 public static void PrefetchTemporal2ndLevelCache (ref Vector8s res)
353 [Acceleration (AccelMode.SSE1)]
354 [CLSCompliant(false)]
355 public static void PrefetchNonTemporal (ref Vector8s res)
359 [Acceleration (AccelMode.SSE1)]
360 [CLSCompliant(false)]
361 public static unsafe void PrefetchTemporalAllCacheLevels (Vector8s *res)
365 [Acceleration (AccelMode.SSE1)]
366 [CLSCompliant(false)]
367 public static unsafe void PrefetchTemporal1stLevelCache (Vector8s *res)
371 [Acceleration (AccelMode.SSE1)]
372 [CLSCompliant(false)]
373 public static unsafe void PrefetchTemporal2ndLevelCache (Vector8s *res)
377 [Acceleration (AccelMode.SSE1)]
378 [CLSCompliant(false)]
379 public static unsafe void PrefetchNonTemporal (Vector8s *res)
383 public override string ToString()
385 return "<" + v0 + ", " + v1 + ", " + v2 + ", " + v3 + ", " +
386 v4 + ", " + v5 + ", " + v6 + ", " + v7 + ">";