aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/M68k/M68kInstrShiftRotate.td
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/M68k/M68kInstrShiftRotate.td')
-rw-r--r--llvm/lib/Target/M68k/M68kInstrShiftRotate.td92
1 files changed, 92 insertions, 0 deletions
diff --git a/llvm/lib/Target/M68k/M68kInstrShiftRotate.td b/llvm/lib/Target/M68k/M68kInstrShiftRotate.td
new file mode 100644
index 000000000000..cab687638076
--- /dev/null
+++ b/llvm/lib/Target/M68k/M68kInstrShiftRotate.td
@@ -0,0 +1,92 @@
+//===------ M68kInstrShiftRotate.td - Logical Instrs -----*- tablegen -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file describes the logical instructions in the M68k architecture.
+/// Here is the current status of the file:
+///
+/// Machine:
+///
+/// SHL [~] ASR [~] LSR [~] SWAP [ ]
+/// ROL [~] ROR [~] ROXL [ ] ROXR [ ]
+///
+/// Map:
+///
+/// [ ] - was not touched at all
+/// [!] - requires extarnal stuff implemented
+/// [~] - in progress but usable
+/// [x] - done
+///
+//===----------------------------------------------------------------------===//
+
+def MxRODI_R : MxBead1Bit<0>;
+def MxRODI_L : MxBead1Bit<1>;
+
+def MxROOP_AS : MxBead2Bits<0b00>;
+def MxROOP_LS : MxBead2Bits<0b01>;
+def MxROOP_ROX : MxBead2Bits<0b10>;
+def MxROOP_RO : MxBead2Bits<0b11>;
+
+/// ------------+---------+---+------+---+------+---------
+/// F E D C | B A 9 | 8 | 7 6 | 5 | 4 3 | 2 1 0
+/// ------------+---------+---+------+---+------+---------
+/// 1 1 1 0 | REG/IMM | D | SIZE |R/I| OP | REG
+/// ------------+---------+---+------+---+------+---------
+class MxSREncoding_R<MxBead1Bit DIRECTION, MxBead2Bits ROOP, MxEncSize SIZE>
+ : MxEncoding<MxBeadDReg<0>, ROOP, MxBead1Bit<1>, SIZE, DIRECTION,
+ MxBeadDReg<2>, MxBead4Bits<0b1110>>;
+
+class MxSREncoding_I<MxBead1Bit DIRECTION, MxBead2Bits ROOP, MxEncSize SIZE>
+ : MxEncoding<MxBeadDReg<0>, ROOP, MxBead1Bit<0>, SIZE, DIRECTION,
+ MxBead3Imm<2, 1>, MxBead4Bits<0b1110>>;
+
+// $reg <- $reg op $reg
+class MxSR_DD<string MN, MxType TYPE, SDNode NODE,
+ MxBead1Bit RODI, MxBead2Bits ROOP>
+ : MxInst<(outs TYPE.ROp:$dst), (ins TYPE.ROp:$src, TYPE.ROp:$opd),
+ MN#"."#TYPE.Prefix#"\t$opd, $dst",
+ [(set TYPE.VT:$dst, (NODE TYPE.VT:$src, TYPE.VT:$opd))],
+ MxSREncoding_R<RODI, ROOP,
+ !cast<MxEncSize>("MxEncSize"#TYPE.Size)>>;
+
+// $reg <- $reg op $imm
+class MxSR_DI<string MN, MxType TYPE, SDNode NODE,
+ MxBead1Bit RODI, MxBead2Bits ROOP>
+ : MxInst<(outs TYPE.ROp:$dst),
+ (ins TYPE.ROp:$src, !cast<Operand>("Mxi"#TYPE.Size#"imm"):$opd),
+ MN#"."#TYPE.Prefix#"\t$opd, $dst",
+ [(set TYPE.VT:$dst,
+ (NODE TYPE.VT:$src,
+ !cast<ImmLeaf>("Mximm"#TYPE.Size#"_1to8"):$opd))],
+ MxSREncoding_I<RODI, ROOP,
+ !cast<MxEncSize>("MxEncSize"#TYPE.Size)>>;
+
+multiclass MxSROp<string MN, SDNode NODE, MxBead1Bit RODI, MxBead2Bits ROOP> {
+
+ let Defs = [CCR] in {
+ let Constraints = "$src = $dst" in {
+
+ def NAME#"8dd" : MxSR_DD<MN, MxType8d, NODE, RODI, ROOP>;
+ def NAME#"16dd" : MxSR_DD<MN, MxType16d, NODE, RODI, ROOP>;
+ def NAME#"32dd" : MxSR_DD<MN, MxType32d, NODE, RODI, ROOP>;
+
+ def NAME#"8di" : MxSR_DI<MN, MxType8d, NODE, RODI, ROOP>;
+ def NAME#"16di" : MxSR_DI<MN, MxType16d, NODE, RODI, ROOP>;
+ def NAME#"32di" : MxSR_DI<MN, MxType32d, NODE, RODI, ROOP>;
+
+ } // $src = $dst
+ } // Defs = [CCR]
+
+} // MxBiArOp_RF
+
+defm SHL : MxSROp<"lsl", shl, MxRODI_L, MxROOP_LS>;
+defm LSR : MxSROp<"lsr", srl, MxRODI_R, MxROOP_LS>;
+defm ASR : MxSROp<"asr", sra, MxRODI_R, MxROOP_AS>;
+
+defm ROL : MxSROp<"rol", rotl, MxRODI_L, MxROOP_RO>;
+defm ROR : MxSROp<"ror", rotr, MxRODI_R, MxROOP_RO>;