Skip to content

Commit d830907

Browse files
committed
[M68k] implement move to and from sr
1 parent fdf72c9 commit d830907

File tree

4 files changed

+95
-2
lines changed

4 files changed

+95
-2
lines changed

llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ static inline unsigned getRegisterIndex(unsigned Register) {
258258
// We don't care about the indices of these registers.
259259
case M68k::PC:
260260
case M68k::CCR:
261+
case M68k::SR:
261262
case M68k::FPC:
262263
case M68k::FPS:
263264
case M68k::FPIAR:
@@ -636,10 +637,13 @@ bool M68kAsmParser::parseRegisterName(MCRegister &RegNo, SMLoc Loc,
636637
StringRef RegisterName) {
637638
auto RegisterNameLower = RegisterName.lower();
638639

639-
// CCR register
640+
// CCR and SR register
640641
if (RegisterNameLower == "ccr") {
641642
RegNo = M68k::CCR;
642643
return true;
644+
} else if (RegisterNameLower == "sr") {
645+
RegNo = M68k::SR;
646+
return true;
643647
}
644648

645649
// Parse simple general-purpose registers.

llvm/lib/Target/M68k/Disassembler/M68kDisassembler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ static DecodeStatus DecodeCCRCRegisterClass(MCInst &Inst, APInt &Insn,
111111
llvm_unreachable("unimplemented");
112112
}
113113

114+
static DecodeStatus DecodeSRCRegisterClass(MCInst &Inst, APInt &Insn,
115+
uint64_t Address,
116+
const void *Decoder) {
117+
llvm_unreachable("unimplemented");
118+
}
119+
114120
static DecodeStatus DecodeImm32(MCInst &Inst, uint64_t Imm, uint64_t Address,
115121
const void *Decoder) {
116122
Inst.addOperand(MCOperand::createImm(M68k::swapWord<uint32_t>(Imm)));

llvm/lib/Target/M68k/M68kInstrData.td

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,14 @@ def MOVM32mp_P : MxMOVEM_RM_Pseudo<MxType32r, MxType32.POp>;
365365
// ons that will be resolved sometime after RA pass.
366366
//===----------------------------------------------------------------------===//
367367

368+
/// Move to CCR
368369
/// --------------------------------------------------
369370
/// F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0
370371
/// --------------------------------------------------
371372
/// | EFFECTIVE ADDRESS
372373
/// 0 1 0 0 0 1 0 0 1 1 | MODE | REG
373374
/// --------------------------------------------------
374-
let Defs = [CCR] in
375+
let Defs = [CCR] in {
375376
class MxMoveToCCR<MxOperand MEMOp, MxEncMemOp SRC_ENC>
376377
: MxInst<(outs CCRC:$dst), (ins MEMOp:$src), "move.w\t$src, $dst", []> {
377378
let Inst = (ascend
@@ -382,6 +383,7 @@ class MxMoveToCCR<MxOperand MEMOp, MxEncMemOp SRC_ENC>
382383

383384
class MxMoveToCCRPseudo<MxOperand MEMOp>
384385
: MxPseudo<(outs CCRC:$dst), (ins MEMOp:$src)>;
386+
} // let Defs = [CCR]
385387

386388
let mayLoad = 1 in
387389
foreach AM = MxMoveSupportedAMs in {
@@ -434,6 +436,64 @@ foreach AM = MxMoveSupportedAMs in {
434436
def MOV16dc : MxMoveFromCCR_R;
435437
def MOV8dc : MxMoveFromCCRPseudo<MxOp8AddrMode_d.Op>;
436438

439+
/// Move to SR
440+
/// --------------------------------------------------
441+
/// F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0
442+
/// --------------------------------------------------
443+
/// | EFFECTIVE ADDRESS
444+
/// 0 1 0 0 0 1 1 0 1 1 | MODE | REG
445+
/// --------------------------------------------------
446+
let Defs = [SR] in {
447+
class MxMoveToSR<MxOperand MEMOp, MxEncMemOp SRC_ENC>
448+
: MxInst<(outs SRC:$dst), (ins MEMOp:$src), "move.w\t$src, $dst", []> {
449+
let Inst = (ascend
450+
(descend 0b0100011011, SRC_ENC.EA),
451+
SRC_ENC.Supplement
452+
);
453+
}
454+
} // let Defs = [SR]
455+
456+
let mayLoad = 1 in
457+
foreach AM = MxMoveSupportedAMs in {
458+
def MOV16s # AM : MxMoveToSR<!cast<MxOpBundle>("MxOp16AddrMode_"#AM).Op,
459+
!cast<MxEncMemOp>("MxMoveSrcOpEnc_"#AM)>;
460+
} // foreach AM
461+
462+
def MOV16sd : MxMoveToSR<MxOp16AddrMode_d.Op, MxMoveSrcOpEnc_d>;
463+
464+
/// Move from SR
465+
/// --------------------------------------------------
466+
/// F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0
467+
/// --------------------------------------------------
468+
/// | EFFECTIVE ADDRESS
469+
/// 0 1 0 0 0 0 0 0 1 1 | MODE | REG
470+
/// --------------------------------------------------
471+
let Uses = [SR] in {
472+
class MxMoveFromSR_R
473+
: MxInst<(outs MxDRD16:$dst), (ins SRC:$src), "move.w\t$src, $dst", []>,
474+
Requires<[ AtLeastM68010 ]> {
475+
let Inst = (descend 0b0100000011, MxEncAddrMode_d<"dst">.EA);
476+
}
477+
478+
class MxMoveFromSR_M<MxOperand MEMOp, MxEncMemOp DST_ENC>
479+
: MxInst<(outs), (ins MEMOp:$dst, SRC:$src), "move.w\t$src, $dst", []>,
480+
Requires<[ AtLeastM68010 ]> {
481+
let Inst = (ascend
482+
(descend 0b0100000011, DST_ENC.EA),
483+
DST_ENC.Supplement
484+
);
485+
}
486+
} // let Uses = [SR]
487+
488+
let mayStore = 1 in
489+
foreach AM = MxMoveSupportedAMs in {
490+
def MOV16 # AM # s
491+
: MxMoveFromSR_M<!cast<MxOpBundle>("MxOp16AddrMode_"#AM).Op,
492+
!cast<MxEncMemOp>("MxMoveDstOpEnc_"#AM)>;
493+
} // foreach AM
494+
495+
def MOV16ds : MxMoveFromSR_R;
496+
437497
//===----------------------------------------------------------------------===//
438498
// LEA
439499
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/M68k/inline-asm.ll

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,26 @@ entry:
152152
ret void
153153
}
154154

155+
define void @move_sr_ccr() {
156+
; CHECK-LABEL: move_sr_ccr:
157+
; CHECK: .cfi_startproc
158+
; CHECK-NEXT: ; %bb.0:
159+
; CHECK-NEXT: ;APP
160+
; CHECK-NEXT: move.w %sr, %d0
161+
; CHECK-NEXT: ;NO_APP
162+
; CHECK-NEXT: ;APP
163+
; CHECK-NEXT: move.w %d0, %sr
164+
; CHECK-NEXT: ;NO_APP
165+
; CHECK-NEXT: ;APP
166+
; CHECK-NEXT: move.w %ccr, %d0
167+
; CHECK-NEXT: ;NO_APP
168+
; CHECK-NEXT: ;APP
169+
; CHECK-NEXT: move.w %d0, %ccr
170+
; CHECK-NEXT: ;NO_APP
171+
; CHECK-NEXT: rts
172+
%1 = call i16 asm sideeffect "move.w %sr, $0", "=r"()
173+
call void asm sideeffect "move.w $0, %sr", "r"(i16 %1)
174+
%2 = call i16 asm sideeffect "move.w %ccr, $0", "=r"()
175+
call void asm sideeffect "move.w $0, %ccr", "r"(i16 %2)
176+
ret void
177+
}

0 commit comments

Comments
 (0)