63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
|
using System.Diagnostics;
|
||
|
|
||
|
namespace Unity.Burst.Intrinsics
|
||
|
{
|
||
|
public unsafe static partial class X86
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// popcnt intrinsics
|
||
|
/// </summary>
|
||
|
public static class Popcnt
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Evaluates to true at compile time if popcnt intrinsics are supported.
|
||
|
///
|
||
|
/// Burst ties popcnt support to SSE4.2 support to simplify feature sets to support.
|
||
|
/// </summary>
|
||
|
public static bool IsPopcntSupported { get { return Sse4_2.IsSse42Supported; } }
|
||
|
|
||
|
/// <summary>
|
||
|
/// Count the number of bits set to 1 in unsigned 32-bit integer a, and return that count in dst.
|
||
|
/// </summary>
|
||
|
/// <remarks>
|
||
|
/// **** popcnt r32, r32
|
||
|
/// </remarks>
|
||
|
/// <param name="v">Integer to be counted in</param>
|
||
|
/// <returns>Count</returns>
|
||
|
[DebuggerStepThrough]
|
||
|
public static int popcnt_u32(uint v)
|
||
|
{
|
||
|
int result = 0;
|
||
|
uint mask = 0x80000000u;
|
||
|
while (mask != 0)
|
||
|
{
|
||
|
result += ((v & mask) != 0) ? 1 : 0;
|
||
|
mask >>= 1;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Count the number of bits set to 1 in unsigned 64-bit integer a, and return that count in dst.
|
||
|
/// </summary>
|
||
|
/// <remarks>
|
||
|
/// **** popcnt r64, r64
|
||
|
/// </remarks>
|
||
|
/// <param name="v">Integer to be counted in</param>
|
||
|
/// <returns>Count</returns>
|
||
|
[DebuggerStepThrough]
|
||
|
public static int popcnt_u64(ulong v)
|
||
|
{
|
||
|
int result = 0;
|
||
|
ulong mask = 0x8000000000000000u;
|
||
|
while (mask != 0)
|
||
|
{
|
||
|
result += ((v & mask) != 0) ? 1 : 0;
|
||
|
mask >>= 1;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|