@@ -5098,33 +5098,31 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
5098
5098
BuildMI (MBB, I, DL, get (AArch64::MOVZWi), DestReg)
5099
5099
.addImm (0 )
5100
5100
.addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5101
+ } else if (Subtarget.hasZeroCycleRegMoveGPR64 () &&
5102
+ !Subtarget.hasZeroCycleRegMoveGPR32 ()) {
5103
+ // Cyclone recognizes "ORR Xd, XZR, Xm" as a zero-cycle register move.
5104
+ MCRegister DestRegX = TRI->getMatchingSuperReg (DestReg, AArch64::sub_32,
5105
+ &AArch64::GPR64spRegClass);
5106
+ assert (DestRegX.isValid () && " Destination super-reg not valid" );
5107
+ MCRegister SrcRegX =
5108
+ SrcReg == AArch64::WZR
5109
+ ? AArch64::XZR
5110
+ : TRI->getMatchingSuperReg (SrcReg, AArch64::sub_32,
5111
+ &AArch64::GPR64spRegClass);
5112
+ assert (SrcRegX.isValid () && " Source super-reg not valid" );
5113
+ // This instruction is reading and writing X registers. This may upset
5114
+ // the register scavenger and machine verifier, so we need to indicate
5115
+ // that we are reading an undefined value from SrcRegX, but a proper
5116
+ // value from SrcReg.
5117
+ BuildMI (MBB, I, DL, get (AArch64::ORRXrr), DestRegX)
5118
+ .addReg (AArch64::XZR)
5119
+ .addReg (SrcRegX, RegState::Undef)
5120
+ .addReg (SrcReg, RegState::Implicit | getKillRegState (KillSrc));
5101
5121
} else {
5102
- if (Subtarget.hasZeroCycleRegMoveGPR64 () &&
5103
- !Subtarget.hasZeroCycleRegMoveGPR32 ()) {
5104
- // Cyclone recognizes "ORR Xd, XZR, Xm" as a zero-cycle register move.
5105
- MCRegister DestRegX = TRI->getMatchingSuperReg (
5106
- DestReg, AArch64::sub_32, &AArch64::GPR64spRegClass);
5107
- assert (DestRegX.isValid () && " Destination super-reg not valid" );
5108
- MCRegister SrcRegX =
5109
- SrcReg == AArch64::WZR
5110
- ? AArch64::XZR
5111
- : TRI->getMatchingSuperReg (SrcReg, AArch64::sub_32,
5112
- &AArch64::GPR64spRegClass);
5113
- assert (SrcRegX.isValid () && " Source super-reg not valid" );
5114
- // This instruction is reading and writing X registers. This may upset
5115
- // the register scavenger and machine verifier, so we need to indicate
5116
- // that we are reading an undefined value from SrcRegX, but a proper
5117
- // value from SrcReg.
5118
- BuildMI (MBB, I, DL, get (AArch64::ORRXrr), DestRegX)
5119
- .addReg (AArch64::XZR)
5120
- .addReg (SrcRegX, RegState::Undef)
5121
- .addReg (SrcReg, RegState::Implicit | getKillRegState (KillSrc));
5122
- } else {
5123
- // Otherwise, expand to ORR WZR.
5124
- BuildMI (MBB, I, DL, get (AArch64::ORRWrr), DestReg)
5125
- .addReg (AArch64::WZR)
5126
- .addReg (SrcReg, getKillRegState (KillSrc));
5127
- }
5122
+ // Otherwise, expand to ORR WZR.
5123
+ BuildMI (MBB, I, DL, get (AArch64::ORRWrr), DestReg)
5124
+ .addReg (AArch64::WZR)
5125
+ .addReg (SrcReg, getKillRegState (KillSrc));
5128
5126
}
5129
5127
return ;
5130
5128
}
0 commit comments