.NET Core 3.0 is here! (#784)
* .NET Core 3.0 is here!
* Remove IMemoryManager.cs and its references.
* Add T Math/F.FusedMultiplyAdd(T, T, T). Nits.
* Nit.
* Update appveyor.yml
* Revert "Resolve Visual Studio build issues"
This reverts commit 1772128ce0
.
* Update SvcTable.cs
This commit is contained in:
parent
35443bac5a
commit
eee639d6ba
208 changed files with 138 additions and 27346 deletions
|
@ -1,9 +1,8 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
|
|
@ -1033,14 +1033,13 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
}
|
||||
|
||||
public static void Fnmadd_S(ArmEmitterContext context)
|
||||
public static void Fnmadd_S(ArmEmitterContext context) // Fused.
|
||||
{
|
||||
OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp;
|
||||
|
||||
int sizeF = op.Size & 1;
|
||||
|
||||
OperandType type = sizeF != 0 ? OperandType.FP64
|
||||
: OperandType.FP32;
|
||||
OperandType type = sizeF != 0 ? OperandType.FP64 : OperandType.FP32;
|
||||
|
||||
Operand ne = context.VectorExtract(type, GetVec(op.Rn), 0);
|
||||
Operand me = context.VectorExtract(type, GetVec(op.Rm), 0);
|
||||
|
@ -1051,14 +1050,13 @@ namespace ARMeilleure.Instructions
|
|||
context.Copy(GetVec(op.Rd), context.VectorInsert(context.VectorZero(), res, 0));
|
||||
}
|
||||
|
||||
public static void Fnmsub_S(ArmEmitterContext context)
|
||||
public static void Fnmsub_S(ArmEmitterContext context) // Fused.
|
||||
{
|
||||
OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp;
|
||||
|
||||
int sizeF = op.Size & 1;
|
||||
|
||||
OperandType type = sizeF != 0 ? OperandType.FP64
|
||||
: OperandType.FP32;
|
||||
OperandType type = sizeF != 0 ? OperandType.FP64 : OperandType.FP32;
|
||||
|
||||
Operand ne = context.VectorExtract(type, GetVec(op.Rn), 0);
|
||||
Operand me = context.VectorExtract(type, GetVec(op.Rm), 0);
|
||||
|
|
|
@ -1073,10 +1073,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T MathF.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = valueA + (value1 * value2);
|
||||
result = MathF.FusedMultiplyAdd(value1, value2, valueA);
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && float.IsSubnormal(result))
|
||||
{
|
||||
|
@ -1256,10 +1253,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T MathF.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = 2f + (value1 * value2);
|
||||
result = MathF.FusedMultiplyAdd(value1, value2, 2f);
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && float.IsSubnormal(result))
|
||||
{
|
||||
|
@ -1388,10 +1382,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T MathF.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = (3f + (value1 * value2)) / 2f;
|
||||
result = MathF.FusedMultiplyAdd(value1, value2, 3f) / 2f;
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && float.IsSubnormal(result))
|
||||
{
|
||||
|
@ -2142,10 +2133,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T Math.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = valueA + (value1 * value2);
|
||||
result = Math.FusedMultiplyAdd(value1, value2, valueA);
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && double.IsSubnormal(result))
|
||||
{
|
||||
|
@ -2323,10 +2311,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T Math.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = 2d + (value1 * value2);
|
||||
result = Math.FusedMultiplyAdd(value1, value2, 2d);
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && double.IsSubnormal(result))
|
||||
{
|
||||
|
@ -2455,10 +2440,7 @@ namespace ARMeilleure.Instructions
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO: When available, use: T Math.FusedMultiplyAdd(T, T, T);
|
||||
// https://github.com/dotnet/corefx/issues/31903
|
||||
|
||||
result = (3d + (value1 * value2)) / 2d;
|
||||
result = Math.FusedMultiplyAdd(value1, value2, 3d) / 2d;
|
||||
|
||||
if ((context.Fpcr & FPCR.Fz) != 0 && double.IsSubnormal(result))
|
||||
{
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
using ARMeilleure.State;
|
||||
using System;
|
||||
|
||||
namespace ARMeilleure.Memory
|
||||
{
|
||||
public interface IMemoryManager : IMemory, IDisposable
|
||||
{
|
||||
void Map(long va, long pa, long size);
|
||||
|
||||
void Unmap(long position, long size);
|
||||
|
||||
bool IsMapped(long position);
|
||||
|
||||
long GetPhysicalAddress(long virtualAddress);
|
||||
|
||||
bool IsRegionModified(long position, long size);
|
||||
|
||||
bool TryGetHostAddress(long position, long size, out IntPtr ptr);
|
||||
|
||||
bool IsValidPosition(long position);
|
||||
|
||||
bool AtomicCompareExchangeInt32(long position, int expected, int desired);
|
||||
|
||||
int AtomicIncrementInt32(long position);
|
||||
|
||||
int AtomicDecrementInt32(long position);
|
||||
|
||||
byte[] ReadBytes(long position, long size);
|
||||
|
||||
void ReadBytes(long position, byte[] data, int startIndex, int size);
|
||||
|
||||
void WriteVector128(long position, V128 value);
|
||||
|
||||
void WriteBytes(long position, byte[] data);
|
||||
|
||||
void WriteBytes(long position, byte[] data, int startIndex, int size);
|
||||
|
||||
void CopyBytes(long src, long dst, long size);
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ namespace ARMeilleure.Memory
|
|||
{
|
||||
public static class MemoryHelper
|
||||
{
|
||||
public static void FillWithZeros(IMemoryManager memory, long position, int size)
|
||||
public static void FillWithZeros(MemoryManager memory, long position, int size)
|
||||
{
|
||||
int size8 = size & ~(8 - 1);
|
||||
|
||||
|
@ -22,7 +22,7 @@ namespace ARMeilleure.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public unsafe static T Read<T>(IMemoryManager memory, long position) where T : struct
|
||||
public unsafe static T Read<T>(MemoryManager memory, long position) where T : struct
|
||||
{
|
||||
long size = Marshal.SizeOf<T>();
|
||||
|
||||
|
@ -34,7 +34,7 @@ namespace ARMeilleure.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public unsafe static void Write<T>(IMemoryManager memory, long position, T value) where T : struct
|
||||
public unsafe static void Write<T>(MemoryManager memory, long position, T value) where T : struct
|
||||
{
|
||||
long size = Marshal.SizeOf<T>();
|
||||
|
||||
|
@ -48,7 +48,7 @@ namespace ARMeilleure.Memory
|
|||
memory.WriteBytes(position, data);
|
||||
}
|
||||
|
||||
public static string ReadAsciiString(IMemoryManager memory, long position, long maxSize = -1)
|
||||
public static string ReadAsciiString(MemoryManager memory, long position, long maxSize = -1)
|
||||
{
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
|
|
|
@ -7,7 +7,7 @@ using static ARMeilleure.Memory.MemoryManagement;
|
|||
|
||||
namespace ARMeilleure.Memory
|
||||
{
|
||||
public unsafe class MemoryManager : IMemoryManager
|
||||
public unsafe class MemoryManager
|
||||
{
|
||||
public const int PageBits = 12;
|
||||
public const int PageSize = 1 << PageBits;
|
||||
|
|
|
@ -3,7 +3,7 @@ using System.Diagnostics;
|
|||
|
||||
namespace ARMeilleure.State
|
||||
{
|
||||
public class ExecutionContext : IExecutionContext
|
||||
public class ExecutionContext
|
||||
{
|
||||
private const int MinCountForCheck = 40000;
|
||||
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
using System;
|
||||
|
||||
namespace ARMeilleure.State
|
||||
{
|
||||
public interface IExecutionContext : IDisposable
|
||||
{
|
||||
uint CtrEl0 { get; }
|
||||
uint DczidEl0 { get; }
|
||||
|
||||
ulong CntfrqEl0 { get; set; }
|
||||
ulong CntpctEl0 { get; }
|
||||
|
||||
long TpidrEl0 { get; set; }
|
||||
long Tpidr { get; set; }
|
||||
|
||||
FPCR Fpcr { get; set; }
|
||||
FPSR Fpsr { get; set; }
|
||||
|
||||
bool IsAarch32 { get; set; }
|
||||
|
||||
bool Running { get; set; }
|
||||
|
||||
event EventHandler<EventArgs> Interrupt;
|
||||
event EventHandler<InstExceptionEventArgs> Break;
|
||||
event EventHandler<InstExceptionEventArgs> SupervisorCall;
|
||||
event EventHandler<InstUndefinedEventArgs> Undefined;
|
||||
|
||||
ulong GetX(int index);
|
||||
void SetX(int index, ulong value);
|
||||
|
||||
V128 GetV(int index);
|
||||
|
||||
bool GetPstateFlag(PState flag);
|
||||
|
||||
void RequestInterrupt();
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
using ARMeilleure.State;
|
||||
|
||||
namespace ARMeilleure.Translation
|
||||
{
|
||||
public interface ITranslator
|
||||
{
|
||||
void Execute(IExecutionContext context, ulong address);
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ using static ARMeilleure.IntermediateRepresentation.OperandHelper;
|
|||
|
||||
namespace ARMeilleure.Translation
|
||||
{
|
||||
public class Translator : ITranslator
|
||||
public class Translator
|
||||
{
|
||||
private const ulong CallFlag = InstEmitFlowHelper.CallFlag;
|
||||
|
||||
|
@ -54,10 +54,8 @@ namespace ARMeilleure.Translation
|
|||
}
|
||||
}
|
||||
|
||||
public void Execute(IExecutionContext ctx, ulong address)
|
||||
public void Execute(State.ExecutionContext context, ulong address)
|
||||
{
|
||||
State.ExecutionContext context = (State.ExecutionContext)ctx;
|
||||
|
||||
if (Interlocked.Increment(ref _threadCount) == 1)
|
||||
{
|
||||
Thread backgroundTranslatorThread = new Thread(TranslateQueuedSubs);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue