From c8bb3cc50e32e957609ee190dd5f35b9a349f640 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Sun, 13 Dec 2020 12:19:38 -0300
Subject: [PATCH] Fix register read after write on STREX implementation (#1801)

* Fix register read after write on STREX implementation

* PTC version update
---
 .../Instructions/InstEmitMemoryExHelper.cs    | 19 ++++++++++++++++++-
 ARMeilleure/Translation/PTC/Ptc.cs            |  2 +-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs b/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs
index 5b890dd395..317e4276ee 100644
--- a/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs
+++ b/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs
@@ -48,6 +48,18 @@ namespace ARMeilleure.Instructions
                 Operand exValuePtr = context.Add(arg0, Const((long)NativeContext.GetExclusiveValueOffset()));
 
                 context.Store(exAddrPtr, context.BitwiseAnd(address, Const(address.Type, GetExclusiveAddressMask())));
+
+                // Make sure the unused higher bits of the value are cleared.
+                if (size < 3)
+                {
+                    context.Store(exValuePtr, Const(0UL));
+                }
+                if (size < 4)
+                {
+                    context.Store(context.Add(exValuePtr, Const(exValuePtr.Type, 8L)), Const(0UL));
+                }
+
+                // Store the new exclusive value.
                 context.Store(exValuePtr, value);
 
                 return value;
@@ -74,6 +86,11 @@ namespace ARMeilleure.Instructions
 
             if (exclusive)
             {
+                // We overwrite one of the register (Rs),
+                // keep a copy of the values to ensure we are working with the correct values.
+                address = context.Copy(address);
+                value = context.Copy(value);
+
                 void SetRs(Operand value)
                 {
                     if (a32)
@@ -98,7 +115,7 @@ namespace ARMeilleure.Instructions
 
                 Operand lblExit = Label();
 
-                SetRs(exFailed);
+                SetRs(Const(1));
 
                 context.BranchIfTrue(lblExit, exFailed);
 
diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs
index 2145f350ff..05dd352ebf 100644
--- a/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/ARMeilleure/Translation/PTC/Ptc.cs
@@ -21,7 +21,7 @@ namespace ARMeilleure.Translation.PTC
     {
         private const string HeaderMagic = "PTChd";
 
-        private const int InternalVersion = 1783; //! To be incremented manually for each change to the ARMeilleure project.
+        private const int InternalVersion = 1801; //! To be incremented manually for each change to the ARMeilleure project.
 
         private const string ActualDir = "0";
         private const string BackupDir = "1";