In hwintrinsiccodegenarm64.cpp, we see the following code which handles RMW intrinsics:
if (targetReg != op2Reg)
{
assert(targetReg != op1Reg);
GetEmitter()->emitIns_Mov(INS_sve_mov, emitTypeSize(node), targetReg, op2Reg, /* canSkip */ true);
}
It can be simplified to just:
assert(targetReg != op1Reg);
GetEmitter()->emitIns_Mov(INS_sve_mov, emitTypeSize(node), targetReg, op2Reg, /* canSkip */ true);
Because emitIns_Mov will not emit a mov if targetReg == op2Reg.
There are similar ones as well that are not INS_sve_mov related, such as:
if (targetReg != op2Reg)
{
assert(targetReg != op1Reg);
assert(targetReg != op3Reg);
GetEmitter()->emitIns_Mov(INS_mov, emitTypeSize(node), targetReg, op2Reg,
/* canSkip */ true);
}
which can be:
assert(targetReg != op1Reg);
assert(targetReg != op3Reg);
GetEmitter()->emitIns_Mov(INS_mov, emitTypeSize(node), targetReg, op2Reg,
/* canSkip */ true);
As a consideration, not part of this issue, but perhaps adding a new function emitIns_MovIfNeeded that simply wraps emitIns_Mov with the canSkip set to true would be clearer.
In
hwintrinsiccodegenarm64.cpp, we see the following code which handles RMW intrinsics:It can be simplified to just:
Because
emitIns_Movwill not emit amoviftargetReg == op2Reg.There are similar ones as well that are not
INS_sve_movrelated, such as:which can be:
As a consideration, not part of this issue, but perhaps adding a new function
emitIns_MovIfNeededthat simply wrapsemitIns_Movwith thecanSkipset totruewould be clearer.