aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions/InstEmitMemoryEx.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Instructions/InstEmitMemoryEx.cs')
-rw-r--r--ARMeilleure/Instructions/InstEmitMemoryEx.cs90
1 files changed, 6 insertions, 84 deletions
diff --git a/ARMeilleure/Instructions/InstEmitMemoryEx.cs b/ARMeilleure/Instructions/InstEmitMemoryEx.cs
index bcca7619..93c20cb5 100644
--- a/ARMeilleure/Instructions/InstEmitMemoryEx.cs
+++ b/ARMeilleure/Instructions/InstEmitMemoryEx.cs
@@ -5,6 +5,7 @@ using System;
using System.Diagnostics;
using static ARMeilleure.Instructions.InstEmitHelper;
+using static ARMeilleure.Instructions.InstEmitMemoryExHelper;
using static ARMeilleure.IntermediateRepresentation.OperandHelper;
namespace ARMeilleure.Instructions
@@ -66,7 +67,7 @@ namespace ARMeilleure.Instructions
// method to read 128-bits atomically.
if (op.Size == 2)
{
- Operand value = EmitLoad(context, address, exclusive, 3);
+ Operand value = EmitLoadExclusive(context, address, exclusive, 3);
Operand valueLow = context.ConvertI64ToI32(value);
@@ -79,7 +80,7 @@ namespace ARMeilleure.Instructions
}
else if (op.Size == 3)
{
- Operand value = EmitLoad(context, address, exclusive, 4);
+ Operand value = EmitLoadExclusive(context, address, exclusive, 4);
Operand valueLow = context.VectorExtract(OperandType.I64, value, 0);
Operand valueHigh = context.VectorExtract(OperandType.I64, value, 1);
@@ -95,46 +96,11 @@ namespace ARMeilleure.Instructions
else
{
// 8, 16, 32 or 64-bits (non-pairwise) load.
- Operand value = EmitLoad(context, address, exclusive, op.Size);
+ Operand value = EmitLoadExclusive(context, address, exclusive, op.Size);
SetIntOrZR(context, op.Rt, value);
}
}
-
- private static Operand EmitLoad(
- ArmEmitterContext context,
- Operand address,
- bool exclusive,
- int size)
- {
- Delegate fallbackMethodDlg = null;
-
- if (exclusive)
- {
- switch (size)
- {
- case 0: fallbackMethodDlg = new _U8_U64 (NativeInterface.ReadByteExclusive); break;
- case 1: fallbackMethodDlg = new _U16_U64 (NativeInterface.ReadUInt16Exclusive); break;
- case 2: fallbackMethodDlg = new _U32_U64 (NativeInterface.ReadUInt32Exclusive); break;
- case 3: fallbackMethodDlg = new _U64_U64 (NativeInterface.ReadUInt64Exclusive); break;
- case 4: fallbackMethodDlg = new _V128_U64(NativeInterface.ReadVector128Exclusive); break;
- }
- }
- else
- {
- switch (size)
- {
- case 0: fallbackMethodDlg = new _U8_U64 (NativeInterface.ReadByte); break;
- case 1: fallbackMethodDlg = new _U16_U64 (NativeInterface.ReadUInt16); break;
- case 2: fallbackMethodDlg = new _U32_U64 (NativeInterface.ReadUInt32); break;
- case 3: fallbackMethodDlg = new _U64_U64 (NativeInterface.ReadUInt64); break;
- case 4: fallbackMethodDlg = new _V128_U64(NativeInterface.ReadVector128); break;
- }
- }
-
- return context.Call(fallbackMethodDlg, address);
- }
-
public static void Pfrm(ArmEmitterContext context)
{
// Memory Prefetch, execute as no-op.
@@ -192,11 +158,11 @@ namespace ARMeilleure.Instructions
value = context.VectorInsert(value, t2, 1);
}
- s = EmitStore(context, address, value, exclusive, op.Size + 1);
+ s = EmitStoreExclusive(context, address, value, exclusive, op.Size + 1);
}
else
{
- s = EmitStore(context, address, t, exclusive, op.Size);
+ s = EmitStoreExclusive(context, address, t, exclusive, op.Size);
}
if (s != null)
@@ -207,50 +173,6 @@ namespace ARMeilleure.Instructions
}
}
- private static Operand EmitStore(
- ArmEmitterContext context,
- Operand address,
- Operand value,
- bool exclusive,
- int size)
- {
- if (size < 3)
- {
- value = context.ConvertI64ToI32(value);
- }
-
- Delegate fallbackMethodDlg = null;
-
- if (exclusive)
- {
- switch (size)
- {
- case 0: fallbackMethodDlg = new _S32_U64_U8 (NativeInterface.WriteByteExclusive); break;
- case 1: fallbackMethodDlg = new _S32_U64_U16 (NativeInterface.WriteUInt16Exclusive); break;
- case 2: fallbackMethodDlg = new _S32_U64_U32 (NativeInterface.WriteUInt32Exclusive); break;
- case 3: fallbackMethodDlg = new _S32_U64_U64 (NativeInterface.WriteUInt64Exclusive); break;
- case 4: fallbackMethodDlg = new _S32_U64_V128(NativeInterface.WriteVector128Exclusive); break;
- }
-
- return context.Call(fallbackMethodDlg, address, value);
- }
- else
- {
- switch (size)
- {
- case 0: fallbackMethodDlg = new _Void_U64_U8 (NativeInterface.WriteByte); break;
- case 1: fallbackMethodDlg = new _Void_U64_U16 (NativeInterface.WriteUInt16); break;
- case 2: fallbackMethodDlg = new _Void_U64_U32 (NativeInterface.WriteUInt32); break;
- case 3: fallbackMethodDlg = new _Void_U64_U64 (NativeInterface.WriteUInt64); break;
- case 4: fallbackMethodDlg = new _Void_U64_V128(NativeInterface.WriteVector128); break;
- }
-
- context.Call(fallbackMethodDlg, address, value);
-
- return null;
- }
- }
-
private static void EmitBarrier(ArmEmitterContext context)
{
// Note: This barrier is most likely not necessary, and probably