mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2026-01-12 00:01:39 +00:00
93 lines
2.6 KiB
C#
93 lines
2.6 KiB
C#
using System.Runtime.InteropServices;
|
|
|
|
namespace ARMeilleure.Instructions
|
|
{
|
|
static partial class SoftFallback
|
|
{
|
|
[UnmanagedCallersOnly]
|
|
public static long SignedShrImm64(long value, long roundConst, int shift)
|
|
{
|
|
if (roundConst == 0L)
|
|
{
|
|
if (shift <= 63)
|
|
{
|
|
return value >> shift;
|
|
}
|
|
else /* if (shift == 64) */
|
|
{
|
|
if (value < 0L)
|
|
{
|
|
return -1L;
|
|
}
|
|
else /* if (value >= 0L) */
|
|
{
|
|
return 0L;
|
|
}
|
|
}
|
|
}
|
|
else /* if (roundConst == 1L << (shift - 1)) */
|
|
{
|
|
if (shift <= 63)
|
|
{
|
|
long add = value + roundConst;
|
|
|
|
if ((~value & (value ^ add)) < 0L)
|
|
{
|
|
return (long)((ulong)add >> shift);
|
|
}
|
|
else
|
|
{
|
|
return add >> shift;
|
|
}
|
|
}
|
|
else /* if (shift == 64) */
|
|
{
|
|
return 0L;
|
|
}
|
|
}
|
|
}
|
|
|
|
[UnmanagedCallersOnly]
|
|
public static ulong UnsignedShrImm64(ulong value, long roundConst, int shift)
|
|
{
|
|
if (roundConst == 0L)
|
|
{
|
|
if (shift <= 63)
|
|
{
|
|
return value >> shift;
|
|
}
|
|
else /* if (shift == 64) */
|
|
{
|
|
return 0UL;
|
|
}
|
|
}
|
|
else /* if (roundConst == 1L << (shift - 1)) */
|
|
{
|
|
ulong add = value + (ulong)roundConst;
|
|
|
|
if ((add < value) && (add < (ulong)roundConst))
|
|
{
|
|
if (shift <= 63)
|
|
{
|
|
return (add >> shift) | (0x8000000000000000UL >> (shift - 1));
|
|
}
|
|
else /* if (shift == 64) */
|
|
{
|
|
return 1UL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (shift <= 63)
|
|
{
|
|
return add >> shift;
|
|
}
|
|
else /* if (shift == 64) */
|
|
{
|
|
return 0UL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|