| //===------ 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>; |