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 [Obsolete ("Use the types in the System.Numerics.Vectors namespace")]
33 [StructLayout(LayoutKind.Explicit, Pack = 0, Size = 16)]
34 public struct Vector8s
53 public Vector8s (short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7)
65 public Vector8s (short s)
77 public short V0 { get { return v0; } set { v0 = value; } }
78 public short V1 { get { return v1; } set { v1 = value; } }
79 public short V2 { get { return v2; } set { v2 = value; } }
80 public short V3 { get { return v3; } set { v3 = value; } }
81 public short V4 { get { return v4; } set { v4 = value; } }
82 public short V5 { get { return v5; } set { v5 = value; } }
83 public short V6 { get { return v6; } set { v6 = value; } }
84 public short V7 { get { return v7; } set { v7 = value; } }
86 public static Vector8s Identity
88 get { return new Vector8s (1); }
91 public static Vector8s Zero
93 get { return new Vector8s (0); }
96 public static Vector8s MinusOne
98 get { return new Vector8s (-1); }
101 [System.Runtime.CompilerServices.IndexerName ("Component")]
102 public unsafe short this [int index]
105 if ((index | 0x7) != 0x7) //index < 0 || index > 7
106 throw new ArgumentOutOfRangeException ("index");
107 fixed (short *v = &v0) {
108 return * (v + index);
112 if ( (index | 0x7) != 0x7) //index < 0 || index > 7
113 throw new ArgumentOutOfRangeException ("index");
114 fixed (short *v = &v0) {
115 * (v + index) = value;
120 [Acceleration (AccelMode.SSE2)]
121 public static unsafe Vector8s operator + (Vector8s va, Vector8s vb)
123 Vector8s res = new Vector8s ();
127 for (int i = 0; i < 8; ++i)
128 *c++ = (short)(*a++ + *b++);
132 [Acceleration (AccelMode.SSE2)]
133 public static unsafe Vector8s operator - (Vector8s va, Vector8s vb)
135 Vector8s res = new Vector8s ();
139 for (int i = 0; i < 8; ++i)
140 *c++ = (short)(*a++ - *b++);
144 [Acceleration (AccelMode.SSE2)]
145 public static unsafe Vector8s operator * (Vector8s va, Vector8s vb)
147 Vector8s res = new Vector8s ();
151 for (int i = 0; i < 8; ++i)
152 *c++ = (short)(*a++ * (*b++));
156 [Acceleration (AccelMode.SSE2)]
157 public static unsafe Vector8s operator >> (Vector8s va, int amount)
159 Vector8s res = new Vector8s ();
162 for (int i = 0; i < 8; ++i)
163 *b++ = (short)(*a++ >> amount);
167 [Acceleration (AccelMode.SSE2)]
168 public static unsafe Vector8s operator << (Vector8s va, int amount)
170 Vector8s res = new Vector8s ();
173 for (int i = 0; i < 8; ++i)
174 *b++ = (short)(*a++ << amount);
178 [Acceleration (AccelMode.SSE2)]
179 public static unsafe Vector8s operator & (Vector8s va, Vector8s vb)
181 Vector8s res = new Vector8s ();
182 uint *a = (uint*) &va.v0;
183 uint *b = (uint*) &vb.v0;
184 uint *c = (uint*) &res.v0;
192 [Acceleration (AccelMode.SSE2)]
193 public static unsafe Vector8s operator | (Vector8s va, Vector8s vb)
195 Vector8s res = new Vector8s ();
196 uint *a = (uint*) &va.v0;
197 uint *b = (uint*) &vb.v0;
198 uint *c = (uint*) &res.v0;
206 [Acceleration (AccelMode.SSE2)]
207 public static unsafe Vector8s operator ^ (Vector8s va, Vector8s vb)
209 Vector8s res = new Vector8s ();
210 uint *a = (uint*) &va.v0;
211 uint *b = (uint*) &vb.v0;
212 uint *c = (uint*) &res.v0;
220 [Acceleration (AccelMode.SSE2)]
221 public unsafe static bool operator ==(Vector8s va, Vector8s vb)
225 for (int i = 0; i < 8; ++i)
231 [Acceleration (AccelMode.SSE2)]
232 public unsafe static bool operator !=(Vector8s va, Vector8s vb)
236 for (int i = 0; i < 8; ++i)
242 [Acceleration (AccelMode.SSE1)]
243 public static unsafe explicit operator Vector2d (Vector8s v)
245 Vector2d* p = (Vector2d*)&v;
249 [Acceleration (AccelMode.SSE1)]
250 public static unsafe explicit operator Vector4f (Vector8s v)
252 Vector4f* p = (Vector4f*)&v;
256 [Acceleration (AccelMode.SSE1)]
257 public static unsafe explicit operator Vector2l (Vector8s v)
259 Vector2l* p = (Vector2l*)&v;
263 [Acceleration (AccelMode.SSE1)]
264 [CLSCompliant(false)]
265 public static unsafe explicit operator Vector2ul (Vector8s v)
267 Vector2ul* p = (Vector2ul*)&v;
271 [Acceleration (AccelMode.SSE1)]
272 public static unsafe explicit operator Vector4i (Vector8s v)
274 Vector4i* p = (Vector4i*)&v;
278 [Acceleration (AccelMode.SSE1)]
279 [CLSCompliant(false)]
280 public static unsafe explicit operator Vector4ui (Vector8s v)
282 Vector4ui* p = (Vector4ui*)&v;
286 [Acceleration (AccelMode.SSE1)]
287 [CLSCompliant(false)]
288 public static unsafe explicit operator Vector8us (Vector8s v)
290 Vector8us* p = (Vector8us*)&v;
294 [Acceleration (AccelMode.SSE1)]
295 [CLSCompliant(false)]
296 public static unsafe explicit operator Vector16sb (Vector8s v)
298 Vector16sb* p = (Vector16sb*)&v;
302 [Acceleration (AccelMode.SSE1)]
303 public static unsafe explicit operator Vector16b (Vector8s v)
305 Vector16b* p = (Vector16b*)&v;
310 [Acceleration (AccelMode.SSE1)]
311 public static Vector8s LoadAligned (ref Vector8s v)
316 [Acceleration (AccelMode.SSE1)]
317 public static void StoreAligned (ref Vector8s res, Vector8s val)
322 [CLSCompliant(false)]
323 [Acceleration (AccelMode.SSE1)]
324 public static unsafe Vector8s LoadAligned (Vector8s *v)
329 [CLSCompliant(false)]
330 [Acceleration (AccelMode.SSE1)]
331 public static unsafe void StoreAligned (Vector8s *res, Vector8s val)
336 [Acceleration (AccelMode.SSE1)]
337 [CLSCompliant(false)]
338 public static void PrefetchTemporalAllCacheLevels (ref Vector8s res)
342 [Acceleration (AccelMode.SSE1)]
343 [CLSCompliant(false)]
344 public static void PrefetchTemporal1stLevelCache (ref Vector8s res)
348 [Acceleration (AccelMode.SSE1)]
349 [CLSCompliant(false)]
350 public static void PrefetchTemporal2ndLevelCache (ref Vector8s res)
354 [Acceleration (AccelMode.SSE1)]
355 [CLSCompliant(false)]
356 public static void PrefetchNonTemporal (ref Vector8s res)
360 [Acceleration (AccelMode.SSE1)]
361 [CLSCompliant(false)]
362 public static unsafe void PrefetchTemporalAllCacheLevels (Vector8s *res)
366 [Acceleration (AccelMode.SSE1)]
367 [CLSCompliant(false)]
368 public static unsafe void PrefetchTemporal1stLevelCache (Vector8s *res)
372 [Acceleration (AccelMode.SSE1)]
373 [CLSCompliant(false)]
374 public static unsafe void PrefetchTemporal2ndLevelCache (Vector8s *res)
378 [Acceleration (AccelMode.SSE1)]
379 [CLSCompliant(false)]
380 public static unsafe void PrefetchNonTemporal (Vector8s *res)
384 public override string ToString()
386 return "<" + v0 + ", " + v1 + ", " + v2 + ", " + v3 + ", " +
387 v4 + ", " + v5 + ", " + v6 + ", " + v7 + ">";