Use BitOperations methods and delete now unused BitUtils methods (#3134)
Replaces BitUtils.CountTrailingZeros/CountLeadingZeros/IsPowerOfTwo with BitOperations methods
This commit is contained in:
parent
63c9c64196
commit
98c838b24c
6 changed files with 19 additions and 68 deletions
|
@ -1,11 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Ryujinx.Common
|
namespace Ryujinx.Common
|
||||||
{
|
{
|
||||||
public static class BitUtils
|
public static class BitUtils
|
||||||
{
|
{
|
||||||
private static ReadOnlySpan<byte> ClzNibbleTbl => new byte[] { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
||||||
|
|
||||||
public static uint AlignUp(uint value, int size)
|
public static uint AlignUp(uint value, int size)
|
||||||
{
|
{
|
||||||
return (uint)AlignUp((int)value, size);
|
return (uint)AlignUp((int)value, size);
|
||||||
|
@ -76,60 +75,7 @@ namespace Ryujinx.Common
|
||||||
|
|
||||||
public static int Pow2RoundDown(int value)
|
public static int Pow2RoundDown(int value)
|
||||||
{
|
{
|
||||||
return IsPowerOfTwo32(value) ? value : Pow2RoundUp(value) >> 1;
|
return BitOperations.IsPow2(value) ? value : Pow2RoundUp(value) >> 1;
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsPowerOfTwo32(int value)
|
|
||||||
{
|
|
||||||
return value != 0 && (value & (value - 1)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsPowerOfTwo64(long value)
|
|
||||||
{
|
|
||||||
return value != 0 && (value & (value - 1)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int CountLeadingZeros32(int value)
|
|
||||||
{
|
|
||||||
return (int)CountLeadingZeros((ulong)value, 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int CountLeadingZeros64(long value)
|
|
||||||
{
|
|
||||||
return (int)CountLeadingZeros((ulong)value, 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ulong CountLeadingZeros(ulong value, int size)
|
|
||||||
{
|
|
||||||
if (value == 0ul)
|
|
||||||
{
|
|
||||||
return (ulong)size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nibbleIdx = size;
|
|
||||||
int preCount, count = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
nibbleIdx -= 4;
|
|
||||||
preCount = ClzNibbleTbl[(int)(value >> nibbleIdx) & 0b1111];
|
|
||||||
count += preCount;
|
|
||||||
}
|
|
||||||
while (preCount == 4);
|
|
||||||
|
|
||||||
return (ulong)count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int CountTrailingZeros32(int value)
|
|
||||||
{
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
while (((value >> count) & 1) == 0)
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long ReverseBits64(long value)
|
public static long ReverseBits64(long value)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
|
using System.Numerics;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
using static Ryujinx.Graphics.Texture.BlockLinearConstants;
|
using static Ryujinx.Graphics.Texture.BlockLinearConstants;
|
||||||
|
@ -47,15 +48,15 @@ namespace Ryujinx.Graphics.Texture
|
||||||
{
|
{
|
||||||
_texBpp = bpp;
|
_texBpp = bpp;
|
||||||
|
|
||||||
_bppShift = BitUtils.CountTrailingZeros32(bpp);
|
_bppShift = BitOperations.TrailingZeroCount(bpp);
|
||||||
|
|
||||||
_bhMask = gobBlocksInY - 1;
|
_bhMask = gobBlocksInY - 1;
|
||||||
_bdMask = gobBlocksInZ - 1;
|
_bdMask = gobBlocksInZ - 1;
|
||||||
|
|
||||||
_bhShift = BitUtils.CountTrailingZeros32(gobBlocksInY);
|
_bhShift = BitOperations.TrailingZeroCount(gobBlocksInY);
|
||||||
_bdShift = BitUtils.CountTrailingZeros32(gobBlocksInZ);
|
_bdShift = BitOperations.TrailingZeroCount(gobBlocksInZ);
|
||||||
|
|
||||||
_xShift = BitUtils.CountTrailingZeros32(GobSize * gobBlocksInY * gobBlocksInZ);
|
_xShift = BitOperations.TrailingZeroCount(GobSize * gobBlocksInY * gobBlocksInZ);
|
||||||
|
|
||||||
RobAndSliceSizes rsSizes = GetRobAndSliceSizes(width, height, gobBlocksInY, gobBlocksInZ);
|
RobAndSliceSizes rsSizes = GetRobAndSliceSizes(width, height, gobBlocksInY, gobBlocksInZ);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Kernel.Common
|
namespace Ryujinx.HLE.HOS.Kernel.Common
|
||||||
{
|
{
|
||||||
|
@ -41,10 +42,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
|
||||||
range++;
|
range++;
|
||||||
|
|
||||||
// This is log2(Range) plus one.
|
// This is log2(Range) plus one.
|
||||||
int nextRangeLog2 = 64 - BitUtils.CountLeadingZeros64(range);
|
int nextRangeLog2 = 64 - BitOperations.LeadingZeroCount((ulong)range);
|
||||||
|
|
||||||
// If Range is already power of 2, subtract one to use log2(Range) directly.
|
// If Range is already power of 2, subtract one to use log2(Range) directly.
|
||||||
int rangeLog2 = nextRangeLog2 - (BitUtils.IsPowerOfTwo64(range) ? 1 : 0);
|
int rangeLog2 = nextRangeLog2 - (BitOperations.IsPow2(range) ? 1 : 0);
|
||||||
|
|
||||||
int parts = rangeLog2 > 32 ? 2 : 1;
|
int parts = rangeLog2 > 32 ? 2 : 1;
|
||||||
int bitsPerPart = rangeLog2 / parts;
|
int bitsPerPart = rangeLog2 / parts;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Common;
|
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Kernel.Memory
|
namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||||
{
|
{
|
||||||
|
@ -259,11 +260,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||||
|
|
||||||
if (backwards)
|
if (backwards)
|
||||||
{
|
{
|
||||||
index = (index * 64 + 63) - BitUtils.CountLeadingZeros64(mask);
|
index = (index * 64 + 63) - BitOperations.LeadingZeroCount((ulong)mask);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
index = index * 64 + BitUtils.CountLeadingZeros64(BitUtils.ReverseBits64(mask));
|
index = index * 64 + BitOperations.LeadingZeroCount((ulong)BitUtils.ReverseBits64(mask));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,11 +313,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||||
|
|
||||||
if (backwards)
|
if (backwards)
|
||||||
{
|
{
|
||||||
index = index * 64 + BitUtils.CountLeadingZeros64(BitUtils.ReverseBits64(mask));
|
index = index * 64 + BitOperations.LeadingZeroCount((ulong)BitUtils.ReverseBits64(mask));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
index = (index * 64 + 63) - BitUtils.CountLeadingZeros64(mask);
|
index = (index * 64 + 63) - BitOperations.LeadingZeroCount((ulong)mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Kernel.Process
|
namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
{
|
{
|
||||||
|
@ -32,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
{
|
{
|
||||||
int mask = _idMasks[index];
|
int mask = _idMasks[index];
|
||||||
|
|
||||||
int firstFreeBit = BitUtils.CountLeadingZeros32((mask + 1) & ~mask);
|
int firstFreeBit = BitOperations.LeadingZeroCount((uint)((mask + 1) & ~mask));
|
||||||
|
|
||||||
if (firstFreeBit < 32)
|
if (firstFreeBit < 32)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,6 +3,7 @@ using Ryujinx.HLE.HOS.Kernel.Common;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Memory;
|
using Ryujinx.HLE.HOS.Kernel.Memory;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Kernel.Process
|
namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
{
|
{
|
||||||
|
@ -130,7 +131,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
return KernelResult.Success;
|
return KernelResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
int codeMask = 1 << (32 - BitUtils.CountLeadingZeros32(code + 1));
|
int codeMask = 1 << (32 - BitOperations.LeadingZeroCount((uint)code + 1));
|
||||||
|
|
||||||
// Check if the property was already set.
|
// Check if the property was already set.
|
||||||
if (((mask0 & codeMask) & 0x1e008) != 0)
|
if (((mask0 & codeMask) & 0x1e008) != 0)
|
||||||
|
|
Reference in a new issue