RyuJIT: Remove redundant memory barrier for XAdd and XChg on arm (#45970)
authorEgor Bogatov <egorbo@gmail.com>
Mon, 28 Dec 2020 21:36:23 +0000 (00:36 +0300)
committerGitHub <noreply@github.com>
Mon, 28 Dec 2020 21:36:23 +0000 (13:36 -0800)
* Remove redundant memory barrier for XAdd and XChg on arm

* Update codegenarm64.cpp

* Same for casal

src/coreclr/jit/codegenarm64.cpp

index 752eff9..951fbbc 100644 (file)
@@ -2814,20 +2814,12 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
                 GetEmitter()->emitIns_R_R_R(INS_swpal, dataSize, dataReg, targetReg, addrReg);
                 break;
             case GT_XADD:
-                if ((targetReg == REG_NA) || (targetReg == REG_ZR))
-                {
-                    GetEmitter()->emitIns_R_R(INS_staddl, dataSize, dataReg, addrReg);
-                }
-                else
-                {
-                    GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, targetReg, addrReg);
-                }
+                GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
+                                            addrReg);
                 break;
             default:
                 assert(!"Unexpected treeNode->gtOper");
         }
-
-        instGen_MemoryBarrier();
     }
     else
     {
@@ -2955,8 +2947,6 @@ void CodeGen::genCodeForCmpXchg(GenTreeCmpXchg* treeNode)
             noway_assert(dataReg != targetReg);
         }
         GetEmitter()->emitIns_R_R_R(INS_casal, dataSize, targetReg, dataReg, addrReg);
-
-        instGen_MemoryBarrier();
     }
     else
     {