1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 using System.Runtime.Intrinsics;
8 namespace System.Runtime.Intrinsics.X86
11 /// This class provides access to Intel SSE hardware instructions via intrinsics
14 public abstract class Sse
18 public static bool IsSupported { get { return false; } }
20 public abstract class X64
24 public static bool IsSupported { get { return false; } }
27 /// __int64 _mm_cvtss_si64 (__m128 a)
28 /// CVTSS2SI r64, xmm/m32
29 /// This intrinisc is only available on 64-bit processes
31 public static long ConvertToInt64(Vector128<float> value) { throw new PlatformNotSupportedException(); }
33 /// __m128 _mm_cvtsi64_ss (__m128 a, __int64 b)
34 /// CVTSI2SS xmm, reg/m64
35 /// This intrinisc is only available on 64-bit processes
37 public static Vector128<float> ConvertScalarToVector128Single(Vector128<float> upper, long value) { throw new PlatformNotSupportedException(); }
40 /// __int64 _mm_cvttss_si64 (__m128 a)
41 /// CVTTSS2SI r64, xmm/m32
42 /// This intrinisc is only available on 64-bit processes
44 public static long ConvertToInt64WithTruncation(Vector128<float> value) { throw new PlatformNotSupportedException(); }
49 /// __m128 _mm_add_ps (__m128 a, __m128 b)
50 /// ADDPS xmm, xmm/m128
52 public static Vector128<float> Add(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
55 /// __m128 _mm_add_ss (__m128 a, __m128 b)
56 /// ADDSS xmm, xmm/m32
58 public static Vector128<float> AddScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
61 /// __m128 _mm_and_ps (__m128 a, __m128 b)
62 /// ANDPS xmm, xmm/m128
64 public static Vector128<float> And(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
67 /// __m128 _mm_andnot_ps (__m128 a, __m128 b)
68 /// ANDNPS xmm, xmm/m128
70 public static Vector128<float> AndNot(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
73 /// __m128 _mm_cmpeq_ps (__m128 a, __m128 b)
74 /// CMPPS xmm, xmm/m128, imm8(0)
76 public static Vector128<float> CompareEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
79 /// int _mm_comieq_ss (__m128 a, __m128 b)
80 /// COMISS xmm, xmm/m32
82 public static bool CompareEqualOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
85 /// int _mm_ucomieq_ss (__m128 a, __m128 b)
86 /// UCOMISS xmm, xmm/m32
88 public static bool CompareEqualUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
91 /// __m128 _mm_cmpeq_ss (__m128 a, __m128 b)
92 /// CMPSS xmm, xmm/m32, imm8(0)
94 public static Vector128<float> CompareEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
97 /// __m128 _mm_cmpgt_ps (__m128 a, __m128 b)
98 /// CMPPS xmm, xmm/m128, imm8(6)
100 public static Vector128<float> CompareGreaterThan(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
103 /// int _mm_comigt_ss (__m128 a, __m128 b)
104 /// COMISS xmm, xmm/m32
106 public static bool CompareGreaterThanOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
109 /// int _mm_ucomigt_ss (__m128 a, __m128 b)
110 /// UCOMISS xmm, xmm/m32
112 public static bool CompareGreaterThanUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
115 /// __m128 _mm_cmpgt_ss (__m128 a, __m128 b)
116 /// CMPSS xmm, xmm/m32, imm8(6)
118 public static Vector128<float> CompareGreaterThanScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
121 /// __m128 _mm_cmpge_ps (__m128 a, __m128 b)
122 /// CMPPS xmm, xmm/m128, imm8(5)
124 public static Vector128<float> CompareGreaterThanOrEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
127 /// int _mm_comige_ss (__m128 a, __m128 b)
128 /// COMISS xmm, xmm/m32
130 public static bool CompareGreaterThanOrEqualOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
133 /// int _mm_ucomige_ss (__m128 a, __m128 b)
134 /// UCOMISS xmm, xmm/m32
136 public static bool CompareGreaterThanOrEqualUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
139 /// __m128 _mm_cmpge_ss (__m128 a, __m128 b)
140 /// CMPPS xmm, xmm/m32, imm8(5)
142 public static Vector128<float> CompareGreaterThanOrEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
145 /// __m128 _mm_cmplt_ps (__m128 a, __m128 b)
146 /// CMPPS xmm, xmm/m128, imm8(1)
148 public static Vector128<float> CompareLessThan(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
151 /// int _mm_comilt_ss (__m128 a, __m128 b)
152 /// COMISS xmm, xmm/m32
154 public static bool CompareLessThanOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
157 /// int _mm_ucomilt_ss (__m128 a, __m128 b)
158 /// UCOMISS xmm, xmm/m32
160 public static bool CompareLessThanUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
163 /// __m128 _mm_cmplt_ss (__m128 a, __m128 b)
164 /// CMPSS xmm, xmm/m32, imm8(1)
166 public static Vector128<float> CompareLessThanScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
169 /// __m128 _mm_cmple_ps (__m128 a, __m128 b)
170 /// CMPPS xmm, xmm/m128, imm8(2)
172 public static Vector128<float> CompareLessThanOrEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
175 /// int _mm_comile_ss (__m128 a, __m128 b)
176 /// COMISS xmm, xmm/m32
178 public static bool CompareLessThanOrEqualOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
181 /// int _mm_ucomile_ss (__m128 a, __m128 b)
182 /// UCOMISS xmm, xmm/m32
184 public static bool CompareLessThanOrEqualUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
187 /// __m128 _mm_cmple_ss (__m128 a, __m128 b)
188 /// CMPSS xmm, xmm/m32, imm8(2)
190 public static Vector128<float> CompareLessThanOrEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
193 /// __m128 _mm_cmpneq_ps (__m128 a, __m128 b)
194 /// CMPPS xmm, xmm/m128, imm8(4)
196 public static Vector128<float> CompareNotEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
199 /// int _mm_comineq_ss (__m128 a, __m128 b)
200 /// COMISS xmm, xmm/m32
202 public static bool CompareNotEqualOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
205 /// int _mm_ucomineq_ss (__m128 a, __m128 b)
206 /// UCOMISS xmm, xmm/m32
208 public static bool CompareNotEqualUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
211 /// __m128 _mm_cmpneq_ss (__m128 a, __m128 b)
212 /// CMPSS xmm, xmm/m32, imm8(4)
214 public static Vector128<float> CompareNotEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
217 /// __m128 _mm_cmpngt_ps (__m128 a, __m128 b)
218 /// CMPPS xmm, xmm/m128, imm8(2)
220 public static Vector128<float> CompareNotGreaterThan(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
223 /// __m128 _mm_cmpngt_ss (__m128 a, __m128 b)
224 /// CMPSS xmm, xmm/m32, imm8(2)
226 public static Vector128<float> CompareNotGreaterThanScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
229 /// __m128 _mm_cmpnge_ps (__m128 a, __m128 b)
230 /// CMPPS xmm, xmm/m128, imm8(1)
232 public static Vector128<float> CompareNotGreaterThanOrEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
235 /// __m128 _mm_cmpnge_ss (__m128 a, __m128 b)
236 /// CMPSS xmm, xmm/m32, imm8(1)
238 public static Vector128<float> CompareNotGreaterThanOrEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
241 /// __m128 _mm_cmpnlt_ps (__m128 a, __m128 b)
242 /// CMPPS xmm, xmm/m128, imm8(5)
244 public static Vector128<float> CompareNotLessThan(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
247 /// __m128 _mm_cmpnlt_ss (__m128 a, __m128 b)
248 /// CMPSS xmm, xmm/m32, imm8(5)
250 public static Vector128<float> CompareNotLessThanScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
253 /// __m128 _mm_cmpnle_ps (__m128 a, __m128 b)
254 /// CMPPS xmm, xmm/m128, imm8(6)
256 public static Vector128<float> CompareNotLessThanOrEqual(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
259 /// __m128 _mm_cmpnle_ss (__m128 a, __m128 b)
260 /// CMPSS xmm, xmm/m32, imm8(6)
262 public static Vector128<float> CompareNotLessThanOrEqualScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
265 /// __m128 _mm_cmpord_ps (__m128 a, __m128 b)
266 /// CMPPS xmm, xmm/m128, imm8(7)
268 public static Vector128<float> CompareOrdered(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
271 /// __m128 _mm_cmpord_ss (__m128 a, __m128 b)
272 /// CMPSS xmm, xmm/m32, imm8(7)
274 public static Vector128<float> CompareOrderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
277 /// __m128 _mm_cmpunord_ps (__m128 a, __m128 b)
278 /// CMPPS xmm, xmm/m128, imm8(3)
280 public static Vector128<float> CompareUnordered(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
283 /// __m128 _mm_cmpunord_ss (__m128 a, __m128 b)
284 /// CMPSS xmm, xmm/m32, imm8(3)
286 public static Vector128<float> CompareUnorderedScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
289 /// int _mm_cvtss_si32 (__m128 a)
290 /// CVTSS2SI r32, xmm/m32
292 public static int ConvertToInt32(Vector128<float> value) { throw new PlatformNotSupportedException(); }
295 /// __m128 _mm_cvtsi32_ss (__m128 a, int b)
296 /// CVTSI2SS xmm, reg/m32
298 public static Vector128<float> ConvertScalarToVector128Single(Vector128<float> upper, int value) { throw new PlatformNotSupportedException(); }
301 /// int _mm_cvttss_si32 (__m128 a)
302 /// CVTTSS2SI r32, xmm/m32
304 public static int ConvertToInt32WithTruncation(Vector128<float> value) { throw new PlatformNotSupportedException(); }
307 /// __m128 _mm_div_ps (__m128 a, __m128 b)
308 /// DIVPS xmm, xmm/m128
310 public static Vector128<float> Divide(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
313 /// __m128 _mm_div_ss (__m128 a, __m128 b)
314 /// DIVSS xmm, xmm/m32
316 public static Vector128<float> DivideScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
319 /// __m128 _mm_loadu_ps (float const* mem_address)
322 public static unsafe Vector128<float> LoadVector128(float* address) { throw new PlatformNotSupportedException(); }
325 /// __m128 _mm_load_ss (float const* mem_address)
328 public static unsafe Vector128<float> LoadScalarVector128(float* address) { throw new PlatformNotSupportedException(); }
331 /// __m128 _mm_load_ps (float const* mem_address)
334 public static unsafe Vector128<float> LoadAlignedVector128(float* address) { throw new PlatformNotSupportedException(); }
337 /// __m128 _mm_loadh_pi (__m128 a, __m64 const* mem_addr)
340 public static unsafe Vector128<float> LoadHigh(Vector128<float> lower, float* address) { throw new PlatformNotSupportedException(); }
343 /// __m128 _mm_loadl_pi (__m128 a, __m64 const* mem_addr)
346 public static unsafe Vector128<float> LoadLow(Vector128<float> upper, float* address) { throw new PlatformNotSupportedException(); }
349 /// __m128 _mm_max_ps (__m128 a, __m128 b)
350 /// MAXPS xmm, xmm/m128
352 public static Vector128<float> Max(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
355 /// __m128 _mm_max_ss (__m128 a, __m128 b)
356 /// MAXSS xmm, xmm/m32
358 public static Vector128<float> MaxScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
361 /// __m128 _mm_min_ps (__m128 a, __m128 b)
362 /// MINPS xmm, xmm/m128
364 public static Vector128<float> Min(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
367 /// __m128 _mm_min_ss (__m128 a, __m128 b)
368 /// MINSS xmm, xmm/m32
370 public static Vector128<float> MinScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
373 /// __m128 _mm_move_ss (__m128 a, __m128 b)
376 public static Vector128<float> MoveScalar(Vector128<float> upper, Vector128<float> value) { throw new PlatformNotSupportedException(); }
379 /// __m128 _mm_movehl_ps (__m128 a, __m128 b)
382 public static Vector128<float> MoveHighToLow(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
385 /// __m128 _mm_movelh_ps (__m128 a, __m128 b)
388 public static Vector128<float> MoveLowToHigh(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
391 /// int _mm_movemask_ps (__m128 a)
392 /// MOVMSKPS reg, xmm
394 public static int MoveMask(Vector128<float> value) { throw new PlatformNotSupportedException(); }
397 /// __m128 _mm_mul_ps (__m128 a, __m128 b)
398 /// MULPS xmm, xmm/m128
400 public static Vector128<float> Multiply(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
403 /// __m128 _mm_mul_ss (__m128 a, __m128 b)
404 /// MULPS xmm, xmm/m32
406 public static Vector128<float> MultiplyScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
409 /// void _mm_prefetch(char* p, int i)
412 public static unsafe void Prefetch0(void* address) { throw new PlatformNotSupportedException(); }
415 /// void _mm_prefetch(char* p, int i)
418 public static unsafe void Prefetch1(void* address) { throw new PlatformNotSupportedException(); }
421 /// void _mm_prefetch(char* p, int i)
424 public static unsafe void Prefetch2(void* address) { throw new PlatformNotSupportedException(); }
427 /// void _mm_prefetch(char* p, int i)
430 public static unsafe void PrefetchNonTemporal(void* address) { throw new PlatformNotSupportedException(); }
433 /// __m128 _mm_or_ps (__m128 a, __m128 b)
434 /// ORPS xmm, xmm/m128
436 public static Vector128<float> Or(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
439 /// __m128 _mm_rcp_ps (__m128 a)
440 /// RCPPS xmm, xmm/m128
442 public static Vector128<float> Reciprocal(Vector128<float> value) { throw new PlatformNotSupportedException(); }
445 /// __m128 _mm_rcp_ss (__m128 a)
446 /// RCPSS xmm, xmm/m32
448 public static Vector128<float> ReciprocalScalar(Vector128<float> value) { throw new PlatformNotSupportedException(); }
451 /// __m128 _mm_rcp_ss (__m128 a, __m128 b)
452 /// RCPSS xmm, xmm/m32
453 /// The above native signature does not exist. We provide this additional overload for consistency with the other scalar APIs.
455 public static Vector128<float> ReciprocalScalar(Vector128<float> upper, Vector128<float> value) { throw new PlatformNotSupportedException(); }
458 /// __m128 _mm_rsqrt_ps (__m128 a)
459 /// RSQRTPS xmm, xmm/m128
461 public static Vector128<float> ReciprocalSqrt(Vector128<float> value) { throw new PlatformNotSupportedException(); }
464 /// __m128 _mm_rsqrt_ss (__m128 a)
465 /// RSQRTSS xmm, xmm/m32
467 public static Vector128<float> ReciprocalSqrtScalar(Vector128<float> value) { throw new PlatformNotSupportedException(); }
470 /// __m128 _mm_rsqrt_ss (__m128 a, __m128 b)
471 /// RSQRTSS xmm, xmm/m32
472 /// The above native signature does not exist. We provide this additional overload for consistency with the other scalar APIs.
474 public static Vector128<float> ReciprocalSqrtScalar(Vector128<float> upper, Vector128<float> value) { throw new PlatformNotSupportedException(); }
477 /// __m128 _mm_shuffle_ps (__m128 a, __m128 b, unsigned int control)
478 /// SHUFPS xmm, xmm/m128, imm8
480 public static Vector128<float> Shuffle(Vector128<float> left, Vector128<float> right, byte control) { throw new PlatformNotSupportedException(); }
483 /// __m128 _mm_sqrt_ps (__m128 a)
484 /// SQRTPS xmm, xmm/m128
486 public static Vector128<float> Sqrt(Vector128<float> value) { throw new PlatformNotSupportedException(); }
489 /// __m128 _mm_sqrt_ss (__m128 a)
490 /// SQRTSS xmm, xmm/m32
492 public static Vector128<float> SqrtScalar(Vector128<float> value) { throw new PlatformNotSupportedException(); }
495 /// __m128 _mm_sqrt_ss (__m128 a, __m128 b)
496 /// SQRTSS xmm, xmm/m32
497 /// The above native signature does not exist. We provide this additional overload for consistency with the other scalar APIs.
499 public static Vector128<float> SqrtScalar(Vector128<float> upper, Vector128<float> value) { throw new PlatformNotSupportedException(); }
502 /// void _mm_store_ps (float* mem_addr, __m128 a)
505 public static unsafe void StoreAligned(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
508 /// void _mm_stream_ps (float* mem_addr, __m128 a)
509 /// MOVNTPS m128, xmm
511 public static unsafe void StoreAlignedNonTemporal(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
514 /// void _mm_storeu_ps (float* mem_addr, __m128 a)
517 public static unsafe void Store(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
520 /// void _mm_sfence(void)
523 public static void StoreFence() { throw new PlatformNotSupportedException(); }
526 /// void _mm_store_ss (float* mem_addr, __m128 a)
529 public static unsafe void StoreScalar(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
532 /// void _mm_storeh_pi (__m64* mem_addr, __m128 a)
535 public static unsafe void StoreHigh(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
538 /// void _mm_storel_pi (__m64* mem_addr, __m128 a)
541 public static unsafe void StoreLow(float* address, Vector128<float> source) { throw new PlatformNotSupportedException(); }
544 /// __m128d _mm_sub_ps (__m128d a, __m128d b)
545 /// SUBPS xmm, xmm/m128
547 public static Vector128<float> Subtract(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
550 /// __m128 _mm_sub_ss (__m128 a, __m128 b)
551 /// SUBSS xmm, xmm/m32
553 public static Vector128<float> SubtractScalar(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
556 /// __m128 _mm_unpackhi_ps (__m128 a, __m128 b)
557 /// UNPCKHPS xmm, xmm/m128
559 public static Vector128<float> UnpackHigh(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
562 /// __m128 _mm_unpacklo_ps (__m128 a, __m128 b)
563 /// UNPCKLPS xmm, xmm/m128
565 public static Vector128<float> UnpackLow(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }
568 /// __m128 _mm_xor_ps (__m128 a, __m128 b)
569 /// XORPS xmm, xmm/m128
571 public static Vector128<float> Xor(Vector128<float> left, Vector128<float> right) { throw new PlatformNotSupportedException(); }