@@ -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}};
@@ -4984,7 +4985,7 @@ AArch64InstructionSelector::selectExtendedSHL(
4984
4985
4985
4986
// Need a 32-bit wide register here.
4986
4987
MachineIRBuilder MIB (*MRI.getVRegDef (Root.getReg ()));
4987
- OffsetReg = narrowExtendRegIfNeeded (OffsetReg, MIB);
4988
+ OffsetReg = moveScalarRegClass (OffsetReg, AArch64::GPR32RegClass , MIB);
4988
4989
}
4989
4990
4990
4991
// We can use the LHS of the GEP as the base, and the LHS of the shift as an
@@ -5156,8 +5157,8 @@ AArch64InstructionSelector::selectAddrModeWRO(MachineOperand &Root,
5156
5157
5157
5158
// Need a 32-bit wide register.
5158
5159
MachineIRBuilder MIB (*PtrAdd);
5159
- Register ExtReg =
5160
- narrowExtendRegIfNeeded (OffsetInst-> getOperand ( 1 ). getReg () , MIB);
5160
+ Register ExtReg = moveScalarRegClass (OffsetInst-> getOperand ( 1 ). getReg (),
5161
+ AArch64::GPR32RegClass , MIB);
5161
5162
unsigned SignExtend = Ext == AArch64_AM::SXTW;
5162
5163
5163
5164
// Base is LHS, offset is ExtReg.
@@ -5431,67 +5432,21 @@ AArch64_AM::ShiftExtendType AArch64InstructionSelector::getExtendTypeForInst(
5431
5432
}
5432
5433
}
5433
5434
5434
- Register AArch64InstructionSelector::narrowExtendRegIfNeeded (
5435
- Register ExtReg , MachineIRBuilder &MIB) const {
5435
+ Register AArch64InstructionSelector::moveScalarRegClass (
5436
+ Register Reg, const TargetRegisterClass &RC , MachineIRBuilder &MIB) const {
5436
5437
MachineRegisterInfo &MRI = *MIB.getMRI ();
5437
- if (MRI.getType (ExtReg).getSizeInBits () == 32 )
5438
- return ExtReg;
5439
-
5440
- // Insert a copy to move ExtReg to GPR32.
5441
- Register NarrowReg = MRI.createVirtualRegister (&AArch64::GPR32RegClass);
5442
- auto Copy = MIB.buildCopy ({NarrowReg}, {ExtReg});
5438
+ auto Ty = MRI.getType (Reg);
5439
+ assert (!Ty.isVector () && " Expected scalars only!" );
5440
+ if (Ty.getSizeInBits () == TRI.getRegSizeInBits (RC))
5441
+ return Reg;
5443
5442
5444
- // Select the copy into a subregister copy.
5443
+ // Create a copy and immediately select it.
5444
+ // FIXME: We should have an emitCopy function?
5445
+ auto Copy = MIB.buildCopy ({&RC}, {Reg});
5445
5446
selectCopy (*Copy, TII, MRI, TRI, RBI);
5446
5447
return Copy.getReg (0 );
5447
5448
}
5448
5449
5449
- Register AArch64InstructionSelector::widenGPRBankRegIfNeeded (
5450
- Register Reg, unsigned WideSize, MachineIRBuilder &MIB) const {
5451
- assert (WideSize >= 8 && " WideSize is smaller than all possible registers?" );
5452
- MachineRegisterInfo &MRI = *MIB.getMRI ();
5453
- unsigned NarrowSize = MRI.getType (Reg).getSizeInBits ();
5454
- assert (WideSize >= NarrowSize &&
5455
- " WideSize cannot be smaller than NarrowSize!" );
5456
-
5457
- // If the sizes match, just return the register.
5458
- //
5459
- // If NarrowSize is an s1, then we can select it to any size, so we'll treat
5460
- // it as a don't care.
5461
- if (NarrowSize == WideSize || NarrowSize == 1 )
5462
- return Reg;
5463
-
5464
- // Now check the register classes.
5465
- const RegisterBank *RB = RBI.getRegBank (Reg, MRI, TRI);
5466
- const TargetRegisterClass *OrigRC = getMinClassForRegBank (*RB, NarrowSize);
5467
- const TargetRegisterClass *WideRC = getMinClassForRegBank (*RB, WideSize);
5468
- assert (OrigRC && " Could not determine narrow RC?" );
5469
- assert (WideRC && " Could not determine wide RC?" );
5470
-
5471
- // If the sizes differ, but the register classes are the same, there is no
5472
- // need to insert a SUBREG_TO_REG.
5473
- //
5474
- // For example, an s8 that's supposed to be a GPR will be selected to either
5475
- // a GPR32 or a GPR64 register. Note that this assumes that the s8 will
5476
- // always end up on a GPR32.
5477
- if (OrigRC == WideRC)
5478
- return Reg;
5479
-
5480
- // We have two different register classes. Insert a SUBREG_TO_REG.
5481
- unsigned SubReg = 0 ;
5482
- getSubRegForClass (OrigRC, TRI, SubReg);
5483
- assert (SubReg && " Couldn't determine subregister?" );
5484
-
5485
- // Build the SUBREG_TO_REG and return the new, widened register.
5486
- auto SubRegToReg =
5487
- MIB.buildInstr (AArch64::SUBREG_TO_REG, {WideRC}, {})
5488
- .addImm (0 )
5489
- .addUse (Reg)
5490
- .addImm (SubReg);
5491
- constrainSelectedInstRegOperands (*SubRegToReg, TII, TRI, RBI);
5492
- return SubRegToReg.getReg (0 );
5493
- }
5494
-
5495
5450
// / Select an "extended register" operand. This operand folds in an extend
5496
5451
// / followed by an optional left shift.
5497
5452
InstructionSelector::ComplexRendererFns
@@ -5552,7 +5507,7 @@ AArch64InstructionSelector::selectArithExtendedRegister(
5552
5507
// We require a GPR32 here. Narrow the ExtReg if needed using a subregister
5553
5508
// copy.
5554
5509
MachineIRBuilder MIB (*RootDef);
5555
- ExtReg = narrowExtendRegIfNeeded (ExtReg, MIB);
5510
+ ExtReg = moveScalarRegClass (ExtReg, AArch64::GPR32RegClass , MIB);
5556
5511
5557
5512
return {{[=](MachineInstrBuilder &MIB) { MIB.addUse (ExtReg); },
5558
5513
[=](MachineInstrBuilder &MIB) {
0 commit comments