aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-07-16 15:57:15 -0300
committerGitHub <noreply@github.com>2018-07-16 15:57:15 -0300
commit5d698a7d8d240b9d324e385fb05c0ce9f26fb410 (patch)
tree945ef9760cb4a78071fc91b0403b60fc9c7cb18b
parente71da4fb747aaff45eafd40bbbd62638b4d659c7 (diff)
Fix LDXP/LDAXP when Rt == Rn (#274)
-rw-r--r--ChocolArm64/Instruction/AInstEmitMemoryEx.cs23
1 files changed, 16 insertions, 7 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitMemoryEx.cs b/ChocolArm64/Instruction/AInstEmitMemoryEx.cs
index ba8eeceb..c8cf9110 100644
--- a/ChocolArm64/Instruction/AInstEmitMemoryEx.cs
+++ b/ChocolArm64/Instruction/AInstEmitMemoryEx.cs
@@ -48,18 +48,24 @@ namespace ChocolArm64.Instruction
{
AOpCodeMemEx Op = (AOpCodeMemEx)Context.CurrOp;
- if (AccType.HasFlag(AccessType.Ordered))
+ bool Ordered = (AccType & AccessType.Ordered) != 0;
+ bool Exclusive = (AccType & AccessType.Exclusive) != 0;
+
+ if (Ordered)
{
EmitBarrier(Context);
}
- if (AccType.HasFlag(AccessType.Exclusive))
+ if (Exclusive)
{
EmitMemoryCall(Context, nameof(AMemory.SetExclusive), Op.Rn);
}
- Context.EmitLdarg(ATranslatedSub.MemoryArgIdx);
Context.EmitLdint(Op.Rn);
+ Context.EmitSttmp();
+
+ Context.EmitLdarg(ATranslatedSub.MemoryArgIdx);
+ Context.EmitLdtmp();
EmitReadZxCall(Context, Op.Size);
@@ -68,7 +74,7 @@ namespace ChocolArm64.Instruction
if (Pair)
{
Context.EmitLdarg(ATranslatedSub.MemoryArgIdx);
- Context.EmitLdint(Op.Rn);
+ Context.EmitLdtmp();
Context.EmitLdc_I(8 << Op.Size);
Context.Emit(OpCodes.Add);
@@ -104,7 +110,10 @@ namespace ChocolArm64.Instruction
{
AOpCodeMemEx Op = (AOpCodeMemEx)Context.CurrOp;
- if (AccType.HasFlag(AccessType.Ordered))
+ bool Ordered = (AccType & AccessType.Ordered) != 0;
+ bool Exclusive = (AccType & AccessType.Exclusive) != 0;
+
+ if (Ordered)
{
EmitBarrier(Context);
}
@@ -112,7 +121,7 @@ namespace ChocolArm64.Instruction
AILLabel LblEx = new AILLabel();
AILLabel LblEnd = new AILLabel();
- if (AccType.HasFlag(AccessType.Exclusive))
+ if (Exclusive)
{
EmitMemoryCall(Context, nameof(AMemory.TestExclusive), Op.Rn);
@@ -145,7 +154,7 @@ namespace ChocolArm64.Instruction
EmitWriteCall(Context, Op.Size);
}
- if (AccType.HasFlag(AccessType.Exclusive))
+ if (Exclusive)
{
Context.EmitLdc_I8(0);
Context.EmitStintzr(Op.Rs);