@@ -5063,7 +5063,7 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
50635063 bool RenamableDest,
50645064 bool RenamableSrc) const {
50655065 if (AArch64::GPR32spRegClass.contains (DestReg) &&
5066- ( AArch64::GPR32spRegClass.contains (SrcReg) || SrcReg == AArch64::WZR )) {
5066+ AArch64::GPR32spRegClass.contains (SrcReg)) {
50675067 if (DestReg == AArch64::WSP || SrcReg == AArch64::WSP) {
50685068 // If either operand is WSP, expand to ADD #0.
50695069 if (Subtarget.hasZeroCycleRegMoveGPR64 () &&
@@ -5088,21 +5088,14 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
50885088 .addImm (0 )
50895089 .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
50905090 }
5091- } else if (SrcReg == AArch64::WZR && Subtarget.hasZeroCycleZeroingGPR32 ()) {
5092- BuildMI (MBB, I, DL, get (AArch64::MOVZWi), DestReg)
5093- .addImm (0 )
5094- .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
50955091 } else if (Subtarget.hasZeroCycleRegMoveGPR64 () &&
50965092 !Subtarget.hasZeroCycleRegMoveGPR32 ()) {
50975093 // Cyclone recognizes "ORR Xd, XZR, Xm" as a zero-cycle register move.
50985094 MCRegister DestRegX = RI.getMatchingSuperReg (DestReg, AArch64::sub_32,
50995095 &AArch64::GPR64spRegClass);
51005096 assert (DestRegX.isValid () && " Destination super-reg not valid" );
5101- MCRegister SrcRegX =
5102- SrcReg == AArch64::WZR
5103- ? AArch64::XZR
5104- : RI.getMatchingSuperReg (SrcReg, AArch64::sub_32,
5105- &AArch64::GPR64spRegClass);
5097+ MCRegister SrcRegX = RI.getMatchingSuperReg (SrcReg, AArch64::sub_32,
5098+ &AArch64::GPR64spRegClass);
51065099 assert (SrcRegX.isValid () && " Source super-reg not valid" );
51075100 // This instruction is reading and writing X registers. This may upset
51085101 // the register scavenger and machine verifier, so we need to indicate
@@ -5121,6 +5114,51 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
51215114 return ;
51225115 }
51235116
5117+ // GPR32 zeroing
5118+ if (AArch64::GPR32spRegClass.contains (DestReg) && SrcReg == AArch64::WZR) {
5119+ if (Subtarget.hasZeroCycleZeroingGPR32 ()) {
5120+ BuildMI (MBB, I, DL, get (AArch64::MOVZWi), DestReg)
5121+ .addImm (0 )
5122+ .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5123+ } else {
5124+ BuildMI (MBB, I, DL, get (AArch64::ORRWrr), DestReg)
5125+ .addReg (AArch64::WZR)
5126+ .addReg (AArch64::WZR);
5127+ }
5128+ return ;
5129+ }
5130+
5131+ if (AArch64::GPR64spRegClass.contains (DestReg) &&
5132+ AArch64::GPR64spRegClass.contains (SrcReg)) {
5133+ if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
5134+ // If either operand is SP, expand to ADD #0.
5135+ BuildMI (MBB, I, DL, get (AArch64::ADDXri), DestReg)
5136+ .addReg (SrcReg, getKillRegState (KillSrc))
5137+ .addImm (0 )
5138+ .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5139+ } else {
5140+ // Otherwise, expand to ORR XZR.
5141+ BuildMI (MBB, I, DL, get (AArch64::ORRXrr), DestReg)
5142+ .addReg (AArch64::XZR)
5143+ .addReg (SrcReg, getKillRegState (KillSrc));
5144+ }
5145+ return ;
5146+ }
5147+
5148+ // GPR64 zeroing
5149+ if (AArch64::GPR64spRegClass.contains (DestReg) && SrcReg == AArch64::XZR) {
5150+ if (Subtarget.hasZeroCycleZeroingGPR64 ()) {
5151+ BuildMI (MBB, I, DL, get (AArch64::MOVZXi), DestReg)
5152+ .addImm (0 )
5153+ .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5154+ } else {
5155+ BuildMI (MBB, I, DL, get (AArch64::ORRXrr), DestReg)
5156+ .addReg (AArch64::XZR)
5157+ .addReg (AArch64::XZR);
5158+ }
5159+ return ;
5160+ }
5161+
51245162 // Copy a Predicate register by ORRing with itself.
51255163 if (AArch64::PPRRegClass.contains (DestReg) &&
51265164 AArch64::PPRRegClass.contains (SrcReg)) {
@@ -5205,27 +5243,6 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
52055243 return ;
52065244 }
52075245
5208- if (AArch64::GPR64spRegClass.contains (DestReg) &&
5209- (AArch64::GPR64spRegClass.contains (SrcReg) || SrcReg == AArch64::XZR)) {
5210- if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
5211- // If either operand is SP, expand to ADD #0.
5212- BuildMI (MBB, I, DL, get (AArch64::ADDXri), DestReg)
5213- .addReg (SrcReg, getKillRegState (KillSrc))
5214- .addImm (0 )
5215- .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5216- } else if (SrcReg == AArch64::XZR && Subtarget.hasZeroCycleZeroingGPR64 ()) {
5217- BuildMI (MBB, I, DL, get (AArch64::MOVZXi), DestReg)
5218- .addImm (0 )
5219- .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSL, 0 ));
5220- } else {
5221- // Otherwise, expand to ORR XZR.
5222- BuildMI (MBB, I, DL, get (AArch64::ORRXrr), DestReg)
5223- .addReg (AArch64::XZR)
5224- .addReg (SrcReg, getKillRegState (KillSrc));
5225- }
5226- return ;
5227- }
5228-
52295246 // Copy a DDDD register quad by copying the individual sub-registers.
52305247 if (AArch64::DDDDRegClass.contains (DestReg) &&
52315248 AArch64::DDDDRegClass.contains (SrcReg)) {
0 commit comments