aboutsummaryrefslogtreecommitdiff
path: root/src/ARMeilleure/Decoders/OpCodeTable.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMeilleure/Decoders/OpCodeTable.cs')
-rw-r--r--src/ARMeilleure/Decoders/OpCodeTable.cs67
1 files changed, 34 insertions, 33 deletions
diff --git a/src/ARMeilleure/Decoders/OpCodeTable.cs b/src/ARMeilleure/Decoders/OpCodeTable.cs
index 4f359958..d3fc4ca0 100644
--- a/src/ARMeilleure/Decoders/OpCodeTable.cs
+++ b/src/ARMeilleure/Decoders/OpCodeTable.cs
@@ -13,7 +13,7 @@ namespace ARMeilleure.Decoders
private readonly struct InstInfo
{
- public int Mask { get; }
+ public int Mask { get; }
public int Value { get; }
public InstDescriptor Inst { get; }
@@ -22,24 +22,25 @@ namespace ARMeilleure.Decoders
public InstInfo(int mask, int value, InstDescriptor inst, MakeOp makeOp)
{
- Mask = mask;
- Value = value;
- Inst = inst;
+ Mask = mask;
+ Value = value;
+ Inst = inst;
MakeOp = makeOp;
}
}
- private static List<InstInfo> AllInstA32 = new();
- private static List<InstInfo> AllInstT32 = new();
- private static List<InstInfo> AllInstA64 = new();
+ private static readonly List<InstInfo> _allInstA32 = new();
+ private static readonly List<InstInfo> _allInstT32 = new();
+ private static readonly List<InstInfo> _allInstA64 = new();
- private static InstInfo[][] InstA32FastLookup = new InstInfo[FastLookupSize][];
- private static InstInfo[][] InstT32FastLookup = new InstInfo[FastLookupSize][];
- private static InstInfo[][] InstA64FastLookup = new InstInfo[FastLookupSize][];
+ private static readonly InstInfo[][] _instA32FastLookup = new InstInfo[FastLookupSize][];
+ private static readonly InstInfo[][] _instT32FastLookup = new InstInfo[FastLookupSize][];
+ private static readonly InstInfo[][] _instA64FastLookup = new InstInfo[FastLookupSize][];
static OpCodeTable()
{
-#region "OpCode Table (AArch64)"
+#pragma warning disable IDE0055 // Disable formatting
+ #region "OpCode Table (AArch64)"
// Base
SetA64("x0011010000xxxxx000000xxxxxxxxxx", InstName.Adc, InstEmit.Adc, OpCodeAluRs.Create);
SetA64("x0111010000xxxxx000000xxxxxxxxxx", InstName.Adcs, InstEmit.Adcs, OpCodeAluRs.Create);
@@ -638,9 +639,9 @@ namespace ARMeilleure.Decoders
SetA64("0x001110<<100001001010xxxxxxxxxx", InstName.Xtn_V, InstEmit.Xtn_V, OpCodeSimd.Create);
SetA64("0>001110<<0xxxxx001110xxxxxxxxxx", InstName.Zip1_V, InstEmit.Zip1_V, OpCodeSimdReg.Create);
SetA64("0>001110<<0xxxxx011110xxxxxxxxxx", InstName.Zip2_V, InstEmit.Zip2_V, OpCodeSimdReg.Create);
-#endregion
+ #endregion
-#region "OpCode Table (AArch32, A32)"
+ #region "OpCode Table (AArch32, A32)"
// Base
SetA32("<<<<0010101xxxxxxxxxxxxxxxxxxxxx", InstName.Adc, InstEmit32.Adc, OpCode32AluImm.Create);
SetA32("<<<<0000101xxxxxxxxxxxxxxxx0xxxx", InstName.Adc, InstEmit32.Adc, OpCode32AluRsImm.Create);
@@ -1050,9 +1051,9 @@ namespace ARMeilleure.Decoders
SetAsimd("111100100x<<xxxxxxxx1000xxx1xxxx", InstName.Vtst, InstEmit32.Vtst, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
SetAsimd("111100111x11<<10xxxx00010xx0xxxx", InstName.Vuzp, InstEmit32.Vuzp, OpCode32SimdCmpZ.Create, OpCode32SimdCmpZ.CreateT32);
SetAsimd("111100111x11<<10xxxx00011xx0xxxx", InstName.Vzip, InstEmit32.Vzip, OpCode32SimdCmpZ.Create, OpCode32SimdCmpZ.CreateT32);
-#endregion
+ #endregion
-#region "OpCode Table (AArch32, T16)"
+ #region "OpCode Table (AArch32, T16)"
SetT16("000<<xxxxxxxxxxx", InstName.Mov, InstEmit32.Mov, OpCodeT16ShiftImm.Create);
SetT16("0001100xxxxxxxxx", InstName.Add, InstEmit32.Add, OpCodeT16AddSubReg.Create);
SetT16("0001101xxxxxxxxx", InstName.Sub, InstEmit32.Sub, OpCodeT16AddSubReg.Create);
@@ -1131,7 +1132,7 @@ namespace ARMeilleure.Decoders
SetT16("11100xxxxxxxxxxx", InstName.B, InstEmit32.B, OpCodeT16BImm11.Create);
#endregion
-#region "OpCode Table (AArch32, T32)"
+ #region "OpCode Table (AArch32, T32)"
// Base
SetT32("11101011010xxxxx0xxxxxxxxxxxxxxx", InstName.Adc, InstEmit32.Adc, OpCodeT32AluRsImm.Create);
SetT32("11110x01010xxxxx0xxxxxxxxxxxxxxx", InstName.Adc, InstEmit32.Adc, OpCodeT32AluImm.Create);
@@ -1299,12 +1300,13 @@ namespace ARMeilleure.Decoders
SetT32("11110011101011111000000000000001", InstName.Yield, InstEmit32.Nop, OpCodeT32.Create);
#endregion
- FillFastLookupTable(InstA32FastLookup, AllInstA32, ToFastLookupIndexA);
- FillFastLookupTable(InstT32FastLookup, AllInstT32, ToFastLookupIndexT);
- FillFastLookupTable(InstA64FastLookup, AllInstA64, ToFastLookupIndexA);
+ FillFastLookupTable(_instA32FastLookup, _allInstA32, ToFastLookupIndexA);
+ FillFastLookupTable(_instT32FastLookup, _allInstT32, ToFastLookupIndexT);
+ FillFastLookupTable(_instA64FastLookup, _allInstA64, ToFastLookupIndexA);
+#pragma warning restore IDE0055
}
- private static void FillFastLookupTable(InstInfo[][] table, List<InstInfo> allInsts, Func<int, int> ToFastLookupIndex)
+ private static void FillFastLookupTable(InstInfo[][] table, List<InstInfo> allInsts, Func<int, int> toFastLookupIndex)
{
List<InstInfo>[] temp = new List<InstInfo>[FastLookupSize];
@@ -1315,8 +1317,8 @@ namespace ARMeilleure.Decoders
foreach (InstInfo inst in allInsts)
{
- int mask = ToFastLookupIndex(inst.Mask);
- int value = ToFastLookupIndex(inst.Value);
+ int mask = toFastLookupIndex(inst.Mask);
+ int value = toFastLookupIndex(inst.Value);
for (int index = 0; index < temp.Length; index++)
{
@@ -1335,22 +1337,21 @@ namespace ARMeilleure.Decoders
private static void SetA32(string encoding, InstName name, InstEmitter emitter, MakeOp makeOp)
{
- Set(encoding, AllInstA32, new InstDescriptor(name, emitter), makeOp);
+ Set(encoding, _allInstA32, new InstDescriptor(name, emitter), makeOp);
}
private static void SetT16(string encoding, InstName name, InstEmitter emitter, MakeOp makeOp)
{
encoding = "xxxxxxxxxxxxxxxx" + encoding;
- Set(encoding, AllInstT32, new InstDescriptor(name, emitter), makeOp);
+ Set(encoding, _allInstT32, new InstDescriptor(name, emitter), makeOp);
}
private static void SetT32(string encoding, InstName name, InstEmitter emitter, MakeOp makeOp)
{
string reversedEncoding = $"{encoding.AsSpan(16)}{encoding.AsSpan(0, 16)}";
- MakeOp reversedMakeOp =
- (inst, address, opCode)
+ OpCode ReversedMakeOp(InstDescriptor inst, ulong address, int opCode)
=> makeOp(inst, address, (int)BitOperations.RotateRight((uint)opCode, 16));
- Set(reversedEncoding, AllInstT32, new InstDescriptor(name, emitter), reversedMakeOp);
+ Set(reversedEncoding, _allInstT32, new InstDescriptor(name, emitter), ReversedMakeOp);
}
private static void SetVfp(string encoding, InstName name, InstEmitter emitter, MakeOp makeOpA32, MakeOp makeOpT32)
@@ -1395,12 +1396,12 @@ namespace ARMeilleure.Decoders
private static void SetA64(string encoding, InstName name, InstEmitter emitter, MakeOp makeOp)
{
- Set(encoding, AllInstA64, new InstDescriptor(name, emitter), makeOp);
+ Set(encoding, _allInstA64, new InstDescriptor(name, emitter), makeOp);
}
private static void Set(string encoding, List<InstInfo> list, InstDescriptor inst, MakeOp makeOp)
{
- int bit = encoding.Length - 1;
+ int bit = encoding.Length - 1;
int value = 0;
int xMask = 0;
int xBits = 0;
@@ -1439,7 +1440,7 @@ namespace ARMeilleure.Decoders
}
else if (chr != '0')
{
- throw new ArgumentException(nameof(encoding));
+ throw new ArgumentException($"Invalid encoding: {encoding}", nameof(encoding));
}
}
@@ -1470,17 +1471,17 @@ namespace ARMeilleure.Decoders
public static (InstDescriptor inst, MakeOp makeOp) GetInstA32(int opCode)
{
- return GetInstFromList(InstA32FastLookup[ToFastLookupIndexA(opCode)], opCode);
+ return GetInstFromList(_instA32FastLookup[ToFastLookupIndexA(opCode)], opCode);
}
public static (InstDescriptor inst, MakeOp makeOp) GetInstT32(int opCode)
{
- return GetInstFromList(InstT32FastLookup[ToFastLookupIndexT(opCode)], opCode);
+ return GetInstFromList(_instT32FastLookup[ToFastLookupIndexT(opCode)], opCode);
}
public static (InstDescriptor inst, MakeOp makeOp) GetInstA64(int opCode)
{
- return GetInstFromList(InstA64FastLookup[ToFastLookupIndexA(opCode)], opCode);
+ return GetInstFromList(_instA64FastLookup[ToFastLookupIndexA(opCode)], opCode);
}
private static (InstDescriptor inst, MakeOp makeOp) GetInstFromList(InstInfo[] insts, int opCode)