Update ASoftFloat.cs
This commit is contained in:
parent
3548bd65b2
commit
61036b1e41
1 changed files with 48 additions and 32 deletions
|
@ -621,6 +621,30 @@ namespace ChocolArm64.Instruction
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static float FPRecpX(float Value, AThreadState State)
|
||||||
|
{
|
||||||
|
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_32.FPRecpX: State.Fpcr = 0x{State.Fpcr:X8}");
|
||||||
|
|
||||||
|
Value.FPUnpack(out FPType Type, out bool Sign, out uint Op);
|
||||||
|
|
||||||
|
float Result;
|
||||||
|
|
||||||
|
if (Type == FPType.SNaN || Type == FPType.QNaN)
|
||||||
|
{
|
||||||
|
Result = FPProcessNaN(Type, Op, State);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint NotExp = (~Op >> 23) & 0xFFu;
|
||||||
|
uint MaxExp = 0xFEu;
|
||||||
|
|
||||||
|
Result = BitConverter.Int32BitsToSingle(
|
||||||
|
(int)((Sign ? 1u : 0u) << 31 | (NotExp == 0xFFu ? MaxExp : NotExp) << 23));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
public static float FPRSqrtStepFused(float Value1, float Value2, AThreadState State)
|
public static float FPRSqrtStepFused(float Value1, float Value2, AThreadState State)
|
||||||
{
|
{
|
||||||
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_32.FPRSqrtStepFused: State.Fpcr = 0x{State.Fpcr:X8}");
|
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_32.FPRSqrtStepFused: State.Fpcr = 0x{State.Fpcr:X8}");
|
||||||
|
@ -751,14 +775,6 @@ namespace ChocolArm64.Instruction
|
||||||
InputDenorm = 7
|
InputDenorm = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum FPRounding
|
|
||||||
{
|
|
||||||
TIEEVEN,
|
|
||||||
POSINF,
|
|
||||||
NEGINF,
|
|
||||||
ZERO
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private static float FPDefaultNaN()
|
private static float FPDefaultNaN()
|
||||||
{
|
{
|
||||||
|
@ -941,14 +957,6 @@ namespace ChocolArm64.Instruction
|
||||||
State.Fpsr |= 1 << (int)Exc;
|
State.Fpsr |= 1 << (int)Exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static FPRounding FPRoundingMode(AThreadState State)
|
|
||||||
{
|
|
||||||
const int RModeBits = 22; // Rounding Mode control field.
|
|
||||||
|
|
||||||
return (FPRounding)((State.Fpcr >> RModeBits) & 0b11);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ASoftFloat_64
|
static class ASoftFloat_64
|
||||||
|
@ -1339,6 +1347,30 @@ namespace ChocolArm64.Instruction
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double FPRecpX(double Value, AThreadState State)
|
||||||
|
{
|
||||||
|
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_64.FPRecpX: State.Fpcr = 0x{State.Fpcr:X8}");
|
||||||
|
|
||||||
|
Value.FPUnpack(out FPType Type, out bool Sign, out ulong Op);
|
||||||
|
|
||||||
|
double Result;
|
||||||
|
|
||||||
|
if (Type == FPType.SNaN || Type == FPType.QNaN)
|
||||||
|
{
|
||||||
|
Result = FPProcessNaN(Type, Op, State);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulong NotExp = (~Op >> 52) & 0x7FFul;
|
||||||
|
ulong MaxExp = 0x7FEul;
|
||||||
|
|
||||||
|
Result = BitConverter.Int64BitsToDouble(
|
||||||
|
(long)((Sign ? 1ul : 0ul) << 63 | (NotExp == 0x7FFul ? MaxExp : NotExp) << 52));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
public static double FPRSqrtStepFused(double Value1, double Value2, AThreadState State)
|
public static double FPRSqrtStepFused(double Value1, double Value2, AThreadState State)
|
||||||
{
|
{
|
||||||
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_64.FPRSqrtStepFused: State.Fpcr = 0x{State.Fpcr:X8}");
|
Debug.WriteLineIf(State.Fpcr != 0, $"ASoftFloat_64.FPRSqrtStepFused: State.Fpcr = 0x{State.Fpcr:X8}");
|
||||||
|
@ -1469,14 +1501,6 @@ namespace ChocolArm64.Instruction
|
||||||
InputDenorm = 7
|
InputDenorm = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum FPRounding
|
|
||||||
{
|
|
||||||
TIEEVEN,
|
|
||||||
POSINF,
|
|
||||||
NEGINF,
|
|
||||||
ZERO
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private static double FPDefaultNaN()
|
private static double FPDefaultNaN()
|
||||||
{
|
{
|
||||||
|
@ -1659,13 +1683,5 @@ namespace ChocolArm64.Instruction
|
||||||
State.Fpsr |= 1 << (int)Exc;
|
State.Fpsr |= 1 << (int)Exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static FPRounding FPRoundingMode(AThreadState State)
|
|
||||||
{
|
|
||||||
const int RModeBits = 22; // Rounding Mode control field.
|
|
||||||
|
|
||||||
return (FPRounding)((State.Fpcr >> RModeBits) & 0b11);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue