@@ -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 {
375376class 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
383384class MxMoveToCCRPseudo<MxOperand MEMOp>
384385 : MxPseudo<(outs CCRC:$dst), (ins MEMOp:$src)>;
386+ } // let Defs = [CCR]
385387
386388let mayLoad = 1 in
387389foreach AM = MxMoveSupportedAMs in {
@@ -434,6 +436,64 @@ foreach AM = MxMoveSupportedAMs in {
434436def MOV16dc : MxMoveFromCCR_R;
435437def 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//===----------------------------------------------------------------------===//
0 commit comments