Skip to content

Commit dc61bca

Browse files
committed
[M68k] always use movem for register spills / spill 8 bit registers into 16 bit slots
1 parent fdf72c9 commit dc61bca

File tree

4 files changed

+11
-31
lines changed

4 files changed

+11
-31
lines changed

llvm/lib/Target/M68k/M68kExpandPseudo.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -193,31 +193,23 @@ bool M68kExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
193193
case M68k::MOV8dc:
194194
return TII->ExpandCCR(MIB, /*IsToCCR=*/false);
195195

196-
case M68k::MOVM8jm_P:
197-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32jm), /*IsRM=*/false);
198196
case M68k::MOVM16jm_P:
199-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32jm), /*IsRM=*/false);
197+
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM16jm), /*IsRM=*/false);
200198
case M68k::MOVM32jm_P:
201199
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32jm), /*IsRM=*/false);
202200

203-
case M68k::MOVM8pm_P:
204-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32pm), /*IsRM=*/false);
205201
case M68k::MOVM16pm_P:
206-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32pm), /*IsRM=*/false);
202+
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM16pm), /*IsRM=*/false);
207203
case M68k::MOVM32pm_P:
208204
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32pm), /*IsRM=*/false);
209205

210-
case M68k::MOVM8mj_P:
211-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mj), /*IsRM=*/true);
212206
case M68k::MOVM16mj_P:
213-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mj), /*IsRM=*/true);
207+
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM16mj), /*IsRM=*/true);
214208
case M68k::MOVM32mj_P:
215209
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mj), /*IsRM=*/true);
216210

217-
case M68k::MOVM8mp_P:
218-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mp), /*IsRM=*/true);
219211
case M68k::MOVM16mp_P:
220-
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mp), /*IsRM=*/true);
212+
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM16mp), /*IsRM=*/true);
221213
case M68k::MOVM32mp_P:
222214
return TII->ExpandMOVEM(MIB, TII->get(M68k::MOVM32mp), /*IsRM=*/true);
223215

llvm/lib/Target/M68k/M68kInstrData.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,20 +337,16 @@ class MxMOVEM_RM_Pseudo<MxType TYPE, MxOperand MEMOp>
337337
: MxPseudo<(outs TYPE.ROp:$dst), (ins MEMOp:$src)>;
338338

339339
// Mem <- Reg
340-
def MOVM8jm_P : MxMOVEM_MR_Pseudo<MxType8d, MxType8.JOp>;
341340
def MOVM16jm_P : MxMOVEM_MR_Pseudo<MxType16r, MxType16.JOp>;
342341
def MOVM32jm_P : MxMOVEM_MR_Pseudo<MxType32r, MxType32.JOp>;
343342

344-
def MOVM8pm_P : MxMOVEM_MR_Pseudo<MxType8d, MxType8.POp>;
345343
def MOVM16pm_P : MxMOVEM_MR_Pseudo<MxType16r, MxType16.POp>;
346344
def MOVM32pm_P : MxMOVEM_MR_Pseudo<MxType32r, MxType32.POp>;
347345

348346
// Reg <- Mem
349-
def MOVM8mj_P : MxMOVEM_RM_Pseudo<MxType8d, MxType8.JOp>;
350347
def MOVM16mj_P : MxMOVEM_RM_Pseudo<MxType16r, MxType16.JOp>;
351348
def MOVM32mj_P : MxMOVEM_RM_Pseudo<MxType32r, MxType32.JOp>;
352349

353-
def MOVM8mp_P : MxMOVEM_RM_Pseudo<MxType8d, MxType8.POp>;
354350
def MOVM16mp_P : MxMOVEM_RM_Pseudo<MxType16r, MxType16.POp>;
355351
def MOVM32mp_P : MxMOVEM_RM_Pseudo<MxType32r, MxType32.POp>;
356352

llvm/lib/Target/M68k/M68kInstrInfo.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,6 @@ bool M68kInstrInfo::ExpandCCR(MachineInstrBuilder &MIB, bool IsToCCR) const {
542542
bool M68kInstrInfo::ExpandMOVEM(MachineInstrBuilder &MIB,
543543
const MCInstrDesc &Desc, bool IsRM) const {
544544
int Reg = 0, Offset = 0, Base = 0;
545-
auto XR32 = RI.getRegClass(M68k::XR32RegClassID);
546545
auto DL = MIB->getDebugLoc();
547546
auto MI = MIB.getInstr();
548547
auto &MBB = *MIB->getParent();
@@ -557,13 +556,6 @@ bool M68kInstrInfo::ExpandMOVEM(MachineInstrBuilder &MIB,
557556
Reg = MIB->getOperand(2).getReg();
558557
}
559558

560-
// If the register is not in XR32 then it is smaller than 32 bit, we
561-
// implicitly promote it to 32
562-
if (!XR32->contains(Reg)) {
563-
Reg = RI.getMatchingMegaReg(Reg, XR32);
564-
assert(Reg && "Has not meaningful MEGA register");
565-
}
566-
567559
unsigned Mask = 1 << RI.getSpillRegisterOrder(Reg);
568560
if (IsRM) {
569561
BuildMI(MBB, MI, DL, Desc)
@@ -738,14 +730,12 @@ unsigned getLoadStoreRegOpcode(unsigned Reg, const TargetRegisterClass *RC,
738730
default:
739731
llvm_unreachable("Unknown spill size");
740732
case 8:
741-
if (M68k::DR8RegClass.hasSubClassEq(RC))
742-
return load ? M68k::MOV8dp : M68k::MOV8pd;
743-
if (M68k::CCRCRegClass.hasSubClassEq(RC))
744-
return load ? M68k::MOV16cp : M68k::MOV16pc;
745-
746-
llvm_unreachable("Unknown 1-byte regclass");
733+
assert(M68k::CCRCRegClass.hasSubClassEq(RC) && "Unknown 1-byte regclass");
734+
return load ? M68k::MOV16cp : M68k::MOV16pc;
747735
case 16:
748-
assert(M68k::XR16RegClass.hasSubClassEq(RC) && "Unknown 2-byte regclass");
736+
assert(M68k::XR16RegClass.hasSubClassEq(RC) ||
737+
M68k::DR8RegClass.hasSubClassEq(RC) &&
738+
"Unknown 2-byte regclass");
749739
return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
750740
case 32:
751741
assert(M68k::XR32RegClass.hasSubClassEq(RC) && "Unknown 4-byte regclass");

llvm/lib/Target/M68k/M68kRegisterInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ class MxRegClass<list<ValueType> regTypes, int alignment, dag regList>
9999
: RegisterClass<"M68k", regTypes, alignment, regList>;
100100

101101
// Data Registers
102+
let Size = 16 in
102103
def DR8 : MxRegClass<[i8], 16, (sequence "BD%u", 0, 7)>;
104+
103105
def DR16 : MxRegClass<[i16], 16, (sequence "WD%u", 0, 7)>;
104106
def DR32 : MxRegClass<[i32], 32, (sequence "D%u", 0, 7)>;
105107

0 commit comments

Comments
 (0)