mirror of
https://github.com/VSadov/Satori.git
synced 2025-06-11 02:13:38 +09:00
Don't use ZR as target in LSE atomics (#105854)
* Don't use ZR as target in LSE atomics * Update codegenarm64.cpp * Update lsraarm64.cpp * Update lsraarm64.cpp
This commit is contained in:
parent
ab03e0ffc0
commit
53a500edf1
2 changed files with 16 additions and 8 deletions
|
@ -3878,19 +3878,21 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
|
||||||
{
|
{
|
||||||
assert(!data->isContainedIntOrIImmed());
|
assert(!data->isContainedIntOrIImmed());
|
||||||
|
|
||||||
|
// These instructions change semantics when targetReg is ZR (the memory ordering becomes weaker).
|
||||||
|
// See atomicBarrierDroppedOnZero in LLVM
|
||||||
|
assert((targetReg != REG_NA) && (targetReg != REG_ZR));
|
||||||
|
|
||||||
switch (treeNode->gtOper)
|
switch (treeNode->gtOper)
|
||||||
{
|
{
|
||||||
case GT_XORR:
|
case GT_XORR:
|
||||||
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, targetReg, addrReg);
|
||||||
addrReg);
|
|
||||||
break;
|
break;
|
||||||
case GT_XAND:
|
case GT_XAND:
|
||||||
{
|
{
|
||||||
// Grab a temp reg to perform `MVN` for dataReg first.
|
// Grab a temp reg to perform `MVN` for dataReg first.
|
||||||
regNumber tempReg = internalRegisters.GetSingle(treeNode);
|
regNumber tempReg = internalRegisters.GetSingle(treeNode);
|
||||||
GetEmitter()->emitIns_R_R(INS_mvn, dataSize, tempReg, dataReg);
|
GetEmitter()->emitIns_R_R(INS_mvn, dataSize, tempReg, dataReg);
|
||||||
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, targetReg, addrReg);
|
||||||
addrReg);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GT_XCHG:
|
case GT_XCHG:
|
||||||
|
@ -3908,8 +3910,7 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GT_XADD:
|
case GT_XADD:
|
||||||
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, targetReg, addrReg);
|
||||||
addrReg);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(!"Unexpected treeNode->gtOper");
|
assert(!"Unexpected treeNode->gtOper");
|
||||||
|
|
|
@ -1086,10 +1086,17 @@ int LinearScan::BuildNode(GenTree* tree)
|
||||||
}
|
}
|
||||||
setInternalRegsDelayFree = true;
|
setInternalRegsDelayFree = true;
|
||||||
}
|
}
|
||||||
|
buildInternalRegisterUses();
|
||||||
|
if (dstCount == 1)
|
||||||
|
{
|
||||||
|
BuildDef(tree);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
buildInternalRegisterUses();
|
else
|
||||||
if (dstCount == 1)
|
|
||||||
{
|
{
|
||||||
|
// We always need the target reg for LSE, even if
|
||||||
|
// return value is unused, see genLockedInstructions
|
||||||
|
buildInternalRegisterUses();
|
||||||
BuildDef(tree);
|
BuildDef(tree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue