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)]
34 public struct Vector8us
53 public Vector8us (ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7)
65 public Vector8us (ushort us)
77 public ushort V0 { get { return v0; } set { v0 = value; } }
78 public ushort V1 { get { return v1; } set { v1 = value; } }
79 public ushort V2 { get { return v2; } set { v2 = value; } }
80 public ushort V3 { get { return v3; } set { v3 = value; } }
81 public ushort V4 { get { return v4; } set { v4 = value; } }
82 public ushort V5 { get { return v5; } set { v5 = value; } }
83 public ushort V6 { get { return v6; } set { v6 = value; } }
84 public ushort V7 { get { return v7; } set { v7 = value; } }
86 public static Vector8us Identity
88 get { return new Vector8us (1); }
91 public static Vector8us Zero
93 get { return new Vector8us (0); }
96 [System.Runtime.CompilerServices.IndexerName ("Component")]
97 public unsafe ushort this [int index]
100 if ((index | 0x7) != 0x7) //index < 0 || index > 7
101 throw new ArgumentOutOfRangeException ("index");
102 fixed (ushort *v = &v0) {
103 return * (v + index);
107 if ( (index | 0x7) != 0x7) //index < 0 || index > 7
108 throw new ArgumentOutOfRangeException ("index");
109 fixed (ushort *v = &v0) {
110 * (v + index) = value;
115 [Acceleration (AccelMode.SSE2)]
116 public static unsafe Vector8us operator + (Vector8us va, Vector8us vb)
118 Vector8us res = new Vector8us ();
122 for (int i = 0; i < 8; ++i)
123 *c++ = (ushort)(*a++ + *b++);
127 [Acceleration (AccelMode.SSE2)]
128 public static unsafe Vector8us operator - (Vector8us va, Vector8us vb)
130 Vector8us res = new Vector8us ();
134 for (int i = 0; i < 8; ++i)
135 *c++ = (ushort)(*a++ - *b++);
140 * NOTE: Thou pmullw states it does signed multiplication, it works for unsigned numbers
141 * if only the lower part is considered and the flags disregarded.
143 [Acceleration (AccelMode.SSE2)]
144 public static unsafe Vector8us operator * (Vector8us va, Vector8us vb)
146 Vector8us res = new Vector8us ();
150 for (int i = 0; i < 8; ++i)
151 *c++ = (ushort)(*a++ * (*b++));
155 [Acceleration (AccelMode.SSE2)]
156 public static unsafe Vector8us operator >> (Vector8us va, int amount)
158 Vector8us res = new Vector8us ();
161 for (int i = 0; i < 8; ++i)
162 *b++ = (ushort)(*a++ >> amount);
166 [Acceleration (AccelMode.SSE2)]
167 public static unsafe Vector8us operator << (Vector8us va, int amount)
169 Vector8us res = new Vector8us ();
172 for (int i = 0; i < 8; ++i)
173 *b++ = (ushort)(*a++ << amount);
177 [Acceleration (AccelMode.SSE2)]
178 public static unsafe Vector8us operator & (Vector8us va, Vector8us vb)
180 Vector8us res = new Vector8us ();
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 Vector8us operator | (Vector8us va, Vector8us vb)
194 Vector8us res = new Vector8us ();
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 Vector8us operator ^ (Vector8us va, Vector8us vb)
208 Vector8us res = new Vector8us ();
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 ==(Vector8us va, Vector8us vb)
224 for (int i = 0; i < 8; ++i)
230 [Acceleration (AccelMode.SSE2)]
231 public unsafe static bool operator !=(Vector8us va, Vector8us vb)
235 for (int i = 0; i < 8; ++i)
241 [Acceleration (AccelMode.SSE1)]
242 public static unsafe explicit operator Vector2d (Vector8us v)
244 Vector2d* p = (Vector2d*)&v;
248 [Acceleration (AccelMode.SSE1)]
249 public static unsafe explicit operator Vector4f (Vector8us v)
251 Vector4f* p = (Vector4f*)&v;
255 [Acceleration (AccelMode.SSE1)]
256 public static unsafe explicit operator Vector2l (Vector8us v)
258 Vector2l* p = (Vector2l*)&v;
262 [Acceleration (AccelMode.SSE1)]
263 public static unsafe explicit operator Vector2ul (Vector8us v)
265 Vector2ul* p = (Vector2ul*)&v;
269 [Acceleration (AccelMode.SSE1)]
270 public static unsafe explicit operator Vector4i (Vector8us v)
272 Vector4i* p = (Vector4i*)&v;
276 [Acceleration (AccelMode.SSE1)]
277 public static unsafe explicit operator Vector4ui (Vector8us v)
279 Vector4ui* p = (Vector4ui*)&v;
283 [Acceleration (AccelMode.SSE1)]
284 public static unsafe explicit operator Vector8s (Vector8us v)
286 Vector8s* p = (Vector8s*)&v;
290 [Acceleration (AccelMode.SSE1)]
291 public static unsafe explicit operator Vector16sb (Vector8us v)
293 Vector16sb* p = (Vector16sb*)&v;
297 [Acceleration (AccelMode.SSE1)]
298 public static unsafe explicit operator Vector16b (Vector8us v)
300 Vector16b* p = (Vector16b*)&v;
305 [Acceleration (AccelMode.SSE1)]
306 public static Vector8us LoadAligned (ref Vector8us v)
311 [Acceleration (AccelMode.SSE1)]
312 public static void StoreAligned (ref Vector8us res, Vector8us val)
317 [Acceleration (AccelMode.SSE1)]
318 public static unsafe Vector8us LoadAligned (Vector8us *v)
323 [Acceleration (AccelMode.SSE1)]
324 public static unsafe void StoreAligned (Vector8us *res, Vector8us val)
329 [Acceleration (AccelMode.SSE1)]
330 [CLSCompliant(false)]
331 public static void PrefetchTemporalAllCacheLevels (ref Vector8us res)
335 [Acceleration (AccelMode.SSE1)]
336 [CLSCompliant(false)]
337 public static void PrefetchTemporal1stLevelCache (ref Vector8us res)
341 [Acceleration (AccelMode.SSE1)]
342 [CLSCompliant(false)]
343 public static void PrefetchTemporal2ndLevelCache (ref Vector8us res)
347 [Acceleration (AccelMode.SSE1)]
348 [CLSCompliant(false)]
349 public static void PrefetchNonTemporal (ref Vector8us res)
353 [Acceleration (AccelMode.SSE1)]
354 [CLSCompliant(false)]
355 public static unsafe void PrefetchTemporalAllCacheLevels (Vector8us *res)
359 [Acceleration (AccelMode.SSE1)]
360 [CLSCompliant(false)]
361 public static unsafe void PrefetchTemporal1stLevelCache (Vector8us *res)
365 [Acceleration (AccelMode.SSE1)]
366 [CLSCompliant(false)]
367 public static unsafe void PrefetchTemporal2ndLevelCache (Vector8us *res)
371 [Acceleration (AccelMode.SSE1)]
372 [CLSCompliant(false)]
373 public static unsafe void PrefetchNonTemporal (Vector8us *res)
377 public override string ToString()
379 return "<" + v0 + ", " + v1 + ", " + v2 + ", " + v3 + ", " +
380 v4 + ", " + v5 + ", " + v6 + ", " + v7 + ">";