Use MethodInfo for managed method calls.

Use IR methods instead of managed methods about Max/Min (S/U).
Follow-ups & Nits.
This commit is contained in:
LDj3SNuD 2020-01-10 02:52:31 +01:00
commit abb65750cd
18 changed files with 481 additions and 619 deletions

View file

@ -23,7 +23,7 @@ namespace ARMeilleure.Instructions
context.StoreToContext(); context.StoreToContext();
context.NativeInterfaceCall(name, Const(op.Address), Const(op.Id)); context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.Id));
context.LoadFromContext(); context.LoadFromContext();
@ -41,7 +41,7 @@ namespace ARMeilleure.Instructions
context.StoreToContext(); context.StoreToContext();
context.NativeInterfaceCall(name, Const(op.Address), Const(op.RawOpCode)); context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.RawOpCode));
context.LoadFromContext(); context.LoadFromContext();

View file

@ -55,7 +55,7 @@ namespace ARMeilleure.Instructions
Operand n = GetIntOrZR(context, op.Rn); Operand n = GetIntOrZR(context, op.Rn);
Operand m = GetIntOrZR(context, op.Rm); Operand m = GetIntOrZR(context, op.Rm);
Operand d = context.SoftFallbackCall(name, n, m); Operand d = context.Call(typeof(SoftFallback).GetMethod(name), n, m);
SetIntOrZR(context, op.Rd, d); SetIntOrZR(context, op.Rd, d);
} }

View file

@ -3,6 +3,7 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.IntermediateRepresentation.OperandHelper; using static ARMeilleure.IntermediateRepresentation.OperandHelper;
@ -22,7 +23,7 @@ namespace ARMeilleure.Instructions
public static void Clrex(ArmEmitterContext context) public static void Clrex(ArmEmitterContext context)
{ {
context.NativeInterfaceCall(nameof(NativeInterface.ClearExclusive)); context.Call(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ClearExclusive)));
} }
public static void Dmb(ArmEmitterContext context) => EmitBarrier(context); public static void Dmb(ArmEmitterContext context) => EmitBarrier(context);
@ -107,32 +108,32 @@ namespace ARMeilleure.Instructions
bool exclusive, bool exclusive,
int size) int size)
{ {
string fallbackMethodName = null; MethodInfo info = null;
if (exclusive) if (exclusive)
{ {
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.ReadByteExclusive); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByteExclusive)); break;
case 1: fallbackMethodName = nameof(NativeInterface.ReadUInt16Exclusive); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16Exclusive)); break;
case 2: fallbackMethodName = nameof(NativeInterface.ReadUInt32Exclusive); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32Exclusive)); break;
case 3: fallbackMethodName = nameof(NativeInterface.ReadUInt64Exclusive); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64Exclusive)); break;
case 4: fallbackMethodName = nameof(NativeInterface.ReadVector128Exclusive); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128Exclusive)); break;
} }
} }
else else
{ {
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.ReadByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.ReadUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.ReadUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.ReadUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)); break;
case 4: fallbackMethodName = nameof(NativeInterface.ReadVector128); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128)); break;
} }
} }
return context.NativeInterfaceCall(fallbackMethodName, address); return context.Call(info, address);
} }
public static void Pfrm(ArmEmitterContext context) public static void Pfrm(ArmEmitterContext context)
@ -219,33 +220,33 @@ namespace ARMeilleure.Instructions
value = context.ConvertI64ToI32(value); value = context.ConvertI64ToI32(value);
} }
string fallbackMethodName = null; MethodInfo info = null;
if (exclusive) if (exclusive)
{ {
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.WriteByteExclusive); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByteExclusive)); break;
case 1: fallbackMethodName = nameof(NativeInterface.WriteUInt16Exclusive); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16Exclusive)); break;
case 2: fallbackMethodName = nameof(NativeInterface.WriteUInt32Exclusive); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32Exclusive)); break;
case 3: fallbackMethodName = nameof(NativeInterface.WriteUInt64Exclusive); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64Exclusive)); break;
case 4: fallbackMethodName = nameof(NativeInterface.WriteVector128Exclusive); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128Exclusive)); break;
} }
return context.NativeInterfaceCall(fallbackMethodName, address, value); return context.Call(info, address, value);
} }
else else
{ {
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.WriteByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.WriteUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.WriteUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.WriteUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)); break;
case 4: fallbackMethodName = nameof(NativeInterface.WriteVector128); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128)); break;
} }
context.NativeInterfaceCall(fallbackMethodName, address, value); context.Call(info, address, value);
return null; return null;
} }

View file

@ -4,6 +4,7 @@ using ARMeilleure.Memory;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using ARMeilleure.Translation.AOT; using ARMeilleure.Translation.AOT;
using System; using System;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.IntermediateRepresentation.OperandHelper; using static ARMeilleure.IntermediateRepresentation.OperandHelper;
@ -340,17 +341,17 @@ namespace ARMeilleure.Instructions
private static void EmitReadIntFallback(ArmEmitterContext context, Operand address, int rt, int size) private static void EmitReadIntFallback(ArmEmitterContext context, Operand address, int rt, int size)
{ {
string fallbackMethodName = null; MethodInfo info = null;
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.ReadByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.ReadUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.ReadUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.ReadUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)); break;
} }
SetInt(context, rt, context.NativeInterfaceCall(fallbackMethodName, address)); SetInt(context, rt, context.Call(info, address));
} }
private static void EmitReadVectorFallback( private static void EmitReadVectorFallback(
@ -361,18 +362,18 @@ namespace ARMeilleure.Instructions
int elem, int elem,
int size) int size)
{ {
string fallbackMethodName = null; MethodInfo info = null;
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.ReadByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.ReadUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.ReadUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.ReadUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)); break;
case 4: fallbackMethodName = nameof(NativeInterface.ReadVector128); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128)); break;
} }
Operand value = context.NativeInterfaceCall(fallbackMethodName, address); Operand value = context.Call(info, address);
switch (size) switch (size)
{ {
@ -387,14 +388,14 @@ namespace ARMeilleure.Instructions
private static void EmitWriteIntFallback(ArmEmitterContext context, Operand address, int rt, int size) private static void EmitWriteIntFallback(ArmEmitterContext context, Operand address, int rt, int size)
{ {
string fallbackMethodName = null; MethodInfo info = null;
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.WriteByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.WriteUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.WriteUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.WriteUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)); break;
} }
Operand value = GetInt(context, rt); Operand value = GetInt(context, rt);
@ -404,7 +405,7 @@ namespace ARMeilleure.Instructions
value = context.ConvertI64ToI32(value); value = context.ConvertI64ToI32(value);
} }
context.NativeInterfaceCall(fallbackMethodName, address, value); context.Call(info, address, value);
} }
private static void EmitWriteVectorFallback( private static void EmitWriteVectorFallback(
@ -414,15 +415,15 @@ namespace ARMeilleure.Instructions
int elem, int elem,
int size) int size)
{ {
string fallbackMethodName = null; MethodInfo info = null;
switch (size) switch (size)
{ {
case 0: fallbackMethodName = nameof(NativeInterface.WriteByte); break; case 0: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)); break;
case 1: fallbackMethodName = nameof(NativeInterface.WriteUInt16); break; case 1: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)); break;
case 2: fallbackMethodName = nameof(NativeInterface.WriteUInt32); break; case 2: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)); break;
case 3: fallbackMethodName = nameof(NativeInterface.WriteUInt64); break; case 3: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)); break;
case 4: fallbackMethodName = nameof(NativeInterface.WriteVector128); break; case 4: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128)); break;
} }
Operand value = null; Operand value = null;
@ -442,7 +443,7 @@ namespace ARMeilleure.Instructions
value = GetVec(rt); value = GetVec(rt);
} }
context.NativeInterfaceCall(fallbackMethodName, address, value); context.Call(info, address, value);
} }
private static Operand GetInt(ArmEmitterContext context, int rt) private static Operand GetInt(ArmEmitterContext context, int rt)

View file

@ -6,6 +6,8 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.State; using ARMeilleure.State;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Diagnostics;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.Instructions.InstEmitSimdHelper; using static ARMeilleure.Instructions.InstEmitSimdHelper;
@ -106,7 +108,7 @@ namespace ARMeilleure.Instructions
{ {
Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size);
Operand de = context.SoftFallbackCall(nameof(SoftFallback.CountLeadingSigns), ne, Const(eSize)); Operand de = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns)), ne, Const(eSize));
res = EmitVectorInsert(context, res, de, index, op.Size); res = EmitVectorInsert(context, res, de, index, op.Size);
} }
@ -128,7 +130,7 @@ namespace ARMeilleure.Instructions
{ {
Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size);
Operand de = context.SoftFallbackCall(nameof(SoftFallback.CountLeadingZeros), ne, Const(eSize)); Operand de = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros)), ne, Const(eSize));
res = EmitVectorInsert(context, res, de, index, op.Size); res = EmitVectorInsert(context, res, de, index, op.Size);
} }
@ -156,7 +158,7 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
de = context.SoftFallbackCall(nameof(SoftFallback.CountSetBits8), ne); de = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountSetBits8)), ne);
} }
res = EmitVectorInsert(context, res, de, index, 0); res = EmitVectorInsert(context, res, de, index, 0);
@ -1298,11 +1300,11 @@ namespace ARMeilleure.Instructions
{ {
if (op.Size == 0) if (op.Size == 0)
{ {
return context.SoftFallbackCall(nameof(SoftFallback.RoundF), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.RoundF)), op1);
} }
else /* if (op.Size == 1) */ else /* if (op.Size == 1) */
{ {
return context.SoftFallbackCall(nameof(SoftFallback.Round), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Round)), op1);
} }
}); });
} }
@ -1317,11 +1319,11 @@ namespace ARMeilleure.Instructions
{ {
if (sizeF == 0) if (sizeF == 0)
{ {
return context.SoftFallbackCall(nameof(SoftFallback.RoundF), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.RoundF)), op1);
} }
else /* if (sizeF == 1) */ else /* if (sizeF == 1) */
{ {
return context.SoftFallbackCall(nameof(SoftFallback.Round), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Round)), op1);
} }
}); });
} }
@ -1424,11 +1426,11 @@ namespace ARMeilleure.Instructions
{ {
if (op.Size == 0) if (op.Size == 0)
{ {
return context.SoftFallbackCall(nameof(SoftFallback.RoundF), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.RoundF)), op1);
} }
else /* if (op.Size == 1) */ else /* if (op.Size == 1) */
{ {
return context.SoftFallbackCall(nameof(SoftFallback.Round), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Round)), op1);
} }
}); });
} }
@ -1443,11 +1445,11 @@ namespace ARMeilleure.Instructions
{ {
if (sizeF == 0) if (sizeF == 0)
{ {
return context.SoftFallbackCall(nameof(SoftFallback.RoundF), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.RoundF)), op1);
} }
else /* if (sizeF == 1) */ else /* if (sizeF == 1) */
{ {
return context.SoftFallbackCall(nameof(SoftFallback.Round), op1); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Round)), op1);
} }
}); });
} }
@ -1681,7 +1683,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Mul_AddSub(context, AddSub.Add); EmitSse41VectorMul_AddSub(context, AddSub.Add);
} }
else else
{ {
@ -1704,7 +1706,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Mul_AddSub(context, AddSub.Subtract); EmitSse41VectorMul_AddSub(context, AddSub.Subtract);
} }
else else
{ {
@ -1727,7 +1729,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Mul_AddSub(context, AddSub.None); EmitSse41VectorMul_AddSub(context, AddSub.None);
} }
else else
{ {
@ -1796,14 +1798,14 @@ namespace ARMeilleure.Instructions
public static void Sabd_V(ArmEmitterContext context) public static void Sabd_V(ArmEmitterContext context)
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse41)
{ {
OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp; OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp;
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
EmitSse41Sabd(context, op, n, m, isLong: false); EmitSse41VectorSabdOp(context, op, n, m, isLong: false);
} }
else else
{ {
@ -1836,7 +1838,7 @@ namespace ARMeilleure.Instructions
n = context.AddIntrinsic(movInst, n); n = context.AddIntrinsic(movInst, n);
m = context.AddIntrinsic(movInst, m); m = context.AddIntrinsic(movInst, m);
EmitSse41Sabd(context, op, n, m, isLong: true); EmitSse41VectorSabdOp(context, op, n, m, isLong: true);
} }
else else
{ {
@ -2018,9 +2020,7 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MaxS64); EmitVectorBinaryOpSx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: true));
EmitVectorBinaryOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
@ -2032,17 +2032,13 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MaxS64); EmitVectorPairwiseOpSx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: true));
EmitVectorPairwiseOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
public static void Smaxv_V(ArmEmitterContext context) public static void Smaxv_V(ArmEmitterContext context)
{ {
string name = nameof(SoftFallback.MaxS64); EmitVectorAcrossVectorOpSx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: true));
EmitVectorAcrossVectorOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
public static void Smin_V(ArmEmitterContext context) public static void Smin_V(ArmEmitterContext context)
@ -2067,9 +2063,7 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MinS64); EmitVectorBinaryOpSx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: true));
EmitVectorBinaryOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
@ -2081,17 +2075,13 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MinS64); EmitVectorPairwiseOpSx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: true));
EmitVectorPairwiseOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
public static void Sminv_V(ArmEmitterContext context) public static void Sminv_V(ArmEmitterContext context)
{ {
string name = nameof(SoftFallback.MinS64); EmitVectorAcrossVectorOpSx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: true));
EmitVectorAcrossVectorOpSx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
public static void Smlal_V(ArmEmitterContext context) public static void Smlal_V(ArmEmitterContext context)
@ -2449,7 +2439,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
EmitSse41Uabd(context, op, n, m, isLong: false); EmitSse41VectorUabdOp(context, op, n, m, isLong: false);
} }
else else
{ {
@ -2482,7 +2472,7 @@ namespace ARMeilleure.Instructions
n = context.AddIntrinsic(movInst, n); n = context.AddIntrinsic(movInst, n);
m = context.AddIntrinsic(movInst, m); m = context.AddIntrinsic(movInst, m);
EmitSse41Uabd(context, op, n, m, isLong: true); EmitSse41VectorUabdOp(context, op, n, m, isLong: true);
} }
else else
{ {
@ -2657,9 +2647,7 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MaxU64); EmitVectorBinaryOpZx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: false));
EmitVectorBinaryOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
@ -2671,17 +2659,13 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MaxU64); EmitVectorPairwiseOpZx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: false));
EmitVectorPairwiseOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
public static void Umaxv_V(ArmEmitterContext context) public static void Umaxv_V(ArmEmitterContext context)
{ {
string name = nameof(SoftFallback.MaxU64); EmitVectorAcrossVectorOpZx(context, (op1, op2) => EmitMax64Op(context, op1, op2, signed: false));
EmitVectorAcrossVectorOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
public static void Umin_V(ArmEmitterContext context) public static void Umin_V(ArmEmitterContext context)
@ -2706,9 +2690,7 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MinU64); EmitVectorBinaryOpZx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: false));
EmitVectorBinaryOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
@ -2720,17 +2702,13 @@ namespace ARMeilleure.Instructions
} }
else else
{ {
string name = nameof(SoftFallback.MinU64); EmitVectorPairwiseOpZx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: false));
EmitVectorPairwiseOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
} }
public static void Uminv_V(ArmEmitterContext context) public static void Uminv_V(ArmEmitterContext context)
{ {
string name = nameof(SoftFallback.MinU64); EmitVectorAcrossVectorOpZx(context, (op1, op2) => EmitMin64Op(context, op1, op2, signed: false));
EmitVectorAcrossVectorOpZx(context, (op1, op2) => context.SoftFallbackCall(name, op1, op2));
} }
public static void Umlal_V(ArmEmitterContext context) public static void Umlal_V(ArmEmitterContext context)
@ -3072,7 +3050,29 @@ namespace ARMeilleure.Instructions
context.Copy(d, res); context.Copy(d, res);
} }
public static void EmitScalarRoundOpF(ArmEmitterContext context, FPRoundingMode roundMode) private static Operand EmitMax64Op(ArmEmitterContext context, Operand op1, Operand op2, bool signed)
{
Debug.Assert(op1.Type == OperandType.I64 && op2.Type == OperandType.I64);
Operand cmp = signed
? context.ICompareGreaterOrEqual (op1, op2)
: context.ICompareGreaterOrEqualUI(op1, op2);
return context.ConditionalSelect(cmp, op1, op2);
}
private static Operand EmitMin64Op(ArmEmitterContext context, Operand op1, Operand op2, bool signed)
{
Debug.Assert(op1.Type == OperandType.I64 && op2.Type == OperandType.I64);
Operand cmp = signed
? context.ICompareLessOrEqual (op1, op2)
: context.ICompareLessOrEqualUI(op1, op2);
return context.ConditionalSelect(cmp, op1, op2);
}
private static void EmitScalarRoundOpF(ArmEmitterContext context, FPRoundingMode roundMode)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@ -3094,7 +3094,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
public static void EmitVectorRoundOpF(ArmEmitterContext context, FPRoundingMode roundMode) private static void EmitVectorRoundOpF(ArmEmitterContext context, FPRoundingMode roundMode)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@ -3211,14 +3211,14 @@ namespace ARMeilleure.Instructions
Subtract Subtract
} }
private static void EmitSse41Mul_AddSub(ArmEmitterContext context, AddSub addSub) private static void EmitSse41VectorMul_AddSub(ArmEmitterContext context, AddSub addSub)
{ {
OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp; OpCodeSimdReg op = (OpCodeSimdReg)context.CurrOp;
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = null; Operand res;
if (op.Size == 0) if (op.Size == 0)
{ {
@ -3248,23 +3248,15 @@ namespace ARMeilleure.Instructions
if (addSub == AddSub.Add) if (addSub == AddSub.Add)
{ {
switch (op.Size) Intrinsic addInst = X86PaddInstruction[op.Size];
{
case 0: res = context.AddIntrinsic(Intrinsic.X86Paddb, d, res); break; res = context.AddIntrinsic(addInst, d, res);
case 1: res = context.AddIntrinsic(Intrinsic.X86Paddw, d, res); break;
case 2: res = context.AddIntrinsic(Intrinsic.X86Paddd, d, res); break;
case 3: res = context.AddIntrinsic(Intrinsic.X86Paddq, d, res); break;
}
} }
else if (addSub == AddSub.Subtract) else if (addSub == AddSub.Subtract)
{ {
switch (op.Size) Intrinsic subInst = X86PsubInstruction[op.Size];
{
case 0: res = context.AddIntrinsic(Intrinsic.X86Psubb, d, res); break; res = context.AddIntrinsic(subInst, d, res);
case 1: res = context.AddIntrinsic(Intrinsic.X86Psubw, d, res); break;
case 2: res = context.AddIntrinsic(Intrinsic.X86Psubd, d, res); break;
case 3: res = context.AddIntrinsic(Intrinsic.X86Psubq, d, res); break;
}
} }
if (op.RegisterSize == RegisterSize.Simd64) if (op.RegisterSize == RegisterSize.Simd64)
@ -3275,7 +3267,7 @@ namespace ARMeilleure.Instructions
context.Copy(d, res); context.Copy(d, res);
} }
private static void EmitSse41Sabd( private static void EmitSse41VectorSabdOp(
ArmEmitterContext context, ArmEmitterContext context,
OpCodeSimdReg op, OpCodeSimdReg op,
Operand n, Operand n,
@ -3308,7 +3300,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
private static void EmitSse41Uabd( private static void EmitSse41VectorUabdOp(
ArmEmitterContext context, ArmEmitterContext context,
OpCodeSimdReg op, OpCodeSimdReg op,
Operand n, Operand n,

View file

@ -300,7 +300,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.Equal, scalar: true); EmitSse2OrAvxCmpOpF(context, CmpCondition.Equal, scalar: true);
} }
else else
{ {
@ -312,7 +312,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.Equal, scalar: false); EmitSse2OrAvxCmpOpF(context, CmpCondition.Equal, scalar: false);
} }
else else
{ {
@ -324,7 +324,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseAvx) if (Optimizations.FastFP && Optimizations.UseAvx)
{ {
EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true); EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true);
} }
else else
{ {
@ -336,7 +336,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseAvx) if (Optimizations.FastFP && Optimizations.UseAvx)
{ {
EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false); EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false);
} }
else else
{ {
@ -348,7 +348,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseAvx) if (Optimizations.FastFP && Optimizations.UseAvx)
{ {
EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: true); EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: true);
} }
else else
{ {
@ -360,7 +360,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseAvx) if (Optimizations.FastFP && Optimizations.UseAvx)
{ {
EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: false); EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: false);
} }
else else
{ {
@ -372,7 +372,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.LessThanOrEqual, scalar: true); EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThanOrEqual, scalar: true);
} }
else else
{ {
@ -384,7 +384,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.LessThanOrEqual, scalar: false); EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThanOrEqual, scalar: false);
} }
else else
{ {
@ -396,7 +396,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.LessThan, scalar: true); EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThan, scalar: true);
} }
else else
{ {
@ -408,7 +408,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.FastFP && Optimizations.UseSse2) if (Optimizations.FastFP && Optimizations.UseSse2)
{ {
EmitSse2CmpOpF(context, CmpCondition.LessThan, scalar: false); EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThan, scalar: false);
} }
else else
{ {
@ -544,7 +544,7 @@ namespace ARMeilleure.Instructions
me = context.VectorExtract(type, GetVec(op.Rm), 0); me = context.VectorExtract(type, GetVec(op.Rm), 0);
} }
Operand nzcv = context.SoftFloatCall(op.Size == 0 ? nameof(SoftFloat32) : nameof(SoftFloat64), nameof(SoftFloat32.FPCompare), ne, me, Const(signalNaNs)); Operand nzcv = EmitSoftFloatCall(context, nameof(SoftFloat32.FPCompare), ne, me, Const(signalNaNs));
EmitSetNzcv(context, nzcv); EmitSetNzcv(context, nzcv);
} }
@ -665,7 +665,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
private static void EmitSse2CmpOpF(ArmEmitterContext context, CmpCondition cond, bool scalar) private static void EmitSse2OrAvxCmpOpF(ArmEmitterContext context, CmpCondition cond, bool scalar)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;

View file

@ -15,7 +15,7 @@ namespace ARMeilleure.Instructions
Operand d = GetVec(op.Rd); Operand d = GetVec(op.Rd);
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
context.Copy(d, context.SoftFallbackCall(nameof(SoftFallback.Decrypt), d, n)); context.Copy(d, context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt)), d, n));
} }
public static void Aese_V(ArmEmitterContext context) public static void Aese_V(ArmEmitterContext context)
@ -25,7 +25,7 @@ namespace ARMeilleure.Instructions
Operand d = GetVec(op.Rd); Operand d = GetVec(op.Rd);
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
context.Copy(d, context.SoftFallbackCall(nameof(SoftFallback.Encrypt), d, n)); context.Copy(d, context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt)), d, n));
} }
public static void Aesimc_V(ArmEmitterContext context) public static void Aesimc_V(ArmEmitterContext context)
@ -34,7 +34,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
context.Copy(GetVec(op.Rd), context.SoftFallbackCall(nameof(SoftFallback.InverseMixColumns), n)); context.Copy(GetVec(op.Rd), context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns)), n));
} }
public static void Aesmc_V(ArmEmitterContext context) public static void Aesmc_V(ArmEmitterContext context)
@ -43,7 +43,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
context.Copy(GetVec(op.Rd), context.SoftFallbackCall(nameof(SoftFallback.MixColumns), n)); context.Copy(GetVec(op.Rd), context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns)), n));
} }
} }
} }

View file

@ -4,6 +4,7 @@ using ARMeilleure.State;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.Instructions.InstEmitSimdHelper; using static ARMeilleure.Instructions.InstEmitSimdHelper;
@ -61,7 +62,7 @@ namespace ARMeilleure.Instructions
{ {
Operand ne = context.VectorExtract(OperandType.FP32, GetVec(op.Rn), 0); Operand ne = context.VectorExtract(OperandType.FP32, GetVec(op.Rn), 0);
Operand res = context.SoftFloatCall(nameof(SoftFloat32_16), nameof(SoftFloat32_16.FPConvert), ne); Operand res = context.Call(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert)), ne);
res = context.ZeroExtend16(OperandType.I64, res); res = context.ZeroExtend16(OperandType.I64, res);
@ -71,7 +72,7 @@ namespace ARMeilleure.Instructions
{ {
Operand ne = EmitVectorExtractZx(context, op.Rn, 0, 1); Operand ne = EmitVectorExtractZx(context, op.Rn, 0, 1);
Operand res = context.SoftFloatCall(nameof(SoftFloat16_32), nameof(SoftFloat16_32.FPConvert), ne); Operand res = context.Call(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert)), ne);
context.Copy(GetVec(op.Rd), context.VectorInsert(context.VectorZero(), res, 0)); context.Copy(GetVec(op.Rd), context.VectorInsert(context.VectorZero(), res, 0));
} }
@ -137,7 +138,7 @@ namespace ARMeilleure.Instructions
{ {
Operand ne = EmitVectorExtractZx(context, op.Rn, part + index, 1); Operand ne = EmitVectorExtractZx(context, op.Rn, part + index, 1);
Operand e = context.SoftFloatCall(nameof(SoftFloat16_32), nameof(SoftFloat16_32.FPConvert), ne); Operand e = context.Call(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert)), ne);
res = context.VectorInsert(res, e, index); res = context.VectorInsert(res, e, index);
} }
@ -221,7 +222,7 @@ namespace ARMeilleure.Instructions
if (sizeF == 0) if (sizeF == 0)
{ {
Operand e = context.SoftFloatCall(nameof(SoftFloat32_16), nameof(SoftFloat32_16.FPConvert), ne); Operand e = context.Call(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert)), ne);
e = context.ZeroExtend16(OperandType.I64, e); e = context.ZeroExtend16(OperandType.I64, e);
@ -243,7 +244,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvts(context, FPRoundingMode.ToNearest, scalar: true); EmitSse41FcvtsOpF(context, FPRoundingMode.ToNearest, scalar: true);
} }
else else
{ {
@ -255,7 +256,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvts(context, FPRoundingMode.ToNearest, scalar: false); EmitSse41FcvtsOpF(context, FPRoundingMode.ToNearest, scalar: false);
} }
else else
{ {
@ -267,7 +268,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvtu(context, FPRoundingMode.ToNearest, scalar: true); EmitSse41FcvtuOpF(context, FPRoundingMode.ToNearest, scalar: true);
} }
else else
{ {
@ -279,7 +280,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvtu(context, FPRoundingMode.ToNearest, scalar: false); EmitSse41FcvtuOpF(context, FPRoundingMode.ToNearest, scalar: false);
} }
else else
{ {
@ -339,7 +340,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvts(context, FPRoundingMode.TowardsZero, scalar: true); EmitSse41FcvtsOpF(context, FPRoundingMode.TowardsZero, scalar: true);
} }
else else
{ {
@ -351,7 +352,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvts(context, FPRoundingMode.TowardsZero, scalar: false); EmitSse41FcvtsOpF(context, FPRoundingMode.TowardsZero, scalar: false);
} }
else else
{ {
@ -363,7 +364,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvts(context, FPRoundingMode.TowardsZero, scalar: false); EmitSse41FcvtsOpF(context, FPRoundingMode.TowardsZero, scalar: false);
} }
else else
{ {
@ -399,7 +400,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvtu(context, FPRoundingMode.TowardsZero, scalar: true); EmitSse41FcvtuOpF(context, FPRoundingMode.TowardsZero, scalar: true);
} }
else else
{ {
@ -411,7 +412,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvtu(context, FPRoundingMode.TowardsZero, scalar: false); EmitSse41FcvtuOpF(context, FPRoundingMode.TowardsZero, scalar: false);
} }
else else
{ {
@ -423,7 +424,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse41) if (Optimizations.UseSse41)
{ {
EmitSse41Fcvtu(context, FPRoundingMode.TowardsZero, scalar: false); EmitSse41FcvtuOpF(context, FPRoundingMode.TowardsZero, scalar: false);
} }
else else
{ {
@ -469,7 +470,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Scvtf(context, scalar: true); EmitSse2ScvtfOp(context, scalar: true);
} }
else else
{ {
@ -489,7 +490,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Scvtf(context, scalar: false); EmitSse2ScvtfOp(context, scalar: false);
} }
else else
{ {
@ -501,7 +502,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Scvtf(context, scalar: false); EmitSse2ScvtfOp(context, scalar: false);
} }
else else
{ {
@ -537,7 +538,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Ucvtf(context, scalar: true); EmitSse2UcvtfOp(context, scalar: true);
} }
else else
{ {
@ -557,7 +558,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Ucvtf(context, scalar: false); EmitSse2UcvtfOp(context, scalar: false);
} }
else else
{ {
@ -569,7 +570,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2Ucvtf(context, scalar: false); EmitSse2UcvtfOp(context, scalar: false);
} }
else else
{ {
@ -600,17 +601,21 @@ namespace ARMeilleure.Instructions
if (sizeF == 0) if (sizeF == 0)
{ {
string name = signed ? nameof(SoftFallback.SatF32ToS32) : nameof(SoftFallback.SatF32ToU32); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32));
e = context.SoftFallbackCall(name, e); e = context.Call(info, e);
e = context.ZeroExtend32(OperandType.I64, e); e = context.ZeroExtend32(OperandType.I64, e);
} }
else /* if (sizeF == 1) */ else /* if (sizeF == 1) */
{ {
string name = signed ? nameof(SoftFallback.SatF64ToS64) : nameof(SoftFallback.SatF64ToU64); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64));
e = context.SoftFallbackCall(name, e); e = context.Call(info, e);
} }
res = EmitVectorInsert(context, res, e, index, sizeI); res = EmitVectorInsert(context, res, e, index, sizeI);
@ -644,17 +649,21 @@ namespace ARMeilleure.Instructions
if (sizeF == 0) if (sizeF == 0)
{ {
string name = signed ? nameof(SoftFallback.SatF32ToS32) : nameof(SoftFallback.SatF32ToU32); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32));
e = context.SoftFallbackCall(name, e); e = context.Call(info, e);
e = context.ZeroExtend32(OperandType.I64, e); e = context.ZeroExtend32(OperandType.I64, e);
} }
else /* if (sizeF == 1) */ else /* if (sizeF == 1) */
{ {
string name = signed ? nameof(SoftFallback.SatF64ToS64) : nameof(SoftFallback.SatF64ToU64); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64));
e = context.SoftFallbackCall(name, e); e = context.Call(info, e);
} }
res = EmitVectorInsert(context, res, e, index, sizeI); res = EmitVectorInsert(context, res, e, index, sizeI);
@ -773,18 +782,22 @@ namespace ARMeilleure.Instructions
value = EmitF2iFBitsMul(context, value, fBits); value = EmitF2iFBitsMul(context, value, fBits);
string name; MethodInfo info;
if (context.CurrOp.RegisterSize == RegisterSize.Int32) if (context.CurrOp.RegisterSize == RegisterSize.Int32)
{ {
name = value.Type == OperandType.FP32 ? nameof(SoftFallback.SatF32ToS32) : nameof(SoftFallback.SatF64ToS32); info = value.Type == OperandType.FP32
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32));
} }
else else
{ {
name = value.Type == OperandType.FP32 ? nameof(SoftFallback.SatF32ToS64) : nameof(SoftFallback.SatF64ToS64); info = value.Type == OperandType.FP32
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64));
} }
return context.SoftFallbackCall(name, value); return context.Call(info, value);
} }
private static Operand EmitScalarFcvtu(ArmEmitterContext context, Operand value, int fBits) private static Operand EmitScalarFcvtu(ArmEmitterContext context, Operand value, int fBits)
@ -793,18 +806,22 @@ namespace ARMeilleure.Instructions
value = EmitF2iFBitsMul(context, value, fBits); value = EmitF2iFBitsMul(context, value, fBits);
string name; MethodInfo info;
if (context.CurrOp.RegisterSize == RegisterSize.Int32) if (context.CurrOp.RegisterSize == RegisterSize.Int32)
{ {
name = value.Type == OperandType.FP32 ? nameof(SoftFallback.SatF32ToU32) : nameof(SoftFallback.SatF64ToU32); info = value.Type == OperandType.FP32
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32));
} }
else else
{ {
name = value.Type == OperandType.FP32 ? nameof(SoftFallback.SatF32ToU64) : nameof(SoftFallback.SatF64ToU64); info = value.Type == OperandType.FP32
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64));
} }
return context.SoftFallbackCall(name, value); return context.Call(info, value);
} }
private static Operand EmitF2iFBitsMul(ArmEmitterContext context, Operand value, int fBits) private static Operand EmitF2iFBitsMul(ArmEmitterContext context, Operand value, int fBits)
@ -881,7 +898,7 @@ namespace ARMeilleure.Instructions
return res; return res;
} }
private static void EmitSse2Scvtf(ArmEmitterContext context, bool scalar) private static void EmitSse2ScvtfOp(ArmEmitterContext context, bool scalar)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@ -946,7 +963,7 @@ namespace ARMeilleure.Instructions
} }
} }
private static void EmitSse2Ucvtf(ArmEmitterContext context, bool scalar) private static void EmitSse2UcvtfOp(ArmEmitterContext context, bool scalar)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@ -1035,7 +1052,7 @@ namespace ARMeilleure.Instructions
} }
} }
private static void EmitSse41Fcvts(ArmEmitterContext context, FPRoundingMode roundMode, bool scalar) private static void EmitSse41FcvtsOpF(ArmEmitterContext context, FPRoundingMode roundMode, bool scalar)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@ -1126,7 +1143,7 @@ namespace ARMeilleure.Instructions
} }
} }
private static void EmitSse41Fcvtu(ArmEmitterContext context, FPRoundingMode roundMode, bool scalar) private static void EmitSse41FcvtuOpF(ArmEmitterContext context, FPRoundingMode roundMode, bool scalar)
{ {
OpCodeSimd op = (OpCodeSimd)context.CurrOp; OpCodeSimd op = (OpCodeSimd)context.CurrOp;

View file

@ -19,7 +19,7 @@ namespace ARMeilleure.Instructions
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.HashChoose), d, ne, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose)), d, ne, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -30,7 +30,7 @@ namespace ARMeilleure.Instructions
Operand ne = context.VectorExtract(OperandType.I32, GetVec(op.Rn), 0); Operand ne = context.VectorExtract(OperandType.I32, GetVec(op.Rn), 0);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.FixedRotate), ne); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate)), ne);
context.Copy(GetVec(op.Rd), context.VectorCreateScalar(res)); context.Copy(GetVec(op.Rd), context.VectorCreateScalar(res));
} }
@ -45,7 +45,7 @@ namespace ARMeilleure.Instructions
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.HashMajority), d, ne, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority)), d, ne, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -60,7 +60,7 @@ namespace ARMeilleure.Instructions
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.HashParity), d, ne, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity)), d, ne, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -73,7 +73,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.Sha1SchedulePart1), d, n, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1)), d, n, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -85,7 +85,7 @@ namespace ARMeilleure.Instructions
Operand d = GetVec(op.Rd); Operand d = GetVec(op.Rd);
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.Sha1SchedulePart2), d, n); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2)), d, n);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -100,7 +100,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.HashLower), d, n, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower)), d, n, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -113,7 +113,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.HashUpper), d, n, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper)), d, n, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -125,7 +125,7 @@ namespace ARMeilleure.Instructions
Operand d = GetVec(op.Rd); Operand d = GetVec(op.Rd);
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.Sha256SchedulePart1), d, n); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1)), d, n);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }
@ -138,7 +138,7 @@ namespace ARMeilleure.Instructions
Operand n = GetVec(op.Rn); Operand n = GetVec(op.Rn);
Operand m = GetVec(op.Rm); Operand m = GetVec(op.Rm);
Operand res = context.SoftFallbackCall(nameof(SoftFallback.Sha256SchedulePart2), d, n, m); Operand res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2)), d, n, m);
context.Copy(GetVec(op.Rd), res); context.Copy(GetVec(op.Rd), res);
} }

View file

@ -4,6 +4,7 @@ using ARMeilleure.State;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.IntermediateRepresentation.OperandHelper; using static ARMeilleure.IntermediateRepresentation.OperandHelper;
@ -314,21 +315,35 @@ namespace ARMeilleure.Instructions
{ {
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
return context.MathCall((op.Size & 1) == 0 ? nameof(MathF) : nameof(Math), name, n); MethodInfo info = (op.Size & 1) == 0
? typeof(MathF).GetMethod(name, new Type[] { typeof(float) })
: typeof(Math). GetMethod(name, new Type[] { typeof(double) });
return context.Call(info, n);
} }
public static Operand EmitRoundMathCall(ArmEmitterContext context, MidpointRounding roundMode, Operand n) public static Operand EmitRoundMathCall(ArmEmitterContext context, MidpointRounding roundMode, Operand n)
{ {
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
return context.MathCall((op.Size & 1) == 0 ? nameof(MathF) : nameof(Math), nameof(Math.Round), n, Const((int)roundMode)); string name = nameof(Math.Round);
MethodInfo info = (op.Size & 1) == 0
? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) })
: typeof(Math). GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) });
return context.Call(info, n, Const((int)roundMode));
} }
public static Operand EmitSoftFloatCall(ArmEmitterContext context, string name, params Operand[] callArgs) public static Operand EmitSoftFloatCall(ArmEmitterContext context, string name, params Operand[] callArgs)
{ {
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
return context.SoftFloatCall((op.Size & 1) == 0 ? nameof(SoftFloat32) : nameof(SoftFloat64), name, callArgs); MethodInfo info = (op.Size & 1) == 0
? typeof(SoftFloat32).GetMethod(name)
: typeof(SoftFloat64).GetMethod(name);
return context.Call(info, callArgs);
} }
public static void EmitScalarBinaryOpByElemF(ArmEmitterContext context, Func2I emit) public static void EmitScalarBinaryOpByElemF(ArmEmitterContext context, Func2I emit)
@ -1362,18 +1377,22 @@ namespace ARMeilleure.Instructions
throw new ArgumentOutOfRangeException(nameof(sizeDst)); throw new ArgumentOutOfRangeException(nameof(sizeDst));
} }
string name; MethodInfo info;
if (signedSrc) if (signedSrc)
{ {
name = signedDst ? nameof(SoftFallback.SignedSrcSignedDstSatQ) : nameof(SoftFallback.SignedSrcUnsignedDstSatQ); info = signedDst
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedSrcSignedDstSatQ))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedSrcUnsignedDstSatQ));
} }
else else
{ {
name = signedDst ? nameof(SoftFallback.UnsignedSrcSignedDstSatQ) : nameof(SoftFallback.UnsignedSrcUnsignedDstSatQ); info = signedDst
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedSrcSignedDstSatQ))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedSrcUnsignedDstSatQ));
} }
return context.SoftFallbackCall(name, op, Const(sizeDst)); return context.Call(info, op, Const(sizeDst));
} }
// TSrc (64bit) == TDst (64bit); signed. // TSrc (64bit) == TDst (64bit); signed.
@ -1381,7 +1400,7 @@ namespace ARMeilleure.Instructions
{ {
Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size."); Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size.");
return context.SoftFallbackCall(nameof(SoftFallback.UnarySignedSatQAbsOrNeg), op); return context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnarySignedSatQAbsOrNeg)), op);
} }
// TSrcs (64bit) == TDst (64bit); signed, unsigned. // TSrcs (64bit) == TDst (64bit); signed, unsigned.
@ -1389,9 +1408,11 @@ namespace ARMeilleure.Instructions
{ {
Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size."); Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size.");
string name = signed ? nameof(SoftFallback.BinarySignedSatQAdd) : nameof(SoftFallback.BinaryUnsignedSatQAdd); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQAdd))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQAdd));
return context.SoftFallbackCall(name, op1, op2); return context.Call(info, op1, op2);
} }
// TSrcs (64bit) == TDst (64bit); signed, unsigned. // TSrcs (64bit) == TDst (64bit); signed, unsigned.
@ -1399,9 +1420,11 @@ namespace ARMeilleure.Instructions
{ {
Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size."); Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size.");
string name = signed ? nameof(SoftFallback.BinarySignedSatQSub) : nameof(SoftFallback.BinaryUnsignedSatQSub); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQSub))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQSub));
return context.SoftFallbackCall(name, op1, op2); return context.Call(info, op1, op2);
} }
// TSrcs (64bit) == TDst (64bit); signed, unsigned. // TSrcs (64bit) == TDst (64bit); signed, unsigned.
@ -1409,9 +1432,11 @@ namespace ARMeilleure.Instructions
{ {
Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size."); Debug.Assert(((OpCodeSimd)context.CurrOp).Size == 3, "Invalid element size.");
string name = signed ? nameof(SoftFallback.BinarySignedSatQAcc) : nameof(SoftFallback.BinaryUnsignedSatQAcc); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQAcc))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQAcc));
return context.SoftFallbackCall(name, op1, op2); return context.Call(info, op1, op2);
} }
public static Operand EmitVectorExtractSx(ArmEmitterContext context, int reg, int index, int size) public static Operand EmitVectorExtractSx(ArmEmitterContext context, int reg, int index, int size)

View file

@ -2,6 +2,7 @@ using ARMeilleure.Decoders;
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.Instructions.InstEmitSimdHelper; using static ARMeilleure.Instructions.InstEmitSimdHelper;
@ -297,8 +298,6 @@ namespace ARMeilleure.Instructions
{ {
OpCodeSimdImm op = (OpCodeSimdImm)context.CurrOp; OpCodeSimdImm op = (OpCodeSimdImm)context.CurrOp;
if (Optimizations.UseSse2)
{
if (op.RegisterSize == RegisterSize.Simd128) if (op.RegisterSize == RegisterSize.Simd128)
{ {
context.Copy(GetVec(op.Rd), X86GetAllElements(context, op.Immediate)); context.Copy(GetVec(op.Rd), X86GetAllElements(context, op.Immediate));
@ -308,22 +307,6 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), X86GetScalar(context, op.Immediate)); context.Copy(GetVec(op.Rd), X86GetScalar(context, op.Immediate));
} }
} }
else
{
Operand e = Const(op.Immediate);
Operand res = context.VectorZero();
int elems = op.RegisterSize == RegisterSize.Simd128 ? 2 : 1;
for (int index = 0; index < elems; index++)
{
res = EmitVectorInsert(context, res, e, index, 3);
}
context.Copy(GetVec(op.Rd), res);
}
}
public static void Ins_Gp(ArmEmitterContext context) public static void Ins_Gp(ArmEmitterContext context)
{ {
@ -349,7 +332,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2MoviMvni(context, not: false); EmitSse2VectorMoviMvniOp(context, not: false);
} }
else else
{ {
@ -361,7 +344,7 @@ namespace ARMeilleure.Instructions
{ {
if (Optimizations.UseSse2) if (Optimizations.UseSse2)
{ {
EmitSse2MoviMvni(context, not: true); EmitSse2VectorMoviMvniOp(context, not: true);
} }
else else
{ {
@ -475,7 +458,7 @@ namespace ARMeilleure.Instructions
EmitVectorZip(context, part: 1); EmitVectorZip(context, part: 1);
} }
private static void EmitSse2MoviMvni(ArmEmitterContext context, bool not) private static void EmitSse2VectorMoviMvniOp(ArmEmitterContext context, bool not)
{ {
OpCodeSimdImm op = (OpCodeSimdImm)context.CurrOp; OpCodeSimdImm op = (OpCodeSimdImm)context.CurrOp;
@ -592,17 +575,30 @@ namespace ARMeilleure.Instructions
args.Add(GetVec((op.Rn + index) & 0x1F)); args.Add(GetVec((op.Rn + index) & 0x1F));
} }
string name = null; MethodInfo info = null;
if (isTbl)
{
switch (op.Size) switch (op.Size)
{ {
case 1: name = isTbl ? nameof(SoftFallback.Tbl1) : nameof(SoftFallback.Tbx1); break; case 1: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1)); break;
case 2: name = isTbl ? nameof(SoftFallback.Tbl2) : nameof(SoftFallback.Tbx2); break; case 2: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2)); break;
case 3: name = isTbl ? nameof(SoftFallback.Tbl3) : nameof(SoftFallback.Tbx3); break; case 3: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3)); break;
case 4: name = isTbl ? nameof(SoftFallback.Tbl4) : nameof(SoftFallback.Tbx4); break; case 4: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4)); break;
}
}
else
{
switch (op.Size)
{
case 1: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1)); break;
case 2: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2)); break;
case 3: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3)); break;
case 4: info = typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4)); break;
}
} }
context.Copy(d, context.SoftFallbackCall(name, args.ToArray())); context.Copy(d, context.Call(info, args.ToArray()));
} }
} }

View file

@ -5,6 +5,7 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.Instructions.InstEmitSimdHelper; using static ARMeilleure.Instructions.InstEmitSimdHelper;
@ -198,7 +199,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.SignedShlRegSatQ), ne, me, Const(1), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlRegSatQ)), ne, me, Const(1), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -239,7 +240,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.SignedShlRegSatQ), ne, me, Const(0), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlRegSatQ)), ne, me, Const(0), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -290,7 +291,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.SignedShlReg), ne, me, Const(1), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlReg)), ne, me, Const(1), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -403,7 +404,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractSx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractSx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.SignedShlReg), ne, me, Const(0), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlReg)), ne, me, Const(0), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -527,7 +528,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.UnsignedShlRegSatQ), ne, me, Const(1), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShlRegSatQ)), ne, me, Const(1), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -558,7 +559,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.UnsignedShlRegSatQ), ne, me, Const(0), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShlRegSatQ)), ne, me, Const(0), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -589,7 +590,7 @@ namespace ARMeilleure.Instructions
Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size); Operand ne = EmitVectorExtractZx(context, op.Rn, index, op.Size);
Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size); Operand me = EmitVectorExtractZx(context, op.Rm, index, op.Size);
Operand e = context.SoftFallbackCall(nameof(SoftFallback.UnsignedShlReg), ne, me, Const(1), Const(op.Size)); Operand e = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShlReg)), ne, me, Const(1), Const(op.Size));
res = EmitVectorInsert(context, res, e, index, op.Size); res = EmitVectorInsert(context, res, e, index, op.Size);
} }
@ -1026,9 +1027,11 @@ namespace ARMeilleure.Instructions
long roundConst, long roundConst,
int shift) int shift)
{ {
string name = signed ? nameof(SoftFallback.SignedShrImm64) : nameof(SoftFallback.UnsignedShrImm64); MethodInfo info = signed
? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64))
: typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64));
return context.SoftFallbackCall(name, value, Const(roundConst), Const(shift)); return context.Call(info, value, Const(roundConst), Const(shift));
} }
private static void EmitVectorShImmWidenBinarySx(ArmEmitterContext context, Func2I emit, int imm) private static void EmitVectorShImmWidenBinarySx(ArmEmitterContext context, Func2I emit, int imm)

View file

@ -3,6 +3,7 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.State; using ARMeilleure.State;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System; using System;
using System.Reflection;
using static ARMeilleure.Instructions.InstEmitHelper; using static ARMeilleure.Instructions.InstEmitHelper;
using static ARMeilleure.IntermediateRepresentation.OperandHelper; using static ARMeilleure.IntermediateRepresentation.OperandHelper;
@ -27,43 +28,43 @@ namespace ARMeilleure.Instructions
{ {
OpCodeSystem op = (OpCodeSystem)context.CurrOp; OpCodeSystem op = (OpCodeSystem)context.CurrOp;
string name; MethodInfo info;
switch (GetPackedId(op)) switch (GetPackedId(op))
{ {
case 0b11_011_0000_0000_001: name = nameof(NativeInterface.GetCtrEl0); break; case 0b11_011_0000_0000_001: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0)); break;
case 0b11_011_0000_0000_111: name = nameof(NativeInterface.GetDczidEl0); break; case 0b11_011_0000_0000_111: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0)); break;
case 0b11_011_0100_0010_000: EmitGetNzcv(context); return; case 0b11_011_0100_0010_000: EmitGetNzcv(context); return;
case 0b11_011_0100_0100_000: name = nameof(NativeInterface.GetFpcr); break; case 0b11_011_0100_0100_000: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFpcr)); break;
case 0b11_011_0100_0100_001: name = nameof(NativeInterface.GetFpsr); break; case 0b11_011_0100_0100_001: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFpsr)); break;
case 0b11_011_1101_0000_010: name = nameof(NativeInterface.GetTpidrEl0); break; case 0b11_011_1101_0000_010: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetTpidrEl0)); break;
case 0b11_011_1101_0000_011: name = nameof(NativeInterface.GetTpidr); break; case 0b11_011_1101_0000_011: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetTpidr)); break;
case 0b11_011_1110_0000_000: name = nameof(NativeInterface.GetCntfrqEl0); break; case 0b11_011_1110_0000_000: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0)); break;
case 0b11_011_1110_0000_001: name = nameof(NativeInterface.GetCntpctEl0); break; case 0b11_011_1110_0000_001: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0)); break;
default: throw new NotImplementedException($"Unknown MRS 0x{op.RawOpCode:X8} at 0x{op.Address:X16}."); default: throw new NotImplementedException($"Unknown MRS 0x{op.RawOpCode:X8} at 0x{op.Address:X16}.");
} }
SetIntOrZR(context, op.Rt, context.NativeInterfaceCall(name)); SetIntOrZR(context, op.Rt, context.Call(info));
} }
public static void Msr(ArmEmitterContext context) public static void Msr(ArmEmitterContext context)
{ {
OpCodeSystem op = (OpCodeSystem)context.CurrOp; OpCodeSystem op = (OpCodeSystem)context.CurrOp;
string name; MethodInfo info;
switch (GetPackedId(op)) switch (GetPackedId(op))
{ {
case 0b11_011_0100_0010_000: EmitSetNzcv(context); return; case 0b11_011_0100_0010_000: EmitSetNzcv(context); return;
case 0b11_011_0100_0100_000: name = nameof(NativeInterface.SetFpcr); break; case 0b11_011_0100_0100_000: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetFpcr)); break;
case 0b11_011_0100_0100_001: name = nameof(NativeInterface.SetFpsr); break; case 0b11_011_0100_0100_001: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetFpsr)); break;
case 0b11_011_1101_0000_010: name = nameof(NativeInterface.SetTpidrEl0); break; case 0b11_011_1101_0000_010: info = typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetTpidrEl0)); break;
default: throw new NotImplementedException($"Unknown MSR 0x{op.RawOpCode:X8} at 0x{op.Address:X16}."); default: throw new NotImplementedException($"Unknown MSR 0x{op.RawOpCode:X8} at 0x{op.Address:X16}.");
} }
context.NativeInterfaceCall(name, GetIntOrZR(context, op.Rt)); context.Call(info, GetIntOrZR(context, op.Rt));
} }
public static void Nop(ArmEmitterContext context) public static void Nop(ArmEmitterContext context)
@ -89,7 +90,7 @@ namespace ARMeilleure.Instructions
{ {
Operand address = context.Add(t, Const(offset)); Operand address = context.Add(t, Const(offset));
context.NativeInterfaceCall(nameof(NativeInterface.WriteUInt64), address, Const(0L)); context.Call(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)), address, Const(0L));
} }
break; break;

View file

@ -1240,12 +1240,5 @@ namespace ARMeilleure.Instructions
: (uint)(value >> 32); : (uint)(value >> 32);
} }
#endregion #endregion
#region "MaxMin"
public static long MaxS64(long val1, long val2) => (val1 >= val2) ? val1 : val2;
public static ulong MaxU64(ulong val1, ulong val2) => (val1 >= val2) ? val1 : val2;
public static long MinS64(long val1, long val2) => (val1 <= val2) ? val1 : val2;
public static ulong MinU64(ulong val1, ulong val2) => (val1 <= val2) ? val1 : val2;
#endregion
} }
} }

View file

@ -23,53 +23,19 @@ namespace ARMeilleure.Translation
_delegateTypesCache = new Dictionary<string, Type>(); _delegateTypesCache = new Dictionary<string, Type>();
} }
public static Delegate GetDelegate(Type type, string name) public static Delegate GetDelegate(MethodInfo info)
{ {
if (type == null) if (info == null)
{ {
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
if (name == null) Type[] parameters = info.GetParameters().Select(pI => pI.ParameterType).ToArray();
{ Type returnType = info.ReturnType;
throw new ArgumentNullException();
}
MethodInfo methodInfo = type.GetMethod(name);
return GetDelegate(methodInfo);
}
public static Delegate GetDelegate(Type type, string name, Type[] types)
{
if (type == null)
{
throw new ArgumentNullException();
}
if (name == null)
{
throw new ArgumentNullException();
}
if (types == null)
{
throw new ArgumentNullException();
}
MethodInfo methodInfo = type.GetMethod(name, types);
return GetDelegate(methodInfo);
}
private static Delegate GetDelegate(MethodInfo methodInfo)
{
Type[] parameters = methodInfo.GetParameters().Select(pI => pI.ParameterType).ToArray();
Type returnType = methodInfo.ReturnType;
Type delegateType = GetDelegateType(parameters, returnType); Type delegateType = GetDelegateType(parameters, returnType);
return Delegate.CreateDelegate(delegateType, methodInfo); return Delegate.CreateDelegate(delegateType, info);
} }
private static Type GetDelegateType(Type[] parameters, Type returnType) private static Type GetDelegateType(Type[] parameters, Type returnType)

View file

@ -14,25 +14,7 @@ namespace ARMeilleure.Translation
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
if (_nativeInterfaceDelegates.TryGetValue(key, out DelegateInfo dlgInfo)) if (_delegates.TryGetValue(key, out DelegateInfo dlgInfo))
{
funcPtr = dlgInfo.FuncPtr;
return true;
}
else if (_softFallbackDelegates.TryGetValue(key, out dlgInfo))
{
funcPtr = dlgInfo.FuncPtr;
return true;
}
else if (_mathDelegates.TryGetValue(key, out dlgInfo))
{
funcPtr = dlgInfo.FuncPtr;
return true;
}
else if (_softFloatDelegates.TryGetValue(key, out dlgInfo))
{ {
funcPtr = dlgInfo.FuncPtr; funcPtr = dlgInfo.FuncPtr;
@ -46,14 +28,14 @@ namespace ARMeilleure.Translation
} }
} }
public static DelegateInfo GetMathDelegateInfo(string key) public static DelegateInfo GetDelegateInfo(string key)
{ {
if (key == null) if (key == null)
{ {
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
if (!_mathDelegates.TryGetValue(key, out DelegateInfo dlgInfo)) if (!_delegates.TryGetValue(key, out DelegateInfo dlgInfo))
{ {
throw new Exception(); throw new Exception();
} }
@ -61,277 +43,189 @@ namespace ARMeilleure.Translation
return dlgInfo; return dlgInfo;
} }
public static DelegateInfo GetNativeInterfaceDelegateInfo(string key) private static void SetDelegateInfo(MethodInfo info)
{ {
if (key == null) string key = $"{info.DeclaringType.Name}.{info.Name}";
{
throw new ArgumentNullException();
}
if (!_nativeInterfaceDelegates.TryGetValue(key, out DelegateInfo dlgInfo)) Delegate dlg = DelegateHelpers.GetDelegate(info);
{
throw new Exception();
}
return dlgInfo; if (!_delegates.TryAdd(key, new DelegateInfo(dlg)))
}
public static DelegateInfo GetSoftFallbackDelegateInfo(string key)
{
if (key == null)
{
throw new ArgumentNullException();
}
if (!_softFallbackDelegates.TryGetValue(key, out DelegateInfo dlgInfo))
{
throw new Exception();
}
return dlgInfo;
}
public static DelegateInfo GetSoftFloatDelegateInfo(string key)
{
if (key == null)
{
throw new ArgumentNullException();
}
if (!_softFloatDelegates.TryGetValue(key, out DelegateInfo dlgInfo))
{
throw new Exception();
}
return dlgInfo;
}
private static void SetMathDelegateInfo(Type type, string name, Type[] types)
{
Delegate dlg = DelegateHelpers.GetDelegate(type, name, types);
if (!_mathDelegates.TryAdd(GetKey(dlg.Method), new DelegateInfo(dlg)))
{ {
throw new Exception(); throw new Exception();
} }
} }
private static void SetNativeInterfaceDelegateInfo(string name) private static readonly Dictionary<string, DelegateInfo> _delegates;
{
Delegate dlg = DelegateHelpers.GetDelegate(typeof(NativeInterface), name);
if (!_nativeInterfaceDelegates.TryAdd(GetKey(dlg.Method), new DelegateInfo(dlg)))
{
throw new Exception();
}
}
private static void SetSoftFallbackDelegateInfo(string name)
{
Delegate dlg = DelegateHelpers.GetDelegate(typeof(SoftFallback), name);
if (!_softFallbackDelegates.TryAdd(GetKey(dlg.Method), new DelegateInfo(dlg)))
{
throw new Exception();
}
}
private static void SetSoftFloatDelegateInfo(Type type, string name)
{
Delegate dlg = DelegateHelpers.GetDelegate(type, name);
if (!_softFloatDelegates.TryAdd(GetKey(dlg.Method), new DelegateInfo(dlg)))
{
throw new Exception();
}
}
private static string GetKey(MethodInfo info)
{
return $"{info.DeclaringType.Name}.{info.Name}";
}
private static readonly Dictionary<string, DelegateInfo> _mathDelegates;
private static readonly Dictionary<string, DelegateInfo> _nativeInterfaceDelegates;
private static readonly Dictionary<string, DelegateInfo> _softFallbackDelegates;
private static readonly Dictionary<string, DelegateInfo> _softFloatDelegates;
static Delegates() static Delegates()
{ {
_mathDelegates = new Dictionary<string, DelegateInfo>(); _delegates = new Dictionary<string, DelegateInfo>();
_nativeInterfaceDelegates = new Dictionary<string, DelegateInfo>();
_softFallbackDelegates = new Dictionary<string, DelegateInfo>();
_softFloatDelegates = new Dictionary<string, DelegateInfo>();
SetMathDelegateInfo(typeof(Math), nameof(Math.Abs), new Type[] { typeof(double) }); SetDelegateInfo(typeof(Math).GetMethod(nameof(Math.Abs), new Type[] { typeof(double) }));
SetMathDelegateInfo(typeof(Math), nameof(Math.Ceiling), new Type[] { typeof(double) }); SetDelegateInfo(typeof(Math).GetMethod(nameof(Math.Ceiling), new Type[] { typeof(double) }));
SetMathDelegateInfo(typeof(Math), nameof(Math.Floor), new Type[] { typeof(double) }); SetDelegateInfo(typeof(Math).GetMethod(nameof(Math.Floor), new Type[] { typeof(double) }));
SetMathDelegateInfo(typeof(Math), nameof(Math.Round), new Type[] { typeof(double), typeof(MidpointRounding) }); SetDelegateInfo(typeof(Math).GetMethod(nameof(Math.Round), new Type[] { typeof(double), typeof(MidpointRounding) }));
SetMathDelegateInfo(typeof(Math), nameof(Math.Truncate), new Type[] { typeof(double) }); SetDelegateInfo(typeof(Math).GetMethod(nameof(Math.Truncate), new Type[] { typeof(double) }));
SetMathDelegateInfo(typeof(MathF), nameof(MathF.Abs), new Type[] { typeof(float) }); SetDelegateInfo(typeof(MathF).GetMethod(nameof(MathF.Abs), new Type[] { typeof(float) }));
SetMathDelegateInfo(typeof(MathF), nameof(MathF.Ceiling), new Type[] { typeof(float) }); SetDelegateInfo(typeof(MathF).GetMethod(nameof(MathF.Ceiling), new Type[] { typeof(float) }));
SetMathDelegateInfo(typeof(MathF), nameof(MathF.Floor), new Type[] { typeof(float) }); SetDelegateInfo(typeof(MathF).GetMethod(nameof(MathF.Floor), new Type[] { typeof(float) }));
SetMathDelegateInfo(typeof(MathF), nameof(MathF.Round), new Type[] { typeof(float), typeof(MidpointRounding) }); SetDelegateInfo(typeof(MathF).GetMethod(nameof(MathF.Round), new Type[] { typeof(float), typeof(MidpointRounding) }));
SetMathDelegateInfo(typeof(MathF), nameof(MathF.Truncate), new Type[] { typeof(float) }); SetDelegateInfo(typeof(MathF).GetMethod(nameof(MathF.Truncate), new Type[] { typeof(float) }));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.Break)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Break)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.CheckSynchronization)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ClearExclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ClearExclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetCntfrqEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetCntpctEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetCtrEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetDczidEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetFpcr)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFpcr)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetFpsr)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFpsr)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetTpidr)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetTpidr)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.GetTpidrEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetTpidrEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadByte)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadByteExclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByteExclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt16)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt16Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt32)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt32Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt64)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadUInt64Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadVector128)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.ReadVector128Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.SetFpcr)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetFpcr)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.SetFpsr)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetFpsr)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.SetTpidrEl0)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SetTpidrEl0)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.SupervisorCall)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SupervisorCall)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.Undefined)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Undefined)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteByte)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteByteExclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByteExclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt16)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt16Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt32)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt32Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt64)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteUInt64Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64Exclusive)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteVector128)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128)));
SetNativeInterfaceDelegateInfo(nameof(NativeInterface.WriteVector128Exclusive)); SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128Exclusive)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinarySignedSatQAcc)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQAcc)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinarySignedSatQAdd)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQAdd)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinarySignedSatQSub)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinarySignedSatQSub)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinaryUnsignedSatQAcc)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQAcc)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinaryUnsignedSatQAdd)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQAdd)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.BinaryUnsignedSatQSub)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.BinaryUnsignedSatQSub)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.CountLeadingSigns)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.CountLeadingZeros)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.CountSetBits8)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountSetBits8)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32b)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32b)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32cb)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cb)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32ch)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32ch)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32cw)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cw)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32cx)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cx)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32h)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32h)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32w)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32w)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Crc32x)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32x)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Decrypt)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Encrypt)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.FixedRotate)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.HashChoose)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.HashLower)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.HashMajority)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.HashParity)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.HashUpper)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.InverseMixColumns)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.MaxS64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.MaxU64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Round)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.MinS64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.RoundF)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.MinU64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.MixColumns)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Round)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.RoundF)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF32ToS32)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF32ToS64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF32ToU32)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF32ToU64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF64ToS32)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF64ToS64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF64ToU32)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SatF64ToU64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Sha1SchedulePart1)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlReg)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Sha1SchedulePart2)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShlRegSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Sha256SchedulePart1)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Sha256SchedulePart2)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedSrcSignedDstSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SignedShlReg)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedSrcUnsignedDstSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SignedShlRegSatQ)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SignedShrImm64)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SignedSrcSignedDstSatQ)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.SignedSrcUnsignedDstSatQ)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbl1)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbl2)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbl3)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbl4)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbx1)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnarySignedSatQAbsOrNeg)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbx2)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShlReg)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbx3)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShlRegSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.Tbx4)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnarySignedSatQAbsOrNeg)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedSrcSignedDstSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnsignedShlReg)); SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedSrcUnsignedDstSatQ)));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnsignedShlRegSatQ));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnsignedShrImm64));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnsignedSrcSignedDstSatQ));
SetSoftFallbackDelegateInfo(nameof(SoftFallback.UnsignedSrcUnsignedDstSatQ));
SetSoftFloatDelegateInfo(typeof(SoftFloat16_32), nameof(SoftFloat16_32.FPConvert)); SetDelegateInfo(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPAdd)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompare)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompare)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompareEQ)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQ)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompareGE)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGE)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompareGT)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGT)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompareLE)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLE)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPCompareLT)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLT)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPDiv)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPDiv)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMax)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMax)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMaxNum)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNum)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMin)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMin)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMinNum)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNum)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMul)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMul)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMulAdd)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMulSub)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSub)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPMulX)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulX)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPNegMulAdd)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPNegMulSub)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulSub)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPRecipEstimate)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimate)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPRecipStepFused)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStepFused)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPRecpX)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecpX)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPRSqrtEstimate)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimate)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPRSqrtStepFused)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStepFused)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPSqrt)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSqrt)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32), nameof(SoftFloat32.FPSub)); SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSub)));
SetSoftFloatDelegateInfo(typeof(SoftFloat32_16), nameof(SoftFloat32_16.FPConvert)); SetDelegateInfo(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPAdd)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompare)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompare)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompareEQ)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQ)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompareGE)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGE)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompareGT)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGT)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompareLE)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLE)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPCompareLT)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLT)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPDiv)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPDiv)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMax)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMax)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMaxNum)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNum)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMin)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMin)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMinNum)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNum)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMul)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMul)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMulAdd)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMulSub)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSub)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPMulX)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulX)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPNegMulAdd)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulAdd)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPNegMulSub)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulSub)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPRecipEstimate)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimate)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPRecipStepFused)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStepFused)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPRecpX)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecpX)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPRSqrtEstimate)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimate)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPRSqrtStepFused)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStepFused)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPSqrt)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSqrt)));
SetSoftFloatDelegateInfo(typeof(SoftFloat64), nameof(SoftFloat64.FPSub)); SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSub)));
} }
} }
} }

View file

@ -1,7 +1,7 @@
using ARMeilleure.Instructions;
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using static ARMeilleure.IntermediateRepresentation.OperandHelper; using static ARMeilleure.IntermediateRepresentation.OperandHelper;
@ -79,38 +79,11 @@ namespace ARMeilleure.Translation
return Add(Instruction.ByteSwap, Local(op1.Type), op1); return Add(Instruction.ByteSwap, Local(op1.Type), op1);
} }
public Operand MathCall(string className, string funcName, params Operand[] callArgs) public Operand Call(MethodInfo info, params Operand[] callArgs)
{ {
string name = $"{className}.{funcName}"; string name = $"{info.DeclaringType.Name}.{info.Name}";
DelegateInfo dlgInfo = Delegates.GetMathDelegateInfo(name); DelegateInfo dlgInfo = Delegates.GetDelegateInfo(name);
return Call(Const(dlgInfo.FuncPtr.ToInt64(), Aot.Enabled, name), dlgInfo.RetType, callArgs);
}
public Operand NativeInterfaceCall(string funcName, params Operand[] callArgs)
{
string name = $"{nameof(NativeInterface)}.{funcName}";
DelegateInfo dlgInfo = Delegates.GetNativeInterfaceDelegateInfo(name);
return Call(Const(dlgInfo.FuncPtr.ToInt64(), Aot.Enabled, name), dlgInfo.RetType, callArgs);
}
public Operand SoftFallbackCall(string funcName, params Operand[] callArgs)
{
string name = $"{nameof(SoftFallback)}.{funcName}";
DelegateInfo dlgInfo = Delegates.GetSoftFallbackDelegateInfo(name);
return Call(Const(dlgInfo.FuncPtr.ToInt64(), Aot.Enabled, name), dlgInfo.RetType, callArgs);
}
public Operand SoftFloatCall(string className, string funcName, params Operand[] callArgs)
{
string name = $"{className}.{funcName}";
DelegateInfo dlgInfo = Delegates.GetSoftFloatDelegateInfo(name);
return Call(Const(dlgInfo.FuncPtr.ToInt64(), Aot.Enabled, name), dlgInfo.RetType, callArgs); return Call(Const(dlgInfo.FuncPtr.ToInt64(), Aot.Enabled, name), dlgInfo.RetType, callArgs);
} }

View file

@ -289,7 +289,7 @@ namespace ARMeilleure.Translation
context.BranchIfTrue(lblNonZero, count); context.BranchIfTrue(lblNonZero, count);
context.NativeInterfaceCall(nameof(NativeInterface.CheckSynchronization)); context.Call(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization)));
context.Branch(lblExit); context.Branch(lblExit);