Closed TIHan closed 6 days ago
In hwintrinsiccodegenarm64.cpp, we see the following code which handles RMW intrinsics:
hwintrinsiccodegenarm64.cpp
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.
emitIns_Mov
mov
targetReg == op2Reg
There are similar ones as well that are not INS_sve_mov related, such as:
INS_sve_mov
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.
emitIns_MovIfNeeded
canSkip
true
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch See info in area-owners.md if you want to be subscribed.
@dotnet/arm64-contrib, @a74nh.
In
hwintrinsiccodegenarm64.cpp
, we see the following code which handles RMW intrinsics:It can be simplified to just:
Because
emitIns_Mov
will not emit amov
iftargetReg == op2Reg
.There are similar ones as well that are not
INS_sve_mov
related, such as:which can be:
As a consideration, not part of this issue, but perhaps adding a new function
emitIns_MovIfNeeded
that simply wrapsemitIns_Mov
with thecanSkip
set totrue
would be clearer.