Skip to content

Commit bfaa06c

Browse files
committed
add pseudo instrs for 8 and 32 bit src/dst ccr moves and expand them to 16 bit instrs
1 parent c320df4 commit bfaa06c

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

llvm/lib/Target/M68k/M68kExpandPseudo.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,11 @@ bool M68kExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
189189
MVT::i16);
190190

191191
case M68k::MOV8cd:
192+
case M68k::MOV32cd:
192193
return TII->ExpandCCR(MIB, /*IsToCCR=*/true);
194+
193195
case M68k::MOV8dc:
196+
case M68k::MOV32dc:
194197
return TII->ExpandCCR(MIB, /*IsToCCR=*/false);
195198

196199
case M68k::MOVM8jm_P:

llvm/lib/Target/M68k/M68kInstrData.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,12 +385,14 @@ class MxMoveToCCRPseudo<MxOperand MEMOp>
385385

386386
let mayLoad = 1 in
387387
foreach AM = MxMoveSupportedAMs in {
388+
def MOV32c # AM : MxMoveToCCRPseudo<!cast<MxOpBundle>("MxOp32AddrMode_"#AM).Op>;
388389
def MOV16c # AM : MxMoveToCCR<!cast<MxOpBundle>("MxOp16AddrMode_"#AM).Op,
389390
!cast<MxEncMemOp>("MxMoveSrcOpEnc_"#AM)>;
390391
def MOV8c # AM : MxMoveToCCRPseudo<!cast<MxOpBundle>("MxOp8AddrMode_"#AM).Op>;
391392
} // foreach AM
392393

393394
// Only data register is allowed.
395+
def MOV32cd : MxMoveToCCRPseudo<MxOp32AddrMode_d.Op>;
394396
def MOV16cd : MxMoveToCCR<MxOp16AddrMode_d.Op, MxMoveSrcOpEnc_d>;
395397
def MOV8cd : MxMoveToCCRPseudo<MxOp8AddrMode_d.Op>;
396398

@@ -423,6 +425,9 @@ class MxMoveFromCCRPseudo<MxOperand MEMOp>
423425

424426
let mayStore = 1 in
425427
foreach AM = MxMoveSupportedAMs in {
428+
def MOV32 # AM # c
429+
: MxMoveFromCCR_M<!cast<MxOpBundle>("MxOp32AddrMode_"#AM).Op,
430+
!cast<MxEncMemOp>("MxMoveDstOpEnc_"#AM)>;
426431
def MOV16 # AM # c
427432
: MxMoveFromCCR_M<!cast<MxOpBundle>("MxOp16AddrMode_"#AM).Op,
428433
!cast<MxEncMemOp>("MxMoveDstOpEnc_"#AM)>;
@@ -431,6 +436,7 @@ foreach AM = MxMoveSupportedAMs in {
431436
} // foreach AM
432437

433438
// Only data register is allowed.
439+
def MOV32dc : MxMoveFromCCRPseudo<MxOp32AddrMode_d.Op>;
434440
def MOV16dc : MxMoveFromCCR_R;
435441
def MOV8dc : MxMoveFromCCRPseudo<MxOp8AddrMode_d.Op>;
436442

llvm/lib/Target/M68k/M68kInstrInfo.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -757,13 +757,28 @@ void M68kInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
757757
bool ToSR = DstReg == M68k::SR;
758758

759759
if (FromCCR) {
760-
assert(M68k::DR8RegClass.contains(DstReg) &&
761-
"Need DR8 register to copy CCR");
762-
Opc = M68k::MOV8dc;
760+
if (M68k::DR8RegClass.contains(DstReg))
761+
Opc = M68k::MOV8dc;
762+
else if (M68k::DR16RegClass.contains(DstReg))
763+
Opc = M68k::MOV16dc;
764+
else if (M68k::DR32RegClass.contains(DstReg))
765+
Opc = M68k::MOV32dc;
766+
else {
767+
LLVM_DEBUG(dbgs() << "Cannot copy CCR to " << RI.getName(DstReg)
768+
<< "(" << RI.getRegClass(DstReg) << ')\n');
769+
llvm_unreachable("Invalid register for MOVE from CCR");
770+
}
763771
} else if (ToCCR) {
764-
assert(M68k::DR8RegClass.contains(SrcReg) &&
765-
"Need DR8 register to copy CCR");
766-
Opc = M68k::MOV8cd;
772+
if (M68k::DR8RegClass.contains(SrcReg))
773+
Opc = M68k::MOV8cd;
774+
else if (M68k::DR16RegClass.contains(SrcReg))
775+
Opc = M68k::MOV16cd;
776+
else if (M68k::DR32RegClass.contains(SrcReg))
777+
Opc = M68k::MOV32cd;
778+
else {
779+
LLVM_DEBUG(dbgs() << "Cannot copy " << RI.getName(SrcReg) << " to CCR" << '\n');
780+
llvm_unreachable("Invalid register for MOVE to CCR");
781+
}
767782
} else if (FromSR || ToSR)
768783
llvm_unreachable("Cannot emit SR copy instruction");
769784

0 commit comments

Comments
 (0)