@@ -289,14 +289,15 @@ class AArch64InstructionSelector : public InstructionSelector {
289
289
getExtendTypeForInst (MachineInstr &MI, MachineRegisterInfo &MRI,
290
290
bool IsLoadStore = false ) const ;
291
291
292
- // / Instructions that accept extend modifiers like UXTW expect the register
293
- // / being extended to be a GPR32. Narrow ExtReg to a 32-bit register using a
294
- // / subregister copy if necessary. Return either ExtReg, or the result of the
295
- // / new copy.
296
- Register narrowExtendRegIfNeeded (Register ExtReg,
297
- MachineIRBuilder &MIB) const ;
298
- Register widenGPRBankRegIfNeeded (Register Reg, unsigned Size,
299
- MachineIRBuilder &MIB) const ;
292
+ // / Move \p Reg to \p RC if \p Reg is not already on \p RC.
293
+ // /
294
+ // / \returns Either \p Reg if no change was necessary, or the new register
295
+ // / created by moving \p Reg.
296
+ // /
297
+ // / Note: This uses emitCopy right now.
298
+ Register moveScalarRegClass (Register Reg, const TargetRegisterClass &RC,
299
+ MachineIRBuilder &MIB) const ;
300
+
300
301
ComplexRendererFns selectArithExtendedRegister (MachineOperand &Root) const ;
301
302
302
303
void renderTruncImm (MachineInstrBuilder &MIB, const MachineInstr &MI,
@@ -1195,10 +1196,10 @@ MachineInstr *AArch64InstructionSelector::emitTestBit(
1195
1196
// TBNZW work.
1196
1197
bool UseWReg = Bit < 32 ;
1197
1198
unsigned NecessarySize = UseWReg ? 32 : 64 ;
1198
- if (Size < NecessarySize)
1199
- TestReg = widenGPRBankRegIfNeeded (TestReg, NecessarySize, MIB);
1200
- else if (Size > NecessarySize)
1201
- TestReg = narrowExtendRegIfNeeded (TestReg, MIB);
1199
+ if (Size != NecessarySize)
1200
+ TestReg = moveScalarRegClass (
1201
+ TestReg, UseWReg ? AArch64::GPR32RegClass : AArch64::GPR64RegClass,
1202
+ MIB);
1202
1203
1203
1204
static const unsigned OpcTable[2 ][2 ] = {{AArch64::TBZX, AArch64::TBNZX},
1204
1205
{AArch64::TBZW, AArch64::TBNZW}};
@@ -4987,7 +4988,7 @@ AArch64InstructionSelector::selectExtendedSHL(
4987
4988
4988
4989
// Need a 32-bit wide register here.
4989
4990
MachineIRBuilder MIB (*MRI.getVRegDef (Root.getReg ()));
4990
- OffsetReg = narrowExtendRegIfNeeded (OffsetReg, MIB);
4991
+ OffsetReg = moveScalarRegClass (OffsetReg, AArch64::GPR32RegClass , MIB);
4991
4992
}
4992
4993
4993
4994
// We can use the LHS of the GEP as the base, and the LHS of the shift as an
@@ -5159,8 +5160,8 @@ AArch64InstructionSelector::selectAddrModeWRO(MachineOperand &Root,
5159
5160
5160
5161
// Need a 32-bit wide register.
5161
5162
MachineIRBuilder MIB (*PtrAdd);
5162
- Register ExtReg =
5163
- narrowExtendRegIfNeeded (OffsetInst-> getOperand ( 1 ). getReg () , MIB);
5163
+ Register ExtReg = moveScalarRegClass (OffsetInst-> getOperand ( 1 ). getReg (),
5164
+ AArch64::GPR32RegClass , MIB);
5164
5165
unsigned SignExtend = Ext == AArch64_AM::SXTW;
5165
5166
5166
5167
// Base is LHS, offset is ExtReg.
@@ -5434,67 +5435,21 @@ AArch64_AM::ShiftExtendType AArch64InstructionSelector::getExtendTypeForInst(
5434
5435
}
5435
5436
}
5436
5437
5437
- Register AArch64InstructionSelector::narrowExtendRegIfNeeded (
5438
- Register ExtReg , MachineIRBuilder &MIB) const {
5438
+ Register AArch64InstructionSelector::moveScalarRegClass (
5439
+ Register Reg, const TargetRegisterClass &RC , MachineIRBuilder &MIB) const {
5439
5440
MachineRegisterInfo &MRI = *MIB.getMRI ();
5440
- if (MRI.getType (ExtReg).getSizeInBits () == 32 )
5441
- return ExtReg;
5442
-
5443
- // Insert a copy to move ExtReg to GPR32.
5444
- Register NarrowReg = MRI.createVirtualRegister (&AArch64::GPR32RegClass);
5445
- auto Copy = MIB.buildCopy ({NarrowReg}, {ExtReg});
5441
+ auto Ty = MRI.getType (Reg);
5442
+ assert (!Ty.isVector () && " Expected scalars only!" );
5443
+ if (Ty.getSizeInBits () == TRI.getRegSizeInBits (RC))
5444
+ return Reg;
5446
5445
5447
- // Select the copy into a subregister copy.
5446
+ // Create a copy and immediately select it.
5447
+ // FIXME: We should have an emitCopy function?
5448
+ auto Copy = MIB.buildCopy ({&RC}, {Reg});
5448
5449
selectCopy (*Copy, TII, MRI, TRI, RBI);
5449
5450
return Copy.getReg (0 );
5450
5451
}
5451
5452
5452
- Register AArch64InstructionSelector::widenGPRBankRegIfNeeded (
5453
- Register Reg, unsigned WideSize, MachineIRBuilder &MIB) const {
5454
- assert (WideSize >= 8 && " WideSize is smaller than all possible registers?" );
5455
- MachineRegisterInfo &MRI = *MIB.getMRI ();
5456
- unsigned NarrowSize = MRI.getType (Reg).getSizeInBits ();
5457
- assert (WideSize >= NarrowSize &&
5458
- " WideSize cannot be smaller than NarrowSize!" );
5459
-
5460
- // If the sizes match, just return the register.
5461
- //
5462
- // If NarrowSize is an s1, then we can select it to any size, so we'll treat
5463
- // it as a don't care.
5464
- if (NarrowSize == WideSize || NarrowSize == 1 )
5465
- return Reg;
5466
-
5467
- // Now check the register classes.
5468
- const RegisterBank *RB = RBI.getRegBank (Reg, MRI, TRI);
5469
- const TargetRegisterClass *OrigRC = getMinClassForRegBank (*RB, NarrowSize);
5470
- const TargetRegisterClass *WideRC = getMinClassForRegBank (*RB, WideSize);
5471
- assert (OrigRC && " Could not determine narrow RC?" );
5472
- assert (WideRC && " Could not determine wide RC?" );
5473
-
5474
- // If the sizes differ, but the register classes are the same, there is no
5475
- // need to insert a SUBREG_TO_REG.
5476
- //
5477
- // For example, an s8 that's supposed to be a GPR will be selected to either
5478
- // a GPR32 or a GPR64 register. Note that this assumes that the s8 will
5479
- // always end up on a GPR32.
5480
- if (OrigRC == WideRC)
5481
- return Reg;
5482
-
5483
- // We have two different register classes. Insert a SUBREG_TO_REG.
5484
- unsigned SubReg = 0 ;
5485
- getSubRegForClass (OrigRC, TRI, SubReg);
5486
- assert (SubReg && " Couldn't determine subregister?" );
5487
-
5488
- // Build the SUBREG_TO_REG and return the new, widened register.
5489
- auto SubRegToReg =
5490
- MIB.buildInstr (AArch64::SUBREG_TO_REG, {WideRC}, {})
5491
- .addImm (0 )
5492
- .addUse (Reg)
5493
- .addImm (SubReg);
5494
- constrainSelectedInstRegOperands (*SubRegToReg, TII, TRI, RBI);
5495
- return SubRegToReg.getReg (0 );
5496
- }
5497
-
5498
5453
// / Select an "extended register" operand. This operand folds in an extend
5499
5454
// / followed by an optional left shift.
5500
5455
InstructionSelector::ComplexRendererFns
@@ -5555,7 +5510,7 @@ AArch64InstructionSelector::selectArithExtendedRegister(
5555
5510
// We require a GPR32 here. Narrow the ExtReg if needed using a subregister
5556
5511
// copy.
5557
5512
MachineIRBuilder MIB (*RootDef);
5558
- ExtReg = narrowExtendRegIfNeeded (ExtReg, MIB);
5513
+ ExtReg = moveScalarRegClass (ExtReg, AArch64::GPR32RegClass , MIB);
5559
5514
5560
5515
return {{[=](MachineInstrBuilder &MIB) { MIB.addUse (ExtReg); },
5561
5516
[=](MachineInstrBuilder &MIB) {
0 commit comments