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