// 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 SSE3 hardware instructions via intrinsics
///
[Intrinsic]
[CLSCompliant(false)]
public abstract class Sse3 : Sse2
{
internal Sse3() { }
public new static bool IsSupported { get => IsSupported; }
///
/// __m128 _mm_addsub_ps (__m128 a, __m128 b)
/// ADDSUBPS xmm, xmm/m128
///
public static Vector128 AddSubtract(Vector128 left, Vector128 right) => AddSubtract(left, right);
///
/// __m128d _mm_addsub_pd (__m128d a, __m128d b)
/// ADDSUBPD xmm, xmm/m128
///
public static Vector128 AddSubtract(Vector128 left, Vector128 right) => AddSubtract(left, right);
///
/// __m128 _mm_hadd_ps (__m128 a, __m128 b)
/// HADDPS xmm, xmm/m128
///
public static Vector128 HorizontalAdd(Vector128 left, Vector128 right) => HorizontalAdd(left, right);
///
/// __m128d _mm_hadd_pd (__m128d a, __m128d b)
/// HADDPD xmm, xmm/m128
///
public static Vector128 HorizontalAdd(Vector128 left, Vector128 right) => HorizontalAdd(left, right);
///
/// __m128 _mm_hsub_ps (__m128 a, __m128 b)
/// HSUBPS xmm, xmm/m128
///
public static Vector128 HorizontalSubtract(Vector128 left, Vector128 right) => HorizontalSubtract(left, right);
///
/// __m128d _mm_hsub_pd (__m128d a, __m128d b)
/// HSUBPD xmm, xmm/m128
///
public static Vector128 HorizontalSubtract(Vector128 left, Vector128 right) => HorizontalSubtract(left, right);
///
/// __m128d _mm_loaddup_pd (double const* mem_addr)
/// MOVDDUP xmm, m64
///
public static unsafe Vector128 LoadAndDuplicateToVector128(double* address) => LoadAndDuplicateToVector128(address);
///
/// __m128i _mm_lddqu_si128 (__m128i const* mem_addr)
/// LDDQU xmm, m128
///
public static unsafe Vector128 LoadDquVector128(sbyte* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(byte* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(short* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(ushort* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(int* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(uint* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(long* address) => LoadDquVector128(address);
public static unsafe Vector128 LoadDquVector128(ulong* address) => LoadDquVector128(address);
///
/// __m128d _mm_movedup_pd (__m128d a)
/// MOVDDUP xmm, xmm/m64
///
public static Vector128 MoveAndDuplicate(Vector128 source) => MoveAndDuplicate(source);
///
/// __m128 _mm_movehdup_ps (__m128 a)
/// MOVSHDUP xmm, xmm/m128
///
public static Vector128 MoveHighAndDuplicate(Vector128 source) => MoveHighAndDuplicate(source);
///
/// __m128 _mm_moveldup_ps (__m128 a)
/// MOVSLDUP xmm, xmm/m128
///
public static Vector128 MoveLowAndDuplicate(Vector128 source) => MoveLowAndDuplicate(source);
}
}