mirror of
https://github.com/VSadov/Satori.git
synced 2025-06-09 17:44:48 +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());
|
||||
|
||||
// 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)
|
||||
{
|
||||
case GT_XORR:
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
||||
addrReg);
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, targetReg, addrReg);
|
||||
break;
|
||||
case GT_XAND:
|
||||
{
|
||||
// Grab a temp reg to perform `MVN` for dataReg first.
|
||||
regNumber tempReg = internalRegisters.GetSingle(treeNode);
|
||||
GetEmitter()->emitIns_R_R(INS_mvn, dataSize, tempReg, dataReg);
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
||||
addrReg);
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, targetReg, addrReg);
|
||||
break;
|
||||
}
|
||||
case GT_XCHG:
|
||||
|
@ -3908,8 +3910,7 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
|
|||
break;
|
||||
}
|
||||
case GT_XADD:
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
|
||||
addrReg);
|
||||
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, targetReg, addrReg);
|
||||
break;
|
||||
default:
|
||||
assert(!"Unexpected treeNode->gtOper");
|
||||
|
|
|
@ -1086,10 +1086,17 @@ int LinearScan::BuildNode(GenTree* tree)
|
|||
}
|
||||
setInternalRegsDelayFree = true;
|
||||
}
|
||||
buildInternalRegisterUses();
|
||||
if (dstCount == 1)
|
||||
{
|
||||
BuildDef(tree);
|
||||
}
|
||||
}
|
||||
buildInternalRegisterUses();
|
||||
if (dstCount == 1)
|
||||
else
|
||||
{
|
||||
// We always need the target reg for LSE, even if
|
||||
// return value is unused, see genLockedInstructions
|
||||
buildInternalRegisterUses();
|
||||
BuildDef(tree);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue