// 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); } }