aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Instructions')
-rw-r--r--ARMeilleure/Instructions/InstEmitException.cs21
-rw-r--r--ARMeilleure/Instructions/InstEmitException32.cs21
2 files changed, 29 insertions, 13 deletions
diff --git a/ARMeilleure/Instructions/InstEmitException.cs b/ARMeilleure/Instructions/InstEmitException.cs
index 8819824b..0baaa87d 100644
--- a/ARMeilleure/Instructions/InstEmitException.cs
+++ b/ARMeilleure/Instructions/InstEmitException.cs
@@ -9,18 +9,25 @@ namespace ARMeilleure.Instructions
{
public static void Brk(ArmEmitterContext context)
{
- EmitExceptionCall(context, nameof(NativeInterface.Break));
- }
+ OpCodeException op = (OpCodeException)context.CurrOp;
- public static void Svc(ArmEmitterContext context)
- {
- EmitExceptionCall(context, nameof(NativeInterface.SupervisorCall));
+ string name = nameof(NativeInterface.Break);
+
+ context.StoreToContext();
+
+ context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.Id));
+
+ context.LoadFromContext();
+
+ context.Return(Const(op.Address));
}
- private static void EmitExceptionCall(ArmEmitterContext context, string name)
+ public static void Svc(ArmEmitterContext context)
{
OpCodeException op = (OpCodeException)context.CurrOp;
+ string name = nameof(NativeInterface.SupervisorCall);
+
context.StoreToContext();
context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.Id));
@@ -41,6 +48,8 @@ namespace ARMeilleure.Instructions
context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.RawOpCode));
context.LoadFromContext();
+
+ context.Return(Const(op.Address));
}
}
} \ No newline at end of file
diff --git a/ARMeilleure/Instructions/InstEmitException32.cs b/ARMeilleure/Instructions/InstEmitException32.cs
index 0b3d28d9..a2a3869f 100644
--- a/ARMeilleure/Instructions/InstEmitException32.cs
+++ b/ARMeilleure/Instructions/InstEmitException32.cs
@@ -10,25 +10,32 @@ namespace ARMeilleure.Instructions
{
public static void Svc(ArmEmitterContext context)
{
- EmitExceptionCall(context, nameof(NativeInterface.SupervisorCall));
- }
+ IOpCode32Exception op = (IOpCode32Exception)context.CurrOp;
- public static void Trap(ArmEmitterContext context)
- {
- EmitExceptionCall(context, nameof(NativeInterface.Break));
+ string name = nameof(NativeInterface.SupervisorCall);
+
+ context.StoreToContext();
+
+ context.Call(typeof(NativeInterface).GetMethod(name), Const(((IOpCode)op).Address), Const(op.Id));
+
+ context.LoadFromContext();
+
+ Translator.EmitSynchronization(context);
}
- private static void EmitExceptionCall(ArmEmitterContext context, string name)
+ public static void Trap(ArmEmitterContext context)
{
IOpCode32Exception op = (IOpCode32Exception)context.CurrOp;
+ string name = nameof(NativeInterface.Break);
+
context.StoreToContext();
context.Call(typeof(NativeInterface).GetMethod(name), Const(((IOpCode)op).Address), Const(op.Id));
context.LoadFromContext();
- Translator.EmitSynchronization(context);
+ context.Return(Const(context.CurrOp.Address));
}
}
}