//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Describe MSP430 instructions format here // class SourceMode val> { bits<2> Value = val; } def SrcReg : SourceMode<0>; // r def SrcMem : SourceMode<1>; // m def SrcIndReg : SourceMode<2>; // n def SrcPostInc : SourceMode<3>; // p def SrcImm : SourceMode<3>; // i // SrcCGImm : SourceMode< >; // c class DestMode { bit Value = val; } def DstReg : DestMode<0>; // r def DstMem : DestMode<1>; // m // Generic MSP430 Format class MSP430Inst : Instruction { field bits<48> Inst; field bits<48> SoftFail = 0; let Namespace = "MSP430"; dag OutOperandList = outs; dag InOperandList = ins; let AsmString = asmstr; let Size = size; } // MSP430 Double Operand (Format I) Instructions class IForm opcode, DestMode ad, bit bw, SourceMode as, int size, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let Pattern = pattern; bits<4> rs; bits<4> rd; let Inst{15-12} = opcode; let Inst{11-8} = rs; let Inst{7} = ad.Value; let Inst{6} = bw; let Inst{5-4} = as.Value; let Inst{3-0} = rd; } // 8 bit IForm instructions class IForm8 opcode, DestMode dest, SourceMode src, int size, dag outs, dag ins, string asmstr, list pattern> : IForm; class I8rr opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Alpha"; } class I8ri opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Gamma"; bits<16> imm; let Inst{31-16} = imm; let rs = 0b0000; } class I8rc opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let DecoderNamespace = "Beta"; let Pattern = pattern; bits<6> imm; bits<4> rd; let Inst{15-12} = opcode; let Inst{11-8} = imm{3-0}; let Inst{7} = DstReg.Value; let Inst{6} = 1; let Inst{5-4} = imm{5-4}; let Inst{3-0} = rd; } class I8rm opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Gamma"; bits<20> src; let rs = src{3-0}; let Inst{31-16} = src{19-4}; } class I8rn opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Delta"; } class I8rp opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Delta"; } class I8mr opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Alpha"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } class I8mi opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Gamma"; bits<16> imm; bits<20> dst; let rs = 0b0000; let Inst{31-16} = imm; let rd = dst{3-0}; let Inst{47-32} = dst{19-4}; } class I8mc opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let DecoderNamespace = "Beta"; let Pattern = pattern; bits<6> imm; bits<20> dst; let Inst{31-16} = dst{19-4}; let Inst{15-12} = opcode; let Inst{11-8} = imm{3-0}; let Inst{7} = DstMem.Value; let Inst{6} = 1; let Inst{5-4} = imm{5-4}; let Inst{3-0} = dst{3-0}; } class I8mm opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Gamma"; bits<20> src; bits<20> dst; let rs = src{3-0}; let Inst{31-16} = src{19-4}; let rd = dst{3-0}; let Inst{47-32} = dst{19-4}; } class I8mn opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Delta"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } class I8mp opcode, dag outs, dag ins, string asmstr, list pattern> : IForm8 { let DecoderNamespace = "Delta"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } // 16 bit IForm instructions class IForm16 opcode, DestMode dest, SourceMode src, int size, dag outs, dag ins, string asmstr, list pattern> : IForm; class I16rr opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Alpha"; } class I16ri opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Gamma"; bits<16> imm; let Inst{31-16} = imm; let rs = 0b0000; } class I16rc opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let DecoderNamespace = "Beta"; let Pattern = pattern; bits<6> imm; bits<4> rd; let Inst{15-12} = opcode; let Inst{11-8} = imm{3-0}; let Inst{7} = DstReg.Value; let Inst{6} = 0; let Inst{5-4} = imm{5-4}; let Inst{3-0} = rd; } class I16rm opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Gamma"; bits<20> src; let rs = src{3-0}; let Inst{31-16} = src{19-4}; } class I16rn opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Delta"; } class I16rp opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Delta"; } class I16mr opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Alpha"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } class I16mi opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Gamma"; bits<16> imm; bits<20> dst; let Inst{31-16} = imm; let rs = 0b0000; let rd = dst{3-0}; let Inst{47-32} = dst{19-4}; } class I16mc opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let DecoderNamespace = "Beta"; let Pattern = pattern; bits<6> imm; bits<20> dst; let Inst{31-16} = dst{19-4}; let Inst{15-12} = opcode; let Inst{11-8} = imm{3-0}; let Inst{7} = DstMem.Value; let Inst{6} = 0; let Inst{5-4} = imm{5-4}; let Inst{3-0} = dst{3-0}; } class I16mm opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Gamma"; bits<20> src; bits<20> dst; let rs = src{3-0}; let Inst{31-16} = src{19-4}; let rd = dst{3-0}; let Inst{47-32} = dst{19-4}; } class I16mn opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Delta"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } class I16mp opcode, dag outs, dag ins, string asmstr, list pattern> : IForm16 { let DecoderNamespace = "Delta"; bits<20> dst; let rd = dst{3-0}; let Inst{31-16} = dst{19-4}; } // MSP430 Single Operand (Format II) Instructions class IIForm opcode, bit bw, SourceMode as, int size, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let Pattern = pattern; bits<4> rs; let Inst{15-10} = 0b000100; let Inst{9-7} = opcode; let Inst{6} = bw; let Inst{5-4} = as.Value; let Inst{3-0} = rs; } // 8 bit IIForm instructions class IIForm8 opcode, SourceMode src, int size, dag outs, dag ins, string asmstr, list pattern> : IIForm; class II8r opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm8; class II8m opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm8 { bits<20> src; let rs = src{3-0}; let Inst{31-16} = src{19-4}; } class II8i opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm8 { bits<16> imm; let rs = 0b0000; let Inst{31-16} = imm; } class II8c opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let Pattern = pattern; bits<6> imm; let Inst{15-10} = 0b000100; let Inst{9-7} = opcode; let Inst{6} = 1; let Inst{5-0} = imm; } class II8n opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm8; class II8p opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm8; // 16 bit IIForm instructions class IIForm16 opcode, SourceMode src, int size, dag outs, dag ins, string asmstr, list pattern> : IIForm; class II16r opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm16; class II16m opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm16 { bits<20> src; let rs = src{3-0}; let Inst{31-16} = src{19-4}; } class II16i opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm16 { bits<16> imm; let rs = 0b0000; let Inst{31-16} = imm; } class II16c opcode, dag outs, dag ins, string asmstr, list pattern> : MSP430Inst { let Pattern = pattern; bits<6> imm; let Inst{15-10} = 0b000100; let Inst{9-7} = opcode; let Inst{6} = 0; let Inst{5-0} = imm; } class II16n opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm16; class II16p opcode, dag outs, dag ins, string asmstr, list pattern> : IIForm16; // MSP430 Conditional Jumps Instructions class CJForm pattern> : MSP430Inst { let Pattern = pattern; bits<3> cond; bits<10> dst; let Inst{15-13} = 0b001; let Inst{12-10} = cond; let Inst{9-0} = dst; } // Pseudo instructions class Pseudo pattern> : MSP430Inst { let Pattern = pattern; }