// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Runtime.CompilerServices;
using System.Runtime.Intrinsics;
namespace System.Runtime.Intrinsics.X86
{
///
/// This class provides access to Intel SSE2 hardware instructions via intrinsics
///
[CLSCompliant(false)]
public abstract class Sse2 : Sse
{
internal Sse2() { }
public new static bool IsSupported { get => IsSupported; }
public new abstract class X64 : Sse.X64
{
internal X64() { }
public new static bool IsSupported { get => IsSupported; }
///
/// __int64 _mm_cvtsd_si64 (__m128d a)
/// CVTSD2SI r64, xmm/m64
/// This intrinisc is only available on 64-bit processes
///
public static long ConvertToInt64(Vector128 value) => ConvertToInt64(value);
///
/// __int64 _mm_cvtsi128_si64 (__m128i a)
/// MOVQ reg/m64, xmm
/// This intrinisc is only available on 64-bit processes
///
public static long ConvertToInt64(Vector128 value) => ConvertToInt64(value);
///
/// __int64 _mm_cvtsi128_si64 (__m128i a)
/// MOVQ reg/m64, xmm
/// This intrinisc is only available on 64-bit processes
///
public static ulong ConvertToUInt64(Vector128 value) => ConvertToUInt64(value);
///
/// __m128d _mm_cvtsi64_sd (__m128d a, __int64 b)
/// CVTSI2SD xmm, reg/m64
/// This intrinisc is only available on 64-bit processes
///
public static Vector128 ConvertScalarToVector128Double(Vector128 upper, long value) => ConvertScalarToVector128Double(upper, value);
///
/// __m128i _mm_cvtsi64_si128 (__int64 a)
/// MOVQ xmm, reg/m64
/// This intrinisc is only available on 64-bit processes
///
public static Vector128 ConvertScalarToVector128Int64(long value) => ConvertScalarToVector128Int64(value);
///
/// __m128i _mm_cvtsi64_si128 (__int64 a)
/// MOVQ xmm, reg/m64
/// This intrinisc is only available on 64-bit processes
///
public static Vector128 ConvertScalarToVector128UInt64(ulong value) => ConvertScalarToVector128UInt64(value);
///
/// __int64 _mm_cvttsd_si64 (__m128d a)
/// CVTTSD2SI reg, xmm/m64
/// This intrinisc is only available on 64-bit processes
///
public static long ConvertToInt64WithTruncation(Vector128 value) => ConvertToInt64WithTruncation(value);
///
/// void _mm_stream_si64(__int64 *p, __int64 a)
/// MOVNTI m64, r64
/// This intrinisc is only available on 64-bit processes
///
public static unsafe void StoreNonTemporal(long* address, long value) => StoreNonTemporal(address, value);
///
/// void _mm_stream_si64(__int64 *p, __int64 a)
/// MOVNTI m64, r64
/// This intrinisc is only available on 64-bit processes
///
public static unsafe void StoreNonTemporal(ulong* address, ulong value) => StoreNonTemporal(address, value);
}
///
/// __m128i _mm_add_epi8 (__m128i a, __m128i b)
/// PADDB xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi8 (__m128i a, __m128i b)
/// PADDB xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi16 (__m128i a, __m128i b)
/// PADDW xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi16 (__m128i a, __m128i b)
/// PADDW xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi32 (__m128i a, __m128i b)
/// PADDD xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi32 (__m128i a, __m128i b)
/// PADDD xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi64 (__m128i a, __m128i b)
/// PADDQ xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128i _mm_add_epi64 (__m128i a, __m128i b)
/// PADDQ xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128d _mm_add_pd (__m128d a, __m128d b)
/// ADDPD xmm, xmm/m128
///
public static Vector128 Add(Vector128 left, Vector128 right) => Add(left, right);
///
/// __m128d _mm_add_sd (__m128d a, __m128d b)
/// ADDSD xmm, xmm/m64
///
public static Vector128 AddScalar(Vector128 left, Vector128 right) => AddScalar(left, right);
///
/// __m128i _mm_adds_epi8 (__m128i a, __m128i b)
/// PADDSB xmm, xmm/m128
///
public static Vector128 AddSaturate(Vector128 left, Vector128 right) => AddSaturate(left, right);
///
/// __m128i _mm_adds_epu8 (__m128i a, __m128i b)
/// PADDUSB xmm, xmm/m128
///
public static Vector128 AddSaturate(Vector128 left, Vector128 right) => AddSaturate(left, right);
///
/// __m128i _mm_adds_epi16 (__m128i a, __m128i b)
/// PADDSW xmm, xmm/m128
///
public static Vector128 AddSaturate(Vector128 left, Vector128 right) => AddSaturate(left, right);
///
/// __m128i _mm_adds_epu16 (__m128i a, __m128i b)
/// PADDUSW xmm, xmm/m128
///
public static Vector128 AddSaturate(Vector128 left, Vector128 right) => AddSaturate(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_and_si128 (__m128i a, __m128i b)
/// PAND xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128d _mm_and_pd (__m128d a, __m128d b)
/// ANDPD xmm, xmm/m128
///
public static Vector128 And(Vector128 left, Vector128 right) => And(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_andnot_si128 (__m128i a, __m128i b)
/// PANDN xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128d _mm_andnot_pd (__m128d a, __m128d b)
/// ADDNPD xmm, xmm/m128
///
public static Vector128 AndNot(Vector128 left, Vector128 right) => AndNot(left, right);
///
/// __m128i _mm_avg_epu8 (__m128i a, __m128i b)
/// PAVGB xmm, xmm/m128
///
public static Vector128 Average(Vector128 left, Vector128 right) => Average(left, right);
///
/// __m128i _mm_avg_epu16 (__m128i a, __m128i b)
/// PAVGW xmm, xmm/m128
///
public static Vector128 Average(Vector128 left, Vector128 right) => Average(left, right);
///
/// __m128i _mm_cmpeq_epi8 (__m128i a, __m128i b)
/// PCMPEQB xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128i _mm_cmpeq_epi8 (__m128i a, __m128i b)
/// PCMPEQB xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128i _mm_cmpeq_epi16 (__m128i a, __m128i b)
/// PCMPEQW xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128i _mm_cmpeq_epi16 (__m128i a, __m128i b)
/// PCMPEQW xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128i _mm_cmpeq_epi32 (__m128i a, __m128i b)
/// PCMPEQD xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128i _mm_cmpeq_epi32 (__m128i a, __m128i b)
/// PCMPEQD xmm, xmm/m128
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// __m128d _mm_cmpeq_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(0)
///
public static Vector128 CompareEqual(Vector128 left, Vector128 right) => CompareEqual(left, right);
///
/// int _mm_comieq_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareEqualOrderedScalar(Vector128 left, Vector128 right) => CompareEqualOrderedScalar(left, right);
///
/// int _mm_ucomieq_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareEqualUnorderedScalar(Vector128 left, Vector128 right) => CompareEqualUnorderedScalar(left, right);
///
/// __m128d _mm_cmpeq_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(0)
///
public static Vector128 CompareEqualScalar(Vector128 left, Vector128 right) => CompareEqualScalar(left, right);
///
/// __m128i _mm_cmpgt_epi8 (__m128i a, __m128i b)
/// PCMPGTB xmm, xmm/m128
///
public static Vector128 CompareGreaterThan(Vector128 left, Vector128 right) => CompareGreaterThan(left, right);
///
/// __m128i _mm_cmpgt_epi16 (__m128i a, __m128i b)
/// PCMPGTW xmm, xmm/m128
///
public static Vector128 CompareGreaterThan(Vector128 left, Vector128 right) => CompareGreaterThan(left, right);
///
/// __m128i _mm_cmpgt_epi32 (__m128i a, __m128i b)
/// PCMPGTD xmm, xmm/m128
///
public static Vector128 CompareGreaterThan(Vector128 left, Vector128 right) => CompareGreaterThan(left, right);
///
/// __m128d _mm_cmpgt_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(6)
///
public static Vector128 CompareGreaterThan(Vector128 left, Vector128 right) => CompareGreaterThan(left, right);
///
/// int _mm_comigt_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareGreaterThanOrderedScalar(Vector128 left, Vector128 right) => CompareGreaterThanOrderedScalar(left, right);
///
/// int _mm_ucomigt_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareGreaterThanUnorderedScalar(Vector128 left, Vector128 right) => CompareGreaterThanUnorderedScalar(left, right);
///
/// __m128d _mm_cmpgt_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(6)
///
public static Vector128 CompareGreaterThanScalar(Vector128 left, Vector128 right) => CompareGreaterThanScalar(left, right);
///
/// __m128d _mm_cmpge_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(5)
///
public static Vector128 CompareGreaterThanOrEqual(Vector128 left, Vector128 right) => CompareGreaterThanOrEqual(left, right);
///
/// int _mm_comige_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareGreaterThanOrEqualOrderedScalar(Vector128 left, Vector128 right) => CompareGreaterThanOrEqualOrderedScalar(left, right);
///
/// int _mm_ucomige_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareGreaterThanOrEqualUnorderedScalar(Vector128 left, Vector128 right) => CompareGreaterThanOrEqualUnorderedScalar(left, right);
///
/// __m128d _mm_cmpge_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(5)
///
public static Vector128 CompareGreaterThanOrEqualScalar(Vector128 left, Vector128 right) => CompareGreaterThanOrEqualScalar(left, right);
///
/// __m128i _mm_cmplt_epi8 (__m128i a, __m128i b)
/// PCMPGTB xmm, xmm/m128
///
public static Vector128 CompareLessThan(Vector128 left, Vector128 right) => CompareLessThan(left, right);
///
/// __m128i _mm_cmplt_epi16 (__m128i a, __m128i b)
/// PCMPGTW xmm, xmm/m128
///
public static Vector128 CompareLessThan(Vector128 left, Vector128 right) => CompareLessThan(left, right);
///
/// __m128i _mm_cmplt_epi32 (__m128i a, __m128i b)
/// PCMPGTD xmm, xmm/m128
///
public static Vector128 CompareLessThan(Vector128 left, Vector128 right) => CompareLessThan(left, right);
///
/// __m128d _mm_cmplt_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(1)
///
public static Vector128 CompareLessThan(Vector128 left, Vector128 right) => CompareLessThan(left, right);
///
/// int _mm_comilt_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareLessThanOrderedScalar(Vector128 left, Vector128 right) => CompareLessThanOrderedScalar(left, right);
///
/// int _mm_ucomilt_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareLessThanUnorderedScalar(Vector128 left, Vector128 right) => CompareLessThanUnorderedScalar(left, right);
///
/// __m128d _mm_cmplt_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(1)
///
public static Vector128 CompareLessThanScalar(Vector128 left, Vector128 right) => CompareLessThanScalar(left, right);
///
/// __m128d _mm_cmple_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(2)
///
public static Vector128 CompareLessThanOrEqual(Vector128 left, Vector128 right) => CompareLessThanOrEqual(left, right);
///
/// int _mm_comile_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareLessThanOrEqualOrderedScalar(Vector128 left, Vector128 right) => CompareLessThanOrEqualOrderedScalar(left, right);
///
/// int _mm_ucomile_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareLessThanOrEqualUnorderedScalar(Vector128 left, Vector128 right) => CompareLessThanOrEqualUnorderedScalar(left, right);
///
/// __m128d _mm_cmple_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(2)
///
public static Vector128 CompareLessThanOrEqualScalar(Vector128 left, Vector128 right) => CompareLessThanOrEqualScalar(left, right);
///
/// __m128d _mm_cmpneq_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(4)
///
public static Vector128 CompareNotEqual(Vector128 left, Vector128 right) => CompareNotEqual(left, right);
///
/// int _mm_comineq_sd (__m128d a, __m128d b)
/// COMISS xmm, xmm/m64
///
public static bool CompareNotEqualOrderedScalar(Vector128 left, Vector128 right) => CompareNotEqualOrderedScalar(left, right);
///
/// int _mm_ucomineq_sd (__m128d a, __m128d b)
/// UCOMISS xmm, xmm/m64
///
public static bool CompareNotEqualUnorderedScalar(Vector128 left, Vector128 right) => CompareNotEqualUnorderedScalar(left, right);
///
/// __m128d _mm_cmpneq_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(4)
///
public static Vector128 CompareNotEqualScalar(Vector128 left, Vector128 right) => CompareNotEqualScalar(left, right);
///
/// __m128d _mm_cmpngt_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(2)
///
public static Vector128 CompareNotGreaterThan(Vector128 left, Vector128 right) => CompareNotGreaterThan(left, right);
///
/// __m128d _mm_cmpngt_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(2)
///
public static Vector128 CompareNotGreaterThanScalar(Vector128 left, Vector128 right) => CompareNotGreaterThanScalar(left, right);
///
/// __m128d _mm_cmpnge_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(1)
///
public static Vector128 CompareNotGreaterThanOrEqual(Vector128 left, Vector128 right) => CompareNotGreaterThanOrEqual(left, right);
///
/// __m128d _mm_cmpnge_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(1)
///
public static Vector128 CompareNotGreaterThanOrEqualScalar(Vector128 left, Vector128 right) => CompareNotGreaterThanOrEqualScalar(left, right);
///
/// __m128d _mm_cmpnlt_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(5)
///
public static Vector128 CompareNotLessThan(Vector128 left, Vector128 right) => CompareNotLessThan(left, right);
///
/// __m128d _mm_cmpnlt_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(5)
///
public static Vector128 CompareNotLessThanScalar(Vector128 left, Vector128 right) => CompareNotLessThanScalar(left, right);
///
/// __m128d _mm_cmpnle_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(6)
///
public static Vector128 CompareNotLessThanOrEqual(Vector128 left, Vector128 right) => CompareNotLessThanOrEqual(left, right);
///
/// __m128d _mm_cmpnle_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(6)
///
public static Vector128 CompareNotLessThanOrEqualScalar(Vector128 left, Vector128 right) => CompareNotLessThanOrEqualScalar(left, right);
///
/// __m128d _mm_cmpord_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(7)
///
public static Vector128 CompareOrdered(Vector128 left, Vector128 right) => CompareOrdered(left, right);
///
/// __m128d _mm_cmpord_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(7)
///
public static Vector128 CompareOrderedScalar(Vector128 left, Vector128 right) => CompareOrderedScalar(left, right);
///
/// __m128d _mm_cmpunord_pd (__m128d a, __m128d b)
/// CMPPD xmm, xmm/m128, imm8(3)
///
public static Vector128 CompareUnordered(Vector128 left, Vector128 right) => CompareUnordered(left, right);
///
/// __m128d _mm_cmpunord_sd (__m128d a, __m128d b)
/// CMPSD xmm, xmm/m64, imm8(3)
///
public static Vector128 CompareUnorderedScalar(Vector128 left, Vector128 right) => CompareUnorderedScalar(left, right);
///
/// __m128i _mm_cvtps_epi32 (__m128 a)
/// CVTPS2DQ xmm, xmm/m128
///
public static Vector128 ConvertToVector128Int32(Vector128 value) => ConvertToVector128Int32(value);
///
/// __m128i _mm_cvtpd_epi32 (__m128d a)
/// CVTPD2DQ xmm, xmm/m128
///
public static Vector128 ConvertToVector128Int32(Vector128 value) => ConvertToVector128Int32(value);
///
/// __m128 _mm_cvtepi32_ps (__m128i a)
/// CVTDQ2PS xmm, xmm/m128
///
public static Vector128 ConvertToVector128Single(Vector128 value) => ConvertToVector128Single(value);
///
/// __m128 _mm_cvtpd_ps (__m128d a)
/// CVTPD2PS xmm, xmm/m128
///
public static Vector128 ConvertToVector128Single(Vector128 value) => ConvertToVector128Single(value);
///
/// __m128d _mm_cvtepi32_pd (__m128i a)
/// CVTDQ2PD xmm, xmm/m128
///
public static Vector128 ConvertToVector128Double(Vector128 value) => ConvertToVector128Double(value);
///
/// __m128d _mm_cvtps_pd (__m128 a)
/// CVTPS2PD xmm, xmm/m128
///
public static Vector128 ConvertToVector128Double(Vector128 value) => ConvertToVector128Double(value);
///