summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jit/codegenlegacy.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp
index 5a8c282ad5..6b0441eb02 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -9621,6 +9621,8 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
// What order should the Dest, Val/Src, and Size be calculated
+ regMaskTP regsToLock = RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2;
+
compiler->fgOrderBlockOps(tree, RBM_ARG_0, RBM_ARG_1, RBM_ARG_2, opsPtr, regsPtr); // OUT arguments
genComputeReg(opsPtr[0], regsPtr[0], RegSet::EXACT_REG, RegSet::KEEP_REG);
@@ -9629,6 +9631,11 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
{
genComputeReg(opsPtr[2], regsPtr[2], RegSet::EXACT_REG, RegSet::KEEP_REG);
}
+ else
+ {
+ regSet.rsLockReg(RBM_ARG_2);
+ regsToLock &= ~RBM_ARG_2;
+ }
genRecoverReg(opsPtr[0], regsPtr[0], RegSet::KEEP_REG);
genRecoverReg(opsPtr[1], regsPtr[1], RegSet::KEEP_REG);
@@ -9648,7 +9655,7 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
(sizeNode->gtRegNum == REG_ARG_2));
}
- regSet.rsLockUsedReg(RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2);
+ regSet.rsLockUsedReg(regsToLock);
genEmitHelperCall(isCopyBlk ? CORINFO_HELP_MEMCPY
/* GT_INITBLK */
@@ -9657,13 +9664,17 @@ void CodeGen::genCodeForBlkOp(GenTreePtr tree, regMaskTP destReg)
regTracker.rsTrackRegMaskTrash(RBM_CALLEE_TRASH);
- regSet.rsUnlockUsedReg(RBM_ARG_0 | RBM_ARG_1 | RBM_ARG_2);
+ regSet.rsUnlockUsedReg(regsToLock);
genReleaseReg(opsPtr[0]);
genReleaseReg(opsPtr[1]);
if (opsPtr[2] != nullptr)
{
genReleaseReg(opsPtr[2]);
}
+ else
+ {
+ regSet.rsUnlockReg(RBM_ARG_2);
+ }
}
if (isCopyBlk && dest->AsBlk()->IsVolatile())